--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/f32test/server/t_dircache.cpp Tue Aug 31 16:34:26 2010 +0300
@@ -0,0 +1,612 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// f32test\server\t_dircache.cpp
+//
+//
+#define __E32TEST_EXTENSION__
+#include <f32file.h>
+#include <f32fsys.h>
+#include <e32test.h>
+#include <f32dbg.h>
+#include "t_server.h"
+#include "t_chlffs.h"
+#include "f32_test_utils.h"
+#include "fat_utils.h"
+#include "d_pagestress.h"
+
+RTest test(_L("T_DIRCACHE"));
+
+/*
+ * This whole test execute on UDEB mode only.
+ */
+#if defined(_DEBUG) || defined(_DEBUG_RELEASE)
+
+TInt gDrive=-1;
+const TInt32 KDef_KLeafDirCacheSize = 32; // default leaf dir cache number
+const TInt32 KDef_DynamicDirCacheMinInBytes = 128 << 10; // default minimum fat dir cache size in bytes
+const TInt32 KDef_DynamicDirCacheMaxInBytes = 256 << 10; // default maximum fat dir cache size in bytes
+const TInt32 KDef_MaxDynamicDirCachePageSzLog2 = 14; // default value for directory cache single page
+ // maximal size Log2, 2^14 (16K) by default
+const TInt32 KMaxThreadCount = 1; // the maximum number of multiple threads that can
+ // access dir cache concurrently.
+const TInt32 KSegmentSize = 1 << 12; // the smallest memory unit that Kernel manages
+
+template <class C>
+TInt controlIo(RFs &fs, TInt drv, TInt fkn, C &c)
+ {
+ TPtr8 ptrC((TUint8 *)&c, sizeof(C), sizeof(C));
+
+ TInt r = fs.ControlIo(drv, fkn, ptrC);
+
+ return r;
+ }
+
+// See f32\sfile\sf_memory_man.cpp for the default value settings
+const TInt KDefaultGlobalCacheMemorySize = (8 << 10) << 10;
+const TInt KDefaultLowMemoryThreshold = 10;
+//----------------------------------------------------------------------------------------------
+//@SYMTestCaseID PBASE-XXXX
+//@SYMTestType FT
+//@SYMPREQ PREQ1885
+//@SYMTestCaseDesc Check global cache settings. The global cache should be either:
+// 1. 0 (disabled)
+// 2. no less than the sum of all per-drive settings
+//----------------------------------------------------------------------------------------------
+void TestGlobalSettings()
+ {
+ test.Next(_L("Test global cache settings"));
+ // read global cache settings from estart.txt
+ TGlobalCacheConfig globalCacheConfig;
+ TInt r = controlIo(TheFs,gDrive, KControlIoGlobalCacheConfig, globalCacheConfig);
+ test_KErrNone(r);
+ test_Value (globalCacheConfig.iGlobalCacheSizeInBytes,
+ globalCacheConfig.iGlobalCacheSizeInBytes > 0 || globalCacheConfig.iGlobalCacheSizeInBytes == KErrNotFound);
+ test_Value (globalCacheConfig.iGlobalLowMemoryThreshold,
+ globalCacheConfig.iGlobalLowMemoryThreshold >= 0 || globalCacheConfig.iGlobalLowMemoryThreshold == KErrNotFound);
+
+ const TInt32 globalCacheSize = globalCacheConfig.iGlobalCacheSizeInBytes > 0 ?
+ globalCacheConfig.iGlobalCacheSizeInBytes : KDefaultGlobalCacheMemorySize;
+
+ // test if global cache is enabled, it is configured in the way that its figure is no less
+ // than the sum of per-drive max size settings (taking default values into account).
+ TInt32 sumDirCacheMaxSize = 0;
+ for (TInt i = 0; i < KMaxDrives; i++)
+ {
+ TBuf<0x20> fsName;
+ r = TheFs.FileSystemName(fsName, i);
+
+ if (r == KErrNone && (F32_Test_Utils::Is_Fat(TheFs, i) || F32_Test_Utils::Is_ExFat(TheFs, i)))
+ {
+ test.Printf(_L("drive[%C:] file system: (\"%S\")\n"), 'A' + i, &fsName);
+ TDirCacheConfig dirCacheConfig;
+ r = controlIo(TheFs,gDrive, KControlIoDirCacheConfig, dirCacheConfig);
+ test_KErrNone(r);
+ if(dirCacheConfig.iDirCacheSizeMax > 0)
+ {
+ sumDirCacheMaxSize += (dirCacheConfig.iDirCacheSizeMax > KDef_DynamicDirCacheMaxInBytes ? dirCacheConfig.iDirCacheSizeMax : KDef_DynamicDirCacheMaxInBytes);
+ }
+ else
+ {
+ sumDirCacheMaxSize += KDef_DynamicDirCacheMaxInBytes;
+ }
+ test.Printf(_L("++sumDirCacheMaxSize = %d\n"), sumDirCacheMaxSize);
+ }
+ }
+ test_Compare(globalCacheSize, >=, sumDirCacheMaxSize);
+ }
+
+//----------------------------------------------------------------------------------------------
+//@SYMTestCaseID PBASE-XXXX
+//@SYMTestType FT
+//@SYMPREQ PREQ1885
+//@SYMTestCaseDesc Test current drive's dir cache configurations, the current dir cache info should
+// match the configurations read from estart.txt file.
+//----------------------------------------------------------------------------------------------
+void TestDirCacheSettings()
+ {
+ test.Next(_L("Test current drive's dir cache settings"));
+
+ // test global cache config is ON
+ TGlobalCacheConfig globalCacheConfig;
+ TInt r = controlIo(TheFs,gDrive, KControlIoGlobalCacheConfig, globalCacheConfig);
+ test_KErrNone(r);
+ test_Value (globalCacheConfig.iGlobalCacheSizeInBytes,
+ globalCacheConfig.iGlobalCacheSizeInBytes > 0 || globalCacheConfig.iGlobalCacheSizeInBytes == KErrNotFound);
+ test_Value (globalCacheConfig.iGlobalLowMemoryThreshold,
+ globalCacheConfig.iGlobalLowMemoryThreshold >= 0 || globalCacheConfig.iGlobalLowMemoryThreshold == KErrNotFound);
+
+ // test global cache info is corresponding to the configurations
+ TGlobalCacheInfo globalCacheInfo;
+ r = controlIo(TheFs,gDrive, KControlIoGlobalCacheInfo, globalCacheInfo);
+ test_KErrNone(r);
+
+ if (globalCacheConfig.iGlobalCacheSizeInBytes == KErrNotFound)
+ {
+ test_Equal(KDefaultGlobalCacheMemorySize, globalCacheInfo.iGlobalCacheSizeInBytes);
+ }
+ else
+ {
+ test_Equal(globalCacheConfig.iGlobalCacheSizeInBytes, globalCacheInfo.iGlobalCacheSizeInBytes);
+ }
+
+ if (globalCacheConfig.iGlobalLowMemoryThreshold == KErrNotFound)
+ {
+ test_Equal(KDefaultLowMemoryThreshold, globalCacheInfo.iGlobalLowMemoryThreshold);
+ }
+ else
+ {
+ test_Equal(globalCacheConfig.iGlobalLowMemoryThreshold, globalCacheInfo.iGlobalLowMemoryThreshold);
+ }
+
+ // read per-drive settings from estart.txt
+ TDirCacheConfig dirCacheConfig;
+ r = controlIo(TheFs,gDrive, KControlIoDirCacheConfig, dirCacheConfig);
+ test_KErrNone(r);
+ test_Value (dirCacheConfig.iLeafDirCacheSize,
+ dirCacheConfig.iLeafDirCacheSize >= 0 || dirCacheConfig.iLeafDirCacheSize == KErrNotFound);
+ test_Value (dirCacheConfig.iDirCacheSizeMin,
+ dirCacheConfig.iDirCacheSizeMin >= 0 || dirCacheConfig.iDirCacheSizeMin == KErrNotFound);
+ test_Value (dirCacheConfig.iDirCacheSizeMax,
+ dirCacheConfig.iDirCacheSizeMax >= 0 || dirCacheConfig.iDirCacheSizeMax == KErrNotFound);
+
+ // caculate expected settings according to the readings from estart.txt
+ if (dirCacheConfig.iLeafDirCacheSize == 0)
+ dirCacheConfig.iLeafDirCacheSize = 1;
+ if (dirCacheConfig.iLeafDirCacheSize == KErrNotFound)
+ dirCacheConfig.iLeafDirCacheSize = KDef_KLeafDirCacheSize;
+ if (dirCacheConfig.iDirCacheSizeMin < KDef_DynamicDirCacheMinInBytes)
+ dirCacheConfig.iDirCacheSizeMin = KDef_DynamicDirCacheMinInBytes;
+ if (dirCacheConfig.iDirCacheSizeMax < KDef_DynamicDirCacheMaxInBytes)
+ dirCacheConfig.iDirCacheSizeMax = KDef_DynamicDirCacheMaxInBytes;
+
+ TVolumeIOParamInfo ioParam;
+ r = TheFs.VolumeIOParam(gDrive, ioParam);
+ test_KErrNone(r);
+ const TInt32 KClusterSize = ioParam.iClusterSize;
+ test.Printf(_L("DRV[%C:] cluster = %d\n"), gDrive + 'A', ioParam.iClusterSize);
+
+ const TInt32 KDefMaxCachePageSize = 1 << KDef_MaxDynamicDirCachePageSzLog2;
+ const TInt32 KPageSizeInData = KClusterSize < KDefMaxCachePageSize ? KClusterSize : KDefMaxCachePageSize;
+ const TInt32 KPageSizeInMem = KPageSizeInData < KSegmentSize ? KSegmentSize : KPageSizeInData;
+ const TInt32 KCacheSizeMinInPages = dirCacheConfig.iDirCacheSizeMin / KPageSizeInMem;
+ const TInt32 KCacheSizeMaxInPages = dirCacheConfig.iDirCacheSizeMax / KPageSizeInMem;
+ const TInt32 KUnlockedPageNum = 0;
+
+ // remount drive, get current dir cache info and test
+ r = F32_Test_Utils::RemountFS (TheFs, CurrentDrive(), NULL);
+ test_KErrNone(r);
+
+ TDirCacheInfo dirCacheInfo;
+ r = controlIo(TheFs,gDrive, KControlIoDirCacheInfo, dirCacheInfo);
+ test_KErrNone(r);
+
+ test_Equal(KSegmentSize, dirCacheInfo.iMemorySegmentSize);
+ test_Equal(KPageSizeInMem, dirCacheInfo.iPageSizeInMemory);
+ test_Equal(KPageSizeInData, dirCacheInfo.iPageSizeInData);
+ test_Equal(KCacheSizeMinInPages, dirCacheInfo.iMinCacheSizeInPages);
+ test_Equal(KCacheSizeMaxInPages, dirCacheInfo.iMaxCacheSizeInPages);
+ test_Equal(KMaxThreadCount, dirCacheInfo.iLockedPageNumber);
+ test_Equal(KUnlockedPageNum, dirCacheInfo.iUnlockedPageNumber);
+ }
+
+//----------------------------------------------------------------------------------------------
+//@SYMTestCaseID PBASE-XXXX
+//@SYMTestType FT
+//@SYMPREQ PREQ1885
+//@SYMTestCaseDesc Test populating dir cache under normal memory conditions.
+//----------------------------------------------------------------------------------------------
+void TestPopulateCache()
+ {
+ test.Next(_L("Test populating dir cache under normal memory conditions"));
+
+ CFileMan* fileMan = CFileMan::NewL(TheFs);
+ test_NotNull(fileMan);
+ TInt r = fileMan->RmDir(_L("\\TEST_DIRCACHE\\"));
+ test_Value(r, r==KErrNone || r==KErrPathNotFound);
+
+ // remount drive, get current dir cache info
+ r = F32_Test_Utils::RemountFS (TheFs, CurrentDrive(), NULL);
+ test_KErrNone(r);
+
+ /*
+ * Test populating dir cache
+ */
+ TVolumeIOParamInfo ioParam;
+ r = TheFs.VolumeIOParam(gDrive, ioParam);
+ test_KErrNone(r);
+ const TInt32 KClusterSize = ioParam.iClusterSize;
+
+ TFileName dirPath = _L("\\TEST_DIRCACHE\\");
+ r = TheFs.MkDirAll(dirPath);
+ test_KErrNone(r);
+
+ TDirCacheInfo dirCacheInfo;
+ r = controlIo(TheFs,gDrive, KControlIoDirCacheInfo, dirCacheInfo);
+ test_KErrNone(r);
+
+ // this calculation is for volumes that have a large cluster size, larger than the allowed maximum
+ // page size. on this case, creating a new directory will generate two or more new pages in the
+ // dir cache
+ const TUint pagesPerDir = KClusterSize > dirCacheInfo.iPageSizeInMemory ?
+ KClusterSize / dirCacheInfo.iPageSizeInMemory : 1;
+
+ // should be KMaxThreadCount + root dir (1 page) + "\\TEST_DIRCACHE\\" (number of pages that are
+ // needed for new directories, i.e. pagesPerDir)
+ test_Equal(KMaxThreadCount + 1 + pagesPerDir, dirCacheInfo.iLockedPageNumber);
+
+ const TInt initialUnlockedPage = dirCacheInfo.iUnlockedPageNumber;
+
+ const TInt createdNewDirs = dirCacheInfo.iMinCacheSizeInPages - dirCacheInfo.iLockedPageNumber;
+ // create directories so that it grows to KCacheSizeMinInPages
+ for (TInt i = 1; i <= createdNewDirs; i++)
+ {
+ dirPath = _L("\\TEST_DIRCACHE\\");
+ TFileName dirName;
+ dirName.Format(_L("DIR%d\\"), i);
+ dirPath += dirName;
+ r = TheFs.MkDirAll(dirPath);
+ test_KErrNone(r);
+ }
+
+ const TInt KFatDirEntrySize = 32;
+ const TInt subDirNum = dirCacheInfo.iMinCacheSizeInPages - dirCacheInfo.iLockedPageNumber;
+ // calculate the extra pages needed for the newly created sub dir entries (plus the original
+ // "." and ".." entries)
+ TInt extraPagesForLeafdir = ((subDirNum + 2) * KFatDirEntrySize / dirCacheInfo.iPageSizeInData) - 1;
+ if (((subDirNum + 2) * KFatDirEntrySize) % dirCacheInfo.iPageSizeInData > 0)
+ extraPagesForLeafdir++;
+ test.Printf(_L("!!Extra pages needed for leafdir = %d\n"), extraPagesForLeafdir); //kk
+
+ r = controlIo(TheFs,gDrive, KControlIoDirCacheInfo, dirCacheInfo);
+ test_KErrNone(r);
+ r = controlIo(TheFs,gDrive, 15, dirCacheInfo);
+ test_KErrNone(r);
+
+ test_Equal(dirCacheInfo.iMinCacheSizeInPages, dirCacheInfo.iLockedPageNumber);
+
+ const TInt maxUnlockedPage = dirCacheInfo.iMaxCacheSizeInPages - dirCacheInfo.iMinCacheSizeInPages;
+ // calculating the expected unlocked page number here.
+ TInt newUnlockedPage = initialUnlockedPage;
+ newUnlockedPage += extraPagesForLeafdir; // if any extra pages are created for the leafdir
+ newUnlockedPage += createdNewDirs * (pagesPerDir - 1); // if more than one page is needed for each dir creation
+ test_Equal((newUnlockedPage > maxUnlockedPage ? maxUnlockedPage : newUnlockedPage), dirCacheInfo.iUnlockedPageNumber);
+
+ // create directories so that it grows to KCacheSizeMinInPages + KCacheSizeMaxInPages
+ if (dirCacheInfo.iMaxCacheSizeInPages > dirCacheInfo.iMinCacheSizeInPages)
+ {
+ for (TInt i = 1; i <= dirCacheInfo.iMaxCacheSizeInPages - dirCacheInfo.iMinCacheSizeInPages; i++)
+ {
+ dirPath = _L("\\TEST_DIRCACHE\\");
+ TFileName dirName;
+ dirName.Format(_L("DIR_UNLOCKED%d\\"), i);
+ dirPath += dirName;
+ r = TheFs.MkDirAll(dirPath);
+ test_KErrNone(r);
+ }
+ r = controlIo(TheFs,gDrive, KControlIoDirCacheInfo, dirCacheInfo);
+ test_KErrNone(r);
+ r = controlIo(TheFs,gDrive, 15, dirCacheInfo);
+ test_KErrNone(r);
+
+ test_Equal(dirCacheInfo.iMinCacheSizeInPages, dirCacheInfo.iLockedPageNumber);
+
+ test_Equal(dirCacheInfo.iMaxCacheSizeInPages - dirCacheInfo.iMinCacheSizeInPages, dirCacheInfo.iUnlockedPageNumber);
+ }
+
+ // create more directories and check that dir cache doesn't grow beyond KCacheSizeMaxInPages
+ for (TInt j = 1; j <= dirCacheInfo.iMinCacheSizeInPages; j++)
+ {
+ dirPath = _L("\\TEST_DIRCACHE\\");
+ TFileName dirName;
+ dirName.Format(_L("DIR_MORE%d\\"), j);
+ dirPath += dirName;
+ r = TheFs.MkDirAll(dirPath);
+ test_KErrNone(r);
+ }
+ r = controlIo(TheFs,gDrive, KControlIoDirCacheInfo, dirCacheInfo);
+ test_KErrNone(r);
+ r = controlIo(TheFs,gDrive, 15, dirCacheInfo);
+ test_KErrNone(r);
+
+ test_Equal(dirCacheInfo.iMinCacheSizeInPages, dirCacheInfo.iLockedPageNumber);
+ test_Equal(dirCacheInfo.iMaxCacheSizeInPages - dirCacheInfo.iMinCacheSizeInPages, dirCacheInfo.iUnlockedPageNumber);
+
+ r = controlIo(TheFs,gDrive, KControlIoDirCacheInfo, dirCacheInfo);
+ test_KErrNone(r);
+
+ r = fileMan->RmDir(_L("\\TEST_DIRCACHE\\"));
+ test_KErrNone(r);
+
+ delete fileMan;
+ }
+
+//----------------------------------------------------------------------------------------------
+//@SYMTestCaseID PBASE-XXXX
+//@SYMTestType FT
+//@SYMPREQ PREQ1885
+//@SYMTestCaseDesc Test simulating low memory condition.
+// 1. The cache should stop growing when it is at its minimum cache size in pages
+// 2. The cache should function properly when it stops simulating low memory condition
+//----------------------------------------------------------------------------------------------
+void TestSimulatingLowMemory()
+ {
+ // remount drive, get current dir cache info and test
+ test.Next(_L("Test dir cache growth when simulating low memory condition"));
+
+ CFileMan* fileMan = CFileMan::NewL(TheFs);
+ test(fileMan != NULL);
+ TInt r = fileMan->RmDir(_L("\\TEST_DIRCACHE\\"));
+ test_Value(r, r==KErrNone || r==KErrPathNotFound);
+
+ r = F32_Test_Utils::RemountFS (TheFs, CurrentDrive(), NULL);
+ test_KErrNone(r);
+
+ r = TheFs.ControlIo(gDrive, KControlIoSimulateMemoryLow);
+ test_KErrNone(r);
+
+ /*
+ * Test populating dir cache
+ */
+ TFileName dirPath = _L("\\TEST_DIRCACHE\\");
+ r = TheFs.MkDirAll(dirPath);
+ test_KErrNone(r);
+
+ TDirCacheInfo dirCacheInfo;
+ r = controlIo(TheFs,gDrive, KControlIoDirCacheInfo, dirCacheInfo);
+ test_KErrNone(r);
+
+ // create directories so that it grows to KCacheSizeMaxInPages
+ for (TInt i = 1; i <= dirCacheInfo.iMaxCacheSizeInPages; i++)
+ {
+ dirPath = _L("\\TEST_DIRCACHE\\");
+ TFileName dirName;
+ dirName.Format(_L("DIR%d\\"), i);
+ dirPath += dirName;
+ r = TheFs.MkDirAll(dirPath);
+ test_KErrNone(r);
+ }
+
+ r = controlIo(TheFs,gDrive, KControlIoDirCacheInfo, dirCacheInfo);
+ test_KErrNone(r);
+
+ test_Equal(dirCacheInfo.iMinCacheSizeInPages, dirCacheInfo.iLockedPageNumber);
+ test_Equal(0, dirCacheInfo.iUnlockedPageNumber);
+
+ r = fileMan->RmDir(_L("\\TEST_DIRCACHE\\"));
+ test_KErrNone(r);
+
+ // test when stop simulating the low memory condition, cache grows normally
+ test.Next(_L("Test dir cache growth when stop simulating low memory condition"));
+ r = TheFs.ControlIo(gDrive, KControlIoStopSimulateMemoryLow);
+ test_KErrNone(r);
+
+ r = F32_Test_Utils::RemountFS (TheFs, CurrentDrive(), NULL);
+ test_KErrNone(r);
+
+ /*
+ * Test populating dir cache
+ */
+ dirPath = _L("\\TEST_DIRCACHE\\");
+ r = TheFs.MkDirAll(dirPath);
+ test_KErrNone(r);
+
+ // create directories so that it grows to KCacheSizeMaxInPages
+ for (TInt j = 1; j <= dirCacheInfo.iMaxCacheSizeInPages; j++)
+ {
+ dirPath = _L("\\TEST_DIRCACHE\\");
+ TFileName dirName;
+ dirName.Format(_L("DIR%d\\"), j);
+ dirPath += dirName;
+ r = TheFs.MkDirAll(dirPath);
+ test_KErrNone(r);
+ }
+
+ r = controlIo(TheFs,gDrive, KControlIoDirCacheInfo, dirCacheInfo);
+ test_KErrNone(r);
+
+ test_Equal(dirCacheInfo.iMinCacheSizeInPages, dirCacheInfo.iLockedPageNumber);
+ test_Equal(dirCacheInfo.iMaxCacheSizeInPages - dirCacheInfo.iMinCacheSizeInPages, dirCacheInfo.iUnlockedPageNumber);
+
+ r = fileMan->RmDir(_L("\\TEST_DIRCACHE\\"));
+ test_KErrNone(r);
+
+ delete fileMan;
+ }
+
+//----------------------------------------------------------------------------------------------
+//@SYMTestCaseID PBASE-XXXX
+//@SYMTestType FT
+//@SYMPREQ PREQ1885
+//@SYMTestCaseDesc Test low memory threshold on hardware platforms
+// 1. Stress the system memory to below the low memory threshold configured
+// 2. The cache should stop growing when it is at its minimum cache size in pages
+// 3. Resume the system memory before step 1.
+// 2. The cache should function properly when it stops simulating low memory condition
+//----------------------------------------------------------------------------------------------
+void TestLowMemoryHW()
+ {
+ test.Next(_L("Test low memory threshold on hardware"));
+#if !defined(__WINS__)
+
+ CFileMan* fileMan = CFileMan::NewL(TheFs);
+ test_NotNull(fileMan);
+ TInt r = fileMan->RmDir(_L("\\TEST_DIRCACHE\\"));
+ test_Value(r, r==KErrNone || r==KErrPathNotFound);
+
+ r = F32_Test_Utils::RemountFS (TheFs, CurrentDrive(), NULL);
+ test_KErrNone(r);
+
+ RPageStressTestLdd PagestressLdd;
+ TMemoryInfoV1Buf memInfo;
+ r = UserHal::MemoryInfo(memInfo);
+ test_KErrNone(r);
+
+ TGlobalCacheInfo globalCacheInfo;
+ r = controlIo(TheFs,gDrive, KControlIoGlobalCacheInfo, globalCacheInfo);
+ test_KErrNone(r);
+
+ test.Printf(_L("Free RAM before setup %d\n"), memInfo().iFreeRamInBytes);
+ const TReal lowMemThreshold = globalCacheInfo.iGlobalLowMemoryThreshold / 200.00;
+ test.Printf(_L("Low memory threshold = %d%%\n"), globalCacheInfo.iGlobalLowMemoryThreshold);
+ test.Printf(_L("Current memory available = %d%%\n"), lowMemThreshold * 100);
+
+ const TInt totalRamInBytes = memInfo().iTotalRamInBytes;
+ const TInt setupFreeRamInBytes = (TInt) (lowMemThreshold * totalRamInBytes);
+ const TInt setupFreeRamInPages = setupFreeRamInBytes / KSegmentSize;
+
+ r = User::LoadLogicalDevice(KPageStressTestLddName);
+ test_Value(r, r==KErrNone || r==KErrAlreadyExists);
+ r = PagestressLdd.Open();
+ test_KErrNone(r);
+ r = PagestressLdd.DoSetDebugFlag((TInt)ETrue);
+ test_KErrNone(r);
+ if (setupFreeRamInPages > 0 && setupFreeRamInBytes < totalRamInBytes)
+ {
+ r = PagestressLdd.DoConsumeRamSetup(setupFreeRamInPages, 1);
+ test_KErrNone(r);
+ r = UserHal::MemoryInfo(memInfo);
+ test_KErrNone(r);
+ test.Printf(_L("Free RAM after setup %d\n"), memInfo().iFreeRamInBytes);
+ }
+ else
+ {
+ test.Printf(_L("Current memory is already low: %d\n"), memInfo().iFreeRamInBytes);
+ }
+
+ /*
+ * Test populating dir cache
+ */
+ TFileName dirPath = _L("\\TEST_DIRCACHE\\");
+ r = TheFs.MkDirAll(dirPath);
+ test_KErrNone(r);
+
+ TDirCacheInfo dirCacheInfo;
+ r = controlIo(TheFs,gDrive, KControlIoDirCacheInfo, dirCacheInfo);
+ test_KErrNone(r);
+
+ // create directories so that it grows to KCacheSizeMaxInPages
+ for (TInt i = 1; i <= dirCacheInfo.iMaxCacheSizeInPages; i++)
+ {
+ dirPath = _L("\\TEST_DIRCACHE\\");
+ TFileName dirName;
+ dirName.Format(_L("DIR%d\\"), i);
+ dirPath += dirName;
+ r = TheFs.MkDirAll(dirPath);
+ test_KErrNone(r);
+ }
+
+ r = controlIo(TheFs,gDrive, KControlIoDirCacheInfo, dirCacheInfo);
+ test_KErrNone(r);
+
+ test_Equal(dirCacheInfo.iMinCacheSizeInPages, dirCacheInfo.iLockedPageNumber);
+ test_Equal(0, dirCacheInfo.iUnlockedPageNumber);
+
+ // release memory
+ PagestressLdd.DoConsumeRamFinish();
+ PagestressLdd.Close();
+ r = User::FreeLogicalDevice(KPageStressTestLddName);
+ test_KErrNone(r);
+
+ r = UserHal::MemoryInfo(memInfo);
+ test_KErrNone(r);
+ test.Printf(_L("Free RAM after test %d\n"), memInfo().iFreeRamInBytes);
+
+ r = fileMan->RmDir(_L("\\TEST_DIRCACHE\\"));
+ test_KErrNone(r);
+ delete fileMan;
+#else
+ test.Printf(_L("This test step only runs on hardware!!\n"));
+#endif //#if !defined(__WINS__)
+ }
+
+#endif // #if defined(_DEBUG) || defined(_DEBUG_RELEASE)
+
+GLDEF_C void CallTestsL()
+//
+// Test the file server.
+//
+ {
+#if defined(_DEBUG) || defined(_DEBUG_RELEASE)
+ TInt nRes=TheFs.CharToDrive(gDriveToTest, gDrive);
+ test_KErrNone(nRes);
+
+ TDriveInfo driveInfo;
+ nRes = TheFs.Drive(driveInfo, gDrive);
+ test.Printf(_L("MediaType: 0x%x\n"), driveInfo.iType);
+ test_KErrNone(nRes);
+
+ if (F32_Test_Utils::Is_Fat(TheFs, gDrive) && driveInfo.iType != EMediaRam)
+ {
+ nRes = F32_Test_Utils::FormatDrive(TheFs, gDrive, ETrue);
+ test_KErrNone(nRes);
+
+ F32_Test_Utils::PrintDrvInfo(TheFs, gDrive);
+
+ TVolumeInfo v;
+ TInt r=TheFs.Volume(v, CurrentDrive());
+ test_KErrNone(r);
+
+ CreateTestDirectory(_L("\\F32-TST\\TDIRCACHE\\"));
+
+ TestGlobalSettings();
+ TestDirCacheSettings();
+ TestPopulateCache();
+ TestSimulatingLowMemory();
+ TestLowMemoryHW();
+
+ DeleteTestDirectory();
+ }
+ else
+ {
+ test.Printf(_L("This test executes on FAT drives and non-RAM media only!!\n"));
+ }
+#else
+ test.Printf(_L("This test executes on DEBUG mode only!!\n"));
+#endif //#if defined(_DEBUG) || defined(_DEBUG_RELEASE)
+ }
+
+/*
+void TestReadEstart()
+ {
+ TDirCacheConfig dirCacheConfig;
+ TInt r = controlIo(TheFs,gDrive, KControlIoDirCacheConfig, dirCacheConfig);
+ test_KErrNone(r);
+ test.Printf(_L("Dir cache: \n Drive %C \n iLeafDirCacheSize %d \n iDirCacheSizeMin %d \n iDirCacheSizeMax %d \n iGlobalCacheMemorySize %d \n iLowMemoryThreshold %%%d"),
+ dirCacheConfig.iDrive + 'A',
+ dirCacheConfig.iLeafDirCacheSize,
+ dirCacheConfig.iDirCacheSizeMin,
+ dirCacheConfig.iDirCacheSizeMax);
+ }
+
+*/
+
+// const TInt KControlIoGlobalCacheConfig=KMaxTInt-21;
+// const TInt KControlIoGlobalCacheInfo=KMaxTInt-22;
+// const TInt KControlIoDirCacheConfig=KMaxTInt-23;
+// const TInt KControlIoDirCacheInfo=KMaxTInt-24;
+//
+//class TGlobalCacheConfig
+//class TGlobalCacheInfo
+//class TDirCacheConfig
+//class TDirCacheInfo
+
+// this test is for FAT only!!
+//if (F32_Test_Utils::Is_ExFat(TheFs, gDrive))
+// {
+// // test cluster size
+// TVolumeIOParamInfo ioParam;
+// TInt r = TheFs.VolumeIOParam(gDrive, ioParam);
+// test.Printf(_L("TheFs.VolumeIOParam for EXFAT: (cluster = %d) = %d\n"), ioParam.iClusterSize, r);
+// }
+//