--- /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;
+ }