appfw/apparchitecture/tef/T_ServiceRegistryStep.cpp
author William Roberts <williamr@symbian.org>
Fri, 23 Apr 2010 14:37:17 +0100
branchRCL_3
changeset 22 c82a39b81a38
parent 0 2e3d3ce01487
child 29 6a787171e1de
permissions -rw-r--r--
Rework addition of Symbian splash screen to reduce the source impact (uses SVG from Bug 2414) Notes: by using the OPTION SOURCEDIR parameter in the mifconv extension instructions, I can arrange to use the same source file name in sfimage, without having to export over the original Nokia file. This means that the name inside splashscreen.mbg is the same, which removes the need for the conditional compilation in SplashScreen.cpp, and gets rid of sf_splashscreen.mmp.

// 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:
//

/**
 @file
 @test
 @internalComponent - Internal Symbian test code
*/

#include "T_ServiceRegistryStep.h"
#include <serviceregistry.h>
#include "testableapalssession.h"
#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
#include <apaidpartner.h>
#endif



_LIT(KImportAppsDir,"c:\\private\\10003a3f\\import\\apps\\");
_LIT(KAppRscSourcePath,"z:\\system\\data\\TestUpdRegAppUninstallation_reg.rsc");
_LIT(KUpgradeAppRscSourcePath,"z:\\system\\data\\TestUpgradeUpdRegAppUninstallation_reg.rsc");
_LIT(KAppRscTargetPath,"c:\\private\\10003a3f\\import\\apps\\TestUpdRegAppUninstallation_reg.rsc");

_LIT8(KLitMimeType,"mime/updregappuninstall");
_LIT8(KLitUpgradeAppMimeType,"mime/upgradeupdregappuninstall");

/**
 * Constructor
 */	
CT_ServiceRegistryTestStep::CT_ServiceRegistryTestStep()
	{
	// Call base class method to set up the human readable name for logging
	SetTestStepName(KT_ServiceRegistryStep);
	}

/**
 * Destructor
 */
CT_ServiceRegistryTestStep::~CT_ServiceRegistryTestStep()
	{
	}

/**
 * @return - TVerdict code
 * Override of base class virtual
 */	
TVerdict CT_ServiceRegistryTestStep::doTestStepPreambleL()
	{
	SetTestStepResult(EPass);
	return TestStepResult();
	}

/**
 * @return - TVerdict code
 * Override of base class virtual
 */
TVerdict CT_ServiceRegistryTestStep::doTestStepPostambleL()
	{
	return TestStepResult();
	}

TVerdict CT_ServiceRegistryTestStep::doTestStepL()
	{
	INFO_PRINTF1(_L("Testing Apparc...T_ServiceRegistry Test Cases Running..."));

	// start an active scheduler
	iScheduler=new(ELeave) CActiveScheduler();
	CActiveScheduler::Install(iScheduler);

	__UHEAP_MARK;
	TInt ret;
	TRAP(ret,RunTestCasesL())
	TEST(ret==KErrNone);
	__UHEAP_MARKEND;
	
	INFO_PRINTF1(_L("...T_ServiceRegistry Test Cases Completed."));

	return TestStepResult();
	}

TInt CT_ServiceRegistryTestStep::RunTestCasesL()
	{
	RTestableApaLsSession ls;
	TEST(KErrNone == ls.Connect());
	CleanupClosePushL(ls);

	// Use DONT_CHECK because it complaints of heap unbalance (a CTypeStoreManager object, althought it is not actually leaked,
	//   but reallocated in CApaAppListServer::DoUpdateTypeStoreL(void)). 
	//   This unbalance happens 'randonmly', possibly a timing issue, as the TypeStore refresh is performed in response to a callback from 
	//	 a CApaFsMonitor object, which introduces an extra 0.25 second delay before invoking the callback.
	//	 *** See DEF101056 ****
	HEAP_TEST_LS_SESSION(ls, 0, DONT_CHECK, TestAssociation1L(), NO_CLEANUP);
	HEAP_TEST_LS_SESSION(ls, 0, DONT_CHECK, TestAppForDataTypeAndServiceL(ls), NO_CLEANUP);
    HEAP_TEST_LS_SESSION(ls, 0, DONT_CHECK, TestUpdateOfServiceRegistryOnAppUninstallationL(ls), NO_CLEANUP);
    HEAP_TEST_LS_SESSION(ls, 0, DONT_CHECK, TestServiceRegistryOnAppUpgradeL(ls), NO_CLEANUP);    
    
	CleanupStack::PopAndDestroy(&ls);	
	return KErrNone;
	}
	
