diff -r 000000000000 -r a41df078684a kerneltest/e32test/power/t_power.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/e32test/power/t_power.cpp Mon Oct 19 15:55:17 2009 +0100 @@ -0,0 +1,222 @@ +// 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_power.cpp +// Overview: +// Test power down and wakeup event notification +// API Information: +// Power::PowerDown(), Power::RequestWakeupEventNotification() +// Details: +// - Arm a wakeup timer, enable wakeup events, enter standby mode, get woken up. +// - Test RequestWakeupEventNotification(): arm a timer, request notification, +// wait for timer to expire, verify event has been notified, issue another +// notification request, disable wakeup events, arm another timer, verify +// wakeup event has not been notified, cancel the notification request and +// close the timer. +// - Verify that a slave process panics because it hasn't and capability. +// - Confirm the number of open handles and pending requests are as expected. +// Platforms/Drives/Compatibility: +// All. +// Assumptions/Requirement/Pre-requisites: +// Failures and causes: +// Base Port information: +// +// + +#define __E32TEST_EXTENSION__ + +#include +#include +#include +#include + +LOCAL_D RTest test(_L(" T_POWER ")); + +void SetAbsoluteTimeout(RTimer& aTimer, TUint aUs, TRequestStatus& aStatus) + { + TTime wakeup; + wakeup.HomeTime(); + wakeup += TTimeIntervalMicroSeconds(aUs); + aTimer.At(aStatus, wakeup); + } + +void PowerTests() + { + test.Next(_L("test PowerDown()")); + + TInt r = Power::PowerDown(); + test (r == KErrNotReady); + + for (int i = 0; i < 4; ++i) + { + test.Printf(_L(" %d "), i); + // Arm an absolute timer wakeup event after 5 sec + TRequestStatus absstatus; + RTimer abstimer; + r = abstimer.CreateLocal(); + test (r == KErrNone); + SetAbsoluteTimeout(abstimer, 5000000, absstatus); // 5 sec + // Go to standby + r = Power::EnableWakeupEvents(EPwStandby); + test (r == KErrNone); + r = Power::PowerDown(); + test (r == KErrNone); + User::WaitForRequest(absstatus); + abstimer.Close(); + } + test.Printf(_L(" OK\n")); + + test.Next(_L("test RequestWakeupEventNotification()")); + + { + TInt r = Power::EnableWakeupEvents(EPwActive); + test (r == KErrArgument); + + // Request wakup event notification and enable wakeup events + TRequestStatus status; + Power::RequestWakeupEventNotification(status); + test(status.Int() == KRequestPending); + r = Power::EnableWakeupEvents(EPwStandby); + test (r == KErrNone); + // Arm an absolute timer wakeup event + TRequestStatus absstatus; + RTimer abstimer; + r = abstimer.CreateLocal(); + test (r == KErrNone); + SetAbsoluteTimeout(abstimer, 100000, absstatus); // 100ms + // Wait for the timer + User::WaitForRequest(absstatus); + test(absstatus.Int() == KErrNone); + // Wakup event has to be already notified + test(status.Int() == KErrNone); + User::WaitForRequest(status); // collect it + // Issue another notification request + Power::RequestWakeupEventNotification(status); + test(status.Int() == KRequestPending); + // Disable wakeup events + Power::DisableWakeupEvents(); + // Arm another absolute timer wakeup event + SetAbsoluteTimeout(abstimer, 100000, absstatus); // 100ms + // Wait for the timer + User::WaitForRequest(absstatus); + test(absstatus.Int() == KErrNone); + // Wakeup event has not to be notified + test(status.Int() == KRequestPending); + // Cancel the notification request + Power::CancelWakeupEventNotification(); + test(status.Int() == KErrCancel); + User::WaitForRequest(status); // collect it + // Cancel again just for fun ... + Power::CancelWakeupEventNotification(); + test(status.Int() == KErrCancel); + + abstimer.Close(); + } + } + +_LIT(KSecuritySlavePath, "t_power_slave.exe"); + +void ExecSlave(TUint aArg) + { + RProcess proc; + TInt r = proc.Create(KSecuritySlavePath, TPtrC((TUint16*) &aArg, sizeof(aArg)/sizeof(TUint16))); + test(r == KErrNone); + TRequestStatus status; + proc.Logon(status); + proc.Resume(); + User::WaitForRequest(status); + // The slave must panic + test_Equal(EExitPanic, proc.ExitType()); + test_Equal(EPlatformSecurityTrap, proc.ExitReason()); + CLOSE_AND_WAIT(proc); + } + +GLDEF_C TInt E32Main() + { + test.Title(); + test.Start(_L("Testing")); + + // Turn off evil lazy dll unloading + RLoader l; + test(l.Connect()==KErrNone); + test(l.CancelLazyDllUnload()==KErrNone); + l.Close(); + + // + // Perform the number of iterations specifed by the command line argument. + // + // If no arguments - perform two iterations + // + TInt iter = 2; + TInt len = User::CommandLineLength(); + if (len) + { + // Copy the command line in a buffer + HBufC* hb = HBufC::NewMax(len); + test(hb != NULL); + TPtr cmd((TUint16*) hb->Ptr(), len); + User::CommandLine(cmd); + // Extract the number of iterations + TLex l(cmd); + TInt i; + TInt r = l.Val(i); + if (r == KErrNone) + iter = i; + else + // strange command - silently ignore + {} + delete hb; + } + + test.Printf(_L("Go for %d iterations\n"), iter); + + while (iter--) + { + // Remember the number of open handles. Just for a sanity check .... + TInt start_thc, start_phc; + RThread().HandleCount(start_phc, start_thc); + + PowerTests(); + + test.Start(_L("test platform security")); + // The slave process must panic because it hasn't any capability + if(!PlatSec::IsCapabilityEnforced(ECapabilityPowerMgmt)) + test.Printf(_L("TESTS NOT RUN - PowerMgmt capability isn't enforced on system")); + else + { + test.Next(_L("PowerDown()")); + ExecSlave(0); + test.Next(_L("EnableWakeupEvents()")); + ExecSlave(1); + test.Next(_L("DisableWakeupEvents()")); + ExecSlave(2); + test.Next(_L("RequestWakeupEventNotification()")); + ExecSlave(3); + test.Next(_L("CancelWakeupEventNotification()")); + ExecSlave(4); + } + test.End(); + + // Sanity check for open handles + TInt end_thc, end_phc; + RThread().HandleCount(end_phc, end_thc); + test(start_thc == end_thc); + test(start_phc == end_phc); + // and also for pending requests ... + test(RThread().RequestCount() == 0); + } + + test.End(); + + return KErrNone; + }