kerneltest/f32test/outsideBMP/src/t_surrogatepair.cpp
author Tom Cosgrove <tom.cosgrove@nokia.com>
Fri, 28 May 2010 16:29:07 +0100
changeset 137 8aab599e3476
parent 0 a41df078684a
child 206 ced41fd9a298
child 269 d57b86b1867a
permissions -rw-r--r--
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) 2007-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\locl\localeutils\T_SURROGATEPAIR.cpp
// 
//

#define __E32TEST_EXTENSION__

#include <e32test.h>
#include <HAL.H>
#include <f32fsys.h>
#include <f32dbg.h>
#include "..\server\t_server.h"

RTest test(_L("T_SURROGATEPAIR"));

/* 
 * Helper function to capture and return any MakeFile error code.
 */
TInt SurrogatePair_MakeFile(const TDesC& aFileName)
	{
	RFile file;
	TInt r=file.Replace(TheFs,aFileName,0);
	file.Close();
	return r;
	}

/*
 *  Tests given ShortName against LongName and vice versa for a File Entry.
 */
void doFileNameTest(const TDesC& aLongName, const TDesC& aShortName)
	{
	TFileName lgnFullPath;
	TFileName shnFullPath;
	TFileName lgn;
	TFileName shn;

	TInt r = TheFs.SessionPath(gSessionPath);
	test_KErrNone(r);
	lgnFullPath = gSessionPath;
	lgnFullPath += aLongName;

	MakeFile(lgnFullPath);

	// Check short name	
	r = TheFs.GetShortName(lgnFullPath, shn);
	test_KErrNone(r);
	r = shn.Compare(aShortName);
	test(r==0);

	// Check long name	
	shnFullPath = gSessionPath;
	shnFullPath += aShortName;

	r = TheFs.GetLongName(shnFullPath, lgn);
	test_KErrNone(r);
	r = lgn.Compare(aLongName);
	test(r==0);

	test_KErrNone(TheFs.Delete(lgnFullPath));
	}

/*
 *  Tests given ShortName against LongName and vice versa for a Directory Entry.
 */
void doDirNameTest(const TDesC& aLongName, const TDesC& aShortName)
	{
	TBuf<KMaxFileName> longDirNamePath;
	TBuf<KMaxFileName> shortDirNamePath;
	TBuf<KMaxFileName> longName;
	TBuf<KMaxFileName> shortName;
	longDirNamePath = gSessionPath;
	longDirNamePath += aLongName;
	longDirNamePath.Append('\\');

	// Create new directory and check creation
	TInt r = TheFs.MkDir(longDirNamePath);
	test_KErrNone(r);
	TUint dumUint=0;
	CDir* dumDir;
	r= TheFs.GetDir(longDirNamePath, dumUint, dumUint, dumDir);
	test_KErrNone(r);
	test_NotNull(dumDir);
	delete dumDir;

	// Check short name
	r = TheFs.GetShortName(longDirNamePath, shortName);
	test_KErrNone(r);
	r = shortName.Compare(aShortName);
	test(r==0);
	
	// Check long name
	shortDirNamePath = gSessionPath;
	shortDirNamePath += shortName;
	shortDirNamePath.Append('\\');
	r = TheFs.GetLongName(shortDirNamePath, longName);
	test_KErrNone(r);
	r = longName.Compare(aLongName);
	test(r==0);

	r = TheFs.RmDir(longDirNamePath);
	test_KErrNone(r);
	}

/*
 *  Tests File entry and Dir entry.
 */
void TestConversion(const TDesC& aLongName, const TDesC& aShortName)
	{
	doFileNameTest(aLongName, aShortName);
	doDirNameTest(aLongName, aShortName);
	}

/*
 * Tests different characters for its validity and conversion in absence of cp dll.
 * Expects ReplacementForUnconvertibleUnicodeCharacters : "_" : UNDERSCORE for all
 * Illegal Characters
 */
