kerneltest/f32test/server/t_appins.cpp
author Tom Cosgrove <tom.cosgrove@nokia.com>
Fri, 28 May 2010 16:29:07 +0100
changeset 30 8aab599e3476
parent 0 a41df078684a
child 43 c1f20ce4abcf
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) 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_appins.cpp
// 
//

#include <f32file.h>
#include <e32test.h>
#include <hal.h>
#include "t_server.h"
#include "t_chlffs.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_APPINS"));
LOCAL_D RFs TheNotifyFs;	//	Fileserver session to receive/request change notification
TInt RemovableDrive;
/*

	What this test is for:
	Tests bug fix for the bug which doesn't notify drive D: when files are installed onto it
 
*/

LOCAL_C void Test1()
//
//	Test notification when session path of notification session is set to be explicitly different 
//	from the drive and directory into which files and directories are created
//
	{
	TFileName path;
	path=_L("?:\\F32-TST\\T_APPINS\\");
		
	TInt r=TheNotifyFs.SessionPath(gSessionPath);
	test(r==KErrNone);

	TChar driveChar;
	r=RFs::DriveToChar(RemovableDrive,driveChar);
	test(r==KErrNone);
	
	if (gSessionPath[0]=='C')
		(gSessionPath[0] == (TText)gDriveToTest)? (path[0] = (TText)driveChar):(path[0] = (TText)gDriveToTest);
	else if (gSessionPath[0]=='Y')
		path[0]='X';
	else if (gSessionPath[0]=='X')
		path[0]='Y';
	else 
		path[0]='C';	//invalid drive numbers shouldn't reach here, must be filtered out from t_main
		//return;
	
	TRequestStatus statEntry(KRequestPending);
	TRequestStatus statFile(KRequestPending);
	TRequestStatus statDir(KRequestPending);
	TRequestStatus statWild(KRequestPending);
	TRequestStatus statWilder(KRequestPending);

	r=TheFs.RmDir(path);
	test((r==KErrNone)||(r==KErrNotFound)||(r==KErrPathNotFound));

	test.Printf(_L("Notify Session Path %S\n"),&gSessionPath);

//	Submit notify change requests (requesting ahead)
	test.Printf(_L("Create a directory %S\n"),&path);
	TheNotifyFs.NotifyChange(ENotifyEntry,statEntry,path);
	TheNotifyFs.NotifyChange(ENotifyFile,statFile,path);
	TheNotifyFs.NotifyChange(ENotifyDir,statDir,path);
	TheNotifyFs.NotifyChange(ENotifyEntry,statWild,_L("?:\\F32-TST\\T_APPINS\\"));
	TheNotifyFs.NotifyChange(ENotifyEntry,statWilder,_L("*:\\"));

	r=TheFs.MkDir(path);	
	test((r==KErrNone)||(r==KErrAlreadyExists));
	User::WaitForAnyRequest();
	test(statEntry==KErrNone);
	test(statFile==KErrNone);
	test(statDir==KErrNone);
	test(statWild==KErrNone);
	test(statWilder==KErrNone);
	
//	Resubmit notify change requests (requesting ahead)
	test.Next(_L("Create a file in the directory"));
	TheNotifyFs.NotifyChange(ENotifyEntry,statEntry,path);
	TheNotifyFs.NotifyChange(ENotifyFile,statFile,path);
	TheNotifyFs.NotifyChange(ENotifyDir,statDir,path);
	TheNotifyFs.NotifyChange(ENotifyEntry,statWild,_L("?:\\F32-TST\\T_APPINS\\"));
	TheNotifyFs.NotifyChange(ENotifyFile,statWilder,_L("*:\\"));

	TFileName filePath;
	filePath=path;
	filePath+=_L("TestFile.app");
	RFile file;
	r=file.Replace(TheFs,filePath,EFileRead|EFileWrite);
	file.Close();
	User::WaitForAnyRequest();
	test(r==KErrNone);
	test (statEntry==KErrNone);
	test(statFile==KErrNone);
	test(statDir==KRequestPending);
	test(statWild==KErrNone);
	test(statWilder==KErrNone);

//	Resubmit notify change requests	
	test.Next(_L("Remove the file from the directory"));
	TheNotifyFs.NotifyChange(ENotifyEntry,statEntry,path);
	TheNotifyFs.NotifyChange(ENotifyFile,statFile,path);
	TheNotifyFs.NotifyChange(ENotifyDir,statWild,_L("?:\\F32-TST\\T_APPINS\\"));
	TheNotifyFs.NotifyChange(ENotifyEntry,statWilder,_L("*:\\"));
	
	r=TheFs.Delete(filePath);
	test(r==KErrNone);
	User::WaitForAnyRequest();
	test (statEntry==KErrNone);
	test(statFile==KErrNone);
	test(statDir==KRequestPending);
	test(statWild==KRequestPending);
	test(statWilder==KErrNone);

//	Resubmit notify change requests	
	test.Next(_L("Remove the directory"));
	TheNotifyFs.NotifyChange(ENotifyEntry,statEntry,path);
	TheNotifyFs.NotifyChange(ENotifyFile,statFile,path);
//	TheNotifyFs.NotifyChange(ENotifyEntry,statWild,_L("?:\\F32-TST\\T_APPINS\\"));
	TheNotifyFs.NotifyChange(ENotifyFile,statWilder,_L("*:\\"));

	r=TheFs.RmDir(path);
	test(r==KErrNone);
	User::WaitForAnyRequest();
	test (statEntry==KErrNone);
	test(statFile==KRequestPending);
	test(statDir==KErrNone);
	test(statWild==KErrNone);
	test(statWilder==KRequestPending);

//	In case any outstanding notification requests exist
	TheNotifyFs.NotifyChangeCancel();
	}

