// 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 "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 @internalComponent - Internal Symbian test code */#include "T_IntegritySupportStep.h"#include <bautils.h>/** * Constructor */ CT_IntegritySupportTestStep::CT_IntegritySupportTestStep() { // Call base class method to set up the human readable name for logging SetTestStepName(KT_IntegritySupportStep); }/** * Destructor */CT_IntegritySupportTestStep::~CT_IntegritySupportTestStep() { iSession.Close(); iUtils.Close(); }/** * @return - TVerdict code * Override of base class virtual */ TVerdict CT_IntegritySupportTestStep::doTestStepPreambleL() { SetTestStepResult(EPass); doAbstractNonNativeAppsTestStepPreambleL(); return TestStepResult(); }/** * @return - TVerdict code * Override of base class virtual */TVerdict CT_IntegritySupportTestStep::doTestStepPostambleL() { return TestStepResult(); }TVerdict CT_IntegritySupportTestStep::doTestStepL() { INFO_PRINTF1(_L("Testing Apparc...T_IntegritySupport Test Cases Running...")); TRAPD(ret,RunTestCasesL()) TEST(ret==KErrNone); INFO_PRINTF1(_L("...T_IntegritySupport Test Cases Completed.")); return TestStepResult(); }TInt CT_IntegritySupportTestStep::RunTestCasesL() { HEAP_TEST_LS_SESSION(iSession, 0, DONT_CHECK, TestNormalInstallation1L(), NO_CLEANUP); HEAP_TEST_LS_SESSION(iSession, 0, DONT_CHECK, TestManualRollback1L(), NO_CLEANUP); HEAP_TEST_LS_SESSION(iSession, 0, DONT_CHECK, TestRollbackOnError1L(), NO_CLEANUP); HEAP_TEST_LS_SESSION(iSession, 0, DONT_CHECK, TestRollbackOnSessionCloseL(), NO_CLEANUP); HEAP_TEST_LS_SESSION(iSession, 0, DONT_CHECK, TestNormalRemoval1L(), NO_CLEANUP); HEAP_TEST_LS_SESSION(iSession, 0, DONT_CHECK, TestManualRollback2L(), NO_CLEANUP); HEAP_TEST_LS_SESSION(iSession, 0, DONT_CHECK, TestRollbackWithoutPrepareL(), NO_CLEANUP); HEAP_TEST_LS_SESSION(iSession, 0, DONT_CHECK, TestRegisterWithoutPrepareL(), NO_CLEANUP); HEAP_TEST_LS_SESSION(iSession, 0, DONT_CHECK, TestCallingPrepareTwiceL(), NO_CLEANUP); HEAP_TEST_LS_SESSION(iSession, 0, DONT_CHECK, TestCallingPrepareFromTwoSessionsL(), NO_CLEANUP); /* Removed from armv5 because they seem to cause filesystem corruption */#ifdef __WINS__ HEAP_TEST_LS_SESSION(iSession, 0, DONT_CHECK, TestReregisterApplicationL(), NO_CLEANUP); HEAP_TEST_LS_SESSION(iSession, 0, DONT_CHECK, TestDoubleInstallFailsL(), NO_CLEANUP);#endif HEAP_TEST_LS_SESSION(iSession, 0, DONT_CHECK, TestRollbackOnFailedUpdateStepL(), NO_CLEANUP); return KErrNone; }_LIT(KLitLogicalExecutable1,"c:\\TestIntegritySupport1.ist");_LIT(KLitRegistrationFile1,"c:\\private\\10003a3f\\import\\apps\\NonNative\\Resource\\102081a1_reg.rsc");static const CT_AbstractNonNativeAppsTestStep::TTestAppDetails KApplication1(0x102081A1,KLitLogicalExecutable1,KLitRegistrationFile1);_LIT(KLitLogicalExecutable2,"c:\\TestIntegritySupport2.ist");_LIT(KLitRegistrationFile2,"c:\\private\\10003a3f\\import\\apps\\NonNative\\Resource\\102081c0_reg.rsc");static const CT_AbstractNonNativeAppsTestStep::TTestAppDetails KApplication2(0x102081C0,KLitLogicalExecutable2,KLitRegistrationFile2);_LIT(KLitLogicalExecutable3,"c:\\TestIntegritySupport3.ist");_LIT(KLitRegistrationFile3,"c:\\private\\10003a3f\\import\\apps\\NonNative\\Resource\\102081c1_reg.rsc");static const CT_AbstractNonNativeAppsTestStep::TTestAppDetails KApplication3(0x102081C1,KLitLogicalExecutable3,KLitRegistrationFile3);_LIT(KLitLogicalExecutable4,"c:\\TestIntegritySupport4.ist");_LIT(KLitRegistrationFile4,"c:\\private\\10003a3f\\import\\apps\\NonNative\\Resource\\102081c2_reg.rsc");static const CT_AbstractNonNativeAppsTestStep::TTestAppDetails KApplication4(0x102081C2,KLitLogicalExecutable4,KLitRegistrationFile4);// uses logical executable from KApplication4_LIT(KLitRegistrationFile5,"c:\\private\\10003a3f\\import\\apps\\NonNative\\Resource\\102081c3_reg.rsc");static const CT_AbstractNonNativeAppsTestStep::TTestAppDetails KApplication5(0x102081C3,KLitLogicalExecutable4,KLitRegistrationFile5);/** @SYMTestCaseID T-IntegritySupportTestStep-TestNormalInstallation1L @SYMPREQ @SYMTestCaseDesc Tests the integrity support during a normal installation @SYMTestPriority @SYMTestStatus Implemented @SYMTestActions Tests installation process when there are no problems. @SYMTestExpectedResults The application is successfully installed and then removed. */void CT_IntegritySupportTestStep::TestNormalInstallation1L() { INFO_PRINTF1(_L("Testing normal application installation...")); RProcess().SetPriority(EPriorityLow); // so that we're pre-empted by the Apparc server when it does its scan CleanupAndResetL(iSession, KApplication1); iSession.PrepareNonNativeApplicationsUpdatesL(); INFO_PRINTF1(_L("..registering app using RegisterNonNativeApplicationL() ")); CallRegisterL(iSession, KApplication1); // Since we have not committed yet, at this stage the files should not be in their // final locations TEST(AppAbsent(iSession, KApplication1)); iSession.CommitNonNativeApplicationsUpdatesL(); // the files should now be present in their final locations TEST(AppPresent(iSession, KApplication1)); INFO_PRINTF1(_L("..deregistering app using DeregisterNonNativeApplicationL() ")); CompleteDeregisterL(iSession, KApplication1); TEST(AppAbsent(iSession, KApplication1)); }/** @SYMTestCaseID T-IntegritySupportTestStep-TestManualRollback1L @SYMPREQ @SYMTestCaseDesc Tests the integrity support during an installation that is rolled back @SYMTestPriority @SYMTestStatus Implemented @SYMTestActions Tests installation process when the client decides to rollback the changes. @SYMTestExpectedResults The installtion is successfully rolled back and the device is in the same state as before the installation attempt. */void CT_IntegritySupportTestStep::TestManualRollback1L() { INFO_PRINTF1(_L("Testing manual rollback during installation...")); CleanupAndResetL(iSession, KApplication2); iSession.PrepareNonNativeApplicationsUpdatesL(); INFO_PRINTF1(_L("..registering app using RegisterNonNativeApplicationL() ")); CallRegisterL(iSession, KApplication2); // Since we have not committed yet, at this stage the files should not be in their // final locations TEST(AppAbsent(iSession, KApplication2)); iSession.RollbackNonNativeApplicationsUpdates(); // Test that they're still all absent since we never committed TEST(AppAbsent(iSession, KApplication2)); }void CT_IntegritySupportTestStep::TestRollbackOnError1L() { // this can be tested by trying to overwrite an icon file. }/** @SYMTestCaseID T-IntegritySupportTestStep-TestRollbackOnSessionCloseL @SYMPREQ @SYMTestCaseDesc Tests that any updates are rolled back if the session is closed in the middle of an update @SYMTestPriority @SYMTestStatus Implemented @SYMTestActions Tests installation process when the client closes the session before committing or rolling back. @SYMTestExpectedResults The installation is successfully rolled back and the device is in the same state as before the installation attempt. */ void CT_IntegritySupportTestStep::TestRollbackOnSessionCloseL() { INFO_PRINTF1(_L("Testing rollback if RApaLsSession is closed...")); RTestableApaLsSession apaSession; User::LeaveIfError(apaSession.Connect()); CleanupClosePushL(apaSession); CleanupAndResetL(apaSession, KApplication3); apaSession.PrepareNonNativeApplicationsUpdatesL(); INFO_PRINTF1(_L("..registering app using RegisterNonNativeApplicationL() ")); CallRegisterL(apaSession, KApplication3); // shouldn't be present until comitted TEST(AppAbsent(iSession, KApplication3)); // We close the session before committing or rolling back. CleanupStack::PopAndDestroy(&apaSession); // We never committed, so check that nothing's changed TEST(AppAbsent(iSession, KApplication3)); }/** @SYMTestCaseID T-IntegritySupportTestStep-TestNormalRemoval1L @SYMPREQ @SYMTestCaseDesc Tests a normal removal attempt @SYMTestPriority @SYMTestStatus Implemented @SYMTestActions Tests the correct working of the removal process. @SYMTestExpectedResults The application is installed and then removed without errors. */ void CT_IntegritySupportTestStep::TestNormalRemoval1L() { INFO_PRINTF1(_L("Testing removal...")); CleanupAndResetL(iSession, KApplication4); INFO_PRINTF1(_L("..registering app using RegisterNonNativeApplicationL() ")); CompleteRegisterL(iSession, KApplication4); TEST(AppPresent(iSession, KApplication4)); INFO_PRINTF1(_L("..deregistering app using DeregisterNonNativeApplicationL() ")); iSession.PrepareNonNativeApplicationsUpdatesL(); CallDeregisterL(iSession,KApplication4); // Check that everythign is still the same as we haven't committed yet TEST(AppPresent(iSession, KApplication4)); iSession.CommitNonNativeApplicationsUpdatesL(); TEST(AppAbsent(iSession, KApplication4)); }/** @SYMTestCaseID T-IntegritySupportTestStep-TestManualRollback2L @SYMPREQ @SYMTestCaseDesc Tests the integrity support during an installation that is rolled back @SYMTestPriority @SYMTestStatus Implemented @SYMTestActions Tests installation process when the client decides to rollback the changes. @SYMTestExpectedResults The installtion is successfully rolled back and the device is in the same state as before the installation attempt. */void CT_IntegritySupportTestStep::TestManualRollback2L() { INFO_PRINTF1(_L("Testing removal rollback...")); CleanupAndResetL(iSession, KApplication5); iSession.PrepareNonNativeApplicationsUpdatesL(); INFO_PRINTF1(_L("..registering app using RegisterNonNativeApplicationL() ")); CallRegisterL(iSession, KApplication5); iSession.CommitNonNativeApplicationsUpdatesL(); TEST(AppPresent(iSession, KApplication5)); INFO_PRINTF1(_L("..deregistering app using DeregisterNonNativeApplicationL() ")); iSession.PrepareNonNativeApplicationsUpdatesL(); CallDeregisterL(iSession, KApplication5); // Check that all is still present as we haven't committed yet TEST(AppPresent(iSession, KApplication5)); iSession.RollbackNonNativeApplicationsUpdates(); // Check that app is in list of installed apps, still TEST(AppPresent(iSession, KApplication5)); // Cleanup and remove app CompleteDeregisterL(iSession, KApplication5); // Check that app is not in list of installed apps anymore TEST(AppAbsent(iSession, KApplication5)); }/** @SYMTestCaseID T-IntegritySupportTestStep-TestRollbackWithoutPrepareL @SYMPREQ @SYMTestCaseDesc Tests that calling RollbackNonNativeApplicationsUpdates works even if the client hasn't calling the PrepareNonNativeApplicationsUpdatesL function. @SYMTestPriority @SYMTestStatus Implemented @SYMTestActions Tests that calling RollbackNonNativeApplicationsUpdates works even if the client hasn't calling the PrepareNonNativeApplicationsUpdatesL function. @SYMTestExpectedResults The function doesn't return an error. */void CT_IntegritySupportTestStep::TestRollbackWithoutPrepareL() { INFO_PRINTF1(_L("Testing RollbackNonNativeApplicationsUpdates without prepare before...")); // Just call the function, if it doesn't panic, we assume it works iSession.RollbackNonNativeApplicationsUpdates(); }/** @SYMTestCaseID T-IntegritySupportTestStep-TestRegisterWithoutPrepareL @SYMPREQ @SYMTestCaseDesc Tests that calling RegisterNonNativeApplicationL fails if PrepareNonNativeApplicationsUpdatesL hasn't been called. @SYMTestPriority @SYMTestStatus Implemented @SYMTestActions Call RegisterNonNativeApplicationL without calling PrepareNonNativeApplicationsUpdatesL first. @SYMTestExpectedResults The function returns KErrNotReady. */ void CT_IntegritySupportTestStep::TestRegisterWithoutPrepareL() { INFO_PRINTF1(_L("Testing RegisterNonNativeApplicationL without prepare before...")); TRAPD(err, CallRegisterL(iSession,KApplication1)); TEST(err == KErrNotReady); }/** @SYMTestCaseID T-IntegritySupportTestStep-TestCallingPrepareTwiceL @SYMPREQ @SYMTestCaseDesc Tests that calling PrepareNonNativeApplicationsUpdatesL twice fails. @SYMTestPriority @SYMTestStatus Implemented @SYMTestActions Call PrepareNonNativeApplicationsUpdatesL twice. @SYMTestExpectedResults The second call returns KErrNotReady. */ void CT_IntegritySupportTestStep::TestCallingPrepareTwiceL() { INFO_PRINTF1(_L("Testing PrepareNonNativeApplicationsUpdatesL twice...")); // Should work iSession.PrepareNonNativeApplicationsUpdatesL(); // Shouldn't work since already called TRAPD(err, iSession.PrepareNonNativeApplicationsUpdatesL()); TEST(err == KErrInUse); iSession.RollbackNonNativeApplicationsUpdates(); // Should work again since we have rolled back iSession.PrepareNonNativeApplicationsUpdatesL(); iSession.RollbackNonNativeApplicationsUpdates(); }/** @SYMTestCaseID T-IntegritySupportTestStep-TestCallingPrepareFromTwoSessionsL @SYMPREQ @SYMTestCaseDesc Tests that commiting an app update when another session has already installed it is successfull. @SYMTestPriority @SYMTestStatus Implemented @SYMTestActions Call PrepareNonNativeApplicationsUpdatesL from a session and then from another one. @SYMTestExpectedResults The second call returns KErrNone. */ void CT_IntegritySupportTestStep::TestCallingPrepareFromTwoSessionsL() { INFO_PRINTF1(_L("Testing PrepareNonNativeApplicationsUpdatesL and other function calls from 2 sessions...")); INFO_PRINTF1(_L(" Cleaning up any existing reg files first...")); CleanupAndResetL(iSession, KApplication1); INFO_PRINTF1(_L(" Running test...")); // open a second session RTestableApaLsSession session2; User::LeaveIfError(session2.Connect()); CleanupClosePushL(session2); // Prepare & Register with the first session iSession.PrepareNonNativeApplicationsUpdatesL(); CallRegisterL(iSession, KApplication1); // Prepare, Register & Deregister with the second session TRAPD(err, session2.PrepareNonNativeApplicationsUpdatesL()); TEST(err == KErrNone); CallRegisterL(session2, KApplication1); // commit the updates with iSession, installing app 1 TRAP(err, iSession.CommitNonNativeApplicationsUpdatesL()); TEST(err == KErrNone); // both sessions should now report app 1 as installed TEST(AppPresent(iSession, KApplication1)); TEST(AppPresent(session2, KApplication1)); // Try to commit with session 2 // This could be an upgrade of the app so completes successfully TRAP(err, session2.CommitNonNativeApplicationsUpdatesL()); INFO_PRINTF2(_L("Err: %d "), err); TEST(err == KErrNone); // check that nothing was damaged TEST(AppPresent(iSession, KApplication1)); TEST(AppPresent(session2, KApplication1)); CleanupStack::PopAndDestroy(&session2); // clean up CompleteDeregisterL(iSession, KApplication1); TEST(AppAbsent(iSession, KApplication1)); }/** @SYMTestCaseID T-IntegritySupportTestStep-TestReregisterApplicationL @SYMPREQ @SYMTestCaseDesc Tests we can deregister an already-installed app and reregister it in one transaction @SYMTestPriority @SYMTestStatus Implemented @SYMTestActions Call Prepare updates, Deregister, Register, Commit @SYMTestExpectedResults All successful, no panics */ void CT_IntegritySupportTestStep::TestReregisterApplicationL() { INFO_PRINTF1(_L("Testing deregister/register of an application in one transaction...")); INFO_PRINTF1(_L(" Cleaning up any existing reg files first...")); CleanupAndResetL(iSession, KApplication1); INFO_PRINTF1(_L(" Registering beforehand so that the deregister has something to do...")); CompleteRegisterL(iSession, KApplication1); // test that it has installed OK TEST(AppPresent(iSession, KApplication1)); INFO_PRINTF1(_L(" Running test...")); // Prepare, Deregister & Register iSession.PrepareNonNativeApplicationsUpdatesL(); CallDeregisterL(iSession, KApplication1); CallRegisterL(iSession, KApplication1); TRAPD(err, iSession.CommitNonNativeApplicationsUpdatesL()); TEST(err == KErrNone); // test that it is still installed OK TEST(AppPresent(iSession, KApplication1)); // clean up CompleteDeregisterL(iSession, KApplication1); }/** @SYMTestCaseID T-IntegritySupportTestStep-TestDoubleInstallFailsL @SYMPREQ @SYMTestCaseDesc @SYMTestPriority @SYMTestStatus Implemented @SYMTestActions @SYMTestExpectedResults */ void CT_IntegritySupportTestStep::TestDoubleInstallFailsL() { INFO_PRINTF1(_L("Testing double register of an application in one transaction...")); INFO_PRINTF1(_L(" Cleaning up any existing reg files first...")); CleanupAndResetL(iSession, KApplication1); // test that the application is absent TEST(AppAbsent(iSession, KApplication1)); INFO_PRINTF1(_L(" Running test...")); iSession.PrepareNonNativeApplicationsUpdatesL(); CallRegisterL(iSession, KApplication1); CallRegisterL(iSession, KApplication1); TRAPD(err, iSession.CommitNonNativeApplicationsUpdatesL()); TEST(err == KErrAccessDenied); // test that the rollback happened when the second register failed, // and thus the app is still absent TEST(AppAbsent(iSession, KApplication1)); // test that things still work TRAP(err, CompleteRegisterL(iSession, KApplication1)); TEST(err == KErrNone); TEST(AppPresent(iSession, KApplication1)); CompleteDeregisterL(iSession, KApplication1); TEST(AppAbsent(iSession, KApplication1)); }/** @SYMTestCaseID T-IntegritySupportTestStep-TestRollbackOnFailedUpdateStepL @SYMPREQ @SYMTestCaseDesc @SYMTestPriority @SYMTestStatus Implemented @SYMTestActions @SYMTestExpectedResults */ void CT_IntegritySupportTestStep::TestRollbackOnFailedUpdateStepL() { INFO_PRINTF1(_L("Testing register app1, deregister app2, then a force-failed update that causes the first two to roll back...")); INFO_PRINTF1(_L(" Cleaning up any existing reg files first...")); CleanupAndResetL(iSession, KApplication1); CleanupAndResetL(iSession, KApplication2); // test that both apps are absent TEST(AppAbsent(iSession, KApplication1)); TEST(AppAbsent(iSession, KApplication2)); // register app 2 and check TRAPD(err,CompleteRegisterL(iSession, KApplication2)); TEST(err == KErrNone); TEST(AppAbsent(iSession, KApplication1)); TEST(AppPresent(iSession, KApplication2)); INFO_PRINTF1(_L(" Running test...")); iSession.PrepareNonNativeApplicationsUpdatesL(); // call register/deregister/fail operations CallRegisterL(iSession, KApplication1); CallDeregisterL(iSession, KApplication2); iSession.AddFailingNonNativeApplicationsUpdate(); // test that nothing has changed yet TEST(AppAbsent(iSession, KApplication1)); TEST(AppPresent(iSession, KApplication2)); // commit, expect KErrGeneral from the force-fail step TRAP(err, iSession.CommitNonNativeApplicationsUpdatesL()); TEST(err == KErrGeneral); // make sure nothing has changed, i.e. everything rolled back ok TEST(AppAbsent(iSession, KApplication1)); TEST(AppPresent(iSession, KApplication2)); // test that things still work iSession.PrepareNonNativeApplicationsUpdatesL(); CallRegisterL(iSession, KApplication1); CallDeregisterL(iSession, KApplication2); TRAP(err,iSession.CommitNonNativeApplicationsUpdatesL()); TEST(err == KErrNone); TEST(AppPresent(iSession, KApplication1)); TEST(AppAbsent(iSession, KApplication2)); CompleteDeregisterL(iSession, KApplication1); TEST(AppAbsent(iSession, KApplication1)); }