void TestShortNameCharacter()
	{
	test.Next(_L("++TestShortNameCharacter"));
	TInt r;
	
	// one-byte chars
	_LIT16(Uni_1, 									"\x0019.TXT");
	_LIT16(Uni_1_ShortName, 						"_.TXT");
	TestConversion( Uni_1, Uni_1_ShortName);
	
	_LIT16(Uni_2, 									"\x0020.TXT");
	_LIT(Uni_2_ShortName, 							"_.TXT");
	TestConversion( Uni_2, Uni_2_ShortName);
	
	_LIT16(Uni_3, 									"\x0021.TXT");
	_LIT16(Uni_3_ShortName, 						"\x0021.TXT");
	TestConversion( Uni_3, Uni_3_ShortName);

 	_LIT16(Uni_4, 									"\x0079"); // y lower case 
	_LIT16(Uni_4_ShortName, 						"\x0059");	// Y upper case
	TestConversion( Uni_4, Uni_4_ShortName);

	_LIT16(Uni_5,									"\x0080");
	_LIT16(Uni_5_ShortName, 						"_");
	TestConversion( Uni_5, Uni_5_ShortName);

	_LIT16(Uni_6,									"\x0081");
	_LIT16(Uni_6_ShortName, 						"_");
	TestConversion( Uni_6, Uni_6_ShortName);

	_LIT16(Uni_7, 									"\x00fe");
	_LIT16(Uni_7_ShortName, 						"_");
	TestConversion( Uni_7, Uni_7_ShortName);

	_LIT16(Uni_8, 									"\x00ff");
	_LIT16(Uni_8_ShortName, 						"_");
	TestConversion( Uni_8, Uni_8_ShortName);
	
	// two-byte chars
	_LIT16(Uni_9, 									"\x0100");
	_LIT16(Uni_9_ShortName, 						"_");
	TestConversion( Uni_9, Uni_9_ShortName);

	_LIT16(Uni_10, 									"\x0101");
	_LIT16(Uni_10_ShortName, 						"_");
	TestConversion( Uni_10, Uni_10_ShortName);

	_LIT16(Uni_11, 									"\x0ffe");
	_LIT16(Uni_11_ShortName, 						"_");
	TestConversion( Uni_11, Uni_11_ShortName);

	_LIT16(Uni_12, 									"\x0fff");
	_LIT16(Uni_12_ShortName,						"_");
	TestConversion( Uni_12, Uni_12_ShortName);

	_LIT16(Uni_13, 									"\x1000");
	_LIT16(Uni_13_ShortName, 						"_");
	TestConversion( Uni_13, Uni_13_ShortName);

	_LIT16(Uni_14, 									"\x1001");
	_LIT16(Uni_14_ShortName, 						"_");
	TestConversion( Uni_14, Uni_14_ShortName);

	_LIT16(Uni_15, 									"\x2999.TXT");
	_LIT16(Uni_15_ShortName, 						"_.TXT");
	TestConversion( Uni_15, Uni_15_ShortName);

	_LIT16(Uni_16, 									"\x4E02.TXT");	
	_LIT16(Uni_16_ShortName, 						"_.TXT");
	TestConversion( Uni_16, Uni_16_ShortName);

	_LIT16(Uni_17, 									"\x4E02.TXT");	
	_LIT(Uni_17_ShortName, 							"_.TXT");
	TestConversion( Uni_17, Uni_17_ShortName);

	_LIT16(Uni_18, 									"\xfffe");
	_LIT16(Uni_18_ShortName, 						"_");
	TestConversion( Uni_18, Uni_18_ShortName);

	_LIT16(Uni_19, 									"\xffff");
	_LIT16(Uni_19_ShortName, 						"_");
	TestConversion( Uni_19, Uni_19_ShortName);

	// four-byte surrogate pairs
	_LIT16(Uni_20, 									"\xd840\xdc00");
	_LIT16(Uni_20_ShortName, 						"_");
	TestConversion( Uni_20, Uni_20_ShortName);	

	_LIT16(Uni_21, 									"\xd840\xdc01");
	_LIT16(Uni_21_ShortName, 						"_");
	TestConversion( Uni_21, Uni_21_ShortName);	

	_LIT16(Uni_22, 									"\xD87F\xdffe");
	_LIT16(Uni_22_ShortName, 						"_");
	TestConversion( Uni_22, Uni_22_ShortName);	

	_LIT16(Uni_23, 									"\xD87F\xdfff");
	_LIT16(Uni_23_ShortName, 						"_");
	TestConversion( Uni_23, Uni_23_ShortName);	

	//	surrogate pair
	_LIT16(Uni_24, 									"\xd840\xddad");
	_LIT16(Uni_24_ShortName, 						"_");
	TestConversion( Uni_24, Uni_24_ShortName);	
	
	_LIT16(Uni_25, 									"\xd801\xdd00");
	_LIT16(Uni_25_ShortName, 						"_");
	TestConversion( Uni_25, Uni_25_ShortName);

	// corrupt surrogate in file name
	_LIT16(KTest0xD800, 							"\xD800.TXT");
	r = SurrogatePair_MakeFile(KTest0xD800);
	test(r==KErrBadName);

	// corrupt surrogate in file ext
	_LIT16(KTest0xD800XT, 							"\xD684.\xD800XT");
	r = SurrogatePair_MakeFile(KTest0xD800XT);
	test(r==KErrBadName);

	// corrupt surrogate in file ext
	_LIT16(KTestTX0xD800, 							"\xD684.TX\xD800");
	r = SurrogatePair_MakeFile(KTestTX0xD800);
	test(r==KErrBadName);

	// corrupt surrogate in file name
	_LIT16(KTest0xDFFF, 							"\xDFFF.TXT");
	r = SurrogatePair_MakeFile(KTest0xDFFF);
	test(r==KErrBadName);

	// corrupt surrogate in file ext
	_LIT16(KTest0xDFFFXT, 							"\xD684.\xDFFFXT");
	r = SurrogatePair_MakeFile(KTest0xDFFFXT);
	test(r==KErrBadName);

	// corrupt surrogate in file ext
	_LIT16(KTestTX0xDFFF, 							"\xD684.TX\xDFFF");
	r = SurrogatePair_MakeFile(KTestTX0xDFFF);
	test(r==KErrBadName);

	test.Next(_L("--TestShortNameCharacter"));
	}