LOCAL_C void Test2()
//
//	Test notification when session path of the notification session is implicitly different 
//	to the drive and directory into which files and directories are created
//
	{
	TFileName sessionPath;
	sessionPath=_L("?:\\F32-TST\\");
		
	TChar driveChar;
	TInt err=RFs::DriveToChar(RemovableDrive,driveChar);
	test(err==KErrNone);

	if (gSessionPath[0]=='C')
		(gSessionPath[0] == (TText)gDriveToTest)? (sessionPath[0] = (TText)driveChar):(sessionPath[0] = (TText)gDriveToTest);
	else if (gSessionPath[0]=='Y')
		sessionPath[0]='X';
	else if (gSessionPath[0]=='X')
		sessionPath[0]='Y';
	else 
		sessionPath[0]='C';	//invalid drive numbers shouldn't reach here, must be filtered out from t_main
		//return;
	
	TInt r=TheFs.SetSessionPath(sessionPath);
	test(r==KErrNone);

	TFileName path;
	path=_L("\\F32-TST\\T_APPINS\\");	//	Takes drive implicitly from associated session path
						
	r=TheFs.RmDir(path);
	test((r==KErrNone)||(r==KErrNotFound)||(r==KErrPathNotFound));
	
	TRequestStatus statEntry(KRequestPending);
	TRequestStatus statFile(KRequestPending);
	TRequestStatus statDir(KRequestPending);
	TRequestStatus statWild(KRequestPending);
	TRequestStatus statWilder(KRequestPending);

	test.Printf(_L("Notify Session Path %S\n"),&gSessionPath);
	test.Printf(_L("File Creation Session Path %S\n"),&sessionPath);

//	Submit notify change requests (requesting ahead)
	test.Printf(_L("Create a directory %S\n"),&path);

	TheNotifyFs.NotifyChange(ENotifyEntry,statEntry,path);	//	Watches drive associated with
	TheNotifyFs.NotifyChange(ENotifyFile,statFile,path);
	TheNotifyFs.NotifyChange(ENotifyDir,statDir,path);
	TheNotifyFs.NotifyChange(ENotifyEntry,statWild,_L("?:\\F32-TST\\T_APPINS\\"));
	TheNotifyFs.NotifyChange(ENotifyAll,statWilder,_L("*:\\"));

	r=TheFs.MkDir(path);										//	Creates the directory on the drive
	test((r==KErrNone)||(r==KErrAlreadyExists));				//	associated with TheFs session path
	test (statEntry==KRequestPending);
	test(statFile==KRequestPending);
	test(statDir==KRequestPending);	//	No notification because it's watching a different drive!
	test(statWild==KErrNone);	//	BUG FIX TEST
	test(statWilder==KErrNone);

//	Don't need to resubmit notify change requests
	test.Next(_L("Create a file in the directory"));
	TheNotifyFs.NotifyChange(ENotifyFile,statWild,_L("?:\\F32-TST\\T_APPINS\\"));
	TheNotifyFs.NotifyChange(ENotifyFile,statWilder,_L("*:\\"));

	TFileName filePath;
	filePath=path;
	filePath+=_L("TestFile.app");
	RFile file;
	r=file.Replace(TheFs,filePath,EFileRead|EFileWrite);
	file.Close();
	test(r==KErrNone);

	test (statEntry==KRequestPending);	//	No notification!
	test(statFile==KRequestPending);
	test(statDir==KRequestPending);	
	test(statWild==KErrNone);
	test(statWilder==KErrNone);

//	No need to resubmit notify change requests	
	TheNotifyFs.NotifyChange(ENotifyEntry,statWild,_L("?:\\F32-TST\\T_APPINS\\"));
	TheNotifyFs.NotifyChange(ENotifyDir,statWilder,_L("*:\\"));

	r=TheFs.Delete(filePath);
	test(r==KErrNone);
//	Still no notification	
	test (statEntry==KRequestPending);
	test(statFile==KRequestPending);
	test(statDir==KRequestPending);
	test(statWild==KErrNone);
	test(statWilder==KRequestPending);

//	No need to resubmit notify change requests	
	test.Next(_L("Remove the directory"));
	TheNotifyFs.NotifyChange(ENotifyDir,statWild,_L("?:\\F32-TST\\T_APPINS\\"));
//	TheNotifyFs.NotifyChange(ENotifyDir,statWilder,_L("*:\\"));
	r=TheFs.RmDir(path);
	test(r==KErrNone);
//	Still no notification	
	test (statEntry==KRequestPending);
	test(statFile==KRequestPending);
	test(statDir==KRequestPending);
	test(statWild==KErrNone);
	test(statWilder==KErrNone);

//	Cancel the outstanding requests
	TheNotifyFs.NotifyChangeCancel();
	}

