kerneltest/e32test/power/t_domain_slave.cpp
changeset 0 a41df078684a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/e32test/power/t_domain_slave.cpp	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,140 @@
+// Copyright (c) 2002-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 "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:
+// e32test\power\t_domain_slave.cpp
+// 
+//
+
+#include <e32power.h>
+#include <e32test.h>
+#include <domainmember.h>
+#include <domainmanager.h>
+#include <e32panic.h>
+#include <e32debug.h>
+
+LOCAL_D RTest test(_L(" T_DOMAIN_SLAVE "));
+
+// This will be run in its own thread as part of test #1. It should get killed when trying to connect 
+// to the manager without appropriate caps set
+TInt IncorrectClient(TAny*)
+{
+    	RDmDomain domain;
+		TInt r = domain.Connect(KDmIdRoot);
+
+		RDmDomainManager manager;
+		r = manager.Connect();
+
+        return(r);
+}
+
+GLDEF_C TInt E32Main()
+	{
+	test.Title();
+	test.Start(_L("Testing"));
+
+//	test.Next(_L("test security"));
+
+	// Get arguments from the command line
+	TInt len = User::CommandLineLength();
+	test (len);
+	TInt size = len * sizeof(TUint16);
+	test (size == sizeof(TInt));
+	TInt arg;
+	TPtr cmd((TUint16*) &arg, len);
+	User::CommandLine(cmd);
+
+	TInt expected_result = PlatSec::IsCapabilityEnforced(ECapabilityPowerMgmt) ? KErrPermissionDenied : KErrNone;
+
+	switch(arg)
+		{
+	case 0:
+		{
+        // This is the original t_domain_slave test, minus the panicking parts which now get
+        // tested as case 1.
+
+        test.Next(_L("test security -- 0"));       
+
+		RDmDomain domain;
+		TInt r = domain.Connect(KDmIdRoot);
+		test (r == expected_result);
+
+		break;
+		}
+    case 1:
+        {
+
+        test.Next(_L("test security -- 1")); 
+        
+        TBool jit = User::JustInTime();
+
+        User::SetJustInTime(EFalse);
+
+        _LIT(KPanicThread, "PanicThread");
+
+        RThread testThread;
+
+        TInt tt=testThread.Create(KPanicThread, IncorrectClient, KDefaultStackSize, 
+            NULL, NULL);
+
+        test (KErrNone == tt);
+
+        TRequestStatus tStatus;
+  //      testThread.Logon(tStatus);
+
+        RUndertaker deathChecker;
+        TInt dcOK = deathChecker.Create();
+
+        test (KErrNone == dcOK);
+
+        TInt nextDeadThread;
+
+        deathChecker.Logon(tStatus, nextDeadThread);
+
+        // threads are created in a suspended state. calling resume here starts the thread.
+        testThread.Resume();
+        User::WaitForRequest(tStatus);
+
+        // If thread suicided for the correct reason --> successful test
+        // NB. KErrPermissionDenied means that the server refused the 
+        // connection because of incorrect capabilities
+
+        RThread corpse;
+        corpse.SetHandle(nextDeadThread);
+
+        RDebug::Printf("Subthread exit type: %d", corpse.ExitType() );
+
+        RDebug::Printf("Subthread exit reason: %d",corpse.ExitReason() );
+
+        test (corpse.ExitType() == EExitKill);
+
+        test (corpse.ExitReason() == KErrPermissionDenied);
+
+        corpse.Close();
+  
+        // close the RUndertaker and test thread
+        deathChecker.Close();
+		CLOSE_AND_WAIT(testThread);
+
+        User::SetJustInTime(jit);
+
+		break;
+        }
+	default:
+		User::Panic(_L("USER"), EInvariantFalse);
+		break;
+		}
+
+	test.End();
+
+	return KErrNone;
+	}