diff -r e8c1ea2c6496 -r 8758140453c0 localisation/apparchitecture/tef/T_NotifStep.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/localisation/apparchitecture/tef/T_NotifStep.cpp Thu Jan 21 12:53:44 2010 +0000 @@ -0,0 +1,305 @@ +// Copyright (c) 2005-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 "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// Checks for notifications when application list changes.\n +// +// + + + +/** + @file + @test + @internalComponent - Internal Symbian test code +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "appfwk_test_utils.h" +#include "T_NotifStep.h" + + +/** + + Overridden from virtual method MApaAppListServObserver::HandleAppListEvent(). + This method is used to receive notification for change in application list.\n + +*/ +void CTestObserver::HandleAppListEvent(TInt /*aEvent*/) + { + + iNotified++; + if (iNotifier) + iNotifier->Cancel(); + CActiveScheduler::Stop(); + } + +/** + Auxiliary Fn for Test Case ID T-NotifStep-TestAppNotificationL + + Copy a registration resource file in the path "c:\private\10003a3f\import\apps" . +*/ +void CT_NotifStep::CreateAppL(const TDesC& aAppName) + { + TFileName appFullName; + TFileName appTargetName; + CFileMan* fileManager = CFileMan::NewL(iFs); + CleanupStack::PushL(fileManager); + appFullName.Format(_L("z:\\ApparcTest\\%S_reg.RSC"),&aAppName); + appTargetName.Format(_L("C:\\Private\\10003a3f\\Import\\apps\\%S_reg.Rsc"), &aAppName); + INFO_PRINTF2(_L("copying the file: %S"), &appTargetName); + TInt ret = fileManager->Copy (appFullName, appTargetName, CFileMan::ERecurse); + TEST(ret==KErrNone); + CleanupStack::PopAndDestroy(fileManager); + } + +/** + Auxiliary Fn for Test Case ID T-NotifStep-TestAppNotificationL + Delete a registration resource file from the path "c:\private\10003a3f\import\apps" . +*/ +void CT_NotifStep::DeleteAppL(const TDesC& aAppName) + { + TFileName appFullName; + CFileMan* fileManager = CFileMan::NewL(iFs); + CleanupStack::PushL(fileManager); + appFullName.Format(_L("C:\\Private\\10003a3f\\Import\\apps\\%S_reg.Rsc"),&aAppName); + + INFO_PRINTF2(_L("Deleting the file: %S"), &appFullName); + TRequestStatus status; + TTime tempTime(0); // added tempTime to avoid asynch CFileMan::Attribs request completing with KErrArgument + TEST(fileManager->Attribs(appFullName,0,KEntryAttReadOnly, tempTime, CFileMan::ERecurse, status)==KErrNone); + User::WaitForRequest(status); + TEST(status.Int() == KErrNone); + TInt ret = fileManager->Delete(appFullName, CFileMan::ERecurse); + TEST(ret==KErrNone); + CleanupStack::PopAndDestroy(fileManager); + } + +/** + @SYMTestCaseID T-NotifStep-TestAppNotificationL + + @SYMPREQ REQ1087, PCHY-5L3RDW + + @SYMTestCaseDesc Test whether notification is received from CApaAppListNotifier + whenever application list changes. + + @SYMTestPriority High + + @SYMTestStatus Implemented + + @SYMTestActions The method creates an object of user-defined observer CTestObserver + and creates a CApaAppListNotifier active object which is associated to the + observer. It then starts the active scheduler and adds a new application or deletes + an application from the application list. To ensure that notifications are received on + change in application list HandleAppListEvent() method which is derived + from interface class MApaAppListServObserver is observed.\n + API Calls:\n + CApaAppListNotifier::NewL(MApaAppListServObserver* aObserver, TPriority aPriority)\n + + @SYMTestExpectedResults On deletion of the app the notification for change in + the application list is received. + + */ +void CT_NotifStep::TestAppNotificationL() + { + // Force the applist to be updated + //To ensure that server has time to count all applications in the system + RPointerArray dummy; + User::LeaveIfError(iSession.ForceRegistration(dummy)); + + TInt theAppCount = 0; + TInt theErr1 = iSession.AppCount(theAppCount); + TEST(theErr1==KErrNone); + + INFO_PRINTF2(_L("The number of applications : %d"), theAppCount); + + CTestObserver* obs=new(ELeave) CTestObserver(); + CleanupStack::PushL(obs); + CApaAppListNotifier* notif=CApaAppListNotifier::NewL(obs,CActive::EPriorityHigh); + CleanupStack::PushL(notif); + obs->iNotifier=notif; + INFO_PRINTF1(_L("Creating and deleting apps for notification")); + CreateAppL(_L("AAA")); + + CActiveScheduler::Start(); + + TInt theAppCount1 = 0; + theErr1 = iSession.AppCount(theAppCount1); + TEST((theAppCount1 - 1) == theAppCount); + INFO_PRINTF2(_L("The number of applications : %d"), theAppCount1); + CleanupStack::PopAndDestroy(notif); + + notif = CApaAppListNotifier::NewL(obs,CActive::EPriorityHigh); + CleanupStack::PushL(notif); + obs->iNotifier = notif; + INFO_PRINTF1(_L("Deleting the application")); + DeleteAppL(_L("AAA")); + + CActiveScheduler::Start(); + + CleanupStack::PopAndDestroy(notif); + User::LeaveIfError(iSession.ForceRegistration(dummy)); + theErr1 = iSession.AppCount(theAppCount1); + TEST(theErr1==KErrNone); + TEST(theAppCount1 == theAppCount); + + INFO_PRINTF2(_L("The number of applications : %d"), theAppCount1); + TEST(obs->iNotified>0); + + INFO_PRINTF2(_L("Received %d notifications"),obs->iNotified); + CleanupStack::PopAndDestroy(obs); + } + +void CT_NotifStep::ModifyIconFileTimeStamp() + { + _LIT(KMbmIconFile, "c:\\resource\\apps\\tupgradeiconapp.mbm"); + _LIT(KTestIconFile, "c:\\TestUpgradeIcon\\tupgradeiconapp.mbm"); + _LIT(KTestIconFileTempPath, "c:\\TestUpgradeIcon\\"); + + // Create KMbmIconFileTempPath + TInt ret = iUtils.CreateDirectoryL(KTestIconFileTempPath); + TEST(ret == KErrNone || ret == KErrAlreadyExists); + INFO_PRINTF1(_L("Copy icon file from C: drive to temp path")); + ret = iUtils.CopyFileL(KMbmIconFile, KTestIconFileTempPath); + + INFO_PRINTF1(_L("Modify timestamp of the icon file")); + TTime modifiedTime(0); + modifiedTime.HomeTime(); + ret = iFs.SetModified(KTestIconFile, modifiedTime); + TEST(ret==KErrNone); + ret = iUtils.SetReadOnly(KTestIconFile, 0); + TEST(ret==KErrNone); + INFO_PRINTF2(_L("Replace the modified icon file in C: drive (%S)"), &KMbmIconFile); + ret = iUtils.CopyFileL(KTestIconFile, KMbmIconFile); + // wait 5 seconds to finish re-scan + User::After(5*1000000); + TEST(ret==KErrNone); + } + +/** + @SYMTestCaseID T-NotifStep-TTestIconFileNotificationL + + @SYMPREQ PDEF102804 + + @SYMTestCaseDesc Test whether notification is received from CApaAppListNotifier whenever the application icon file is changed + + @SYMTestPriority High + + @SYMTestStatus Implemented + + @SYMTestActions Modify the application icon file in a temporary location. Move icon file to a location specified in the resource file. + + @SYMTestExpectedResults A notification is recieved when the updated icon file is replaced to a location specified in the resource file. +*/ +void CT_NotifStep::TestIconFileNotificationL() + { + // Force the applist to be updated + //To ensure that server has time to count all applications in the system + RPointerArray dummy; + User::LeaveIfError(iSession.ForceRegistration(dummy)); + + // Create observer + CTestObserver* obs = new(ELeave) CTestObserver(); + CleanupStack::PushL(obs); + CApaAppListNotifier* notif = CApaAppListNotifier::NewL(obs, CActive::EPriorityHigh); + CleanupStack::PushL(notif); + obs->iNotifier=notif; + + // Change the timestamp of the icon file + INFO_PRINTF1(_L("Modifying the icon file...attempt to check it's notified")); + ModifyIconFileTimeStamp(); + + CActiveScheduler::Start(); + + CleanupStack::PopAndDestroy(notif); + // Test if notification is recieved. + TEST(obs->iNotified > 0); + if (obs->iNotified > 0) + { + INFO_PRINTF2(_L("Received %d notifications"),obs->iNotified); + } + + CleanupStack::PopAndDestroy(obs); //obs + } + +CT_NotifStep::~CT_NotifStep() +/** + Destructor + */ + { + delete iScheduler; + } + +CT_NotifStep::CT_NotifStep() +/** + Constructor + */ + { + // Call base class method to set up the human readable name for logging + SetTestStepName(KT_NotifStep); + } + +TVerdict CT_NotifStep::doTestStepL() +/** + @return - TVerdict code + Override of base class virtual + */ + { + INFO_PRINTF1(_L("Testing Apparc...T_Notif")); + + TInt ret = FbsStartup(); + TEST(ret==KErrNone); + ret=RFbsSession::Connect(); + TEST(ret==KErrNone); + // start an active scheduler + iScheduler=new(ELeave) CActiveScheduler(); + CActiveScheduler::Install(iScheduler); + + TEST(KErrNone == iFs.Connect()); + TEST(KErrNone == iSession.Connect()); + TEST(KErrNone == iUtils.Connect()); + + // run the testcode (inside an alloc heaven harness) + __UHEAP_MARK; +#if defined (__WINSCW__) + INFO_PRINTF1(_L("T-NotifStep-TTestIconFileNotificationL Test Started...")); + TRAP(ret,TestIconFileNotificationL()); + TEST(ret==KErrNone); + INFO_PRINTF2(_L("TestIconFileNotificationL() finished with return code '%d'\n"), ret); +#endif + INFO_PRINTF1(_L("T-NotifStep-TestAppNotificationL Test Started...")); + TRAP(ret,TestAppNotificationL()); + TEST(ret==KErrNone); + INFO_PRINTF2(_L("TestAppNotificationL() finished with return code '%d'\n"), ret); + __UHEAP_MARKEND; + + iUtils.Close(); + iSession.Close(); + iFs.Close(); + RFbsSession::Disconnect(); + INFO_PRINTF1(_L("T_Notif Completed.")); + return TestStepResult(); + }