/**
   @SYMTestCaseID T-ServiceRegistryTestStep-TestAssociation1L
  
   @SYMPREQ 
  
   @SYMTestCaseDesc Test the functionality of ServiceRegistry 
   
   @SYMTestPriority 
  
   @SYMTestStatus Implemented
   
   @SYMTestActions Tests the addition, retrieval and deletions of 
   associations
   
   @SYMTestExpectedResults The association are added, retrieved and deleted
   from the registry
 */
void CT_ServiceRegistryTestStep::TestAssociation1L()
	{
	INFO_PRINTF1(_L("TestAssociation1L"));
	CServiceRegistry* registry = CServiceRegistry::NewL();
	CleanupStack::PushL(registry);
	
	const TUid uid1 = { 0x11111111 };
	const TUid uid2 = { 0x22222222 };
	
	const TUid serviceUid1 = { 0x00001111 };
	const TUid serviceUid2 = { 0x00002222 };

	const TDataType data1(uid1);
	const TDataType data2(uid2);
	
	TUid result;
	
	TInt err = registry->GetDefault(serviceUid1, data1, result);
	TEST(err == KErrNotFound);
	TEST(result == KNullUid);
	
	err = registry->SetDefault(serviceUid1, data1, uid1);
	TEST(err == KErrNone);
	err = registry->SetDefault(serviceUid2, data2, uid2);
	TEST(err == KErrNone);
	
	err = registry->GetDefault(serviceUid1, data1, result);
	TEST(err == KErrNone);
	TEST(result == uid1);
	
	err = registry->GetDefault(serviceUid2, data2, result);
	TEST(err == KErrNone);
	TEST(result == uid2);
	
	err = registry->RemoveEntry(serviceUid1, data1);
	TEST(err == KErrNone);
	
	err = registry->RemoveEntry(serviceUid1, data1);
	TEST(err == KErrNotFound);
	
	err = registry->GetDefault(serviceUid1, data1, result);
	TEST(err == KErrNotFound);
	TEST(result == KNullUid);
	
	err = registry->GetDefault(serviceUid2, data2, result);
	TEST(err == KErrNone);
	TEST(result == uid2);
	
	err = registry->RemoveEntry(serviceUid2, data2);
	TEST(err == KErrNone);
	
	err = registry->GetDefault(serviceUid2, data2, result);
	TEST(err == KErrNotFound);
	TEST(result == KNullUid);
	
	CleanupStack::PopAndDestroy(registry);
	}
	
/**
   @SYMTestCaseID T-ServiceRegistryTestStep-TestAppForDataTypeAndServiceL
  
   @SYMPREQ 
  
   @SYMTestCaseDesc Test the functionality of ServiceRegistry 
   
   @SYMTestPriority 
  
   @SYMTestStatus Implemented
   
   @SYMTestActions Tests that the RApaLsSession::AppForDataTypeAndService
   function behaves correctly when associations are added to the registry
   
   @SYMTestExpectedResults The correct application is returned
 */
void CT_ServiceRegistryTestStep::TestAppForDataTypeAndServiceL(RApaLsSession& aLs)
	{
	INFO_PRINTF1(_L("TestAppForDataTypeAndServiceL"));

	const TUid KUidServerApp = {0x10004c56};
	const TUid KUidServerApp2 = {0x10004c58};
	const TUid KUidServerAppDummy = {0x12344268};
	const TUid KUidService01020333 = {0x01020333};
	_LIT8(KLitMimeTypePriority,"text/priority");

	CServiceRegistry* registry = CServiceRegistry::NewL();
	CleanupStack::PushL(registry);

	// Check first the default association (no association in registry)
	TUid appUid;
	TInt err = aLs.AppForDataTypeAndService(TDataType(KLitMimeTypePriority), KUidService01020333,appUid);
	TEST(err == KErrNone);
	TEST(appUid == KUidServerApp);

	// Check after having added an association in the registry
	err = registry->SetDefault(KUidService01020333, TDataType(KLitMimeTypePriority), KUidServerApp2);
	TEST(err == KErrNone);

	err = aLs.AppForDataTypeAndService(TDataType(KLitMimeTypePriority), KUidService01020333,appUid);
	TEST(err == KErrNone);
	TEST(appUid == KUidServerApp2);

	err = registry->RemoveEntry(KUidService01020333, TDataType(KLitMimeTypePriority));
	TEST(err == KErrNone);

	err = aLs.AppForDataTypeAndService(TDataType(KLitMimeTypePriority), KUidService01020333,appUid);
	TEST(err == KErrNone);
	TEST(appUid == KUidServerApp);

	// Check association with app that doesn't exist
	err = registry->SetDefault(KUidService01020333, TDataType(KLitMimeTypePriority), KUidServerAppDummy);
	TEST(err == KErrNone);

	err = aLs.AppForDataTypeAndService(TDataType(KLitMimeTypePriority), KUidService01020333,appUid);
	TEST(err == KErrNone);
	TEST(appUid == KUidServerApp);

	err = registry->RemoveEntry(KUidService01020333, TDataType(KLitMimeTypePriority));
	TEST(err == KErrNone);

	err = aLs.AppForDataTypeAndService(TDataType(KLitMimeTypePriority), KUidService01020333,appUid);
	TEST(err == KErrNone);
	TEST(appUid == KUidServerApp);

	CleanupStack::PopAndDestroy(registry);
	}


