usbmgmt/usbmgrtest/t_usbmanager_suite/T_UsbManager/src/CStartStopPersonality.cpp
changeset 0 c9bc50fca66e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usbmgmt/usbmgrtest/t_usbmanager_suite/T_UsbManager/src/CStartStopPersonality.cpp	Tue Feb 02 02:02:59 2010 +0200
@@ -0,0 +1,738 @@
+/*
+* Copyright (c) 2004-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
+*/
+#include <test/testexecutelog.h>
+#include "CUsbTestStepBase.h"
+#include "CStartStopPersonality.h"
+	
+//////////////////////////////////
+//    CStartStopPersonality1    //
+//////////////////////////////////
+
+CStartStopPersonality1::CStartStopPersonality1()
+
+	{
+	// Call base class method to set up the human readable name for logging
+	SetTestStepName(KStartStopPersonality1);
+	iDoNotConnect = ETrue;
+	}
+
+/*
+ This test case uses 3 sessions to the USB manager to call TryStart and TryStop in
+ different states of the server.
+ For TryStart the first 2 sessions use the same personality id and the third one uses
+ a different personality id.
+*/
+TVerdict CStartStopPersonality1::doTestStepL()
+	{
+	SetTestStepResult(EFail);
+	
+	//Read personality from ini file
+	TInt personality1 = 0;
+	TInt personality2 = 0;
+	_LIT(KPersonality1, "personality1"); 
+	if (!GetIntFromConfig(ConfigSection(), KPersonality1, personality1))
+		{
+		INFO_PRINTF1(_L("Can't get personality1 id from config file"));
+		return TestStepResult();
+		}
+	_LIT(KPersonality2, "personality2"); 
+	if (!GetIntFromConfig(ConfigSection(), KPersonality2, personality1))
+		{
+		INFO_PRINTF1(_L("Can't get personality2 id from config file"));
+		return TestStepResult();
+		}
+	
+	//Open sessions;
+	RUsb sess1, sess2, sess3;
+
+	TInt res;
+	res = sess1.Connect();
+	if (res != KErrNone)
+		{
+		INFO_PRINTF2(_L("Error connecting session 1 to USB service: %d"), res);
+		return TestStepResult();
+		}
+	res = sess2.Connect();
+	if (res != KErrNone)
+		{
+		INFO_PRINTF2(_L("Error connecting session 2 to USB service: %d"), res);
+		return TestStepResult();
+		}
+	res = sess3.Connect();
+	if (res != KErrNone)
+		{
+		INFO_PRINTF2(_L("Error connecting session 3 to USB service: %d"), res);
+		return TestStepResult();
+		}
+
+	//Initial State: Idle
+	//Function: TryStart
+	INFO_PRINTF1(_L("Initial State: Idle, Function: TryStart"));
+	SetIdle(sess1);
+	if (CheckState(sess1, EUsbServiceIdle) != KErrNone)
+		{
+		INFO_PRINTF1(_L("Trying again"));
+		SetIdle(sess1);
+		if (CheckState(sess1, EUsbServiceIdle) != KErrNone)
+			{
+			return TestStepResult();
+			}
+		}
+	if (TryStart(sess1, sess2, sess3, KErrNone, KErrNone, KErrAbort, personality1, personality2, EUsbServiceStarted) != KErrNone)
+		{
+		return TestStepResult();
+		}
+	
+	//Initial State: Idle
+	//Function: TryStop
+	INFO_PRINTF1(_L("Initial State: Idle, Function: TryStop"));
+	SetIdle(sess1);
+	if (CheckState(sess1, EUsbServiceIdle) != KErrNone)
+		{
+		INFO_PRINTF1(_L("Trying again"));
+		SetIdle(sess1);
+		if (CheckState(sess1, EUsbServiceIdle) != KErrNone)
+			{
+			return TestStepResult();
+			}
+		}
+	if (TryStop(sess1, sess2, sess3, KErrNone, KErrNone, KErrNone) != KErrNone)
+		{
+		return TestStepResult();
+		}
+	
+	//Initial State: Starting
+	//Function: TryStart
+	INFO_PRINTF1(_L("Initial State: Starting, Function: TryStart"));
+	SetStarting(sess1);
+	if (CheckState(sess1, EUsbServiceStarting) != KErrNone)
+		{
+		INFO_PRINTF1(_L("Trying again"));
+		SetStarting(sess1);
+		if (CheckState(sess1, EUsbServiceStarting) != KErrNone)
+			{
+			return TestStepResult();
+			}
+		}
+	if (TryStart(sess1, sess2, sess3, KErrNone, KErrNone, KErrAbort, personality1, personality2, EUsbServiceStarted) != KErrNone)
+		{
+		return TestStepResult();
+		}
+	
+	//Initial State: Starting
+	//Function: TryStop
+	INFO_PRINTF1(_L("Initial State: Starting, Function: TryStop"));
+	SetStarting(sess1);
+	if (CheckState(sess1, EUsbServiceStarting) != KErrNone)
+		{
+		INFO_PRINTF1(_L("Trying again"));
+		SetStarting(sess1);
+		if (CheckState(sess1, EUsbServiceStarting) != KErrNone)
+			{
+			return TestStepResult();
+			}
+		}
+	if (TryStop(sess1, sess2, sess3, KErrServerBusy, KErrServerBusy, KErrServerBusy) != KErrNone)
+		{
+		return TestStepResult();
+		}
+
+	//Initial State: Stopping
+	//Function: TryStart
+	INFO_PRINTF1(_L("Initial State: Stopping, Function: TryStart"));
+	SetStopping(sess1);
+	if (CheckState(sess1, EUsbServiceStopping) != KErrNone)
+		{
+		INFO_PRINTF1(_L("Trying again"));
+		SetStopping(sess1);
+		if (CheckState(sess1, EUsbServiceStopping) != KErrNone)
+			{
+			return TestStepResult();
+			}
+		}
+	if (TryStart(sess1, sess2, sess3, KErrServerBusy, KErrServerBusy, KErrServerBusy, personality1, personality2, EUsbServiceStopping) != KErrNone)
+		{
+		return TestStepResult();
+		}
+	
+	//Initial State: Stopping
+	//Function: TryStop
+	INFO_PRINTF1(_L("Initial State: Stopping, Function: TryStop"));
+	SetStopping(sess1);
+	if (CheckState(sess1, EUsbServiceStopping) != KErrNone)
+		{
+		INFO_PRINTF1(_L("Trying again"));
+		SetStopping(sess1);
+		if (CheckState(sess1, EUsbServiceStopping) != KErrNone)
+			{
+			return TestStepResult();
+			}
+		}
+	if (TryStop(sess1, sess2, sess3, KErrNone, KErrNone, KErrNone) != KErrNone)
+		{
+		return TestStepResult();
+		}
+	
+	//Initial State: Started
+	//Function: TryStart
+	//Assumes that the personality we are trying to start in sessions 1 and 2
+	//is the same as the current personality.
+	INFO_PRINTF1(_L("Initial State: Started, Function: TryStart"));
+	SetStarted(sess1);
+	if (CheckState(sess1, EUsbServiceStarted) != KErrNone)
+		{
+		INFO_PRINTF1(_L("Trying again"));
+		SetStarted(sess1);
+		if (CheckState(sess1, EUsbServiceStarted) != KErrNone)
+			{
+			return TestStepResult();
+			}
+		}
+	if (TryStart(sess1, sess2, sess3, KErrNone, KErrNone, KErrAbort, personality1, personality2, EUsbServiceStarted) != KErrNone)
+		{
+		return TestStepResult();
+		}
+	
+	//Initial State: Started
+	//Function: TryStop
+	INFO_PRINTF1(_L("Initial State: Started, Function: TryStop"));
+	SetStarted(sess1);
+	if (CheckState(sess1, EUsbServiceStarted) != KErrNone)
+		{
+		INFO_PRINTF1(_L("Trying again"));
+		SetStarted(sess1);
+		if (CheckState(sess1, EUsbServiceStarted) != KErrNone)
+			{
+			return TestStepResult();
+			}
+		}
+	if (TryStop(sess1, sess2, sess3, KErrNone, KErrNone, KErrNone) != KErrNone)
+		{
+		return TestStepResult();
+		}
+	
+	
+	sess1.Close();
+	sess2.Close();
+	sess3.Close();
+	
+	SetTestStepResult(EPass);
+	return TestStepResult();
+	}
+
+TInt CStartStopPersonality1::TryStart(RUsb aSess1, RUsb aSess2, RUsb aSess3, TInt aRet1, TInt aRet2, TInt aRet3, TInt aPersonality1, TInt aPersonality2, TUsbServiceState aState)
+	{
+	TRequestStatus stat1, stat2, stat3;
+	aSess1.TryStart(aPersonality1, stat1);
+	aSess2.TryStart(aPersonality1, stat2);
+	aSess3.TryStart(aPersonality2, stat3);
+	User::WaitForRequest(stat1);
+	User::WaitForRequest(stat2);
+	User::WaitForRequest(stat3);
+	if (stat1 != aRet1)
+		{
+		INFO_PRINTF2(_L("Session 1 TryStart returned unexpected error code: %d"), stat1.Int());
+		return KErrGeneral;
+		}
+	if (stat2 != aRet2)
+		{
+		INFO_PRINTF2(_L("Session 2 TryStart returned unexpected error code: %d"), stat2.Int());
+		return KErrGeneral;
+		}
+	if (stat3 != aRet3)
+		{
+		INFO_PRINTF2(_L("Session 3 TryStart returned unexpected error code: %d"), stat3.Int());
+		return KErrGeneral;
+		}
+	
+	//Make sure the correct personality is loaded and the server is in the expected state
+	TInt err;
+	TInt currPersonality;
+	err = aSess1.GetCurrentPersonalityId(currPersonality);
+	if (err != KErrNone)
+		{
+		INFO_PRINTF2(_L("Unable to get current personality id: %d"), err);
+		return KErrGeneral;
+		}
+	else if (currPersonality != aPersonality1)
+		{
+		INFO_PRINTF3(_L("Current personality id does not match expected value: %d != %d"), currPersonality, aPersonality1);
+		return KErrGeneral;
+		}
+	
+	return CheckState(aSess1, aState);
+	}
+
+TInt CStartStopPersonality1::TryStop(RUsb aSess1, RUsb aSess2, RUsb aSess3, TInt aRet1, TInt aRet2, TInt aRet3)
+	{
+	TRequestStatus stat1, stat2, stat3;
+	aSess1.TryStop(stat1);
+	aSess2.TryStop(stat2);
+	aSess3.TryStop(stat3);
+	User::WaitForRequest(stat1);
+	User::WaitForRequest(stat2);
+	User::WaitForRequest(stat3);
+	if (stat1 != aRet1)
+		{
+		INFO_PRINTF2(_L("Session 1 TryStop returned unexpected error code: %d"), stat1.Int());
+		return KErrGeneral;
+		}
+	if (stat2 != aRet2)
+		{
+		INFO_PRINTF2(_L("Session 2 TryStop returned unexpected error code: %d"), stat2.Int());
+		return KErrGeneral;
+		}
+	if (stat3 != aRet3)
+		{
+		INFO_PRINTF2(_L("Session 3 TryStop returned unexpected error code: %d"), stat3.Int());
+		return KErrGeneral;
+		}
+	return KErrNone;
+	}
+
+//////////////////////////////////
+//    CStartStopPersonality2    //
+//////////////////////////////////
+
+CStartStopPersonality2::CStartStopPersonality2()
+
+	{
+	// Call base class method to set up the human readable name for logging
+	SetTestStepName(KStartStopPersonality2);
+	iDoNotConnect = ETrue;
+	}
+
+TVerdict CStartStopPersonality2::doTestStepL()
+	{
+	SetTestStepResult(EFail);
+	
+	//Read personality from ini file
+	TInt personality;
+	_LIT(KPersonality, "personality1"); 
+	if (!GetIntFromConfig(ConfigSection(), KPersonality, personality))
+		{
+		INFO_PRINTF1(_L("Can't get personality id from config file"));
+		return TestStepResult();
+		}
+	
+	//Open sessions;
+	RUsb sess1, sess2;
+
+	TInt res;
+	res = sess1.Connect();
+	if (res != KErrNone)
+		{
+		INFO_PRINTF2(_L("Error connecting session 1 to USB service: %d"), res);
+		return TestStepResult();
+		}
+	res = sess2.Connect();
+	if (res != KErrNone)
+		{
+		INFO_PRINTF2(_L("Error connecting session 2 to USB service: %d"), res);
+		return TestStepResult();
+		}
+	
+	TRequestStatus stat1, stat2;
+	
+	//Initial State: Idle
+	//Functions: TryStart/Start
+	INFO_PRINTF1(_L("Initial State: Idle, Functions: TryStart/Start"));
+	SetIdle(sess1);
+	if (CheckState(sess1, EUsbServiceIdle) != KErrNone)
+		{
+		return TestStepResult();
+		}
+	sess1.TryStart(personality, stat1);
+	sess2.Start(stat2);
+	if (CheckReturnCodes(stat1, stat2, KErrNone, KErrNone) != KErrNone)
+		{
+		return TestStepResult();
+		}
+	
+	//Initial State: Idle
+	//Functions: Start/TryStart
+	INFO_PRINTF1(_L("Initial State: Idle, Functions: Start/TryStart"));
+	SetIdle(sess1);
+	sess1.Start(stat1);
+	sess2.TryStart(personality, stat2);
+	if (CheckReturnCodes(stat1, stat2, KErrNone, KErrNone) != KErrNone)
+		{
+		return TestStepResult();
+		}
+	
+	//Initial State: Idle
+	//Functions: TryStart/Stop
+	INFO_PRINTF1(_L("Initial State: Idle, Functions: TryStart/Stop"));
+	SetIdle(sess1);
+	sess1.TryStart(personality, stat1);
+	sess2.Stop(stat2);
+	if (CheckReturnCodes(stat1, stat2, KErrUsbServiceStopped, KErrNone) != KErrNone)
+		{
+		return TestStepResult();
+		}
+	
+	//Initial State: Idle
+	//Functions: Stop/TryStart
+	INFO_PRINTF1(_L("Initial State: Idle, Functions: Stop/TryStart"));
+	SetIdle(sess1);
+	sess1.Stop(stat1);
+	sess2.TryStart(personality, stat2);
+	if (CheckReturnCodes(stat1, stat2, KErrNone, KErrNone) != KErrNone)
+		{
+		return TestStepResult();
+		}
+	
+	//Initial State: Idle
+	//Functions: TryStop/Start
+	INFO_PRINTF1(_L("Initial State: Idle, Functions: TryStop/Start"));
+	SetIdle(sess1);
+	sess1.TryStop(stat1);
+	sess2.Start(stat2);
+	if (CheckReturnCodes(stat1, stat2, KErrNone, KErrNone) != KErrNone)
+		{
+		return TestStepResult();
+		}
+	
+	//Initial State: Idle
+	//Functions: Start/TryStop
+	INFO_PRINTF1(_L("Initial State: Idle, Functions: Start/Stop"));
+	SetIdle(sess1);
+	sess1.Start(stat1);
+	sess2.TryStop(stat2);
+	if (CheckReturnCodes(stat1, stat2, KErrNone, KErrServerBusy) != KErrNone)
+		{
+		return TestStepResult();
+		}
+	
+	//Initial State: Idle
+	//Functions: TryStop/Stop
+	INFO_PRINTF1(_L("Initial State: Idle, Functions: TryStop/Stop"));
+	SetIdle(sess1);
+	sess1.TryStop(stat1);
+	sess2.Stop(stat2);
+	if (CheckReturnCodes(stat1, stat2, KErrNone, KErrNone) != KErrNone)
+		{
+		return TestStepResult();
+		}
+	
+	//Initial State: Idle
+	//Functions: Stop/TryStop
+	INFO_PRINTF1(_L("Initial State: Idle, Functions: Stop/TryStop"));
+	SetIdle(sess1);
+	sess1.Stop(stat1);
+	sess2.TryStop(stat2);
+	if (CheckReturnCodes(stat1, stat2, KErrNone, KErrNone) != KErrNone)
+		{
+		return TestStepResult();
+		}
+	
+	//Initial State: Starting
+	//Functions: TryStart/Start
+	INFO_PRINTF1(_L("Initial State: Starting, Functions: TryStart/Start"));
+	SetIdle(sess1);
+	sess1.TryStart(personality, stat1);
+	sess2.Start(stat2);
+	if (CheckReturnCodes(stat1, stat2, KErrNone, KErrNone) != KErrNone)
+		{
+		return TestStepResult();
+		}
+	
+	//Initial State: Starting
+	//Functions: Start/TryStart
+	INFO_PRINTF1(_L("Initial State: Starting, Functions: Start/TryStart"));
+	SetStarting(sess1);
+	sess1.Start(stat1);
+	sess2.TryStart(personality, stat2);
+	if (CheckReturnCodes(stat1, stat2, KErrNone, KErrNone) != KErrNone)
+		{
+		return TestStepResult();
+		}
+	
+	//Initial State: Starting
+	//Functions: TryStart/Stop
+	INFO_PRINTF1(_L("Initial State: Starting, Functions: TryStart/Stop"));
+	SetStarting(sess1);
+	sess1.TryStart(personality, stat1);
+	sess2.Stop(stat2);
+	if (CheckReturnCodes(stat1, stat2, KErrUsbServiceStopped, KErrNone) != KErrNone)
+		{
+		return TestStepResult();
+		}
+	
+	//Initial State: Starting
+	//Functions: Stop/TryStart
+	INFO_PRINTF1(_L("Initial State: Starting, Functions: Stop/TryStart"));
+	SetStarting(sess1);
+	sess1.Stop(stat1);
+	sess2.TryStart(personality, stat2);
+	if (CheckReturnCodes(stat1, stat2, KErrNone, KErrServerBusy) != KErrNone)
+		{
+		return TestStepResult();
+		}
+	
+	//Initial State: Starting
+	//Functions: TryStop/Start
+	INFO_PRINTF1(_L("Initial State: Starting, Functions: TryStop/Start"));
+	SetStarting(sess1);
+	sess1.TryStop(stat1);
+	sess2.Start(stat2);
+	if (CheckReturnCodes(stat1, stat2, KErrServerBusy, KErrNone) != KErrNone)
+		{
+		return TestStepResult();
+		}
+	
+	//Initial State: Starting
+	//Functions: Start/TryStop
+	INFO_PRINTF1(_L("Initial State: Starting, Functions: Start/TryStop"));
+	SetStarting(sess1);
+	sess1.Start(stat1);
+	sess2.TryStop(stat2);
+	if (CheckReturnCodes(stat1, stat2, KErrNone, KErrServerBusy) != KErrNone)
+		{
+		return TestStepResult();
+		}
+	
+	//Initial State: Starting
+	//Functions: TryStop/Stop
+	INFO_PRINTF1(_L("Initial State: Starting, Functions: TryStop/Stop"));
+	SetStarting(sess1);
+	sess1.TryStop(stat1);
+	sess2.Stop(stat2);
+	if (CheckReturnCodes(stat1, stat2, KErrServerBusy, KErrNone) != KErrNone)
+		{
+		return TestStepResult();
+		}
+	
+	//Initial State: Starting
+	//Functions: Stop/TryStop
+	INFO_PRINTF1(_L("Initial State: Starting, Functions: Stop/TryStop"));
+	SetStarting(sess1);
+	sess1.Stop(stat1);
+	sess2.TryStop(stat2);
+	if (CheckReturnCodes(stat1, stat2, KErrNone, KErrNone) != KErrNone)
+		{
+		return TestStepResult();
+		}
+	
+	//Initial State: Stopping
+	//Functions: TryStart/Start
+	INFO_PRINTF1(_L("Initial State: Stopping, Functions: TryStart/Start"));
+	SetStopping(sess1);
+	sess1.TryStart(personality, stat1);
+	sess2.Start(stat2);
+	if (CheckReturnCodes(stat1, stat2, KErrServerBusy, KErrNone) != KErrNone)
+		{
+		return TestStepResult();
+		}
+	
+	//Initial State: Stopping
+	//Functions: Start/TryStart
+	INFO_PRINTF1(_L("Initial State: Stopping, Functions: Start/TryStart"));
+	SetStopping(sess1);
+	sess1.Start(stat1);
+	sess2.TryStart(personality, stat2);
+	if (CheckReturnCodes(stat1, stat2, KErrNone, KErrNone) != KErrNone)
+		{
+		return TestStepResult();
+		}
+	
+	//Initial State: Stopping
+	//Functions: TryStart/Stop
+	INFO_PRINTF1(_L("Initial State: Stopping, Functions: TryStart/Stop"));
+	SetStopping(sess1);
+	sess1.TryStart(personality, stat1);
+	sess2.Stop(stat2);
+	if (CheckReturnCodes(stat1, stat2, KErrServerBusy, KErrNone) != KErrNone)
+		{
+		return TestStepResult();
+		}
+	
+	//Initial State: Stopping
+	//Functions: Stop/TryStart
+	INFO_PRINTF1(_L("Initial State: Stopping, Functions: Stop/TryStart"));
+	SetStopping(sess1);
+	sess1.Stop(stat1);
+	sess2.TryStart(personality, stat2);
+	if (CheckReturnCodes(stat1, stat2, KErrNone, KErrServerBusy) != KErrNone)
+		{
+		return TestStepResult();
+		}
+	
+	//Initial State: Stopping
+	//Functions: TryStop/Start
+	INFO_PRINTF1(_L("Initial State: Stopping, Functions: TryStop/Start"));
+	SetStopping(sess1);
+	sess1.TryStop(stat1);
+	sess2.Start(stat2);
+	if (CheckReturnCodes(stat1, stat2, KErrUsbServiceStarted, KErrNone) != KErrNone)
+		{
+		return TestStepResult();
+		}
+	
+	//Initial State: Stopping
+	//Functions: Start/TryStop
+	INFO_PRINTF1(_L("Initial State: Stopping, Functions: Start/TryStop"));
+	SetStopping(sess1);
+	sess1.Start(stat1);
+	sess2.TryStop(stat2);
+	if (CheckReturnCodes(stat1, stat2, KErrNone, KErrServerBusy) != KErrNone)
+		{
+		return TestStepResult();
+		}
+	
+	//Initial State: Stopping
+	//Functions: TryStop/Stop
+	INFO_PRINTF1(_L("Initial State: Stopping, Functions: TryStop/Stop"));
+	SetStopping(sess1);
+	sess1.TryStop(stat1);
+	sess2.Stop(stat2);
+	if (CheckReturnCodes(stat1, stat2, KErrNone, KErrNone) != KErrNone)
+		{
+		return TestStepResult();
+		}
+	
+	//Initial State: Stopping
+	//Functions: Stop/TryStop
+	INFO_PRINTF1(_L("Initial State: Stopping, Functions: Stop/TryStop"));
+	SetStopping(sess1);
+	sess1.Stop(stat1);
+	sess2.TryStop(stat2);
+	if (CheckReturnCodes(stat1, stat2, KErrNone, KErrNone) != KErrNone)
+		{
+		return TestStepResult();
+		}
+	
+	//Initial State: Started
+	//Functions: TryStart/Start
+	INFO_PRINTF1(_L("Initial State: Started, Functions: TryStart/Start"));
+	SetIdle(sess1);
+	sess1.TryStart(personality, stat1);
+	sess2.Start(stat2);
+	if (CheckReturnCodes(stat1, stat2, KErrNone, KErrNone) != KErrNone)
+		{
+		return TestStepResult();
+		}
+	
+	//Initial State: Started
+	//Functions: Start/TryStart
+	//Assumes that the personality we are trying to start in sessions 1 and 2
+	//is the same as the current personality.
+	INFO_PRINTF1(_L("Initial State: Started, Functions: Start/TryStart"));
+	SetStarted(sess1);
+	sess1.Start(stat1);
+	sess2.TryStart(personality, stat2);
+	if (CheckReturnCodes(stat1, stat2, KErrNone, KErrNone) != KErrNone)
+		{
+		return TestStepResult();
+		}
+	
+	//Initial State: Started
+	//Functions: TryStart/Stop
+	//Assumes that the personality we are trying to start in session 1
+	//is the same as the current personality.
+	INFO_PRINTF1(_L("Initial State: Started, Functions: TryStart/Stop"));
+	SetStarted(sess1);
+	sess1.TryStart(personality, stat1);
+	sess2.Stop(stat2);
+	if (CheckReturnCodes(stat1, stat2, KErrNone, KErrNone) != KErrNone)
+		{
+		return TestStepResult();
+		}
+	
+	//Initial State: Started
+	//Functions: Stop/TryStart
+	INFO_PRINTF1(_L("Initial State: Started, Functions: Stop/TryStart"));
+	SetStarted(sess1);
+	sess1.Stop(stat1);
+	sess2.TryStart(personality, stat2);
+	if (CheckReturnCodes(stat1, stat2, KErrNone, KErrServerBusy) != KErrNone)
+		{
+		return TestStepResult();
+		}
+	
+	//Initial State: Started
+	//Functions: TryStop/Start
+	INFO_PRINTF1(_L("Initial State: Started, Functions: TryStop/Start"));
+	SetStarted(sess1);
+	sess1.TryStop(stat1);
+	sess2.Start(stat2);
+	if (CheckReturnCodes(stat1, stat2, KErrUsbServiceStarted, KErrNone) != KErrNone)
+		{
+		return TestStepResult();
+		}
+	
+	//Initial State: Started
+	//Functions: Start/TryStop
+	INFO_PRINTF1(_L("Initial State: Started, Functions: Start/TryStop"));
+	SetStarted(sess1);
+	sess1.Start(stat1);
+	sess2.TryStop(stat2);
+	if (CheckReturnCodes(stat1, stat2, KErrNone, KErrNone) != KErrNone)
+		{
+		return TestStepResult();
+		}
+	
+	//Initial State: Started
+	//Functions: TryStop/Stop
+	INFO_PRINTF1(_L("Initial State: Started, Functions: TryStop/Stop"));
+	SetStarted(sess1);
+	sess1.TryStop(stat1);
+	sess2.Stop(stat2);
+	if (CheckReturnCodes(stat1, stat2, KErrNone, KErrNone) != KErrNone)
+		{
+		return TestStepResult();
+		}
+	
+	//Initial State: Started
+	//Functions: Stop/TryStop
+	INFO_PRINTF1(_L("Initial State: Started, Functions: Stop/TryStop"));
+	SetStarted(sess1);
+	sess1.Stop(stat1);
+	sess2.TryStop(stat2);
+	if (CheckReturnCodes(stat1, stat2, KErrNone, KErrNone) != KErrNone)
+		{
+		return TestStepResult();
+		}
+	
+	sess1.Close();
+	sess2.Close();
+	
+	SetTestStepResult(EPass);
+	return TestStepResult();
+	}
+
+TInt CStartStopPersonality2::CheckReturnCodes(TRequestStatus& aStat1, TRequestStatus& aStat2, TInt aRet1, TInt aRet2)
+	{
+	User::WaitForRequest(aStat1);
+	User::WaitForRequest(aStat2);
+	if (aStat1 != aRet1)
+		{
+		INFO_PRINTF2(_L("Session 1 returned unexpected error code: %d"), aStat1.Int());
+		return KErrGeneral;
+		}
+	if (aStat2 != aRet2)
+		{
+		INFO_PRINTF2(_L("Session 2 returned unexpected error code: %d"), aStat2.Int());
+		return KErrGeneral;
+		}
+	return KErrNone;
+	}
+