void TestVolumeLabel()
	{
	test.Next(_L("++TestVolumeLabel"));
	test.Next(_L("Test unicode volume labels"));

	TInt r = TheFs.SessionPath(gSessionPath);
	test_KErrNone(r);
	TInt driveNum;
	r = TheFs.CharToDrive(gSessionPath[0], driveNum);
	test_KErrNone(r);
	
	// Retrieves the original volume label
	TVolumeInfo vInfo;
	r = TheFs.Volume(vInfo, driveNum);
	const TInt KVolumeLabelSize = 11;
	TBuf<KVolumeLabelSize> originalVolumeLabel(vInfo.iName);

	// Tests setting volume label with 1 byte characters
	_LIT(K1ByteVolumeLabel, 				"\x0079\x0079\x0079");
	_LIT(K1ByteVolumeLabel_ShortName, 		"\x0079\x0079\x0079");
	
	r = TheFs.SetVolumeLabel(K1ByteVolumeLabel, driveNum);
	test_KErrNone(r);
	r = TheFs.Volume(vInfo, driveNum);
	test_KErrNone(r);
	r = vInfo.iName.Compare(K1ByteVolumeLabel_ShortName);
	test_Equal(r, 0);
	
	// Tests setting volume label with 2 byte characters
	_LIT(K2ByteVolumeLabel, 				"\x65B0\x65B0\x65B0");
	_LIT(K2ByteVolumeLabel_ShortName, 		"___");

	r = TheFs.SetVolumeLabel(K2ByteVolumeLabel, driveNum);
	test_KErrNone(r);
	r = TheFs.Volume(vInfo, driveNum);
	test_KErrNone(r);
	r = vInfo.iName.Compare(K2ByteVolumeLabel_ShortName);
	test_Equal(r, 0);

	// Tests setting volume label with surrogate pair
	_LIT(KTestVolumeLabelSurrogatePair1, 			"\xD846\xDF1D\x0041\x0042");
	_LIT(KTestVolumeLabelSurrogatePair1_ShortName,	"_AB");

	r = TheFs.SetVolumeLabel(KTestVolumeLabelSurrogatePair1, driveNum);
	test_KErrNone(r);
	r = TheFs.Volume(vInfo, driveNum);
	test_KErrNone(r);
	r = vInfo.iName.Compare(KTestVolumeLabelSurrogatePair1_ShortName);
	test_Equal(r, 0);

	_LIT(KTestVolumeLabelSurrogatePair2, 			"\x0041\x0042\xD846\xDF1D");
	_LIT(KTestVolumeLabelSurrogatePair2_ShortName,	"AB_");

	r = TheFs.SetVolumeLabel(KTestVolumeLabelSurrogatePair2, driveNum);
	test_KErrNone(r);
	r = TheFs.Volume(vInfo, driveNum);
	test_KErrNone(r);
	r = vInfo.iName.Compare(KTestVolumeLabelSurrogatePair2_ShortName);
	test_Equal(r, 0);

	// Sets back the original volume label
	r = TheFs.SetVolumeLabel(originalVolumeLabel, driveNum);
	test_KErrNone(r);
	
	test.Next(_L("--TestVolumeLabel"));
	}

