First public contribution.
1 // Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
2 // All rights reserved.
3 // This component and the accompanying materials are made available
4 // under the terms of the License "Eclipse Public License v1.0"
5 // which accompanies this distribution, and is available
6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
8 // Initial Contributors:
9 // Nokia Corporation - initial contribution.
14 // e32test\mmu\t_kblockmap.cpp
15 // Unit tests for TKernBlockMap
16 // 002 Test Initialise error checking
17 // 003 Test processing of user-side block map into extent list
18 // 004 Test processing of user-side block map into extent list, block size > read unit size
19 // 005 Test Read error checking
24 //! @SYMTestCaseID KBASE-T_KBLOCKMAP-0338
27 //! @SYMTestCaseDesc Demand Paging Kernel Blockmap tests
28 //! @SYMTestActions 001 Unit tests the TKernBlockMap class
29 //! @SYMTestExpectedResults All tests should pass.
30 //! @SYMTestPriority High
31 //! @SYMTestStatus Implemented
35 #include <memmodel/epoc/mmubase/kblockmap.h>
37 RTest test(_L("T_KBLOCKMAP"));
39 #define test_noError(x) { TInt _r = (x); if (_r < 0) HandleError(_r, __LINE__); }
40 #define test_notNull(x) { TAny* _a = (TAny*)(x); if (_a == NULL) HandleNull(__LINE__); }
41 #define test_equal(e, a) { TInt _e = (e); TInt _a = (a); if (_e != _a) HandleNotEqual(_e, _a, __LINE__); }
43 void HandleError(TInt aError, TInt aLine)
45 test.Printf(_L("Error %d\n"), aError);
46 test.operator()(EFalse, aLine);
49 void HandleNull(TInt aLine)
51 test.Printf(_L("Null value\n"));
52 test.operator()(EFalse, aLine);
55 void HandleNotEqual(TInt aExpected, TInt aActual, TInt aLine)
57 test.Printf(_L("Expected 0x%x but got 0x%x\n"), aExpected, aActual);
58 test.operator()(EFalse, aLine);
61 /// An list of "pod" objects which can be initialised by passing a variable number of TUints to its
68 CList(TInt aCount, ...);
70 inline TInt Count() const { return iCount; }
71 const T* Entries() const { return iEntries; }
72 const T& operator[](TInt aIndex) const;
74 void Set(TInt aCount, VA_LIST aList);
76 const CList<T>& operator=(const CList<T>&);
83 : iCount(0), iEntries(NULL)
85 __ASSERT_COMPILE(sizeof(T) % sizeof(TUint32) == 0);
89 CList<T>::CList(TInt aCount, ...)
93 VA_START(list, aCount);
100 User::Free(iEntries);
105 void CList<T>::Set(TInt aCount, VA_LIST aList)
108 test(iEntries == NULL);
109 iEntries = (T*)User::Alloc(sizeof(T) * iCount);
110 test_notNull(iEntries);
111 TInt argCount = iCount * (sizeof(T) / sizeof(TUint32));
112 for (TInt i = 0 ; i < argCount ; ++i)
113 ((TUint32*)iEntries)[i] = VA_ARG(aList, TUint32);
117 const T& CList<T>::operator[](TInt aIndex) const
119 test(aIndex < iCount);
120 return iEntries[aIndex];
123 /// Holds all the data associated with the user-side representation of a block map
124 class CBlockMap : public CList<TBlockMapEntryBase>
127 CBlockMap(TUint aBlockGranularity,
128 TUint aBlockStartOffset,
129 TInt64 aStartBlockAddress,
130 TUint aReadUnitShift,
131 TUint aCodeLengthInFile,
134 inline const SBlockMapInfoBase& Info() const { return iInfo; }
135 inline TInt ReadUnitShift() const { return iReadUnitShift; }
136 inline TInt CodeLengthInFile() const { return iCodeLengthInFile; }
137 inline TInt EntriesSize() const { return iEntriesSize; }
139 SBlockMapInfoBase iInfo;
140 TBlockMapEntryBase* iEntries;
141 TUint iReadUnitShift;
142 TUint iCodeLengthInFile;
146 CBlockMap::CBlockMap(TUint aBlockGranularity,
147 TUint aBlockStartOffset,
148 TInt64 aStartBlockAddress,
149 TUint aReadUnitShift,
150 TUint aCodeLengthInFile,
154 iInfo.iBlockGranularity = aBlockGranularity;
155 iInfo.iBlockStartOffset = aBlockStartOffset;
156 iInfo.iStartBlockAddress = aStartBlockAddress;
157 // don't care about iInfo.iLocalDriveNumber for test purposes
158 iReadUnitShift = aReadUnitShift;
159 iCodeLengthInFile = aCodeLengthInFile;
160 iEntriesSize = aEntriesSize;
161 iEntries = (TBlockMapEntryBase*)User::Alloc(iEntriesSize);
164 VA_START(list, aEntriesSize);
165 Set(iEntriesSize / sizeof(TBlockMapEntryBase), list);
168 /// A list of extents, for comparison with those generated by the kernel block map processing code
169 class CExtentList : public CList<TBlockMap::SExtent>
172 typedef TBlockMap::SExtent SExtent;
173 CExtentList(TInt aCount, ...);
177 CExtentList::CExtentList(TInt aCount, ...)
180 VA_START(list, aCount);
184 void CExtentList::Dump() const
186 RDebug::Printf("CExtentList:\n");
187 const CExtentList& self = *this;
188 for (TInt i = 0 ; i < Count() ; ++i)
189 RDebug::Printf(" %d: %08x -> %08x: %08x\n", i, self[i].iDataOffset, self[i+1].iDataOffset, self[i].iBlockNumber);
192 TBool operator==(const TBlockMap::SExtent& a, const TBlockMap::SExtent& b)
194 return a.iDataOffset == b.iDataOffset && a.iBlockNumber == b.iBlockNumber;
197 TBool operator!=(const TBlockMap::SExtent& a, const TBlockMap::SExtent& b)
202 TBool CompareExtentsEqual(const TBlockMap& aBlockMap, const CExtentList& aExtentList)
204 if (aBlockMap.Count() != aExtentList.Count())
206 for (TInt i = 0 ; i < aBlockMap.Count() ; ++i)
208 if (aBlockMap.Extent(i) != aExtentList[i])
214 TInt MakeKernBlockMap(TBlockMap& aKbm, const CBlockMap& aUbm)
216 TBlockMapEntryBase* buffer = (TBlockMapEntryBase*)User::Alloc(aUbm.EntriesSize());
217 test_notNull(buffer);
218 Mem::Copy(buffer, aUbm.Entries(), aUbm.EntriesSize());
219 return aKbm.Initialise(aUbm.Info(),
222 aUbm.ReadUnitShift(),
223 aUbm.CodeLengthInFile());
226 void MakeKernBlockMapAndTestExtents(const CBlockMap& aUbm, const CExtentList& aExpectedExtentList)
229 test_noError(MakeKernBlockMap(kbm, aUbm));
230 TBool equal = CompareExtentsEqual(kbm, aExpectedExtentList);
233 aExpectedExtentList.Dump();
243 void TestInitialiseErrors()
245 test.Next(_L("Test Initialise error checking"));
248 // Block size must be a power of two
249 test_equal(KErrArgument, MakeKernBlockMap(kbm, CBlockMap(513, 0, 0, 9, 1, 8, 1, 0)));
251 // Block size must be greater than or equal to the read unit size
252 test_equal(KErrArgument, MakeKernBlockMap(kbm, CBlockMap(512, 0, 0, 10, 1, 8, 1, 0)));
254 // Block start offset must be less than or equal to block size
255 test_equal(KErrArgument, MakeKernBlockMap(kbm, CBlockMap(512, 513, 0, 9, 1, 8, 1, 0)));
257 // Block zero address must be a multiple of the block size
258 test_equal(KErrArgument, MakeKernBlockMap(kbm, CBlockMap(512, 0, 1, 9, 1, 8, 1, 0)));
260 // Code length in file must be greater than zero
261 test_equal(KErrArgument, MakeKernBlockMap(kbm, CBlockMap(512, 0, 0, 9, 0, 8, 1, 0)));
263 // Size of entries array must be multiple of the size of one entry
264 test_equal(KErrArgument, MakeKernBlockMap(kbm, CBlockMap(512, 0, 0, 9, 1, 9, 1, 0)));
266 // Size of entries must be non-zero
267 test_equal(KErrArgument, MakeKernBlockMap(kbm, CBlockMap(512, 0, 0, 9, 1, 0)));
269 // Size of block map must be greater or equal to size of data in file
270 test_equal(KErrArgument, MakeKernBlockMap(kbm, CBlockMap(512, 0, 0, 9, 513, 8, 1, 0)));
273 // blockGranularity, startOffset, blockZeroAddress, readUnitShift, codeLengthInFile, entriesSize, (numberOfBlocks, startBlock)+
275 void TestExtentList()
277 test.Next(_L("Test processing of user-side block map into extent list"));
279 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
280 // |= | | | | | | | | |
281 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
282 MakeKernBlockMapAndTestExtents(CBlockMap(512, 0, 0, 9, 1, 8, 1, 0),
283 CExtentList(1, 0, 0));
285 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
286 // | |= | | | | | | | |
287 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
288 MakeKernBlockMapAndTestExtents(CBlockMap(512, 0, 512, 9, 1, 8, 1, 0),
289 CExtentList(1, 0, 1));
291 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
292 // | | = | | | | | | | |
293 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
294 MakeKernBlockMapAndTestExtents(CBlockMap(512, 23, 512, 9, 1, 8, 1, 0),
295 CExtentList(1, -23, 1));
297 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
298 // | | | | = | | | | | |
299 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
300 MakeKernBlockMapAndTestExtents(CBlockMap(512, 23, 512, 9, 1, 8, 1, 2),
301 CExtentList(1, -23, 3));
303 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
304 // | | | | ======| | | | | |
305 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
306 MakeKernBlockMapAndTestExtents(CBlockMap(512, 23, 512, 9, 489, 8, 1, 2),
307 CExtentList(1, -23, 3));
309 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
310 // | | | | ======== | | | | |
311 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
312 MakeKernBlockMapAndTestExtents(CBlockMap(512, 23, 512, 9, 600, 8, 2, 2),
313 CExtentList(1, -23, 3));
315 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
316 // | | | | ==============| |== | | |
317 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
318 MakeKernBlockMapAndTestExtents(CBlockMap(512, 23, 512, 9, 1100, 16, 2, 2, 1, 5),
319 CExtentList(2, -23, 3, 1001, 6));
321 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
322 // | | | | ==============| |=======| | |
323 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
324 MakeKernBlockMapAndTestExtents(CBlockMap(512, 23, 512, 9, 1513, 16, 2, 2, 1, 5),
325 CExtentList(2, -23, 3, 1001, 6));
327 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
328 // | | | | ==============| |=======|= | |
329 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
330 MakeKernBlockMapAndTestExtents(CBlockMap(512, 23, 512, 9, 1540, 16, 2, 2, 2, 5),
331 CExtentList(2, -23, 3, 1001, 6));
334 void TestExtentListScaled()
336 test.Next(_L("Test processing of user-side block map into extent list, block size > read unit size"));
338 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
339 // |= : | : | : | : | : | : | : | : | : |
340 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
341 MakeKernBlockMapAndTestExtents(CBlockMap(512, 0, 0, 8, 1, 8, 1, 0),
342 CExtentList(1, 0, 0));
344 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
345 // | : |= : | : | : | : | : | : | : | : |
346 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
347 MakeKernBlockMapAndTestExtents(CBlockMap(512, 0, 512, 8, 1, 8, 1, 0),
348 CExtentList(1, 0, 2));
350 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
351 // | : | = : | : | : | : | : | : | : | : |
352 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
353 MakeKernBlockMapAndTestExtents(CBlockMap(512, 23, 512, 8, 1, 8, 1, 0),
354 CExtentList(1, -23, 2));
356 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
357 // | : | : = | : | : | : | : | : | : | : |
358 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
359 MakeKernBlockMapAndTestExtents(CBlockMap(512, 280, 512, 8, 1, 8, 1, 0),
360 CExtentList(1, -24, 3));
362 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
363 // | : | : | : | : = | : | : | : | : | : |
364 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
365 MakeKernBlockMapAndTestExtents(CBlockMap(512, 280, 512, 8, 1, 8, 1, 2),
366 CExtentList(1, -24, 7));
368 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
369 // | : | : | : | : ==| : | : | : | : | : |
370 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
371 MakeKernBlockMapAndTestExtents(CBlockMap(512, 280, 512, 8, 232, 8, 1, 2),
372 CExtentList(1, -24, 7));
374 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
375 // | : | : | : | : ==== : | : | : | : | : |
376 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
377 MakeKernBlockMapAndTestExtents(CBlockMap(512, 280, 512, 8, 333, 8, 2, 2),
378 CExtentList(1, -24, 7));
380 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
381 // | : | : | : | : ======== | : | : | : | : |
382 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
383 MakeKernBlockMapAndTestExtents(CBlockMap(512, 280, 512, 8, 666, 8, 2, 2),
384 CExtentList(1, -24, 7));
386 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
387 // | : | : | : | : ==========| : | : | : | : |
388 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
389 MakeKernBlockMapAndTestExtents(CBlockMap(512, 280, 512, 8, 744, 8, 2, 2),
390 CExtentList(1, -24, 7));
392 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
393 // | : | : | : | : ==========| : |== : | : | : |
394 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
395 MakeKernBlockMapAndTestExtents(CBlockMap(512, 280, 512, 8, 888, 16, 2, 2, 1, 5),
396 CExtentList(2, -24, 7, 744, 12));
398 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
399 // | : | : | : | : ==========| : |=======| : | : |
400 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
401 MakeKernBlockMapAndTestExtents(CBlockMap(512, 280, 512, 8, 1256, 16, 2, 2, 1, 5),
402 CExtentList(2, -24, 7, 744, 12));
404 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
405 // | : | : | : | : ==========| : |========= : | : |
406 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
407 MakeKernBlockMapAndTestExtents(CBlockMap(512, 280, 512, 8, 1350, 16, 2, 2, 2, 5),
408 CExtentList(2, -24, 7, 744, 12));
411 /// Holds the expected arguments for one call to the read function
419 /// Holds a list of expected arguments for all calls to the read function
420 class CReadInfo : public CList<SReadEntry>
423 CReadInfo(TInt aReturnVal, TInt aCount, ...);
424 const SReadEntry& Next();
426 TInt ReturnVal() const { return iReturnVal; }
432 CReadInfo::CReadInfo(TInt aReturnVal, TInt aCount, ...)
433 : iPos(0), iReturnVal(aReturnVal)
436 VA_START(list, aCount);
440 const SReadEntry& CReadInfo::Next()
442 const CList<SReadEntry>& self = *this;
446 void CReadInfo::Done() const
448 test_equal(Count(), iPos);
451 TInt ReadFunc(TAny* aArg, TAny*, TLinAddr aBuffer, TInt aBlockNumber, TInt aBlockCount)
453 CReadInfo& info = *(CReadInfo*)aArg;
454 const SReadEntry& expected = info.Next();
455 test_equal(expected.iBuffer, aBuffer);
456 test_equal(expected.iBlockNumber, aBlockNumber);
457 test_equal(expected.iBlockCount, aBlockCount);
461 void TestRead(const TBlockMap& aBlockMap,
466 const CReadInfo& aExpected)
468 test_equal(aExpected.ReturnVal(),
469 aBlockMap.Read(aBuffer, aPos, aLength, aReadUnitShift, ReadFunc, (TAny*)&aExpected, (TAny*)NULL));
473 void TestReadErrors()
475 test.Next(_L("Test Read error checking"));
479 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
480 // |= | | | | | | | | |
481 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
482 test_noError(MakeKernBlockMap(kbm, CBlockMap(512, 0, 0, 9, 1, 8, 1, 0)));
484 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
485 // | : | : | : | : ==========| : |========= : | : |
486 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
487 test_noError(MakeKernBlockMap(kbm2, CBlockMap(512, 280, 512, 8, 1350, 16, 2, 2, 2, 5)));
489 // Test read start position is outside block map
490 TestRead(kbm, 0, 1, 1, 9, CReadInfo(KErrArgument, 0));
491 TestRead(kbm2, 0, 1350, 1, 8, CReadInfo(KErrArgument, 0));
493 // Test read start position is negative
494 TestRead(kbm, 0, -1, 1, 9, CReadInfo(KErrArgument, 0));
495 TestRead(kbm2, 0, -1, 1, 8, CReadInfo(KErrArgument, 0));
497 // Test read length exceeds block map length
498 TestRead(kbm, 0, 0, 2, 9, CReadInfo(KErrArgument, 1, 0, 0, 1));
499 TestRead(kbm2, 0, 1349, 2, 8, CReadInfo(KErrArgument, 1, 0, 14, 1));
504 test.Next(_L("Test Read"));
506 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
507 // |=======================| | | | | | |
508 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
511 test_noError(MakeKernBlockMap(kbm2, CBlockMap(512, 0, 0, 9, 1536, 8, 3, 0)));
513 // Test correct number of blocks read
514 TestRead(kbm2, 0, 0, 512, 9, CReadInfo(0, 1, 0, 0, 1));
515 TestRead(kbm2, 0, 0, 513, 9, CReadInfo(0, 1, 0, 0, 2));
516 TestRead(kbm2, 0, 0, 1024, 9, CReadInfo(0, 1, 0, 0, 2));
517 TestRead(kbm2, 0, 0, 1025, 9, CReadInfo(0, 1, 0, 0, 3));
518 TestRead(kbm2, 0, 0, 1536, 9, CReadInfo(0, 1, 0, 0, 3));
520 // Test start offset not aligned to read unit
521 TestRead(kbm2, 0, 1, 511, 9, CReadInfo(1, 1, 0, 0, 1));
522 TestRead(kbm2, 0, 256, 256, 9, CReadInfo(256, 1, 0, 0, 1));
523 TestRead(kbm2, 0, 511, 1, 9, CReadInfo(511, 1, 0, 0, 1));
524 TestRead(kbm2, 0, 513, 511, 9, CReadInfo(1, 1, 0, 1, 1));
525 TestRead(kbm2, 0, 1023, 1, 9, CReadInfo(511, 1, 0, 1, 1));
527 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
528 // |=======| |=======| |=======| | | | |
529 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
532 test_noError(MakeKernBlockMap(kbm, CBlockMap(512, 0, 0, 9, 1536, 24, 1, 0, 1, 3, 1, 5)));
534 // Test correct block selected for read
535 TestRead(kbm, 0, 0, 1, 9, CReadInfo(0, 1, 0, 0, 1));
536 TestRead(kbm, 0, 256, 1, 9, CReadInfo(256, 1, 0, 0, 1));
537 TestRead(kbm, 0, 511, 1, 9, CReadInfo(511, 1, 0, 0, 1));
538 TestRead(kbm, 0, 512, 1, 9, CReadInfo(0, 1, 0, 3, 1));
539 TestRead(kbm, 0, 768, 1, 9, CReadInfo(256, 1, 0, 3, 1));
540 TestRead(kbm, 0, 1023, 1, 9, CReadInfo(511, 1, 0, 3, 1));
541 TestRead(kbm, 0, 1535, 1, 9, CReadInfo(511, 1, 0, 5, 1));
543 // Test reading multiple blocks
544 TestRead(kbm, 0, 0, 513, 9, CReadInfo(0, 2, 0, 0, 1, 512, 3, 1));
545 TestRead(kbm, 0, 0, 1024, 9, CReadInfo(0, 2, 0, 0, 1, 512, 3, 1));
546 TestRead(kbm, 0, 0, 1025, 9, CReadInfo(0, 3, 0, 0, 1, 512, 3, 1, 1024, 5, 1));
547 TestRead(kbm, 0, 0, 1536, 9, CReadInfo(0, 3, 0, 0, 1, 512, 3, 1, 1024, 5, 1));
550 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
551 // | ====| |=======| |=======| | | | |
552 // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
555 test_noError(MakeKernBlockMap(kbm3, CBlockMap(512, 256, 0, 9, 1280, 24, 1, 0, 1, 3, 1, 5)));
557 // Test correct block selected for read
558 TestRead(kbm3, 0, 0, 1, 9, CReadInfo(256, 1, 0, 0, 1));
559 TestRead(kbm3, 0, 255, 1, 9, CReadInfo(511, 1, 0, 0, 1));
560 TestRead(kbm3, 0, 256, 1, 9, CReadInfo(0, 1, 0, 3, 1));
561 TestRead(kbm3, 0, 767, 1, 9, CReadInfo(511, 1, 0, 3, 1));
562 TestRead(kbm3, 0, 768, 1, 9, CReadInfo(0, 1, 0, 5, 1));
564 // Test reading multiple blocks
565 TestRead(kbm3, 0, 0, 256, 9, CReadInfo(256, 1, 0, 0, 1));
566 TestRead(kbm3, 0, 0, 257, 9, CReadInfo(256, 2, 0, 0, 1, 512, 3, 1));
567 TestRead(kbm3, 0, 0, 768, 9, CReadInfo(256, 2, 0, 0, 1, 512, 3, 1));
568 TestRead(kbm3, 0, 0, 769, 9, CReadInfo(256, 3, 0, 0, 1, 512, 3, 1, 1024, 5, 1));
569 TestRead(kbm3, 0, 0, 1280, 9, CReadInfo(256, 3, 0, 0, 1, 512, 3, 1, 1024, 5, 1));
575 test.Start(_L("Unit tests the TKernBlockMap class"));
577 TestInitialiseErrors();
579 TestExtentListScaled();