/** @SYMTestCaseID PDS-SQL-UT-4141 @SYMTestCaseDesc RFileBuf64::SetReadAheadSize() test. The test iterates over all existing drives. For each R/W drive a test file is created using RFileBuf64 class. Then the test collects information regarding the block size, cluster size and read buffer size and calls RFileBuf64::SetReadAheadSize() with these parameters to check how the read-ahead buffer size will be recalculated. @SYMTestActions RFileBuf64::SetReadAheadSize() test. @SYMTestExpectedResults Test must not fail @SYMTestPriority High @SYMREQ REQ12106 REQ12109 */ void SetReadAheadSizeTest() { TheTest.Printf(_L("==================\r\n")); _LIT(KType1, "Not present"); _LIT(KType2, "Unknown"); _LIT(KType3, "Floppy"); _LIT(KType4, "Hard disk"); _LIT(KType5, "CD ROM"); _LIT(KType6, "RAM disk"); _LIT(KType7, "Flash"); _LIT(KType8, "ROM drive"); _LIT(KType9, "Remote drive"); _LIT(KType10,"NAND flash"); _LIT(KType11,"Rotating media"); for(TInt drive=EDriveA;drive<=EDriveZ;++drive) { TDriveInfo driveInfo; TInt err = TheFs.Drive(driveInfo, drive); if(err == KErrNone) { TVolumeInfo vinfo; err = TheFs.Volume(vinfo, drive); if(err == KErrNone) { TVolumeIOParamInfo vparam; err = TheFs.VolumeIOParam(drive, vparam); TEST2(err, KErrNone); TBuf8<128> vinfoex8; err = TheFs.QueryVolumeInfoExt(drive, EFileSystemSubType, vinfoex8); TEST2(err, KErrNone); TPtrC vinfoex((const TUint16*)(vinfoex8.Ptr() + 8), vinfoex8[0]); TPtrC KMediaTypeNames[] = {KType1(), KType2(), KType3(), KType4(), KType5(), KType6(), KType7(), KType8(), KType9(), KType10(), KType11()}; TheTest.Printf(_L("Drive: %C:, Type: %16.16S, File System: %8.8S, Size: %d Mb.\r\n"), 'A' + drive, &KMediaTypeNames[driveInfo.iType], &vinfoex, (TInt)(vinfo.iSize / (1024 * 1024))); TheTest.Printf(_L(" Size: %ld bytes.\r\n"), vinfo.iSize); TheTest.Printf(_L(" Block size=%d, Cluster size=%d, Read buffer size=%d.\r\n"), vparam.iBlockSize, vparam.iClusterSize, vparam.iRecReadBufSize); if(driveInfo.iType == EMediaRam || driveInfo.iType == EMediaHardDisk || driveInfo.iType == EMediaFlash || driveInfo.iType == EMediaNANDFlash) { TDriveUnit drvUnit(drive); TDriveName drvName = drvUnit.Name(); TParse parse; parse.Set(KTestFile2, &drvName, NULL); TheDbName.Copy(parse.FullName()); TRAP(err, BaflUtils::EnsurePathExistsL(TheFs, TheDbName)); if(err == KErrNone || err == KErrAlreadyExists) { (void)TheFs.Delete(TheDbName); RFileBuf64 fbuf64(8 * 1024); err = fbuf64.Create(TheFs, TheDbName, EFileRead | EFileWrite); TEST2(err, KErrNone); TInt readAhead = fbuf64.SetReadAheadSize(vparam.iBlockSize, vparam.iRecReadBufSize); TheTest.Printf(_L(" Read-ahead size=%d.\r\n"), readAhead); fbuf64.Close(); (void)TheFs.Delete(TheDbName); } else { TheTest.Printf(_L("Drive %C. BaflUtils::EnsurePathExistsL() has failed with err=%d.\r\n"), 'A' + drive, err); } } } else { TheTest.Printf(_L("Drive %C. RFs::Volume() has failed with err=%d.\r\n"), 'A' + drive, err); } } else { TheTest.Printf(_L("Drive %C. RFs::Drive() has failed with err=%d.\r\n"), 'A' + drive, err); } } TheTest.Printf(_L("==================\r\n")); // RFileBuf64 fbuf64(8 * 1024);//buffer capacity = 8Kb //"ReadRecBufSize" defined and is power of two, the "BlockSize" is also defined and is power of two TInt err2 = fbuf64.Create(TheFs, TheDbName, EFileRead | EFileWrite); TEST2(err2, KErrNone); TInt blockSize = 4096; TInt readRecBufSize = 2048; TInt readAhead2 = fbuf64.SetReadAheadSize(blockSize, readRecBufSize); TEST2(readAhead2, readRecBufSize); fbuf64.Close(); //"ReadRecBufSize" defined and is power of two but is less than the default read-ahead value err2 = fbuf64.Open(TheFs, TheDbName, EFileRead | EFileWrite); TEST2(err2, KErrNone); blockSize = 0; readRecBufSize = 128; readAhead2 = fbuf64.SetReadAheadSize(blockSize, readRecBufSize); TEST2(readAhead2, RFileBuf64::KDefaultReadAheadSize); fbuf64.Close(); //"ReadRecBufSize" defined and is power of two but is bigger than the buffer capacity err2 = fbuf64.Open(TheFs, TheDbName, EFileRead | EFileWrite); TEST2(err2, KErrNone); blockSize = -10; readRecBufSize = fbuf64.iCapacity * 2; readAhead2 = fbuf64.SetReadAheadSize(blockSize, readRecBufSize); TEST2(readAhead2, fbuf64.iCapacity); fbuf64.Close(); //"ReadRecBufSize" defined but is not power of two, "BlockSize" defined but is less than the default read-ahead value err2 = fbuf64.Open(TheFs, TheDbName, EFileRead | EFileWrite); TEST2(err2, KErrNone); blockSize = 512; readRecBufSize = 4000; readAhead2 = fbuf64.SetReadAheadSize(blockSize, readRecBufSize); TEST2(readAhead2, RFileBuf64::KDefaultReadAheadSize); fbuf64.Close(); //"ReadRecBufSize" defined but is not power of two, "BlockSize" defined and is bigger than the default read-ahead value err2 = fbuf64.Open(TheFs, TheDbName, EFileRead | EFileWrite); TEST2(err2, KErrNone); blockSize = 4096; readRecBufSize = 4000; readAhead2 = fbuf64.SetReadAheadSize(blockSize, readRecBufSize); TEST2(readAhead2, blockSize); fbuf64.Close(); //"ReadRecBufSize" defined but is not power of two, "BlockSize" defined and is bigger than the buffer capacity err2 = fbuf64.Open(TheFs, TheDbName, EFileRead | EFileWrite); TEST2(err2, KErrNone); blockSize = fbuf64.iCapacity * 2; readRecBufSize = 1; readAhead2 = fbuf64.SetReadAheadSize(blockSize, readRecBufSize); TEST2(readAhead2, fbuf64.iCapacity); fbuf64.Close(); //"ReadRecBufSize" negative, "BlockSize" defined but is not power of two err2 = fbuf64.Open(TheFs, TheDbName, EFileRead | EFileWrite); TEST2(err2, KErrNone); blockSize = 1000; readRecBufSize = -2; readAhead2 = fbuf64.SetReadAheadSize(blockSize, readRecBufSize); TEST2(readAhead2, RFileBuf64::KDefaultReadAheadSize); fbuf64.Close(); //"ReadRecBufSize" negative, "BlockSize" negative err2 = fbuf64.Open(TheFs, TheDbName, EFileRead | EFileWrite); TEST2(err2, KErrNone); blockSize = -1; readRecBufSize = -2; readAhead2 = fbuf64.SetReadAheadSize(blockSize, readRecBufSize); TEST2(readAhead2, RFileBuf64::KDefaultReadAheadSize); fbuf64.Close(); // (void)TheFs.Delete(TheDbName); }