LOCAL_C void Test3()
//
//	Test notification when session path of the notification session is set to be the 
//	same as the drive and directory into which files and directories are created
//
	{
	TFileName path;
	path=_L("\\F32-TST\\T_APPINS\\");
	TInt r=TheFs.RmDir(path);
	test((r==KErrNone)||(r==KErrNotFound)||(r==KErrPathNotFound));
	
	TRequestStatus statEntry(KRequestPending);
	TRequestStatus statFile(KRequestPending);
	TRequestStatus statDir(KRequestPending);
	TRequestStatus statWild(KRequestPending);
	TRequestStatus statWilder(KRequestPending);

	test.Printf(_L("Session Path %S\n"),&gSessionPath);
//	Set the session path of the session	which creates the file/directory to be
//	the same as the notification session's session path
	r=TheFs.SetSessionPath(gSessionPath);
	test(r==KErrNone);

//	Submit notify change requests (requesting ahead)
	test.Printf(_L("Create a directory %S\n"),&path);
	TheNotifyFs.NotifyChange(ENotifyEntry,statEntry,path);
	TheNotifyFs.NotifyChange(ENotifyFile,statFile,path);
	TheNotifyFs.NotifyChange(ENotifyDir,statDir,path);
	TheNotifyFs.NotifyChange(ENotifyEntry,statWild,_L("?:\\F32-TST\\"));
	TheNotifyFs.NotifyChange(ENotifyEntry,statWilder,_L("*:\\"));

	r=TheFs.MkDir(path);	
	test((r==KErrNone)||(r==KErrAlreadyExists));
	User::WaitForAnyRequest();
	test (statEntry==KErrNone);
	test(statFile==KErrNone);
	test(statDir==KErrNone);
	test(statWild==KErrNone);
	test(statWilder==KErrNone);

//	Resubmit notify change requests (requesting ahead)
	test.Next(_L("Create a file in the directory"));
	TheNotifyFs.NotifyChange(ENotifyEntry,statEntry,path);
	TheNotifyFs.NotifyChange(ENotifyFile,statFile,path);
	TheNotifyFs.NotifyChange(ENotifyDir,statDir,path);
	TheNotifyFs.NotifyChange(ENotifyEntry,statWild,_L("?:\\F32-TST\\"));
	TheNotifyFs.NotifyChange(ENotifyEntry,statWilder,_L("*:\\"));


	TFileName filePath;
	filePath=path;
	filePath+=_L("TestFile.app");
	RFile file;
	r=file.Replace(TheFs,filePath,EFileRead|EFileWrite);
	file.Close();
	User::WaitForAnyRequest();
	test(r==KErrNone);
	test (statEntry==KErrNone);
	test(statFile==KErrNone);
	test(statDir==KRequestPending);	
	test(statWild==KErrNone);
	test(statWilder==KErrNone);

//	Resubmit notify change requests	
	test.Next(_L("Remove the file from the directory"));
	TheNotifyFs.NotifyChange(ENotifyEntry,statEntry,path);
	TheNotifyFs.NotifyChange(ENotifyFile,statFile,path);
	TheNotifyFs.NotifyChange(ENotifyEntry,statWild,_L("?:\\F32-TST\\"));
	TheNotifyFs.NotifyChange(ENotifyEntry,statWilder,_L("*:\\"));

	r=TheFs.Delete(filePath);
	test(r==KErrNone);
	User::WaitForAnyRequest();
	test (statEntry==KErrNone);
	test(statFile==KErrNone);
	test(statDir==KRequestPending);
	test(statWild==KErrNone);
	test(statWilder==KErrNone);

//	Resubmit notify change requests	
	test.Next(_L("Remove the directory"));
	TheNotifyFs.NotifyChange(ENotifyEntry,statEntry,path);
	TheNotifyFs.NotifyChange(ENotifyFile,statFile,path);
	TheNotifyFs.NotifyChange(ENotifyEntry,statWild,_L("?:\\F32-TST\\"));
	TheNotifyFs.NotifyChange(ENotifyEntry,statWilder,_L("*:\\"));

	r=TheFs.RmDir(path);
	test(r==KErrNone);
	User::WaitForAnyRequest();
	test (statEntry==KErrNone);
	test(statFile==KRequestPending);
	test(statDir==KErrNone);
	test(statWild==KErrNone);
	test(statWilder==KErrNone);

//	Cancel any outstanding notification change requests
	TheNotifyFs.NotifyChangeCancel();
	}