/**
   @SYMTestCaseID APPFWK-APPARC-0104
  
   @SYMDEF INC138417 
  
   @SYMTestCaseDesc Tests whether a data mapping of an applicaiton is removed from 
                    service registry if that applicaiton is uninstalled.
   
   @SYMTestPriority 
  
   @SYMTestStatus Implemented
   
   @SYMTestActions Inserts data mapping for an applicaion and uninstalls that application.
                   Tests whether the inserted data mapping is removed from the service registry. 
   
   @SYMTestExpectedResults The inserted data mapping is removed from the service registry.
 */

void CT_ServiceRegistryTestStep::TestUpdateOfServiceRegistryOnAppUninstallationL(RApaLsSession& aLs)   
    {
    INFO_PRINTF1(_L("TestUpdateOfServiceRegistryOnAppUninstallationL"));
    RSmlTestUtils fs;
    CleanupClosePushL(fs);
    User::LeaveIfError(fs.Connect());

     TInt err = fs.CreateDirectoryL(KImportAppsDir);
     TESTEL((err == KErrNone || err == KErrAlreadyExists), err);
     INFO_PRINTF1(_L("c:\\private\\10003a3f\\import\\apps is created successfully or already exists"));
     
     //Make sure that the target file does not exist.
     DeleteFileL(fs, KAppRscTargetPath);

     // Copy TestUpdRegAppUninstallation_reg.rsc from z:\ to c:\private\10003a3f\import\apps\.
     err = fs.CopyFileL(KAppRscSourcePath, KAppRscTargetPath);
     TEST(err == KErrNone);
     INFO_PRINTF1(_L("Successfully copied TestUpdRegAppUninstallation_reg.rsc from Z:\\system\\data to c:\\private\\10003a3f\\import\\apps"));

     //Wait till the applist is updated.
     WaitForAppListUpdateL();

     CServiceRegistry* registry = CServiceRegistry::NewL();
     CleanupStack::PushL(registry);
     
     TUid appUid = {0x10207f80};
     TUid resultUid={KNullUidValue};    
     TDataType dataType (KLitMimeType);
     
     //Test whether 0x10207f80 application is in application list.
     TApaAppInfo appInfo;
     TEST(aLs.GetAppInfo(appInfo,appUid)==KErrNone);

     //Set 0x10207f80 as default application for "mime/updregappuninstall" MIME type.
     registry->SetDefault(KOpenServiceUid,dataType, appUid);
     registry->GetDefault(KOpenServiceUid,dataType, resultUid);
     TEST(appUid==resultUid);
 
     //Delete file c:\\private\\10003a3f\\import\\apps\\TestUpdRegAppUninstallation_reg.rsc 
     DeleteFileL(fs, KAppRscTargetPath);
     
     //Wait till the application list is updated.
     WaitForAppListUpdateL();  
     
     //Check the application is removed from the application list
     TEST(aLs.GetAppInfo(appInfo,appUid)==KErrNotFound);
     
     //Check data mappings related to uninstalled applicaiton is also removed.
     TEST(registry->GetDefault(KOpenServiceUid,dataType, resultUid)==KErrNotFound);

     CleanupStack::PopAndDestroy(registry);
     CleanupStack::PopAndDestroy(&fs);  
    }

void CTestApplistChangeObserver::HandleAppListEvent(TInt /*aEvent*/)
    {
    CActiveScheduler::Stop();    
    }

/**
   @SYMTestCaseID APPFWK-APPARC-0105
  
   @SYMDEF INC138417 
  
   @SYMTestCaseDesc Tests whether a data mapping of an applicaiton is not changed in 
                    service registry if that applicaiton is upgraded.
   
   @SYMTestPriority 
  
   @SYMTestStatus Implemented
   
   @SYMTestActions Inserts data mapping for an applicaion and upgrades that application with newer version.
                   Tests the existence of inserted data mapping in the service registry. 
   
   @SYMTestExpectedResults Inserted data mapping is not removed from the service registry.
 */