void TestConsistentShortNameGeneration()
	{
	test.Next(_L("++TestConsistentShortNameGeneration"));
	test.Next(_L("Test consistent short name generation"));

	//unicode characters.
	_LIT(KTestFileName1,		 				"a\x65B0(bcd)");
	_LIT(KTestFileName1_ShortName,	 			"A_(BCD)");
	_LIT(KTestFileName2, 						"ab\x65B0(cdef)");
	_LIT(KTestFileName2_ShortName,				"AB_(CD~1");
	_LIT(KTestFileName3, 						"abc\x65B0(def)");
	_LIT(KTestFileName3_ShortName,				"ABC_(D~1");
	_LIT(KTestFileName4, 						"abcd\x65B0(ef)");
	_LIT(KTestFileName4_ShortName,				"ABCD_(~1");
	_LIT(KTestFileName5, 						"abcde\x65B0(f)");
	_LIT(KTestFileName5_ShortName,				"ABCDE_~1");
	_LIT(KTestFileNameSurrogatePair1, 			"\x0041\x0308\x006F\xD846\xDF1D\x0042");
	_LIT(KTestFileNameSurrogatePair1_ShortName,	"A_O_B");
	_LIT(KTestFileNameSurrogatePair2, 			"\xD846\xDF1D\x0041\x0042");
	_LIT(KTestFileNameSurrogatePair2_ShortName,	"_AB");
	_LIT(KTestFileNameSurrogatePair3, 			"\x0041\x0042\xD846\xDF1D");
	_LIT(KTestFileNameSurrogatePair3_ShortName,	"AB_");

	// Test file creation and long/short name generation
	TestConversion(KTestFileName1,				KTestFileName1_ShortName);
	TestConversion(KTestFileName2, 				KTestFileName2_ShortName);
	TestConversion(KTestFileName3, 				KTestFileName3_ShortName);
	TestConversion(KTestFileName4, 				KTestFileName4_ShortName);
	TestConversion(KTestFileName5, 				KTestFileName5_ShortName);
	TestConversion(KTestFileNameSurrogatePair1,	KTestFileNameSurrogatePair1_ShortName);
	TestConversion(KTestFileNameSurrogatePair2,	KTestFileNameSurrogatePair2_ShortName);
	TestConversion(KTestFileNameSurrogatePair3,	KTestFileNameSurrogatePair3_ShortName);

	test.Next(_L("--TestConsistentShortNameGeneration"));
	}

void TestConsistentShortNameExtGeneration()
	{
	test.Next(_L("++TestConsistentShortNameExtGeneration"));
	test.Next(_L("Test consistent short name extensions are generated"));
	
	// File names will be used for testing boundaries
	_LIT(KTestFileNameExt1, 						"abcdefg.\xFFFF");
	_LIT(KTestFileNameExt1_ShortName,				"ABCDEFG._");
	_LIT(KTestFileNameExt2, 						"abcdefg.t_");
	_LIT(KTestFileNameExt2_ShortName, 				"ABCDEFG.T_");
	_LIT(KTestFileNameExt3, 						"abcdefg.\xFFFFt");
	_LIT(KTestFileNameExt3_ShortName,				"ABCDEFG._T");
	_LIT(KTestFileNameExt4, 						"abcdefg.\xFFFF\xFFFF");
	_LIT(KTestFileNameExt4_ShortName,				"ABCDEFG.__");
	_LIT(KTestFileNameExtSurrogatePair1, 			"ABCDEFG.\xD846\xDF1D\x0041");
	_LIT(KTestFileNameExtSurrogatePair1_ShortName,	"ABCDEFG._A");
	_LIT(KTestFileNameExtSurrogatePair2, 			"ABCDEFG.\x0041\xD846\xDF1D");
	_LIT(KTestFileNameExtSurrogatePair2_ShortName,	"ABCDEFG.A_");

	// Test file creation and long/short name generation
	TestConversion(KTestFileNameExt1, 				KTestFileNameExt1_ShortName);
	TestConversion(KTestFileNameExt2, 				KTestFileNameExt2_ShortName);
	TestConversion(KTestFileNameExt3, 				KTestFileNameExt3_ShortName);
	TestConversion(KTestFileNameExt4, 				KTestFileNameExt4_ShortName);
	TestConversion(KTestFileNameExtSurrogatePair1, 	KTestFileNameExtSurrogatePair1_ShortName);
	TestConversion(KTestFileNameExtSurrogatePair2, 	KTestFileNameExtSurrogatePair2_ShortName);

	test.Next(_L("--TestConsistentShortNameExtGeneration"));
	}