#if !defined(__WINS__)

LOCAL_C void Test4()
//
//	Test notification when session path is set to be different from the drive and directory
//	into which files and directories are created
//
	{
	TFileName path;
	TBuf<23> pathBuf=_L("?:\\F32-TST\\T_APPINS\\");
	
	TChar driveChar;
	TInt r=RFs::DriveToChar(RemovableDrive,driveChar);
	test(r==KErrNone);
	
	if (gDriveToTest =='C')
		pathBuf[0]=driveChar;
	else
		pathBuf[0] =gDriveToTest;
	
	path = pathBuf;
	r=TheFs.RmDir(path);
	test((r==KErrNone)||(r==KErrNotFound)||(r==KErrPathNotFound));
		
	TInt result;
	result=TheFs.MkDir(_L("C:\\SILLY\\"));
	test((result==KErrNone)||(result==KErrAlreadyExists));
	result=TheFs.MkDir(_L("C:\\SILLY\\SILLIER\\"));
	test((result==KErrNone)||(result==KErrAlreadyExists));
	result=TheFs.MkDir(_L("C:\\SILLY\\SILLIER\\SILLIEST\\"));
	test((result==KErrNone)||(result==KErrAlreadyExists));

	result=TheNotifyFs.SetSessionPath(_L("C:\\SILLY\\SILLIER\\SILLIEST\\"));
	test(result==KErrNone);
	
	result=TheNotifyFs.SessionPath(gSessionPath);
	test(result==KErrNone);
	test.Printf(_L("Session Path %S\n"),&gSessionPath);

	TRequestStatus statEntry(KRequestPending);
	TRequestStatus statFile(KRequestPending);
	TRequestStatus statDir(KRequestPending);

//	Submit notify change requests (requesting ahead)
	test.Printf(_L("Create a directory %S\n"),&path);
	TheNotifyFs.NotifyChange(ENotifyEntry,statEntry,path);
	TheNotifyFs.NotifyChange(ENotifyFile,statFile,path);
	TheNotifyFs.NotifyChange(ENotifyDir,statDir,path);

	r=TheFs.MkDir(path);	
	test((r==KErrNone)||(r==KErrAlreadyExists));
	User::WaitForAnyRequest();
	test (statEntry==KErrNone);
	test(statFile==KErrNone);
	test(statDir==KErrNone);

//	Resubmit notify change requests (requesting ahead)
	test.Next(_L("Create a file in the directory"));
	TheNotifyFs.NotifyChange(ENotifyEntry,statEntry,path);
	TheNotifyFs.NotifyChange(ENotifyFile,statFile,path);
	TheNotifyFs.NotifyChange(ENotifyDir,statDir,path);

	TFileName filePath;
	filePath=path;
	filePath+=_L("TestFile.app");
	RFile file;
	r=file.Replace(TheFs,filePath,EFileRead|EFileWrite);
	file.Close();
	User::WaitForAnyRequest();
	test(r==KErrNone);
	test (statEntry==KErrNone);
	test(statFile==KErrNone);
	test(statDir==KRequestPending);

//	Resubmit notify change requests	
	test.Next(_L("Remove the file from the directory"));
	TheNotifyFs.NotifyChange(ENotifyEntry,statEntry,path);
	TheNotifyFs.NotifyChange(ENotifyFile,statFile,path);
	
	r=TheFs.Delete(filePath);
	test(r==KErrNone);
	User::WaitForAnyRequest();
	test (statEntry==KErrNone);
	test(statFile==KErrNone);
	test(statDir==KRequestPending);

//	Resubmit notify change requests	
	test.Next(_L("Remove the directory"));
	TheNotifyFs.NotifyChange(ENotifyEntry,statEntry,path);
	TheNotifyFs.NotifyChange(ENotifyFile,statFile,path);
	r=TheFs.RmDir(path);
	test(r==KErrNone);
	User::WaitForAnyRequest();
	test (statEntry==KErrNone);
	test(statFile==KRequestPending);
	test(statDir==KErrNone);

	result=TheFs.RmDir(_L("C:\\SILLY\\SILLIER\\SILLIEST\\"));
	test((result==KErrNone)||(result==KErrAlreadyExists));
	result=TheFs.RmDir(_L("C:\\SILLY\\SILLIER\\"));
	test((result==KErrNone)||(result==KErrAlreadyExists));
	result=TheFs.RmDir(_L("C:\\SILLY\\"));
	test((result==KErrNone)||(result==KErrAlreadyExists));	
	}