void CT_ServiceRegistryTestStep::TestServiceRegistryOnAppUpgradeL(RApaLsSession& aLs)   
    {
    INFO_PRINTF1(_L("TestServiceRegistryOnAppUpgrade"));
 
    RSmlTestUtils fs;
    CleanupClosePushL(fs);
    User::LeaveIfError(fs.Connect());

     TInt err = fs.CreateDirectoryL(KImportAppsDir);
     TESTEL((err == KErrNone || err == KErrAlreadyExists), err);
     INFO_PRINTF1(_L("c:\\private\\10003a3f\\import\\apps is created successfully or already exists"));
     
     //Make sure that the target file does not exist.
     DeleteFileL(fs, KAppRscTargetPath);

     // Copy TestUpdRegAppUninstallation_reg.rsc from z:\ to c:\private\10003a3f\import\apps\.
     err = fs.CopyFileL(KAppRscSourcePath, KAppRscTargetPath);
     TEST(err == KErrNone);
     INFO_PRINTF1(_L("Successfully copied TestUpdRegAppUninstallation_reg.rsc from Z:\\system\\data to c:\\private\\10003a3f\\import\\apps"));

     //Wait till the applist is updated.
     WaitForAppListUpdateL();

     CServiceRegistry* registry = CServiceRegistry::NewL();
     CleanupStack::PushL(registry);
     
     TUid appUid = {0x10207f80};
     TUid resultUid={KNullUidValue};    
     TDataType dataType (KLitMimeType);
     
     //Test whether 0x10207f80 application is in application list.
     TApaAppInfo appInfo;
     TEST(aLs.GetAppInfo(appInfo,appUid)==KErrNone);

     //Set 0x10207f80 as default application for "mime/updregappuninstall" MIME type.
     registry->SetDefault(KOpenServiceUid,dataType, appUid);
     registry->GetDefault(KOpenServiceUid,dataType, resultUid);
     TEST(appUid==resultUid);
     
     TDataType upgDataType(KLitUpgradeAppMimeType);
     err=aLs.AppForDataType(upgDataType,resultUid);
     TEST(resultUid.iUid==KNullUidValue);
 
     DeleteFileL(fs, KAppRscTargetPath);
     
     err = fs.CopyFileL(KUpgradeAppRscSourcePath, KAppRscTargetPath);
     TEST(err == KErrNone);
     INFO_PRINTF1(_L("Successfully copied TestUpgradeUpdRegAppUninstallation_reg.rsc from Z:\\system\\data to c:\\private\\10003a3f\\import\\apps"));

     //Change the modified time of the file to current time
     RFs aFs;
     TEST(aFs.Connect()==KErrNone);
     TTime modifiedTime(0);
     modifiedTime.HomeTime();
     TEST(aFs.SetModified(KAppRscTargetPath, modifiedTime)==KErrNone);
     aFs.Close();
     
     //Wait till the applist is updated.
     WaitForAppListUpdateL();
    
     //Check the application is not removed from the application list
     TEST(aLs.GetAppInfo(appInfo,appUid)==KErrNone);
     
     //Check data mappings related to upgraded applicaiton is not removed.
     TEST(registry->GetDefault(KOpenServiceUid,dataType, resultUid)==KErrNone);
     TEST(resultUid==appUid);
     
     err=aLs.AppForDataType(upgDataType,resultUid);
     TEST((err==KErrNone) && (resultUid==appUid));
     
     DeleteFileL(fs,KAppRscTargetPath);

     CleanupStack::PopAndDestroy(registry);
     CleanupStack::PopAndDestroy(&fs);  
    }


//Deletes the file if it exists.
TInt CT_ServiceRegistryTestStep::DeleteFileL(RSmlTestUtils &aFs, const TDesC &aFileName)
    {
    TInt fileExists = EFalse;
    TInt err;
    aFs.IsFilePresent(aFileName, fileExists);
    if (fileExists)
        {
        aFs.ChangeFilePermissionL(aFileName);
        err=aFs.DeleteFileL(aFileName);
        if(err==KErrNone)
            INFO_PRINTF2(_L("Removed file %S"), &aFileName);
        else
            INFO_PRINTF2(_L("Failed to remove file %S"), &aFileName);
        }
    else
        {
        err=KErrNotFound;
        }

    return(err);
}

//Wait till the application list is updated.
void CT_ServiceRegistryTestStep::WaitForAppListUpdateL()
    {
     CTestApplistChangeObserver* obs = new(ELeave) CTestApplistChangeObserver();
     CleanupStack::PushL(obs);
     CApaAppListNotifier* notif = CApaAppListNotifier::NewL(obs, CActive::EPriorityHigh);
     CleanupStack::PushL(notif);
     obs->iNotifier = notif;
     CActiveScheduler::Start();
     
     CleanupStack::PopAndDestroy(notif);  
     CleanupStack::PopAndDestroy(obs);     
     INFO_PRINTF1(_L("Applicaiton list is updated."));     
    }