diff -r 000000000000 -r 2f259fa3e83a uifw/tsrc/public/basic/AknSoundServerStifTest/src/AknSoundServerStifTestCases.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uifw/tsrc/public/basic/AknSoundServerStifTest/src/AknSoundServerStifTestCases.cpp Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,907 @@ +/* +* Copyright (c) 2002-2007 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: Implementation for test cases. +* +*/ + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include + +#include "aknsoundserverstiftest.h" +#include "aknsoundserversession.h" +#include "eiksrvsoundserversession.h" + +// Fail code used as a default, if no error code is available. +const TInt KDefaultFailCode = -999; + +// Sound server session UIDs taken from test range (0xE0000000...0xEFFFFFFF). +const TInt KSession1Uid = 0xE2220001; +const TInt KSession2Uid = 0xE2220002; + +// Fake resource ids taken from test range (0xE0000000...0xEFFFFFFF). +#define R_STIFTEST_SOUND_CONTEXT_1 0xE1110001 +#define R_STIFTEST_SOUND_CONTEXT_2 0xE1110002 + +// TestModuleIf().Printf() seems to work better with a small delay. +const TInt KPrintDelay = 100000; + +// Test case names. +_LIT(KTestCaseInit, "'Init keysound server'"); +_LIT(KTestCasePlayKey, "'Play keysound'"); +_LIT(KTestCasePlayKeyAsync, "'Play keysound (async)'"); +_LIT(KTestCasePlaySid, "'Play sid'"); +_LIT(KTestCaseStopCurrentTone, "'Stop current tone'"); +_LIT(KTestCaseAddSids, "'Add sids'"); +_LIT(KTestCasePushContext, "'Push context'"); +_LIT(KTestCaseLockContext, "'Lock context'"); +_LIT(KTestCaseCloseServer, "'Close server'"); + +// Generic test case texts. +_LIT(KTestPassed, "Test case passed"); +_LIT(KTestFailed, "Test case failed"); +_LIT(KBegin, "Begin"); +_LIT(KEnd, "End"); + +// Error texts. +_LIT(KInitFailed, "Init() failed"); +_LIT(KConnectFailed, "Connect() failed"); +_LIT(KInvalidTRequestStatus, "Invalid TRequestStatus"); +_LIT(KFirstTopContextWrong, "First TopContext() wrong"); +_LIT(KSecondTopContextWrong, "Second TopContext() wrong"); +_LIT(KThirdTopContextWrong, "Third TopContext() wrong"); +_LIT(KFourthTopContextWrong, "Fourth TopContext() wrong"); +_LIT(KFifthTopContextWrong, "Fifth TopContext() wrong"); +_LIT(KSixthTopContextWrong, "Sixth TopContext() wrong"); +_LIT(KInvalidReturnValue, "Return value not KErrPermissionDenied"); + +// Other texts +_LIT(KPlayingKeyClick, "Playing key click"); +_LIT(KPlayingErrorTone, "Playing error tone"); +_LIT(KBatteryLowStopped, "Battery low stopped"); +_LIT(KPlayingSid, "Playing sid:"); +_LIT(KSidId, "0x%x"); +_LIT(KPlayingFinished, "Playing finished"); +_LIT(KPressingKey, "Pressing key:"); +_LIT(KKeyId, "%d" ); +_LIT(KFinished, "Finished"); + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CAknSoundServerStifTest::Case +// Returns a test case by number. +// +// This function contains an array of all available test cases +// i.e pair of case name and test function. If case specified by parameter +// aCaseNumber is found from array, then that item is returned. +// +// The reason for this rather complicated function is to specify all the +// test cases only in one place. It is not necessary to understand how +// function pointers to class member functions works when adding new test +// cases. See function body for instructions how to add new test case. +// ----------------------------------------------------------------------------- +// +const TCaseInfo CAknSoundServerStifTest::Case ( + const TInt aCaseNumber ) const + { + /** + * To add new test cases, implement new test case function and add new + * line to KCases array specify the name of the case and the function + * doing the test case + * In practice, do following + * 1) Make copy of existing test case function and change its name + * and functionality. Note that the function must be added to + * AknSoundServerStifTest.cpp file and to AknSoundServerStifTest.h + * header file. + * + * 2) Add entry to following KCases array either by using: + * + * 2.1: FUNCENTRY or ENTRY macro + * ENTRY macro takes two parameters: test case name and test case + * function name. + * + * FUNCENTRY macro takes only test case function name as a parameter and + * uses that as a test case name and test case function name. + * + * Or + * + * 2.2: OOM_FUNCENTRY or OOM_ENTRY macro. Note that these macros are used + * only with OOM (Out-Of-Memory) testing! + * + * OOM_ENTRY macro takes five parameters: test case name, test case + * function name, TBool which specifies is method supposed to be run using + * OOM conditions, TInt value for first heap memory allocation failure and + * TInt value for last heap memory allocation failure. + * + * OOM_FUNCENTRY macro takes test case function name as a parameter and uses + * that as a test case name, TBool which specifies is method supposed to be + * run using OOM conditions, TInt value for first heap memory allocation + * failure and TInt value for last heap memory allocation failure. + */ + + static TCaseInfoInternal const KCases[] = + { + // To add new test cases, add new items to this array + + // NOTE: When compiled to GCCE, there must be Classname:: + // declaration in front of the method name, e.g. + // CAknSoundServerStifTest::PrintTest. Otherwise the compiler + // gives errors. + + // enum TKeySoundServerCommands + // { + // EKeySoundServerInit, TestCaseInit() + // EKeySoundServerPlayKey, TestCasePlayKey() + // EKeySoundServerPlaySID, TestCasePlaySid() + // EKeySoundServerAddSIDS, TestCaseAddSidsL() + // EKeySoundServerRemoveSIDS, None. (Command is unused and should be removed!) + // EKeySoundServerPushContext, TestCasePushContextL() + // EKeySoundServerPopContext, TestCasePushContextL() + // EKeySoundServerBringToForeground, TestCasePushContextL() + // EKeySoundServerStopCurrentTone, TestCaseStopCurrentTone() + // EKeySoundServerLockContext, TestCaseLockContextL() + // EKeySoundServerReleaseContext, TestCaseLockContextL() + // EKeySoundServerCloseServer, TestCaseCloseServerL() + // EKeySoundServerTopContext TestCasePushContextL() + // }; + + ENTRY("Init keysound server", CAknSoundServerStifTest::TestCaseInit), + ENTRY("Play keysound", CAknSoundServerStifTest::TestCasePlayKey), + ENTRY("Play keysound (async)", CAknSoundServerStifTest::TestCasePlayKeyAsync), + ENTRY("Play sid", CAknSoundServerStifTest::TestCasePlaySid), + ENTRY("Stop current tone", CAknSoundServerStifTest::TestCaseStopCurrentTone), + ENTRY("Add sids", CAknSoundServerStifTest::TestCaseAddSidsL), + ENTRY("Push context", CAknSoundServerStifTest::TestCasePushContextL), + ENTRY("Lock context", CAknSoundServerStifTest::TestCaseLockContextL), + ENTRY("Close server", CAknSoundServerStifTest::TestCaseCloseServer) + }; + + // Verify that case number is valid + if( (TUint) aCaseNumber >= sizeof( KCases ) / + sizeof( TCaseInfoInternal ) ) + { + // Invalid case, construct empty object + TCaseInfo null( (const TText*) L"" ); + null.iMethod = NULL; + null.iIsOOMTest = EFalse; + null.iFirstMemoryAllocation = 0; + null.iLastMemoryAllocation = 0; + return null; + } + + // Construct TCaseInfo object and return it + TCaseInfo tmp ( KCases[ aCaseNumber ].iCaseName ); + tmp.iMethod = KCases[ aCaseNumber ].iMethod; + tmp.iIsOOMTest = KCases[ aCaseNumber ].iIsOOMTest; + tmp.iFirstMemoryAllocation = KCases[ aCaseNumber ].iFirstMemoryAllocation; + tmp.iLastMemoryAllocation = KCases[ aCaseNumber ].iLastMemoryAllocation; + return tmp; + } + +// ----------------------------------------------------------------------------- +// CAknSoundServerStifTest::TestCaseInit() +// Creates and initializes a connection to Keysound Server. +// Test case for server command "EKeySoundServerInit". +// ----------------------------------------------------------------------------- +// +TInt CAknSoundServerStifTest::TestCaseInit(TTestResult& aResult) + { + // Default result is fail. + aResult.SetResult(KDefaultFailCode, KTestFailed); + + // Start test. + PrintWithDelay(0, KBegin, KTestCaseInit); + + RAknSoundServerSession session; + TInt err = session.Connect(); + + if (!err) + { + // The application UID should be given as a parameter for Init(). + // However, we are already using that UID for iSoundServerSession + // and don't want to use it twice. + TBool init = session.Init(KSession1Uid); + + if(init) + { + // Test case passed. + aResult.SetResult(KErrNone, KTestPassed); + } + else + { + aResult.SetResult(KDefaultFailCode, KInitFailed); + } + } + else + { + aResult.SetResult(err, KConnectFailed); + } + + session.Close(); + + // End test. + PrintWithDelay(0, KEnd, KTestCaseInit); + + // Case was executed + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CAknSoundServerStifTest::TestCasePlayKey() +// Plays a keysound. +// Test case for server command "EKeySoundServerPlayKey". +// ----------------------------------------------------------------------------- +// +TInt CAknSoundServerStifTest::TestCasePlayKey(TTestResult& aResult) + { + // Default result is fail. + aResult.SetResult(KDefaultFailCode, KTestFailed); + + // Start test. + PrintWithDelay(0, KBegin, KTestCasePlayKey); + + RAknSoundServerSession session = CreateNewSessionL(KSession1Uid); + + // Execute step 1. + session.KeyPressed(EStdKeyDownArrow, EFalse); + + PrintWithDelay(0, KNullDesC, KPlayingKeyClick); + + // Test case passed (unfortunately there is no means to really ensure it). + aResult.SetResult(KErrNone, KTestPassed); + + session.Close(); + + // End test. + PrintWithDelay(0, KEnd, KTestCasePlayKey); + + // Case was executed + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CAknSoundServerStifTest::TestCasePlayKeyAsync() +// Plays a keysound asynchronously. +// Test case for server command "EKeySoundServerPlayKey". +// ----------------------------------------------------------------------------- +// +TInt CAknSoundServerStifTest::TestCasePlayKeyAsync(TTestResult& aResult) + { + // Default result is fail. + aResult.SetResult(KDefaultFailCode, KTestFailed); + + // Start test. + PrintWithDelay(0, KBegin, KTestCasePlayKeyAsync); + + // Note that REikSrvSoundServerSession is used instead of RAknSoundServerSession. + REikSrvSoundServerSession session; + User::LeaveIfError(session.Connect()); + + // Session must be initialised. + session.Init(KSession1Uid); + + PrintWithDelay(0, KNullDesC, KPlayingKeyClick); + + TRequestStatus status; + session.KeyPressed(EStdKeyDownArrow, status, EFalse); + User::WaitForRequest(status); + + if(status.Int() == KErrNone) + { + // Test case passed. + aResult.SetResult(KErrNone, KTestPassed); + } + else + { + aResult.SetResult(status.Int(), KInvalidTRequestStatus); + } + + session.Close(); + + // End test. + PrintWithDelay(0, KEnd, KTestCasePlayKeyAsync); + + // Case was executed + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CAknSoundServerStifTest::TestCasePlaySid() +// Plays a sid. +// Test case for server command "EKeySoundServerPlaySID". +// ----------------------------------------------------------------------------- +// +TInt CAknSoundServerStifTest::TestCasePlaySid(TTestResult& aResult) + { + // Default result is fail. + aResult.SetResult(KDefaultFailCode, KTestFailed); + + // Start test. + PrintWithDelay(0, KBegin, KTestCasePlaySid); + + RAknSoundServerSession session = CreateNewSessionL(KSession1Uid); + + session.PlaySound(EAvkonSIDErrorTone); + + PrintWithDelay(0, KNullDesC, KPlayingErrorTone); + + // Test case passed (unfortunately there is no means to really ensure it). + aResult.SetResult(KErrNone, KTestPassed); + + session.Close(); + + // End test. + PrintWithDelay(0, KEnd, KTestCasePlaySid); + + // Case was executed + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CAknSoundServerStifTest::TestCaseStopCurrentTone() +// Stops a playing sid. +// Test case for server command "EKeySoundServerStopCurrentTone". +// ----------------------------------------------------------------------------- +// +TInt CAknSoundServerStifTest::TestCaseStopCurrentTone(TTestResult& aResult) + { + // Default result is fail. + aResult.SetResult(KDefaultFailCode, KTestFailed); + + // Start test. + PrintWithDelay(0, KBegin, KTestCaseStopCurrentTone); + + RAknSoundServerSession session = CreateNewSessionL(KSession1Uid); + + session.PlaySound(EAvkonSIDBatteryLowTone); + + // Small delay for checking that the tone starts playing. + User::After(300000); + + session.StopSound(EAvkonSIDBatteryLowTone); + + PrintWithDelay(0, KNullDesC, KBatteryLowStopped); + + // Test case passed (unfortunately there is no means to really ensure it). + aResult.SetResult(KErrNone, KTestPassed); + + session.Close(); + + // End test. + PrintWithDelay(0, KEnd, KTestCaseStopCurrentTone); + + // Case was executed + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CAknSoundServerStifTest::TestCaseAddSidsL() +// Adds sids. +// Test case for server command "EKeySoundServerAddSIDS". +// ----------------------------------------------------------------------------- +// +TInt CAknSoundServerStifTest::TestCaseAddSidsL(TTestResult& aResult) + { + // Default result is fail. + aResult.SetResult(KDefaultFailCode, KTestFailed); + + // Start test. + PrintWithDelay(0, KBegin, KTestCaseAddSids); + + RAknSoundServerSession session = CreateNewSessionL(KSession1Uid); + + // Simulate resource reading for the following resource: + // + // RESOURCE AVKON_SOUND_INFO_LIST r_keysoundapp_sound_list + // { + // list = + // { + // AVKON_SOUND_INFO {sid=1; frequency=300; ms=600000;}, + // AVKON_SOUND_INFO {sid=2; frequency=600; ms=700000;}, + // AVKON_SOUND_INFO {sid=3; frequency=900; ms=800000;}, + // AVKON_SOUND_INFO {sid=4; frequency=1200; ms=900000;} + // }; + // } + // + const TInt KAknResourceBufferSize = 512; + + // Package information to a buffer. + CBufFlat* buffer = CBufFlat::NewL(KAknResourceBufferSize); + CleanupStack::PushL(buffer); + + RBufWriteStream bufStream; + bufStream.Open(*buffer); + + CleanupClosePushL(bufStream); + + // Take lowest 16 bits from KSession1Uid... + TInt soundId = (KSession1Uid << 16); + + // Count + bufStream.WriteUint16L(4); // count + + // AVKON_SOUND_INFO 1 + bufStream.WriteUint32L(soundId + 1); // soundId + bufStream.WriteUint16L(EAvkonLowLevelNotesPriority); // priority + bufStream.WriteUint32L(EAknAudioPrefDefaultTone); // preference + bufStream.WriteUint8L(1); // type 1, tone + bufStream.WriteUint16L(300); // frequency + bufStream.WriteUint32L(600000); // ms + bufStream.WriteUint8L(9); // volume + + // AVKON_SOUND_INFO 2 + bufStream.WriteUint32L(soundId + 2); // soundId + bufStream.WriteUint16L(EAvkonLowLevelNotesPriority); // priority + bufStream.WriteUint32L(EAknAudioPrefDefaultTone); // preference + bufStream.WriteUint8L(1); // type 1, tone + bufStream.WriteUint16L(600); // frequency + bufStream.WriteUint32L(700000); // ms + bufStream.WriteUint8L(9); // volume + + // AVKON_SOUND_INFO 3 + bufStream.WriteUint32L(soundId + 3); // soundId + bufStream.WriteUint16L(EAvkonLowLevelNotesPriority); // priority + bufStream.WriteUint32L(EAknAudioPrefDefaultTone); // preference + bufStream.WriteUint8L(1); // type 1, tone + bufStream.WriteUint16L(900); // frequency + bufStream.WriteUint32L(800000); // ms + bufStream.WriteUint8L(9); // volume + + // AVKON_SOUND_INFO 4 + bufStream.WriteUint32L(soundId + 4); // soundId + bufStream.WriteUint16L(EAvkonLowLevelNotesPriority); // priority + bufStream.WriteUint32L(EAknAudioPrefDefaultTone); // preference + bufStream.WriteUint8L(1); // type 1, tone + bufStream.WriteUint16L(1200); // frequency + bufStream.WriteUint32L(900000); // ms + bufStream.WriteUint8L(9); // volume + + CleanupStack::PopAndDestroy(); // bufstream close + + TPtr8 bufPtr = buffer->Ptr(0); + TIpcArgs args (KSession1Uid, bufPtr.Length(), &bufPtr); + User::LeaveIfError(session.ServerRequest(EKeySoundServerAddSIDS, args)); + + CleanupStack::PopAndDestroy(); // buffer + + // Wait for keyclick playing before starting actual test playings. + User::After(500000); + + for (TInt i = 1; i < 5; i++) + { + session.PlaySound(soundId + i); + TestModuleIf().Printf(0, KPlayingSid, KSidId, soundId + i); + User::After(1000000); + } + + PrintWithDelay(0, KPlayingFinished, KNullDesC); + + // Test case passed (unfortunately there is no means to really ensure it). + aResult.SetResult(KErrNone, KTestPassed); + + session.Close(); + + // End test. + PrintWithDelay(0, KEnd, KTestCaseAddSids); + + // Case was executed + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CAknSoundServerStifTest::TestCasePushContextL() +// +// Test case for following server commands: +// "EKeySoundServerPushContext" +// "EKeySoundServerBringToForeground" +// "EKeySoundServerTopContext" +// "EKeySoundServerPopContext" +// ----------------------------------------------------------------------------- +// +TInt CAknSoundServerStifTest::TestCasePushContextL(TTestResult& aResult) + { + // Default result is fail. + aResult.SetResult(KDefaultFailCode, KTestFailed); + + // Start test. + PrintWithDelay(0, KBegin, KTestCasePushContext); + + RAknSoundServerSession session = CreateNewSessionL(KSession1Uid); + + // Step 1 + if (session.TopContext() != R_AVKON_DEFAULT_SKEY_LIST) + { + // Test case failed. + aResult.SetResult(KDefaultFailCode, KFirstTopContextWrong); + + session.Close(); + return KErrNone; + } + + // Step 2 + PushContextL(session, R_STIFTEST_SOUND_CONTEXT_1, KSession1Uid); + + // Step 3 + session.BringToForeground(); + + // Step 4 + if (session.TopContext() != R_STIFTEST_SOUND_CONTEXT_1) + { + // Test case failed. + aResult.SetResult(KDefaultFailCode, KSecondTopContextWrong); + + session.Close(); + return KErrNone; + } + + // Wait for keyclick playing before starting actual test playings. + User::After(500000); + + // Step 5 (simulate key presses to play sounds) + for (TInt i = 1; i < 4; i++) + { + // Ascii characters '1' = 49, '2' = 50 and '3' = 51. + session.KeyPressed(48 + i, EFalse); + TestModuleIf().Printf(0, KPressingKey, KKeyId, i); + User::After(1500000); + } + + PrintWithDelay(0, KFinished, KNullDesC); + + // Step 6 + session.PopContext(); + + // Step 7 + if (session.TopContext() != R_AVKON_DEFAULT_SKEY_LIST) + { + // Test case failed. + aResult.SetResult(KDefaultFailCode, KThirdTopContextWrong); + + session.Close(); + return KErrNone; + } + + // Test case passed. + aResult.SetResult(KErrNone, KTestPassed); + + session.Close(); + + // Without this the keysounds of STIF application itself would get broken. + iSoundServerSession.BringToForeground(); + + // End test. + PrintWithDelay(0, KEnd, KTestCasePushContext); + + // Case was executed + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CAknSoundServerStifTest::TestCaseLockContextL() +// +// Test case for following server commands: +// "EKeySoundServerLockContext" +// "EKeySoundServerReleaseContext" +// ----------------------------------------------------------------------------- +// +TInt CAknSoundServerStifTest::TestCaseLockContextL(TTestResult& aResult) + { + // Default result is fail. + aResult.SetResult(KDefaultFailCode, KTestFailed); + + // Start test. + PrintWithDelay(0, KBegin, KTestCaseLockContext); + + // ------------------------------------------------------- + // In this test case we need two keysound server sessions. + // ------------------------------------------------------- + RAknSoundServerSession session1 = CreateNewSessionL(KSession1Uid); + RAknSoundServerSession session2 = CreateNewSessionL(KSession2Uid); + + // Step 1 + PushContextL(session1, R_STIFTEST_SOUND_CONTEXT_1, KSession1Uid); + + // Step 2 + session1.BringToForeground(); + + // Step 3 + session1.LockContext(); + + // Step 4 + if (session1.TopContext() != R_STIFTEST_SOUND_CONTEXT_1) + { + // Test case failed. + aResult.SetResult(KDefaultFailCode, KFirstTopContextWrong); + + session1.Close(); + session2.Close(); + return KErrNone; + } + + // Step 5 (change to session2) + if (session2.TopContext() != R_STIFTEST_SOUND_CONTEXT_1) + { + // Test case failed. + aResult.SetResult(KDefaultFailCode, KSecondTopContextWrong); + + session1.Close(); + session2.Close(); + return KErrNone; + } + + // Step 6 + PushContextL(session2, R_STIFTEST_SOUND_CONTEXT_2, KSession2Uid); + + // Step 7 + session2.BringToForeground(); + + // Step 8 + if (session2.TopContext() != R_STIFTEST_SOUND_CONTEXT_1) + { + // Test case failed. + aResult.SetResult(KDefaultFailCode, KThirdTopContextWrong); + + session1.Close(); + session2.Close(); + return KErrNone; + } + + // Step 9 + session2.PopContext(); + + // Step 10 + if (session2.TopContext() != R_STIFTEST_SOUND_CONTEXT_1) + { + // Test case failed. + aResult.SetResult(KDefaultFailCode, KFourthTopContextWrong); + + session1.Close(); + session2.Close(); + return KErrNone; + } + + // Step 11 (change back to session1) + if (session1.TopContext() != R_STIFTEST_SOUND_CONTEXT_1) + { + // Test case failed. + aResult.SetResult(KDefaultFailCode, KFifthTopContextWrong); + + session1.Close(); + session2.Close(); + return KErrNone; + } + + // Step 12 + session1.ReleaseContext(); + + // Step 13 + session1.PopContext(); + + // Step 14 + if (session1.TopContext() != R_AVKON_DEFAULT_SKEY_LIST) + { + // Test case failed. + aResult.SetResult(KDefaultFailCode, KSixthTopContextWrong); + + session1.Close(); + session2.Close(); + return KErrNone; + } + + // Test case passed. + aResult.SetResult(KErrNone, KTestPassed); + + session1.Close(); + session2.Close(); + + // Without this the keysounds of STIF application itself would get broken. + iSoundServerSession.BringToForeground(); + + // End test. + PrintWithDelay(0, KEnd, KTestCaseLockContext); + + // Case was executed + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CAknSoundServerStifTest::TestCaseCloseServer() +// Tries to close the keysound server. Call should fail with KErrPermissionDenied. +// Test case for server command "EKeySoundServerCloseServer". +// ----------------------------------------------------------------------------- +// +TInt CAknSoundServerStifTest::TestCaseCloseServer(TTestResult& aResult) + { + // Default result is fail. + aResult.SetResult(KDefaultFailCode, KTestFailed); + + // Start test. + PrintWithDelay(0, KBegin, KTestCaseCloseServer); + + RAknSoundServerSession session = CreateNewSessionL(KSession1Uid); + + // Make a direct server request. There is no method for calling close server. + TInt err = session.ServerRequest(EKeySoundServerCloseServer, TIpcArgs()); + + // Only calls from eiksrvs process should be accepted, so KErrPermissionDenied + // is the expected result. + if (err == KErrPermissionDenied) + { + // Test case passed. + aResult.SetResult(KErrNone, KTestPassed); + } + else + { + aResult.SetResult(KDefaultFailCode, KInvalidReturnValue); + } + + session.Close(); + + // End test. + PrintWithDelay(0, KEnd, KTestCaseCloseServer); + + // Case was executed + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CAknSoundServerStifTest::CreateNewSessionL() +// Convenience method for creating a new keysound server session. +// ----------------------------------------------------------------------------- +// +RAknSoundServerSession CAknSoundServerStifTest::CreateNewSessionL(TInt aSessionUid) + { + RAknSoundServerSession session; + User::LeaveIfError(session.Connect()); + + // Connection succeeded, call Init(). + TInt init = session.Init(aSessionUid); + if (!init) + { + // Initialisation failed. Close session and leave. + session.Close(); + User::Leave(KErrUnknown); + } + return session; + } + +// ----------------------------------------------------------------------------- +// CAknSoundServerStifTest::PushContextL() +// Simulates resource reading and calls pushcontext for the given resource. +// Only R_STIFTEST_SOUND_CONTEXT_1 and R_STIFTEST_SOUND_CONTEXT_1 are supported. +// ----------------------------------------------------------------------------- +// +void CAknSoundServerStifTest::PushContextL(RAknSoundServerSession& aSession, + TInt aResId, TInt aSessionUid) + { + switch (aResId) + { + case R_STIFTEST_SOUND_CONTEXT_1: + { + // Simulates resource reading and calls pushcontext for the following context: + // + // RESOURCE AVKON_SKEY_LIST r_stiftest_sound_context_1 + // { + // list= + // { + // AVKON_SKEY_INFO {key='1'; sid=EAvkonSIDReadialCompleteTone;}, + // AVKON_SKEY_INFO {key='2'; sid=EAvkonSIDBatteryLowTone;}, + // AVKON_SKEY_INFO {key='3'; sid=EAvkonSIDRechargeBatteryTone;} + // }; + // } + // + const TInt items = 3; + const TInt resSize = (items * 5); + + CBufFlat* buffer = CBufFlat::NewL(resSize); + CleanupStack::PushL(buffer); + + RBufWriteStream bufStream; + bufStream.Open(*buffer); + + CleanupClosePushL(bufStream); + + bufStream.WriteInt16L(EAvkonSIDReadialCompleteTone); // sid + bufStream.WriteUint16L('1'); // key + bufStream.WriteUint8L(ESKeyTypeShort); // type + + bufStream.WriteInt16L(EAvkonSIDBatteryLowTone); // sid + bufStream.WriteUint16L('2'); // key + bufStream.WriteUint8L(ESKeyTypeShort); // type + + bufStream.WriteInt16L(EAvkonSIDRechargeBatteryTone); // sid + bufStream.WriteUint16L('3'); // key + bufStream.WriteUint8L(ESKeyTypeShort); // type + + CleanupStack::PopAndDestroy(); // bufstream close + + TPtr8 bufPtr = buffer->Ptr(0); + TIpcArgs args (items, &bufPtr, aSessionUid, aResId); + User::LeaveIfError(aSession.ServerRequest(EKeySoundServerPushContext, args)); + CleanupStack::PopAndDestroy(); // buffer + + break; + } + case R_STIFTEST_SOUND_CONTEXT_2: + { + // Simulates resource reading and calls pushcontext for the following context: + // + // RESOURCE AVKON_SKEY_LIST r_stiftest_sound_context_2 + // { + // list= + // { + // AVKON_SKEY_INFO {key='1'; sid=EAvkonSIDVoiceRecordingTone;}, + // AVKON_SKEY_INFO {key='2'; sid=EAvkonSIDVoiceRecordingStartTone;}, + // AVKON_SKEY_INFO {key='3'; sid=EAvkonSIDVoiceRecordingStopTone;} + // }; + // } + // + const TInt items = 3; + const TInt resSize = (items * 5); + + CBufFlat* buffer = CBufFlat::NewL(resSize); + CleanupStack::PushL(buffer); + + RBufWriteStream bufStream; + bufStream.Open(*buffer); + + CleanupClosePushL(bufStream); + + bufStream.WriteInt16L(EAvkonSIDVoiceRecordingTone); // sid + bufStream.WriteUint16L('1'); // key + bufStream.WriteUint8L(ESKeyTypeShort); // type + + bufStream.WriteInt16L(EAvkonSIDVoiceRecordingStartTone); // sid + bufStream.WriteUint16L('2'); // key + bufStream.WriteUint8L(ESKeyTypeShort); // type + + bufStream.WriteInt16L(EAvkonSIDVoiceRecordingStopTone); // sid + bufStream.WriteUint16L('3'); // key + bufStream.WriteUint8L(ESKeyTypeShort); // type + + CleanupStack::PopAndDestroy(); // bufstream close + + TPtr8 bufPtr = buffer->Ptr(0); + TIpcArgs args (items, &bufPtr, aSessionUid, R_STIFTEST_SOUND_CONTEXT_2); + User::LeaveIfError(aSession.ServerRequest(EKeySoundServerPushContext, args)); + CleanupStack::PopAndDestroy(); // buffer + + break; + } + default: + { + break; + } + } + } + +// ----------------------------------------------------------------------------- +// CAknSoundServerStifTest::PrintWithDelay() +// Convenience method for printing with delay. (Printing seems to work better +// if a delay is used.) +// ----------------------------------------------------------------------------- +// +void CAknSoundServerStifTest::PrintWithDelay(const TInt aPriority, const TDesC& aDesC1, + const TDesC& aDesC2) + { + TestModuleIf().Printf(aPriority, aDesC1, aDesC2); + User::After(KPrintDelay); + } + +// End of File