appfw/apparchitecture/tef/t_drivenotification.cpp
changeset 0 2e3d3ce01487
child 19 924385140d98
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/appfw/apparchitecture/tef/t_drivenotification.cpp	Tue Feb 02 10:12:00 2010 +0200
@@ -0,0 +1,275 @@
+// 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 "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:
+// Only in Armv5 platform,
+// C: Drive is set to be monitored using KApaDrivesToMonitor. The value of 
+// KApaDrivesToMonitor is set to 4. It is computed in the following way.
+// ZY XWVU TSRQ PONM LKJI HGFE DCBA
+// 00 0000 0000 0000 0000 0000 0100. 
+// If the value is Set then the corresponding drive has to be monitored.
+// 
+//
+
+/**
+ @file
+ @test
+ @internalComponent - Internal Symbian test code
+*/
+
+#include <e32test.h>
+#include "appfwk_test_utils.h"
+#include "t_drivenotification.h"
+
+_LIT(KResourceFileSourceZ, "z:\\system\\data\\tnotifydrivesapp_reg.rsc");
+
+void CDriveTestObserver::HandleAppListEvent(TInt /*aEvent*/)
+	{
+	iNotified++;
+	if (iNotifier)
+		iNotifier->Cancel();
+	CActiveScheduler::Stop();
+	}
+
+CT_DriveNotificationStep::~CT_DriveNotificationStep()
+	{	
+	}
+
+CT_DriveNotificationStep::CT_DriveNotificationStep()
+	{
+	// Call base class method to set up the human readable name for logging
+	SetTestStepName(KT_DriveNotificationStep);
+	}
+	
+/**
+   @SYMTestCaseID	APPFWK-APPARC-0083
+  
+   @SYMCR 			CR1035
+  
+   @SYMTestCaseDesc Test for the drive's notification.
+   
+   @SYMTestPriority High 
+  
+   @SYMTestStatus 	Implemented
+   
+   @SYMTestActions 	In armv5 platform, the patchable constant KApaDrivesToMonitor is set to monitor C: drive. 
+   Hence the notifications from other drives are ignored. The test copies the tnotifydrivesapp_reg.rsc to either 
+   D: or E: drive and also to C:. There will be no notification from D: or E: drives and the applist wont be 
+   updated whereas from C: notifications will be issued and applist will be updated.
+   In Winscw platform, all the drives will be monitored by default and notifications will be issued when the test
+   copies tnotifydrivesapp_reg.rsc to C: drive and W: drive and the applist will be updated.
+   
+   @SYMTestExpectedResults The app is not added to the applist when no notification is issued and applist is 
+   updated when notifications are issued.
+*/    
+void CT_DriveNotificationStep::TestDrivesNotificationL()
+	{
+	INFO_PRINTF1(_L("Start TestDriveNotification()"));
+	
+	TApaAppInfo appInfo;
+	TUid appUid = {0xA0003376};
+	RApaLsSession theLs;
+	User::LeaveIfError(theLs.Connect());
+	CleanupClosePushL(theLs);
+	
+	// Wait for applist to be updated.... 
+	RPointerArray<TDesC> dummy;
+	User::LeaveIfError(theLs.ForceRegistration(dummy));
+	
+	//Check whether app is not present in the applist
+	TInt ret = theLs.GetAppInfo(appInfo,appUid);
+	INFO_PRINTF3(_L(" Expected value is %d, Call to GetAppInfo returned : %d  "), KErrNotFound, ret);
+	TEST(ret==KErrNotFound);
+	
+	//Copy the registration file to C: drive.
+	CopyRegFileL(EDriveC);
+	
+	CDriveTestObserver* obs = new(ELeave) CDriveTestObserver();
+	CleanupStack::PushL(obs);
+	CApaAppListNotifier* notif = CApaAppListNotifier::NewL(obs, CActive::EPriorityHigh);
+	CleanupStack::PushL(notif);
+	
+	obs->iNotifier = notif;
+		
+	CActiveScheduler::Start();
+	//Since c:\\private\\10003a3f\\Import\\apps\\ path is Monitored, a notification is issued and applist is updated.
+	TEST(obs->iNotified > 0);	
+	INFO_PRINTF2(_L("Received %d notifications"),obs->iNotified);
+	
+	//Check whether applist is updated and app is present in the applist.
+	ret = theLs.GetAppInfo(appInfo,appUid);
+	INFO_PRINTF3(_L(" Expected value is %d, Call to GetAppInfo returned : %d  "), KErrNone, ret);
+	TEST(ret==KErrNone);
+	
+	//Deleting the rsc file that is present in c:\\private\\10003a3f\\Import\\apps\\ path.
+	DeleteRegFileL(EDriveC);
+	
+	// Wait for applist to be updated.... 
+	User::LeaveIfError(theLs.ForceRegistration(dummy));
+	
+	//Check whether applist is updated and app is absent in the applist.
+	ret = theLs.GetAppInfo(appInfo,appUid);
+	INFO_PRINTF3(_L(" Expected value is %d, Call to GetAppInfo returned : %d  "), KErrNotFound, ret);
+	TEST(ret==KErrNotFound);
+		
+	//Armv5 platform, GetMMCDriveL() returns either the D: (in case of NAND rom) or E: (in case of Normal rom).
+	//Winscw platform, GetMMCDriveL() returns W:.
+	TDriveNumber drive = GetMMCDriveL();
+	
+	//Copy the registration file to drive specified.
+	CopyRegFileL(drive);
+	
+	// Wait for applist to be updated.... 
+	User::LeaveIfError(theLs.ForceRegistration(dummy));
+	
+	//Check whether applist is updated and app is present in the applist.
+#ifdef __EABI__
+	ret = theLs.GetAppInfo(appInfo,appUid);
+	TEST (ret == KErrNotFound);
+	INFO_PRINTF3(_L(" Expected value is %d, Call to GetAppInfo returned : %d  "), KErrNotFound, ret);
+	//Deleting the rsc file.
+	DeleteRegFileL(drive);
+#else	
+	ret = theLs.GetAppInfo(appInfo,appUid);
+	TEST(ret==KErrNone);
+	INFO_PRINTF3(_L(" Expected value is %d, Call to GetAppInfo returned : %d  "),KErrNone, ret);
+	//Deleting the rsc file.
+	DeleteRegFileL(drive);
+#endif
+	CleanupStack::PopAndDestroy(3, &theLs);
+	
+	INFO_PRINTF1(_L("End TestDrivesNotificationL()"));
+	}
+/*
+Copy the tnotifydrivesapp_reg.rsc file from source to destination. 
+In Winscw platform, the registration file is copied to C: and W: drive.
+In Armv5 platform, the registration file is copied to C: and D: or E: drive. 
+*/
+
+void CT_DriveNotificationStep::CopyRegFileL(TDriveNumber aDriveNumber)
+	{
+	_LIT(KResourceFileTarget, ":\\private\\10003a3f\\Import\\apps\\tnotifydrivesapp_reg.rsc");	
+	_LIT(KResourceAppFolder, ":\\private\\10003a3f\\Import\\apps\\");
+	RBuf tempPathToBeCopied, tempFolderToBeCreated;
+	RFs fs;
+	TChar driveLetter;
+	CleanupClosePushL(fs);
+	User::LeaveIfError(fs.Connect());
+	TInt maxSizeofFileName = KResourceFileTarget().Length() + 1;
+	TInt maxSizeofFolderName = KResourceAppFolder().Length() + 1;
+	tempPathToBeCopied.CreateL(maxSizeofFileName);
+	CleanupClosePushL(tempPathToBeCopied);
+	tempFolderToBeCreated.CreateL(maxSizeofFolderName);
+	CleanupClosePushL(tempFolderToBeCreated);
+	fs.DriveToChar(aDriveNumber,driveLetter);
+	tempPathToBeCopied.Append(driveLetter);
+	tempPathToBeCopied.Append(KResourceFileTarget);
+	tempFolderToBeCreated.Append(driveLetter);
+	tempFolderToBeCreated.Append(KResourceAppFolder);
+	RSmlTestUtils smlServer;
+	CleanupClosePushL(smlServer);
+	TInt ret = smlServer.Connect();
+	TEST(ret == KErrNone);
+	ret = smlServer.CreateDirectoryL(tempFolderToBeCreated);
+	if (ret != KErrNone && ret != KErrAlreadyExists)
+		{
+		User::LeaveIfError(ret);
+		}
+	ret = smlServer.CopyFileL(KResourceFileSourceZ, tempPathToBeCopied);
+	TEST(ret == KErrNone);
+	INFO_PRINTF2(_L("Copied Registration file. Finished with the value : %d "), ret);
+	CleanupStack::PopAndDestroy(4, &fs);
+	}
+
+
+
+void CT_DriveNotificationStep::DeleteRegFileL(TDriveNumber aDriveNumber)
+	{
+	_LIT(KResourceFileTarget, ":\\private\\10003a3f\\Import\\apps\\tnotifydrivesapp_reg.rsc");	
+	RBuf tempPathToBeDeleted;
+	RFs fs;
+	TChar driveLetter;
+	CleanupClosePushL(fs);
+	User::LeaveIfError(fs.Connect());
+	TInt maxSizeofFileName = KResourceFileTarget().Length() + 1;
+	tempPathToBeDeleted.CreateL(maxSizeofFileName);
+	CleanupClosePushL(tempPathToBeDeleted);
+	fs.DriveToChar(aDriveNumber,driveLetter);
+	tempPathToBeDeleted.Append(driveLetter);
+	tempPathToBeDeleted.Append(KResourceFileTarget);
+	RSmlTestUtils smlServer;
+	CleanupClosePushL(smlServer);
+	TInt ret = smlServer.Connect();
+	TEST(ret == KErrNone);
+	ret = smlServer.SetReadOnly(tempPathToBeDeleted, 0)	;
+	TEST(ret == KErrNone);
+	//delete the file
+	ret = smlServer.DeleteFileL(tempPathToBeDeleted);	
+	TEST(ret == KErrNone);
+	INFO_PRINTF2(_L("Deleted Registration file. Finished with value : %d"), ret);	
+	CleanupStack::PopAndDestroy(3,&fs);
+	}
+	
+
+TDriveNumber CT_DriveNotificationStep::GetMMCDriveL()
+	{
+	TDriveNumber drive = EDriveW;	
+#ifdef __EABI__
+	RFs	fs;
+ 	User::LeaveIfError(fs.Connect());
+	// The removable media is expected at D: on NAND ROM and at E: on normal ROMs.
+	//The following code works on techview but not guaranteed to work on all platforms. 
+	TDriveInfo driveInfo;
+	TInt err = fs.Drive(driveInfo, EDriveD);
+	if(err == KErrNone && ((driveInfo.iDriveAtt & KDriveAttRemovable) != 0))
+		{
+	 	 // Use drive D
+	 	drive = EDriveD;
+	 	}
+	 else
+	 	{
+		err = fs.Drive(driveInfo, EDriveE);
+		if(err == KErrNone && ((driveInfo.iDriveAtt & KDriveAttRemovable) != 0))
+			{
+		 	// Use drive E
+		 	drive = EDriveE;
+		 	}
+		}
+	fs.Close();
+#else
+	drive = EDriveW;
+#endif	
+	return drive;
+	}
+
+
+TVerdict CT_DriveNotificationStep::doTestStepL()
+	{
+	INFO_PRINTF1(_L("Testing the Notifications ... T_DriveNotification"));
+	
+	// start an active scheduler
+	iScheduler=new(ELeave) CActiveScheduler();
+	CActiveScheduler::Install(iScheduler);
+	
+	// run the testcode (inside an alloc heaven harness)
+ 	__UHEAP_MARK;
+ 	 	
+ 	TRAPD(ret,TestDrivesNotificationL());
+	TEST(ret==KErrNone);
+	INFO_PRINTF2(_L("TestDrivesNotificationL finished with code '%d'\n"), ret);
+ 	
+  	__UHEAP_MARKEND;
+
+	INFO_PRINTF1(_L("T_DriveNotification Completed."));
+	return TestStepResult();
+	}
+