void TestDuplicateLongFileNames()
	{
	test.Next(_L("++TestDuplicateLongFileNames"));
	test.Next(_L("Testing tilde and numbers (\"~n\") are applied correctly for multiple long-named files"));

	// These are to test "~1", "~2" behaviours when the first 8 bytes of new files
	// are identical with existing files
	_LIT(KTestFileName1, 							"ABCD\xFFFE(A).TXT");
	_LIT(KTestFileName1_ShortName, 					"ABCD_(A).TXT");
	_LIT(KTestFileName2, 							"ABCD\xFFFE(AB).TXT");
	_LIT(KTestFileName2_ShortName, 					"ABCD_(~1.TXT");
	_LIT(KTestFileName3, 							"ABCD\xFFFE(ABC).TXT");
	_LIT(KTestFileName3_ShortName, 					"ABCD_(~2.TXT");
	_LIT(KTestFileNameSurrogatePair1, 				"ABCD\xD846\xDF1D(ABC).TXT");
	_LIT(KTestFileNameSurrogatePair1_ShortName,		"ABCD_(~3.TXT");
	_LIT(KTestFileNameSurrogatePair2, 				"ABCD\xD846\xDF1D(DEF).TXT");
	_LIT(KTestFileNameSurrogatePair2_ShortName,		"ABCD_(~4.TXT");

	TFileName sn;
	MakeFile(KTestFileName1);
	TInt r = TheFs.GetShortName(KTestFileName1, sn);
	test_KErrNone(r);
	r = sn.Compare(KTestFileName1_ShortName);
	test_Equal(r, 0);

	MakeFile(KTestFileName2);
	r = TheFs.GetShortName(KTestFileName2, sn);
	test_KErrNone(r);
	r = sn.Compare(KTestFileName2_ShortName);
	test_Equal(r, 0);

	MakeFile(KTestFileName3);
	r = TheFs.GetShortName(KTestFileName3, sn);
	test_KErrNone(r);
	r = sn.Compare(KTestFileName3_ShortName);
	test_Equal(r, 0);

	MakeFile(KTestFileNameSurrogatePair1);
	r = TheFs.GetShortName(KTestFileNameSurrogatePair1, sn);
	test_KErrNone(r);
	r = sn.Compare(KTestFileNameSurrogatePair1_ShortName);
	test_Equal(r, 0);

	MakeFile(KTestFileNameSurrogatePair2);
	r = TheFs.GetShortName(KTestFileNameSurrogatePair2, sn);
	test_KErrNone(r);
	r = sn.Compare(KTestFileNameSurrogatePair2_ShortName);
	test_Equal(r, 0);

	test_KErrNone(TheFs.Delete(KTestFileName1));
	test_KErrNone(TheFs.Delete(KTestFileName2));
	test_KErrNone(TheFs.Delete(KTestFileName3));
	test_KErrNone(TheFs.Delete(KTestFileNameSurrogatePair1));
	test_KErrNone(TheFs.Delete(KTestFileNameSurrogatePair2));

	test.Next(_L("--TestDuplicateLongFileNames"));
	}

