diff -r e8c1ea2c6496 -r 8758140453c0 localisation/apparchitecture/tef/t_servicebasestep.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/localisation/apparchitecture/tef/t_servicebasestep.cpp Thu Jan 21 12:53:44 2010 +0000 @@ -0,0 +1,502 @@ +// Copyright (c) 2008-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: +// + + + +/** + @file + @test + @internalComponent - Internal Symbian test code +*/ + +#include "t_servicebasestep.h" +#include +#include +#include +#include "testableapalssession.h" +#include "../tef/TNonNative/TNNApp1.h" + +TInt PanicTest(TAny* aOption); + +// RTstServiceApp + +TInt RTstServiceApp::DoTestTransferSessionL(TUid aServiceUid, TBool aPassingFileByHandle, const TDesC& aFileNameWithoutDriveOrPath) + { // static + //create the first session object + RTstServiceApp appServiceFirst(aServiceUid); + CleanupClosePushL(appServiceFirst); + //connecting first session object + appServiceFirst.ConnectL(); + + //create the second session object + RTstServiceApp appServiceSecond(aServiceUid); + //transfer session for first session object to the second session object + appServiceSecond.TransferExistingSessionL(appServiceFirst); + CleanupClosePushL(appServiceSecond); + + TRequestStatus requestStatus; + //request for a service from the second session object + appServiceSecond.ReceiveTestResult(requestStatus, aPassingFileByHandle, aFileNameWithoutDriveOrPath); + User::WaitForRequest(requestStatus); + const TInt result=User::LeaveIfError(requestStatus.Int()); + + CleanupStack::PopAndDestroy(&appServiceSecond); + CleanupStack::PopAndDestroy(&appServiceFirst); + User::After(5 * 1000000); //Wait 5sec for Apparc update due to paging + + return result; + } + +TInt RTstServiceApp::DoTestTransferSessionAndBackL(TUid aServiceUid, TBool aPassingFileByHandle, const TDesC& aFileNameWithoutDriveOrPath) + { // static + //create the first session object + RTstServiceApp appServiceFirst(aServiceUid); + CleanupClosePushL(appServiceFirst); + //connecting first session object + appServiceFirst.ConnectL(); + + //create the second session object + RTstServiceApp appServiceSecond(aServiceUid); + //transfer session from first session object to the second session object + appServiceSecond.TransferExistingSessionL(appServiceFirst); + CleanupClosePushL(appServiceSecond); + + //transfer session back to first session object from the second session object + appServiceFirst.TransferExistingSessionL(appServiceSecond); + TRequestStatus requestStatus; + //request for a service from the first session object + appServiceFirst.ReceiveTestResult(requestStatus, aPassingFileByHandle, aFileNameWithoutDriveOrPath); + User::WaitForRequest(requestStatus); + const TInt result=User::LeaveIfError(requestStatus.Int()); + + CleanupStack::PopAndDestroy(&appServiceSecond); + CleanupStack::PopAndDestroy(&appServiceFirst); + User::After(5 * 1000000); //Wait 5sec for Apparc update due to paging + + return result; + } + +TInt RTstServiceApp::DoTestTransferWithUnconnectedSessionL(TUid aServiceUid, TBool aPassingFileByHandle, const TDesC& aFileNameWithoutDriveOrPath) + { // static + //create the first session object + RTstServiceApp appServiceFirst(aServiceUid); + CleanupClosePushL(appServiceFirst); + + //create the second session object + RTstServiceApp appServiceSecond(aServiceUid); + //transfer session for first session object to the second session object + appServiceSecond.TransferExistingSessionL(appServiceFirst); + CleanupClosePushL(appServiceSecond); + + TRequestStatus requestStatus; + //request for a service from the second session object + appServiceSecond.ReceiveTestResult(requestStatus, aPassingFileByHandle, aFileNameWithoutDriveOrPath); + User::WaitForRequest(requestStatus); + const TInt result=User::LeaveIfError(requestStatus.Int()); + + CleanupStack::PopAndDestroy(&appServiceSecond); + CleanupStack::PopAndDestroy(&appServiceFirst); + User::After(5 * 1000000); //Wait 5sec for Apparc update due to paging + + return result; + } + +RTstServiceApp::RTstServiceApp(TUid aServiceUid) + :iServiceUid(aServiceUid) + { + } + +void RTstServiceApp::ConnectL() + { + ConnectExistingByNameL(KLitServerName); + } + +void RTstServiceApp::ReceiveTestResult(TRequestStatus& aRequestStatus, TBool aPassingFileByHandle, const TDesC& aFileNameWithoutDriveOrPath) + { + SendReceive(EOpcode_receiveTestResult, TIpcArgs(aPassingFileByHandle, &aFileNameWithoutDriveOrPath), aRequestStatus); + } + +TUid RTstServiceApp::ServiceUid() const + { + return iServiceUid; + } + +//CT_ServiceBaseStep + +void CT_ServiceBaseStep::ClosePanicWindowL() + { + RWsSession ws; + User::LeaveIfError(ws.Connect()); + + TInt wgFocus = ws.GetFocusWindowGroup(); + + const TUint32 KClientHandle = 0xFFFFFFFF; // Events delivered to this handle are thrown away + RWindowGroup wg = RWindowGroup(ws); + + wg.Construct(KClientHandle); + TInt wgId = wg.Identifier(); + + TWsEvent event; + event.SetType(EEventKey); + TKeyEvent *keyEvent = event.Key(); + keyEvent->iCode = EKeyEscape; + keyEvent->iScanCode = EStdKeyEscape; + keyEvent->iModifiers = 0; + + TInt limit = 0; + for(limit = 0; wgFocus != wgId && (limit < 50); limit++) + { + ws.SendEventToAllWindowGroups(event); + wgFocus = ws.GetFocusWindowGroup(); + RDebug::Print(_L("ClosePanicWindowL() - EKeyEscape sent to Windows Group")); + } + + // close everything + wg.Close(); + ws.Close(); + } + +void PanicFirstInstanceAfterTransferL() + { + TPtrC fullFileName = _L("z:\\private\\101F289C\\GIF.NNA1"); + TPtrC fileNameWithoutDriveOrPath(TParsePtrC(fullFileName).NameAndExt()); + const TUid serviceUid = {0x10207f97}; + + RTestableApaLsSession apparcServer; + CleanupClosePushL(apparcServer); + User::LeaveIfError(apparcServer.Connect()); + + RFs fileServer; + CleanupClosePushL(fileServer); + User::LeaveIfError(fileServer.Connect()); + User::LeaveIfError(fileServer.ShareProtected()); + + apparcServer.FlushRecognitionCache(); + + RFile file; + CleanupClosePushL(file); + User::LeaveIfError(file.Open(fileServer, fullFileName, EFileShareReadersOnly|EFileStream|EFileRead)); + + TThreadId threadId2; + TRequestStatus requestStatusForRendezvous2; + User::LeaveIfError(apparcServer.StartDocument(file, threadId2, &requestStatusForRendezvous2)); + User::WaitForRequest(requestStatusForRendezvous2); + + //create the first session object + RTstServiceApp appServiceFirst(serviceUid); + CleanupClosePushL(appServiceFirst); + appServiceFirst.ConnectL(); + + //create the second session object + RTstServiceApp appServiceSecond(serviceUid); + //transfer session from first session object to the second session object + appServiceSecond.TransferExistingSessionL(appServiceFirst); + CleanupClosePushL(appServiceSecond); + TRequestStatus requestStatus; + //request for a service from the first session object + appServiceFirst.ReceiveTestResult(requestStatus, ETrue, fileNameWithoutDriveOrPath); + //code should have panicked by now + User::WaitForRequest(requestStatus); + const TInt result=User::LeaveIfError(requestStatus.Int()); + + CleanupStack::PopAndDestroy(&appServiceSecond); + CleanupStack::PopAndDestroy(&appServiceFirst); + } + +void PanicSecondInstanceAfterTransferBackL() + { + TPtrC fullFileName = _L("z:\\private\\101F289C\\GIF.NNA1"); + TPtrC fileNameWithoutDriveOrPath(TParsePtrC(fullFileName).NameAndExt()); + const TUid serviceUid = {0x10207f97}; + + RTstServiceApp appServiceFirst(serviceUid); + CleanupClosePushL(appServiceFirst); + appServiceFirst.ConnectL(); + + RTstServiceApp appServiceSecond(serviceUid); + //transfer session from first session object to the second session object + appServiceSecond.TransferExistingSessionL(appServiceFirst); + CleanupClosePushL(appServiceSecond); + + //Transfer ownership back to first instance + appServiceFirst.TransferExistingSessionL(appServiceSecond); + + TRequestStatus requestStatus; + //request for a service from the first session object + appServiceSecond.ReceiveTestResult(requestStatus, ETrue, fileNameWithoutDriveOrPath); + //code should have panicked by now + User::WaitForRequest(requestStatus); + const TInt result=User::LeaveIfError(requestStatus.Int()); + + CleanupStack::PopAndDestroy(&appServiceSecond); + CleanupStack::PopAndDestroy(&appServiceFirst); + } + +TInt PanicTest(TAny* aOption) + { + CTrapCleanup* trapCleanup = CTrapCleanup::New(); + if (!trapCleanup) + { + return KErrNoMemory; + } + TInt option = (TInt)aOption; + TInt err = KErrNone; + if (option == 1) + { + TRAP(err, PanicFirstInstanceAfterTransferL()); + } + else + { + TRAP(err, PanicSecondInstanceAfterTransferBackL()); + } + + delete trapCleanup; + return err; + } + +void CT_ServiceBaseStep::OpenFileLC(RFile& aFile, RFs& aFileServer, const TDesC& aFullFileName) + { + CleanupClosePushL(aFile); + User::LeaveIfError(aFile.Open(aFileServer, aFullFileName, EFileShareReadersOnly|EFileStream|EFileRead)); + } + +/** + @SYMTestCaseID APPFWK-APPARC-0092 + + @SYMCR CR1555 + + @SYMTestCaseDesc Transfer ownership of session from one instance of RApaAppServiceBase to another + + @SYMTestPriority High + + @SYMTestStatus Implemented + + @SYMTestActions Start the server application. + Create an instance of RApaAppServiceBase and connect to server. + Create another instance of RApaAppServiceBase and take the ownership of the connected session. + Request a service from the second instance. + + @SYMTestExpectedResults Check if request has been serviced correctly. + */ +void CT_ServiceBaseStep::TestServiceAppL(RApaLsSession& aApparcServer, RFs& aFileServer) + { + TPtrC fullFileName = _L("z:\\private\\101F289C\\GIF.NNA1"); + TPtrC fileNameWithoutDriveOrPath(TParsePtrC(fullFileName).NameAndExt()); + const TUid serviceUid = {0x10207f97}; + + //Transfer session from one RApaAppServiceBase instance to another and request for service from the latter + __UHEAP_MARK; + RFile file; + OpenFileLC(file, aFileServer, fullFileName); + TThreadId threadId; + TRequestStatus requestStatusForRendezvous; + User::LeaveIfError(aApparcServer.StartDocument(file, threadId, &requestStatusForRendezvous)); + User::WaitForRequest(requestStatusForRendezvous); + INFO_PRINTF1(_L("App started....\n")); + TEST(RTstServiceApp::DoTestTransferSessionL(serviceUid, ETrue, fileNameWithoutDriveOrPath) == KCheckPass); + INFO_PRINTF1(_L("Requested service completed successfully....\n")); + CleanupStack::PopAndDestroy(&file); + __UHEAP_MARKEND; + } + +/** + @SYMTestCaseID APPFWK-APPARC-0093 APPFWK-APPARC-0095 + + @SYMCR CR1555 + + @SYMTestCaseDesc Testing if requesting service with the wrong instance will panic + + @SYMTestPriority High + + @SYMTestStatus Implemented + + @SYMTestActions Start the server application. + Create two instances of RApaAppServiceBase and connect to server. + Request service with the wrong instance(which does not have the session). + + @SYMTestExpectedResults Requesting service with the wrong instance should raise a KERN-EXEC 0 panic. + */ +void CT_ServiceBaseStep::TestPanicWithWrongInstanceL() + { + RThread thread; + TRequestStatus stat; + TBuf<32> threadNameBuf; + // Give each thread a unique name to avoid KErrAlreadyExists error on thread creation + _LIT(KThreadNameFormat, "CT_ServiceBaseStep%d"); + threadNameBuf.Format(KThreadNameFormat, 1); + + //Transfer session from one RApaAppServiceBase instance to another and request for service from the first, this should panic with KERN-EXEC 0 + TInt threadCreationVal = thread.Create(threadNameBuf,PanicTest,KDefaultStackSize,0x2000,0x20000,(TAny*)1); + TEST(threadCreationVal==KErrNone); + + TRequestStatus status; + thread.Logon(status); + TBool jit = User::JustInTime(); + User::SetJustInTime(EFalse); + thread.Resume(); + User::WaitForRequest(status); + + // we are always expecting the same panic category + TExitCategoryName category = thread.ExitCategory(); + TEST(category.Compare(_L("KERN-EXEC")) == 0); + INFO_PRINTF2(_L("Expected exit category:KERN-EXEC, Actual exit category: '%S'..."), &category); + + TInt exitReason = thread.ExitReason(); + TEST(exitReason == 0); + INFO_PRINTF2(_L("Expected exit reason: 0, Actual exit reason:, %d \n"), exitReason); + + thread.Close(); + + threadNameBuf.Format(KThreadNameFormat, 2); + //Transfer session from one RApaAppServiceBase instance to another and back, request for service from the second instance, this should panic with KERN-EXEC 0 + threadCreationVal = thread.Create(threadNameBuf,PanicTest,KDefaultStackSize,0x2000,0x20000,(TAny*)2); + TEST(threadCreationVal==KErrNone); + + thread.Logon(status); + User::SetJustInTime(EFalse); + thread.Resume(); + User::WaitForRequest(status); + + // we are always expecting the same panic category + category = thread.ExitCategory(); + TEST(category.Compare(_L("KERN-EXEC")) == 0); + INFO_PRINTF2(_L("Expected exit category:KERN-EXEC, Actual exit category: '%S'..."), &category); + + exitReason = thread.ExitReason(); + TEST(exitReason == 0); + INFO_PRINTF2(_L("Expected exit reason: 0, Actual exit reason:, %d \n"), exitReason); + + thread.Close(); + User::SetJustInTime(jit); + ClosePanicWindowL(); + } + +/** + @SYMTestCaseID APPFWK-APPARC-0094 + + @SYMCR CR1555 + + @SYMTestCaseDesc Transfer ownership of session from one instance of RApaAppServiceBase to another and transfer back to first instance + + @SYMTestPriority High + + @SYMTestStatus Implemented + + @SYMTestActions Start the server application. + Create an instance of RApaAppServiceBase and connect to server. + Create another instance of RApaAppServiceBase and take the ownership of the connected session. + Transfer back the ownership to the first instance. + Request a service from the first instance. + + @SYMTestExpectedResults Check if request has been serviced correctly. + */ +void CT_ServiceBaseStep::TestTransferBackL(RApaLsSession& aApparcServer, RFs& aFileServer) + { + TPtrC fullFileName = _L("z:\\private\\101F289C\\GIF.NNA1"); + TPtrC fileNameWithoutDriveOrPath(TParsePtrC(fullFileName).NameAndExt()); + const TUid serviceUid = {0x10207f97}; + + __UHEAP_MARK; + RFile file; + OpenFileLC(file, aFileServer, fullFileName); + TThreadId threadId; + TRequestStatus requestStatusForRendezvous; + User::LeaveIfError(aApparcServer.StartDocument(file, threadId, &requestStatusForRendezvous)); + User::WaitForRequest(requestStatusForRendezvous); + INFO_PRINTF1(_L("App started....\n")); + TEST(RTstServiceApp::DoTestTransferSessionAndBackL(serviceUid, ETrue, fileNameWithoutDriveOrPath) == KCheckPass); + INFO_PRINTF1(_L("Requested service completed successfully....\n")); + CleanupStack::PopAndDestroy(&file); + __UHEAP_MARKEND; + } + +/** + @SYMTestCaseID APPFWK-APPARC-0097 + + @SYMCR CR1555 + + @SYMTestCaseDesc Transfer ownership of session from one instance of RApaAppServiceBase which is not connected to another + + @SYMTestPriority High + + @SYMTestStatus Implemented + + @SYMTestActions Start the server application. + Create an instance of RApaAppServiceBase. + Create another instance of RApaAppServiceBase and take the ownership of unconnected session. + + @SYMTestExpectedResults Check if function leaves with KErrArgument. + */ +void CT_ServiceBaseStep::TestTransferWithUnconnectedSessionL() + { + TPtrC fullFileName = _L("z:\\private\\101F289C\\GIF.NNA1"); + TPtrC fileNameWithoutDriveOrPath(TParsePtrC(fullFileName).NameAndExt()); + const TUid serviceUid = {0x10207f97}; + + __UHEAP_MARK; + TInt err; + TRAP(err, RTstServiceApp::DoTestTransferWithUnconnectedSessionL(serviceUid, ETrue, fileNameWithoutDriveOrPath)); + TEST(err == KErrArgument); + INFO_PRINTF2(_L("Expected error code: -6, Actual error code:, %d \n"), err); + __UHEAP_MARKEND; + } + +// CTestStep derived functions + +CT_ServiceBaseStep::~CT_ServiceBaseStep() + { + } + +CT_ServiceBaseStep::CT_ServiceBaseStep() + { + SetTestStepName(KT_ServiceBaseStep); + } + +TVerdict CT_ServiceBaseStep::doTestStepPreambleL() + { + SetTestStepResult(EPass); + return TestStepResult(); + } + +TVerdict CT_ServiceBaseStep::doTestStepPostambleL() + { + return TestStepResult(); + } + +TVerdict CT_ServiceBaseStep::doTestStepL() + { + INFO_PRINTF1(_L("Test ServiceBase starting....\n")); + + RTestableApaLsSession apparcServer; + CleanupClosePushL(apparcServer); + User::LeaveIfError(apparcServer.Connect()); + + RFs fileServer; + CleanupClosePushL(fileServer); + User::LeaveIfError(fileServer.Connect()); + User::LeaveIfError(fileServer.ShareProtected()); + + apparcServer.FlushRecognitionCache(); + + HEAP_TEST_LS_SESSION(apparcServer, 0, DONT_CHECK, TestServiceAppL(apparcServer, fileServer), apparcServer.FlushRecognitionCache()); + HEAP_TEST_LS_SESSION(apparcServer, 0, 0, TestPanicWithWrongInstanceL(), apparcServer.FlushRecognitionCache()); + HEAP_TEST_LS_SESSION(apparcServer, 0, DONT_CHECK, TestTransferBackL(apparcServer, fileServer), apparcServer.FlushRecognitionCache()); + HEAP_TEST_LS_SESSION(apparcServer, 0, 0, TestTransferWithUnconnectedSessionL(), apparcServer.FlushRecognitionCache()); + + CleanupStack::PopAndDestroy(2, &apparcServer); + + INFO_PRINTF1(_L("....Test ServiceBase completed!")); + return TestStepResult(); + }