#endif
LOCAL_C void DoTests()
//
// Do all tests
//
	{
	Test1();
	Test2();
	Test3();
	}

GLDEF_D void CallTestsL(void)
//
//
//
    {
	test.Title();
	
	TChar driveLetter;
	TChar driveChar;
	TDriveList drvList;
	TBuf<13> dirBuf=_L("?:\\F32-TST\\");


	if (IsSessionDriveLFFS(TheFs,driveLetter))
		{
		test.Printf(_L("DoTestsL(): Skipped: test does not run on LFFS.\n"));
		return;
		}

	test.Start(_L("Testing filesystem"));
	TInt r=TheNotifyFs.Connect();
	test(r==KErrNone);
	TFileName sessionPath;
	TInt uid;
	test(HAL::Get(HAL::EMachineUid,uid)==KErrNone);
	if(uid==HAL::EMachineUid_Cogent || uid==HAL::EMachineUid_IQ80310 || uid==HAL::EMachineUid_X86PC)
		{
		test.Printf(_L("WARNING: d: not tested on cogent or IQ80310 \n"));
		goto End;
		}

#if !defined(__WINS__)
//	MARM TESTS
	r=TheFs.MkDir(_L("C:\\F32-TST\\"));
	test((r==KErrNone)||(r==KErrAlreadyExists));

	if(KErrNone == TheFs.DriveList(drvList))
		{
		TInt i;
		//should be successful, otherwise it means a system w/o any drive!!!
		for(i=0;i<KMaxDrives;i++)
			{
			TDriveInfo driveInfo;
			if((drvList[i] != 0)
				&& (KErrNone == TheFs.Drive(driveInfo, i))
				&& (driveInfo.iType == EMediaHardDisk)
				&& (driveInfo.iDriveAtt & KDriveAttRemovable))
				{
				RemovableDrive = i;
				test.Printf(_L("RemovableDrive = %d\n"),RemovableDrive);
				break;
				}
			}
		if(i == KMaxDrives)
			{
			test.Printf(_L("No Removable media found! Testing discontinued.\n"));
			User::Exit(KErrNone);
			}			
		}
	else
		{
		test.Printf(_L("No Drive found! Testing discontinued.\n"));
		User::Exit(KErrNone);
		}
	
	r=RFs::DriveToChar(RemovableDrive,driveChar);
	test(r==KErrNone);
	
	if(gDriveToTest == 'C')
		dirBuf[0] = (TText)driveChar;
	else
		dirBuf[0] = (TText)gDriveToTest;
		
	r=TheFs.MkDir(dirBuf);
	if ((r!=KErrNone)||(r!=KErrAlreadyExists))
		{
		test.Printf(_L("TEST REQUIRES A CF CARD - "));
		//test.Printf(_L("PUT A VALID CARD IN AND PRESS A KEY..."));
		//test.Getch();
		r=TheFs.MkDir(dirBuf);
		}
	test((r==KErrNone)||(r==KErrAlreadyExists));	
		
//	Set the notification session path to the test directory on C drive
	sessionPath=_L("C:\\F32-TST\\");
	r=TheNotifyFs.SetSessionPath(sessionPath);
	test(r==KErrNone);
//	Run tests
	TRAP(r,DoTests());
	if (r!=KErrNone)
		test.Printf(_L("Error: %d\n"),r);
	Test4();
	CheckDisk();

//	Set the notification session path to the test directory on gDriveToTest
	if(gDriveToTest == 'C')
		sessionPath[0] = (TText)driveChar;
	else
		sessionPath[0] = (TText)gDriveToTest;
		

	r=TheNotifyFs.SetSessionPath(sessionPath);
	test(r==KErrNone);

	test(r==KErrNone);
	TRAP(r,DoTests());
	if (r!=KErrNone)
		test.Printf(_L("Error: %d\n"),r);
	Test4();
	CheckDisk();
#elif defined (__WINS__)
	r=TheFs.MkDir(_L("X:\\F32-TST\\"));
	test((r==KErrNone)||(r==KErrAlreadyExists));
	r=TheFs.MkDir(_L("Y:\\F32-TST\\"));
	test((r==KErrNone)||(r==KErrAlreadyExists));
//	Set session path to test directory on Y drive
	r=TheNotifyFs.SetSessionPath(_L("Y:\\F32-TST\\"));
	test(r==KErrNone);
	TRAP(r,DoTests());
	if (r!=KErrNone)
		test.Printf(_L("Error: %d\n"),r);

	CheckDisk();

	//we have no X drive on eka2 yet
//	Set session path to test directory on X drive	
//	r=TheNotifyFs.SetSessionPath(_L("X:\\F32-TST\\"));
//	test(r==KErrNone);
//	TRAP(r,DoTests());

	if (r!=KErrNone)
		test.Printf(_L("Error: %d\n"),r);

	CheckDisk();
#endif

End:
	TheNotifyFs.Close();
	test.End();
	test.Close();
    }