--- /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();
+ }
+