Fix for bug 2283 (RVCT 4.0 support is missing from PDK 3.0.h)
Have multiple extension sections in the bld.inf, one for each version
of the compiler. The RVCT version building the tools will build the
runtime libraries for its version, but make sure we extract all the other
versions from zip archives. Also add the archive for RVCT4.
// 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
//
//
#define __E32TEST_EXTENSION__
#include <f32file.h>
#include <e32test.h>
#include "t_server.h"
#include "f32_test_utils.h"
using namespace F32_Test_Utils;
TInt gDriveNum = -1;
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());
static 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();
}
static 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;j<count;j++)
{
entry=anEntryList->operator[](j);
if ((entry.iName)==(aFileName))
fileCount++;
}
dir.Close();
delete anEntryList;
return(fileCount);
}
static 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();
}
static 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();
}
static 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();
}
static 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);
}
//-------------------------------------------------------------------
/**
Create a directory; create many files in it (the directory will become more that 1 cluster)
Then rename every file in this directory to a new name.
*/
void TestRenameManyFilesInTheSameDir()
{
test.Next(_L("TestRenameManyFilesInTheSameDir"));
if(Is_Win32(TheFs, gDriveNum))
{
test.Printf(_L("Skipping on WINS drive\n"));
return;
}
_LIT(KDir, "\\dir1\\");
_LIT(KFile, "filename_long-");
//-- the number of files is chosen the way to have the directory file at least 2 clusters long (on FAT)
//-- "filename_long-XXX" will correspond to 2 VFAT entries in the directory; max. cluster size of FAT is 32K
//-- 2*32*600 = 38400 > 32K
const TInt KNumFiles = 600;
TName fName;
TInt i;
TInt nRes;
//-- quick format the drive
nRes = FormatDrive(TheFs, gDriveNum, ETrue);
test_KErrNone(nRes);
MakeDir(KDir);
//-- create a number of files in a single directory, it shall be larger than 1 cluster.
for(i=0; i<KNumFiles; ++i)
{
fName.Format(_L("%S%S%03d"), &KDir, &KFile, i);
nRes = CreateEmptyFile(TheFs, fName, 0);
test_KErrNone(nRes);
}
//-- rename all files in the same directory
TName fNameNew;
for(i=0; i<KNumFiles; ++i)
{
fName.Format(_L("%S%S%03d"), &KDir, &KFile, i);
fNameNew.Format(_L("%S%S%03d_new"), &KDir, &KFile, i);
nRes = TheFs.Rename(fName, fNameNew);
test_KErrNone(nRes);
}
fName.Format(_L("%c:"), gDriveNum+'A');
nRes = TheFs.CheckDisk(fName);
test(nRes == KErrNone || nRes == KErrNotSupported);
//-- clean up
for(i=0; i<KNumFiles; ++i)
{
fNameNew.Format(_L("%S%S%03d_new"), &KDir, &KFile, i);
nRes = TheFs.Delete(fNameNew);
test_KErrNone(nRes);
}
fName.Format(_L("%c:"), gDriveNum+'A');
nRes = TheFs.CheckDisk(fName);
test(nRes == KErrNone || nRes == KErrNotSupported);
nRes = TheFs.RmDir(KDir);
test(nRes == KErrNone);
}
void CallTestsL(void)
{
test.Title();
test.Start(_L("Testing rename"));
//-- set up console output
F32_Test_Utils::SetConsole(test.Console());
TInt nRes=TheFs.CharToDrive(gDriveToTest, gDriveNum);
test(nRes==KErrNone);
PrintDrvInfo(TheFs, gDriveNum);
if(!Is_Win32(TheFs, gDriveNum))
{
nRes = FormatDrive(TheFs, gDriveNum, ETrue);
test(nRes==KErrNone);
}
MakeDir(_L("\\F32-TST\\SYSTEM\\"));
CreateTestFiles();
TestRFsRename();
TestRFileRename();
TestEikonRename();
TestReplaceAndRename();
TestRenameManyFilesInTheSameDir();
if(!Is_Win32(TheFs, gDriveNum))
{
nRes = FormatDrive(TheFs, gDriveNum, ETrue);
test(nRes==KErrNone);
}
test.End();
test.Close();
}