void TestDuplicateLongDirNames()
	{
	test.Next(_L("++TestDuplicateLongDirNames"));
	test.Next(_L("Testing tilde and number appended correctly for duplicate long name dirs"));

	TheFs.SessionPath(gSessionPath);

	// These are to test "~1", "~2" behaviours when the first 8 bytes of new directories
	// are identical with existing directories
	_LIT(KTestDirName1, 							"\\F32-TST\\T_SURROGATEPAIR\\ABCD\xFFFE(A)\\");
	_LIT(KTestDirName1_ShortName, 					"ABCD_(A)");
	_LIT(KTestDirName2, 							"\\F32-TST\\T_SURROGATEPAIR\\ABCD\xFFFE(AB)\\");
	_LIT(KTestDirName2_ShortName, 					"ABCD_(~1");
	_LIT(KTestDirName3, 							"\\F32-TST\\T_SURROGATEPAIR\\ABCD\xFFFE(ABC)\\");
	_LIT(KTestDirName3_ShortName,				 	"ABCD_(~2");
	_LIT(KTestDirNameSurrogatePair1, 				"\\F32-TST\\T_SURROGATEPAIR\\ABCD\xD846\xDF1D(ABCD)\\");
	_LIT(KTestDirNameSurrogatePair1_ShortName,		"ABCD_(~3");
	_LIT(KTestDirNameSurrogatePair2, 				"\\F32-TST\\T_SURROGATEPAIR\\ABCD\xD846\xDF1D(ABCDE)\\");
	_LIT(KTestDirNameSurrogatePair2_ShortName,		"ABCD_(~4");

	TFileName sn;
	MakeDir(KTestDirName1);
	TInt r = TheFs.GetShortName(KTestDirName1, sn);
	test_KErrNone(r);
	r = sn.Compare(KTestDirName1_ShortName);
	test_Equal(r, 0);

	MakeDir(KTestDirName2);
	r = TheFs.GetShortName(KTestDirName2, sn);
	test_KErrNone(r);
	r = sn.Compare(KTestDirName2_ShortName);
	test_Equal(r, 0);

	MakeDir(KTestDirName3);
	r = TheFs.GetShortName(KTestDirName3, sn);
	test_KErrNone(r);
	r = sn.Compare(KTestDirName3_ShortName);
	test_Equal(r, 0);

	MakeDir(KTestDirNameSurrogatePair1);
	r = TheFs.GetShortName(KTestDirNameSurrogatePair1, sn);
	test_KErrNone(r);
	r = sn.Compare(KTestDirNameSurrogatePair1_ShortName);
	test_Equal(r, 0);

	MakeDir(KTestDirNameSurrogatePair2);
	r = TheFs.GetShortName(KTestDirNameSurrogatePair2, sn);
	test_KErrNone(r);
	r = sn.Compare(KTestDirNameSurrogatePair2_ShortName);
	test_Equal(r, 0);

	test_KErrNone(TheFs.RmDir(KTestDirName1));
	test_KErrNone(TheFs.RmDir(KTestDirName2));
	test_KErrNone(TheFs.RmDir(KTestDirName3));
	test_KErrNone(TheFs.RmDir(KTestDirNameSurrogatePair1));
	test_KErrNone(TheFs.RmDir(KTestDirNameSurrogatePair2));

	test.Next(_L("--TestDuplicateLongDirNames"));
	}

void CallTestsL(void)
	{

	test.Title();
	test.Start(_L("Starting T_SURROGATEPAIR tests"));

#if defined(_DEBUG) || defined(_DEBUG_RELEASE)

	// Test only runs on Fat file systems
	TheFs.SessionPath(gSessionPath);
	TInt driveNum = CurrentDrive();
	TFSName name;
	TInt r = TheFs.FileSystemName(name, driveNum);
	if (KErrNone == r)
		{
		if (name.Compare(_L("Fat")) != 0)
			{
			test.Printf(_L("Test only runs on 'Fat' drives"));
			}
		else
			{
			// Check for the default implementation
			// Disables codepage dll implementation of LocaleUtils functions
			r = TheFs.ControlIo(driveNum, KControlIoDisableFatUtilityFunctions);
			test_KErrNone(r);

			CreateTestDirectory(_L("\\F32-TST\\T_SURROGATEPAIR\\"));

			TestVolumeLabel();
			TestShortNameCharacter();
			TestConsistentShortNameGeneration();
			TestConsistentShortNameExtGeneration();
			TestDuplicateLongFileNames();
			TestDuplicateLongDirNames();

			DeleteTestDirectory();

			// Disables codepage dll implementation of LocaleUtils functions for other base tests
			r = TheFs.ControlIo(driveNum, KControlIoDisableFatUtilityFunctions);
			test_KErrNone(r);
			}
		}
	else
		{
		test.Printf(_L("Drive %C: is not ready!"), 'A'+driveNum);
		test(EFalse);
		}
#else
	test.Printf(_L("Test only runs on DEBUG builds, see test logs of debug builds for details."));
#endif  // _DEBUG) || _DEBUG_RELEASE
	test.End();
	}