os/kernelhwsrv/kerneltest/f32test/server/t_vfat.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     1 // Copyright (c) 1997-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".
     7 //
     8 // Initial Contributors:
     9 // Nokia Corporation - initial contribution.
    10 //
    11 // Contributors:
    12 //
    13 // Description:
    14 // f32test\server\t_vfat.cpp
    15 // 
    16 //
    17 
    18 #include <f32file.h>
    19 #include <e32test.h>
    20 #include <e32math.h>
    21 #include "t_server.h"
    22 
    23 RTest test(_L("T_VFAT"));
    24 
    25 static void Test1()
    26 //
    27 // Create 71 8.3 files
    28 // Rename each of them to vfat filenames (% order)
    29 // Chkdsk
    30 // Check entries
    31 //
    32 	{
    33 
    34 	test.Next(_L("Test rename"));
    35 	TInt totalFiles=103;
    36 	TInt orderMod=61;
    37 	TFileName nameshort=_L("File");
    38 	TFileName namelong=_L("File.+',;'=[]");
    39 	TInt i;
    40 	TBuf8<256> data;
    41 
    42 	for (i=0;i<totalFiles;i++)
    43 		{
    44 		TBuf<32> tempName=nameshort;
    45 		tempName.AppendNum(i);
    46 		data.SetLength(i);
    47 		MakeFile(tempName,data);
    48 		}
    49 
    50 	TInt count=totalFiles;
    51 	while(count--)
    52 		{
    53 		TInt fileNum=(orderMod*count)%totalFiles;
    54 		TBuf<32> shortName=nameshort;
    55 		shortName.AppendNum(fileNum);
    56 		TBuf<32> longName=namelong;
    57 		longName.AppendNum(fileNum);
    58 		TInt r=TheFs.Rename(shortName,longName);
    59 		test(r==KErrNone);
    60 		}
    61 
    62 	TInt r=TheFs.CheckDisk(gSessionPath);
    63 	test(r==KErrNone || r==KErrNotSupported);
    64 
    65 	CDir* dirList;
    66 	r=TheFs.GetDir(_L("*.*"),KEntryAttMaskSupported,ESortBySize,dirList);
    67 	test(r==KErrNone);
    68 	test(dirList->Count()==totalFiles);
    69 	for (i=0;i<totalFiles;i++)
    70 		{
    71 		TBuf<32> longName=namelong;
    72 		longName.AppendNum(i);
    73 		TEntry entry;
    74 		entry=(*dirList)[i];
    75 		test(entry.iName.MatchF(longName)!=KErrNotFound);
    76 		}
    77 
    78 	delete dirList;
    79 	}
    80 
    81 
    82 #ifdef __WINS__
    83 const TInt gMaxIterations=1000;
    84 #else
    85 const TInt gMaxIterations=1000;	// Have pity on a poor 18MHz CPU
    86 #endif
    87 
    88 const TInt gMaxFiles=256;
    89 TBuf<gMaxFiles> gDataBuf;
    90 TBuf8<gMaxFiles> buf;
    91 TFileName gFileName[gMaxFiles];
    92 
    93 LOCAL_C void Test2()
    94 //
    95 // Random test
    96 // Generate random numbers fileNum, fileOp.
    97 // fileOp = 1, shortname
    98 // fileOp = 2, longName
    99 // fileOp = 3, delete file
   100 // 
   101 	{
   102 
   103 	TInt i;
   104 	test.Next(_L("Random test"));
   105 	TInt64 seed=51703;
   106 	TInt maxIterations=gMaxIterations;
   107 	TInt maxFileOps=3;
   108 	TInt checkFrequency=100; // 1 in xxxx
   109 	
   110 	for(i=0;i<gMaxFiles;i++)
   111 		gFileName[i]=_L("");
   112 
   113 	TFileName fileName;
   114 	while(maxIterations--)
   115 		{
   116 		TInt fileNum=Math::Rand(seed)%gMaxFiles;
   117 		TInt fileOp=Math::Rand(seed)%maxFileOps;
   118 		switch(fileOp)
   119 			{
   120 		case 0:
   121 			CreateShortName(fileName,seed);
   122 			break;
   123 		case 1:
   124 			CreateLongName(fileName,seed);
   125 			break;
   126 		case 2:
   127 			TInt r;
   128 			fileName=gFileName[fileNum];
   129 			if (fileName==_L(""))
   130 				goto End;
   131 			r=TheFs.Delete(fileName);
   132 			test(r==KErrNone);
   133 			gFileName[fileNum]=_L("");
   134 			goto End;
   135 		default:
   136 			User::Panic(_L("IllegalVal"),KErrGeneral);
   137 			};
   138 		
   139 		if (gFileName[fileNum]==_L(""))
   140 			{
   141 			/* Delete any existing file with the same name */
   142 			TInt r;
   143 			RFile thing;
   144 			r=thing.Open(TheFs, fileName, EFileShareAny);
   145 			test (r==KErrNone || r==KErrNotFound);
   146 			if (r==KErrNone)
   147 				{
   148 				TInt s;
   149 				test (thing.Size(s) == KErrNone);
   150 				thing.Close();
   151 				r=TheFs.Delete(fileName);
   152 				test (r==KErrNone);
   153 				gFileName[s]=_L("");
   154 				}
   155 			else
   156 				thing.Close();
   157 				
   158 			gDataBuf.SetLength(fileNum);
   159 			/* the return from the following function was being checked and the next would only be
   160 			carried out if the return showed no error.  But this function never returns anything so
   161 			the code wasn't compiling */
   162 			buf.Copy(gDataBuf);	// Unicode
   163 			MakeFile(fileName,buf);
   164 			gFileName[fileNum]=fileName;
   165 			}
   166 		else
   167 			{
   168 			TInt r=TheFs.Rename(gFileName[fileNum],fileName);
   169             if (r != KErrNone && r != KErrAlreadyExists)
   170                 test.Printf(_L("Rename returned %d at line %d"), r, __LINE__);
   171 			test(r==KErrNone || r==KErrAlreadyExists);
   172 			if (r==KErrNone)
   173 				gFileName[fileNum]=fileName;
   174 			}
   175 End:
   176 		if ((maxIterations%checkFrequency)==0)
   177 			{
   178 			test.Printf(_L("Iteration %d    \r"),gMaxIterations-maxIterations);
   179 			TInt r=TheFs.CheckDisk(gSessionPath);
   180 			test(r==KErrNone || r==KErrNotSupported);
   181 			TInt count=0;
   182 			CDir* dirList;
   183 			r=TheFs.GetDir(_L("*.*"),KEntryAttMaskSupported,ESortBySize,dirList);
   184 			test(r==KErrNone);
   185 			for(i=0;i<gMaxFiles;i++)
   186 				{
   187 				if (gFileName[i]==_L(""))
   188 					continue;
   189 				TEntry entry;
   190 				entry=(*dirList)[count];
   191 				TInt r=gFileName[i].MatchF(entry.iName);
   192 				if (r==KErrNotFound)
   193 					{
   194                     //-- tests a dodgy case when the name has multiple trailing dots. They must have been removed by FS implementation
   195                     TUint len=gFileName[i].Length();
   196                     test(gFileName[i][len-1]=='.');
   197 
   198                     //-- strip all trailing dots from the original name
   199                     while(len)
   200                     {
   201                         if(gFileName[i][len-1]=='.')
   202                             len--;
   203                         else
   204                             break;
   205                     }
   206 
   207                     TPtrC ptrFileName(gFileName[i].Ptr(), len);
   208 
   209                     test(ptrFileName.CompareF(entry.iName) == 0);
   210 
   211 
   212 					}
   213 				count++;
   214 				}
   215 			delete dirList;
   216 			}
   217 		}
   218 	test.Printf(_L("\n"),i);
   219 	}
   220 
   221 //-----------------------------------------------------------------
   222 _LIT(KName1, "\\file1");
   223 _LIT(KName2, "\\file1.");
   224 _LIT(KName3, "\\file1..");
   225 _LIT(KName4, "\\file1...");
   226 _LIT(KExpectedName, "file1");
   227 
   228 void DoCheckTD_FN()
   229 {
   230     TInt    nRes;
   231     TEntry  entry;
   232 
   233     nRes = TheFs.Entry(KName1, entry);
   234     test(nRes == KErrNone);
   235     test(entry.iName.CompareF(KExpectedName) == 0);
   236 
   237     nRes = TheFs.Entry(KName2, entry);
   238     test(nRes == KErrNone);
   239     test(entry.iName.CompareF(KExpectedName) == 0);
   240 
   241     nRes = TheFs.Entry(KName3, entry);
   242     test(nRes == KErrNone);
   243     test(entry.iName.CompareF(KExpectedName) == 0);
   244 
   245     nRes = TheFs.Entry(KName3, entry);
   246     test(nRes == KErrNone);
   247     test(entry.iName.CompareF(KExpectedName) == 0);
   248 }
   249 
   250 /**
   251     Test that ALL trailing dots are removed from the file names by filsystem implementation
   252 */
   253 void TestTrailingDots()
   254 {
   255     test.Next(_L("Test trailing dots"));
   256 
   257     //-- actually, all these APIs shall be tested:
   258     //-- CMountCB::MkDirL()
   259     //-- CMountCB::RmDirL()
   260     //-- CMountCB::DeleteL()
   261     //-- CMountCB::RenameL()
   262     //-- CMountCB::ReplaceL()
   263     //-- CMountCB::EntryL() const
   264     //-- CMountCB::SetEntryL()
   265     //-- CMountCB::FileOpenL()
   266     //-- CMountCB::DirOpenL()
   267     //-- CMountCB::ReadSectionL()
   268     //-- CFileCB::RenameL()
   269 
   270 
   271     TInt    nRes;
   272     RFile   file;
   273 
   274     //----- create and check "\\file1"
   275     nRes = file.Replace(TheFs, KName1, EFileWrite);
   276     test(nRes == KErrNone);
   277     file.Close();
   278     
   279     DoCheckTD_FN();
   280 
   281     nRes = TheFs.Delete(KName1);
   282     test(nRes == KErrNone);
   283 
   284 
   285     //----- create and check "\\file1."
   286     nRes = file.Replace(TheFs, KName2, EFileWrite);
   287     test(nRes == KErrNone);
   288     file.Close();
   289     
   290     DoCheckTD_FN();
   291 
   292     nRes = TheFs.Delete(KName2);
   293     test(nRes == KErrNone);
   294 
   295 
   296     //----- create and check "\\file1.."
   297     nRes = file.Replace(TheFs, KName3, EFileWrite);
   298     test(nRes == KErrNone);
   299     file.Close();
   300     
   301     DoCheckTD_FN();
   302 
   303     nRes = TheFs.Delete(KName3);
   304     test(nRes == KErrNone);
   305 
   306 
   307     //----- create and check "\\file1..."
   308     nRes = file.Replace(TheFs, KName4, EFileWrite);
   309     test(nRes == KErrNone);
   310     file.Close();
   311     
   312     DoCheckTD_FN();
   313     
   314     nRes = TheFs.Delete(KName4);
   315     test(nRes == KErrNone);
   316 
   317 
   318 }
   319 
   320 void CallTestsL()
   321 //
   322 // Do tests relative to session path
   323 //
   324 	{
   325 
   326 	TurnAllocFailureOff();
   327 
   328 	CreateTestDirectory(_L("\\F32-TST\\TVFAT\\"));
   329 
   330 	Test1();
   331 	DeleteTestDirectory();
   332 	CreateTestDirectory(_L("\\F32-TST\\TVFAT\\"));
   333 	Test2();
   334 
   335     TestTrailingDots();
   336 
   337 	DeleteTestDirectory();
   338 	}
   339