diff -r 000000000000 -r 96e5fb8b040d kerneltest/f32test/server/t_rename.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/f32test/server/t_rename.cpp Thu Dec 17 09:24:54 2009 +0200 @@ -0,0 +1,465 @@ +// Copyright (c) 1999-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_rename.cpp +// +// + +#include +#include +#include "t_server.h" + +#if defined(__WINS__) +#define WIN32_LEAN_AND_MEAN +#pragma warning (disable:4201) // warning C4201: nonstandard extension used : nameless struct/union +#pragma warning (default:4201) // warning C4201: nonstandard extension used : nameless struct/union +#endif + +#if defined(_UNICODE) +#if !defined(UNICODE) +#define UNICODE +#endif +#endif + +GLDEF_D RTest test(_L("T_RENAME")); + +TBuf8<26> alphaBuffer=_L8("ABCDEFGHIJKLMNOPQRSTUVWXYZ"); +TPtr8 alphaPtr((TText8*)alphaBuffer.Ptr(),alphaBuffer.Size(),alphaBuffer.Size()); + +TBuf8<17> BeckBuffer=_L8("A Devil's Haircut"); +TPtr8 BeckPtr((TText8*)BeckBuffer.Ptr(),BeckBuffer.Size(),BeckBuffer.Size()); + +/* + + What this test is for: + Tests bug fix for the bug which created two files of the same name + +*/ + +LOCAL_C void CreateTestFiles() +// +// +// + { + test.Next(_L("Create test files")); + TInt r=TheFs.MkDir(_L("\\F32-TST\\")); + test(r==KErrNone || r==KErrAlreadyExists); + + RFile file; + +// Create \\SessionPath\\testfile + r=file.Replace(TheFs,_L("\\F32-TST\\testfile"),EFileRead|EFileWrite); + test(r==KErrNone); + r=file.Write(BeckPtr); + test(r==KErrNone); + file.Close(); + +// Create \\SessionPath\\rfsfile + r=file.Replace(TheFs,_L("\\F32-TST\\rfsfile"),EFileRead|EFileWrite); + test(r==KErrNone); + r=file.Write(BeckPtr); + test(r==KErrNone); + file.Close(); + +// Create \\SessionPath\\eikfile + r=file.Replace(TheFs,_L("\\F32-TST\\eikfile"),EFileRead|EFileWrite); + test(r==KErrNone); + r=file.Write(BeckPtr); + test(r==KErrNone); + file.Close(); + + } +/* +LOCAL_C void CleanUp() +// +// Delete any files created by the tests +// + { + TInt r=TheFs.Delete(_L("\\F32-TST\\TESTFILE")); + test(r==KErrNone); + r=TheFs.Delete(_L("\\F32-TST\\RFSFILE")); + test(r==KErrNone); + r=TheFs.Delete(_L("\\F32-TST\\EIKFILE")); + test(r==KErrNone); + r=TheFs.Delete(_L("\\F32-TST\\TEST")); + test(r==KErrNone); + r=TheFs.RmDir(_L("\\F32-TST\\SYSTEM\\")); + test(r==KErrNone); + } +*/ + +LOCAL_C TInt CountFiles(TPtrC aDirectory, TPtrC aFileName) +// +// Return the number of files of aFileName found in aDirectory +// + { + RDir dir; + TFileName sessionPath; + TInt r=TheFs.SessionPath(sessionPath); + test(r==KErrNone); + TFileName path=_L("?:"); + path[0]=sessionPath[0]; + path+=aDirectory; + if (path[path.Length()-1]==KPathDelimiter) + path.Append('*'); + else + path.Append(_L("\\*")); + + r=dir.Open(TheFs,path,KEntryAttMaskSupported); + test(r==KErrNone); + + CDir* anEntryList; + r=TheFs.GetDir(path,KEntryAttMaskSupported,ESortByName,anEntryList); + test(r==KErrNone); + +// Sets the new length of path to the position of the last path delimiter +1 + path.SetLength(path.LocateReverse(KPathDelimiter)+1); + TInt fileCount=0; + TEntry entry; + + TInt count=anEntryList->Count(); + for (TInt j=0;joperator[](j); + if ((entry.iName)==(aFileName)) + fileCount++; + } + + dir.Close(); + delete anEntryList; + return(fileCount); + } + +LOCAL_C void TestRFileRename() +// +// Test RFile::Rename() function +// + { + test.Next(_L("Rename file with DOS compatible name using RFile function")); + TInt r; + RFile file; + + r=file.Open(TheFs,_L("\\F32-TST\\testfile"),EFileRead|EFileWrite); + test(r==KErrNone); + + r=file.Rename(_L("\\F32-TST\\TESTFILE")); + test(r==KErrNone); + + file.Close(); + + test.Next(_L("Write in some data")); + r=file.Open(TheFs,_L("\\F32-TST\\TESTFILE"),EFileRead|EFileWrite); + test(r==KErrNone); + + r=file.Write(alphaPtr); + test(r==KErrNone); + + file.Close(); + } + + +LOCAL_C void TestRFsRename() +// +// Test RFs::Rename() function +// + { + test.Next(_L("Rename file with DOS compatible name using RFs function")); + TInt r; + + r=TheFs.Rename(_L("\\F32-TST\\rfsfile"),_L("\\F32-TST\\RFSFILE")); + test(r==KErrNone); + + RFile file; + test.Next(_L("Write in some data")); + r=file.Open(TheFs,_L("\\F32-TST\\RFSFILE"),EFileRead|EFileWrite); + test(r==KErrNone); + + r=file.Write(alphaPtr); + test(r==KErrNone); + + file.Close(); + } + +LOCAL_C void TestEikonRename() +// +// Test EIKON style rename by creating a new file, and copying old data into new file +// + { + test.Next(_L("Rename file with DOS compatible name simulating EIKON")); + TInt r; + RFile file; + + test.Next(_L("Create a new file with DOS compatible equivalent name")); + r=file.Create(TheFs,_L("\\F32-TST\\EIKFILE"),EFileRead|EFileWrite); + test((r==KErrNone)||(r==KErrAlreadyExists)); + file.Close(); + + test.Next(_L("Copy data from original file into new file")); + r=TheFs.Replace(_L("\\F32-TST\\eikfile"),_L("\\F32-TST\\EIKFILE")); + test(r==KErrNone); + + test.Next(_L("Open the new file and write into it")); + r=file.Open(TheFs,_L("\\F32-TST\\EIKFILE"),EFileRead|EFileWrite); + test(r==KErrNone); + + r=file.Write(alphaPtr); + test(r==KErrNone); + + file.Close(); + } + + +LOCAL_C void TestReplaceAndRename() +// +// Tests the bug which allows 2 files of the same name to be created has been fixed +// + { + TInt r; + RFile file; + +// ************************************************************************* +// First test with a non DOS compatible name renamed to a DOS compatible name + test.Next(_L("Rename test to TEST and replace temp with TEST")); + r=file.Replace(TheFs,_L("\\F32-TST\\test"),EFileWrite); + test(r==KErrNone); + r=file.Write(BeckPtr); + test(r==KErrNone); + file.Close(); + + r=TheFs.Rename(_L("\\F32-TST\\test"),_L("\\F32-TST\\TEST")); + test(r==KErrNone); + r=file.Replace(TheFs,_L("\\F32-TST\\temp"),EFileWrite); + test(r==KErrNone); + r=file.Write(alphaPtr); + test(r==KErrNone); + file.Close(); + +// Replace(oldName, newName) +// Copy oldName to newName (ie temp to TEST) +// If TEST does not exist, it is created and then temp's attributes etc are copied into it +// then temp is deleted. If it does exist, it must be closed +// The bug created a second file of the same name + r=TheFs.Replace(_L("\\F32-TST\\temp"),_L("\\F32-TST\\TEST")); + test(r==KErrNone); + +// Check that there's only one file named TEST + TInt fileCount=0; + fileCount=CountFiles(_L("\\F32-TST\\"),_L("TEST")); + test(fileCount==1); + r=TheFs.Delete(_L("\\F32-TST\\TEST")); + test(r==KErrNone); + fileCount=CountFiles(_L("\\F32-TST\\"),_L("TEST")); + test(fileCount==0); + test(r==KErrNone); + + +//***************************************************** +// The same test but with different source directories + test.Next(_L("Rename test to and replace \\SYSTEM\\temp with TEST")); + r=file.Replace(TheFs,_L("\\F32-TST\\test"),EFileWrite); + test(r==KErrNone); + r=file.Write(BeckPtr); + test(r==KErrNone); + file.Close(); + + r=TheFs.Rename(_L("\\F32-TST\\test"),_L("\\F32-TST\\TEST")); + test(r==KErrNone); + r=file.Replace(TheFs,_L("\\F32-TST\\SYSTEM\\temp"),EFileWrite); + test(r==KErrNone); + r=file.Write(alphaPtr); + test(r==KErrNone); + file.Close(); + +// The bug created a second file of the same name + r=TheFs.Replace(_L("\\F32-TST\\SYSTEM\\temp"),_L("\\F32-TST\\TEST")); + test(r==KErrNone); + + fileCount=0; + fileCount=CountFiles(_L("\\F32-TST\\"),_L("TEST")); + test(fileCount==1); + r=TheFs.Delete(_L("\\F32-TST\\TEST")); + test(r==KErrNone); + fileCount=CountFiles(_L("\\F32-TST\\"),_L("TEST")); + test(fileCount==0); +// Test that system directory is now empty + fileCount=0; + fileCount=CountFiles(_L("\\F32-TST\\SYSTEM\\"),_L("temp")); + test(fileCount==0); + test(r==KErrNone); + +// ************************************************************************* +// Test with a DOS compatible name renamed to a different DOS compatible name + test.Next(_L("Rename little to BIG and replace temp with BIG")); + r=file.Replace(TheFs,_L("\\F32-TST\\little"),EFileWrite); + test(r==KErrNone); + r=file.Write(BeckPtr); + test(r==KErrNone); + file.Close(); + + // Test a long path (>250 chrs) + r=TheFs.Rename(_L("\\F32-TST\\little"),_L("\\F32-TST\\PLATTEST\\FileStore\\TestData\\20495_Folder\\PLATTEST\\FileStore\\TestData\\20495_Folder\\PLATTEST\\FileStore\\TestData\\20495_Folder\\PLATTEST\\FileStore\\TestData\\20495_Folder\\PLATTEST\\FileStore\\TestData\\20495_Folder\\PLATTEST\\FileStore\\TestData\\20495_Folder\\PLATTEST\\FileStore\\TestData\\20495_Folder\\PLATTEST\\FileStore\\TestData\\20495_Folder\\PLATTEST\\FileStore\\TestData\\20495_Folder\\PLATTEST\\FileStore\\TestData\\20495_Folder\\PLATTEST\\FileStore\\TestData\\0495_Folder\\PLATTEST\\FileStore\\TestData\\20495_Folder\\PLATTEST\\FileStore\\TestData\\20495_Folder\\PLATTEST\\FileStore\\TestData\\20495_Folder\\PLATTEST\\FileStore\\TestData\\20495_Folder\\PLATTEST\\FileStore\\TestData\\20495_Folder\\PLATTEST\\FileStore\\TestData\\20495_Folder\\middle.gif")); + test(r==KErrBadName); + + r=TheFs.Rename(_L("\\F32-TST\\little"),_L("\\F32-TST\\BIG")); + test(r==KErrNone); + r=file.Replace(TheFs,_L("\\F32-TST\\temp"),EFileWrite); + test(r==KErrNone); + r=file.Write(alphaPtr); + test(r==KErrNone); + file.Close(); + + r=TheFs.Replace(_L("\\F32-TST\\temp"),_L("\\F32-TST\\BIG")); + test(r==KErrNone); + + fileCount=0; + fileCount=CountFiles(_L("\\F32-TST\\"),_L("BIG")); + test(fileCount==1); + r=TheFs.Delete(_L("\\F32-TST\\BIG")); + test(r==KErrNone); + fileCount=CountFiles(_L("\\F32-TST\\"),_L("BIG")); + test(fileCount==0); + test(r==KErrNone); + +// *********************************** +// Test with a non-DOS compatible name + test.Next(_L("Rename veryLongFileName to VERYLONGFILENAME")); + r=file.Replace(TheFs,_L("\\F32-TST\\veryLongFileName"),EFileWrite); + test(r==KErrNone); + r=file.Write(BeckPtr); + test(r==KErrNone); + file.Close(); + + r=TheFs.Rename(_L("\\F32-TST\\veryLongFileName"),_L("\\F32-TST\\VERYLONGFILENAME")); + test(r==KErrNone); + r=file.Replace(TheFs,_L("\\F32-TST\\temp"),EFileWrite); + test(r==KErrNone); + r=file.Write(alphaPtr); + test(r==KErrNone); + file.Close(); + + r=TheFs.Replace(_L("\\F32-TST\\temp"),_L("\\F32-TST\\VERYLONGFILENAME")); + test(r==KErrNone); + + fileCount=0; + fileCount=CountFiles(_L("\\F32-TST\\"),_L("VERYLONGFILENAME")); + test(fileCount==1); + r=TheFs.Delete(_L("\\F32-TST\\VERYLONGFILENAME")); + test(r==KErrNone); + fileCount=CountFiles(_L("\\F32-TST\\"),_L("VERYLONGFILENAME")); + test(fileCount==0); + test(r==KErrNone); + +// ******************************* +// Test with a DOS compatible name + test.Next(_L("Rename FILE to FILE and replace temp with FILE")); + r=file.Replace(TheFs,_L("\\F32-TST\\FILE"),EFileWrite); + test(r==KErrNone); + r=file.Write(BeckPtr); + test(r==KErrNone); + file.Close(); + + r=TheFs.Rename(_L("\\F32-TST\\FILE"),_L("\\F32-TST\\FILE")); + test(r==KErrNone); + r=file.Replace(TheFs,_L("\\F32-TST\\temp"),EFileWrite); + test(r==KErrNone); + r=file.Write(alphaPtr); + test(r==KErrNone); + file.Close(); + + r=TheFs.Replace(_L("\\F32-TST\\temp"),_L("\\F32-TST\\FILE")); + test(r==KErrNone); + + fileCount=0; + fileCount=CountFiles(_L("\\F32-TST\\"),_L("FILE")); + test(fileCount==1); + r=TheFs.Delete(_L("\\F32-TST\\FILE")); + test(r==KErrNone); + fileCount=CountFiles(_L("\\F32-TST\\"),_L("FILE")); + test(fileCount==0); + test(r==KErrNone); + +// ************************************************** +// Test with a DOS compatible name which is kept open + test.Next(_L("Rename test1 to TEST1 and replace temp1 with TEST1 while it's open")); + r=file.Replace(TheFs,_L("\\F32-TST\\test1"),EFileWrite); + test(r==KErrNone); + r=file.Write(BeckPtr); + test(r==KErrNone); + file.Close(); + + r=TheFs.Rename(_L("\\F32-TST\\test1"),_L("\\F32-TST\\TEST1")); + test(r==KErrNone); + +// Try with the file open + RFile openFile; + r=openFile.Open(TheFs,_L("\\F32-TST\\TEST1"),EFileRead|EFileWrite); + test(r==KErrNone); + + r=file.Replace(TheFs,_L("\\F32-TST\\temp"),EFileWrite); + test(r==KErrNone); + r=file.Write(alphaPtr); + test(r==KErrNone); + file.Close(); + + r=TheFs.Replace(_L("\\F32-TST\\temp"),_L("\\F32-TST\\TEST1")); + test(r==KErrInUse); // Fails as it should! But not intuitive bearing in mind the other bug... + + openFile.Close(); + + r=TheFs.Replace(_L("\\F32-TST\\temp"),_L("\\F32-TST\\TEST1")); + test(r==KErrNone); + + fileCount=0; + fileCount=CountFiles(_L("\\F32-TST\\"),_L("TEST1")); + test(fileCount==1); + r=TheFs.Delete(_L("\\F32-TST\\TEST1")); + test(r==KErrNone); + fileCount=CountFiles(_L("\\F32-TST\\"),_L("TEST1")); + test(fileCount==0); + test(r==KErrNone); + +// Clean up + RFormat format; + TInt count; + TFileName sessionPath; + r=TheFs.SessionPath(sessionPath); + r=format.Open(TheFs,sessionPath,EQuickFormat,count); + if (r == KErrAccessDenied) + return; + test(r==KErrNone); + while(count && r==KErrNone) + r=format.Next(count); + format.Close(); + } + + +GLDEF_C void CallTestsL(void) +// +// Do all tests +// + { + + test.Title(); + test.Start(_L("Testing rename")); + + TheFs.MkDir(_L("\\F32-TST\\SYSTEM\\")); + CreateTestFiles(); + TestRFsRename(); + TestRFileRename(); + TestEikonRename(); + TestReplaceAndRename(); + + test.End(); + test.Close(); + } +