telephonyserverplugins/simtsy/test/Te_Sim/Te_SimCallOOMTest.cpp
changeset 0 3553901f7fa8
child 24 6638e7f4bd8f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/telephonyserverplugins/simtsy/test/Te_Sim/Te_SimCallOOMTest.cpp	Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +1,135 @@
+// 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:
+//
+
+#include "Te_SimCallOOMTest.h"
+
+CSimCallOOMTest::CSimCallOOMTest() 
+	{ 
+	SetTestStepName(_L("CallOOMTest"));
+	}
+
+TVerdict CSimCallOOMTest::doTestStepL()
+	{
+	INFO_PRINTF1(_L("BeginCallOOMTest"));
+
+ 	CreateConfigFileL(_L("c:\\config3.txt"));
+ 	SetTestNumberL(0);
+
+	TInt ret = iPhone.Open(iTelServer,KPhoneName); 
+	INFO_PRINTF2(_L("Result: %d"),ret); 
+	TESTL(ret == KErrNone); 
+	INFO_PRINTF1(_L("Opened phone object"));
+
+	iTelServer.SetPriorityClient();
+
+	TESTL(iPhone.Initialise()==KErrNone);
+	INFO_PRINTF1(_L("Opened phone object"));
+
+	TESTL(iLine.Open(iPhone,KVoiceLineName)==KErrNone);
+	INFO_PRINTF1(_L("Opened Line object"));
+
+	TName callName;
+	TESTL(iCall.OpenNewCall(iLine,callName)==KErrNone);
+	INFO_PRINTF1(_L("Opened Call object"));
+
+	iLine.Close();
+	iCall.Close();
+
+	TESTL(iLine.Open(iPhone,KVoiceLineName)==KErrNone);
+	INFO_PRINTF1(_L("Opened Line object"));
+
+	TName callName2;
+	TInt error = iCall.OpenNewCall(iLine,callName2);
+	TESTL(error==KErrNone);
+	INFO_PRINTF1(_L("Opened Call object"));
+	
+#ifdef _DEBUG
+	TRequestStatus stat;
+	TBool oomAvailable = EFalse;
+	TInt failure(0);
+	const TInt KMaxTests = 1000;
+	_LIT(KEmergencyNo, "01632960000");
+	
+	while (!oomAvailable && failure < KMaxTests)
+		{
+		INFO_PRINTF2(_L("Failing alloc %d. Making Call... "),failure);
+
+		iTelServer.__DbgFailNext(failure);
+
+		// Check that the heap is balanced at the same level before and 
+		// after all attempts at emergency call.
+		iTelServer.__DbgMarkHeap();
+		iCall.DialEmergencyCall(stat, KEmergencyNo);
+		User::WaitForRequest(stat);
+		INFO_PRINTF2(_L("result=%d... "), stat.Int());
+
+		if (stat.Int()!=KErrNone)
+			{
+			INFO_PRINTF2(_L("Failing after %d Allocs"),failure);
+			iTelServer.__DbgMarkEnd(0);
+			}
+		else
+			{
+			INFO_PRINTF2(_L("Passing after %d Allocs"),failure);
+			}
+			
+		iTelServer.__DbgFailNextAvailable(oomAvailable);
+
+		TInt ret = iCall.HangUp();
+		INFO_PRINTF2(_L("HangUp result=%d"), ret);
+
+		if (ret!=KErrNone)
+			{
+			iCall.HangUp();//if hang up unsuceessfull call again without heap fail
+			}
+
+		// Test for the end of the test. Not perfect (doesn't demonstrate 
+		// that there wasn't an OOM situation that was handled quietly 
+		// such that the call/hangup still worked) but I think it's all we 
+		// can do.
+		
+		if ( stat!=KErrNone || ret!=KErrNone)
+			{
+			INFO_PRINTF3(_L("OOM testing complete. Call status is %d and hang-up return is %d"),stat.Int(),ret);
+			break;
+			}
+			
+		
+		failure++;
+		}
+
+	// Resetting the heap to flush any FailNext there might be hanging around.
+	iTelServer.__DbgFailNext(0);
+
+	iCall.DialEmergencyCall(stat, KEmergencyNo);//use this to make the previous memory failure happen
+	User::WaitForRequest(stat);
+	iCall.HangUp();
+	
+	// KMaxTests is used to stop the above while statement looping
+	// indefinitely. If KMaxTests is reached then we can guess that something
+	// has gone wrong and the test should be failed.
+	TESTL(failure < KMaxTests);
+#else
+	INFO_PRINTF1(_L("TestDisabled on release build"));
+#endif // _DEBUG	
+	INFO_PRINTF1(_L("Closing objects..."));
+	iCall.Close();
+	iLine.Close();
+	iPhone.Close();
+	ASSERT(RThread().RequestCount()==0);
+
+	return TestStepResult();
+	}
+