diff -r 675a964f4eb5 -r 35751d3474b7 cryptomgmtlibs/securitytestfw/test/testhandler2/t_policy.cpp --- a/cryptomgmtlibs/securitytestfw/test/testhandler2/t_policy.cpp Tue Jul 21 01:04:32 2009 +0100 +++ b/cryptomgmtlibs/securitytestfw/test/testhandler2/t_policy.cpp Thu Sep 10 14:01:51 2009 +0300 @@ -1,541 +1,541 @@ -/* -* 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 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: -* -*/ - - -#include "t_policy.h" -#include "t_input.h" -#include "t_output.h" -#include "t_testhandler.h" -#include "utf.h" - -#include - -// run failure tests first - -_LIT8(KTestExeStart, ""); -_LIT8(KExcludedCapsStart, ""); -_LIT8(KPolicyStart, ""); -_LIT8(KPreActionsStart, ""); -_LIT8(KPassAcionStart, ""); -_LIT8(KFailAcionStart, ""); -_LIT8(KPostActionsStart, ""); -_LIT8(KSecureIdStart, ""); -_LIT8(KSecureIdEnd, ""); -_LIT8(KVendorIdStart, ""); -_LIT8(KVendorIdEnd, ""); - -_LIT(KFormat,"Action Name : %S \n"); -_LIT(KSetCapExe, "setcap"); -_LIT(KSetCapExe2, "setcap : "); -//NOTE :If the below literal is uncommented , remove the c:\hardcoded reference -// and replace with RFs::GetSystemDrive(). -//_LIT(KTestExeTmpPath, "c:\\sys\\bin\\policytest_exe.exe"); -_LIT(KPassScriptPath, "\\policytest_script_pass.txt"); -_LIT(KFailScriptPath, "\\policytest_script_fail.txt"); -_LIT(KLogTmpPath, "\\policytest_log.txt"); -_LIT(KTestPath, "policytest_"); -_LIT(KFailTestRunning, "Fail Test Script Running"); -_LIT(KPassTestRunning, "Pass Test Script Running"); - - -const TUint KCapabilityAll = 0xffffffff; - -CPolicyTest* CPolicyTest::NewL(CConsoleBase& aConsole, - Output& aOut, - const TTestActionSpec& aTestActionSpec) - { - CPolicyTest* self = CPolicyTest::NewLC(aConsole, aOut, aTestActionSpec); - CleanupStack::Pop(self); - return self; - } - -CPolicyTest* CPolicyTest::NewLC(CConsoleBase& aConsole, - Output& aOut, - const TTestActionSpec& aTestActionSpec) - { - CPolicyTest* self = new(ELeave) CPolicyTest(aConsole, aOut); - CleanupStack::PushL(self); - self->ConstructL(aTestActionSpec); - return self; - } - -CPolicyTest::CPolicyTest(CConsoleBase& aConsole, - Output& aOut) - : CTestAction(aConsole, aOut) - { - } - -void CPolicyTest::ConstructL(const TTestActionSpec& aTestActionSpec) - { - CTestAction::ConstructL(aTestActionSpec); - iExpectedResult = KErrNone; - - User::LeaveIfError(iFs.Connect()); - - RProcess thisProcess; - User::LeaveIfError(thisProcess.Open(thisProcess.Id())); - iProcessSecureId = thisProcess.SecureId(); - iProcessVendorId = thisProcess.VendorId(); - thisProcess.Close(); - - SetTestExeL(Input::ParseElement(aTestActionSpec.iActionBody, KTestExeStart)); - Input::ParseCapabilitySetL(Input::ParseElement(aTestActionSpec.iActionBody, KExcludedCapsStart), iExcludedCaps); - SetPolicyL(Input::ParseElement(aTestActionSpec.iActionBody, KPolicyStart)); - iPreActions = Input::ParseElement(aTestActionSpec.iActionBody, KPreActionsStart).AllocL(); - SetTestActionL(Input::ParseElement(aTestActionSpec.iActionBody, KPassAcionStart), - Input::ParseElement(aTestActionSpec.iActionBody, KFailAcionStart)); - iPostActions = Input::ParseElement(aTestActionSpec.iActionBody, KPostActionsStart).AllocL(); - } - -CPolicyTest::~CPolicyTest() - { - iFs.Close(); - delete iTestExe; - iCapabilities.Close(); - delete iPreActions; - delete iPassAction; - delete iFailAction; - delete iPostActions; - iProcess.Close(); - } - -void CPolicyTest::BadUsageL(const TDesC& aMessage) - { - iOut.writeString(_L("Error in script action testpolicy")); - iOut.writeNewLine(); - iOut.writeString(aMessage); - iOut.writeNewLine(); - User::Leave(KErrArgument); - } - -void CPolicyTest::SetTestExeL(const TDesC8& aPath) - { - if (aPath == KNullDesC8) - { - BadUsageL(_L("testexe not specified")); - } - - iTestExe = HBufC::NewMaxL(aPath.Length()); - TPtr ptr = iTestExe->Des(); - ptr.Copy(aPath); - } - -void CPolicyTest::SetPolicyL(const TDesC8& aSpec) - { - iSecureId = Input::ParseIntElement(aSpec, KSecureIdStart, KSecureIdEnd); - iVendorId = Input::ParseIntElement(aSpec, KVendorIdStart, KVendorIdEnd); - - TCapabilitySet capSet; - Input::ParseCapabilitySetL(aSpec, capSet); - - // Extract capabilities into array - for (TInt i = 0 ; i < ECapability_Limit ; ++i) - { - TCapability c = static_cast(i); - if (capSet.HasCapability(c)) - { - User::LeaveIfError(iCapabilities.Append(c)); - } - } - } - -void CPolicyTest::SetTestActionL(const TDesC8& aPassAction, const TDesC8& aFailAction) - { - if (aPassAction == KNullDesC8) - { - BadUsageL(_L("passactions not specified")); - } - - iPassAction = aPassAction.AllocL(); - - if (aFailAction == KNullDesC8) - { - BadUsageL(_L("failactions not specified")); - } - - iFailAction = aFailAction.AllocL(); -} - -void CPolicyTest::PerformAction(TRequestStatus& aStatus) - { - if (aStatus < 0) - { - iState = EFinished; - } - - switch (iState) - { - case EInit: - { - TDriveUnit sysDrive (RFs::GetSystemDrive()); - TDriveName sysDriveName (sysDrive.Name()); - - TBuf<128> scriptFile (sysDriveName); - scriptFile.Append(KPassScriptPath); - WriteScriptFileL(scriptFile, *iPassAction); - - scriptFile.Copy(sysDriveName); - scriptFile.Append(KFailScriptPath); - WriteScriptFileL(scriptFile, *iFailAction); - } - // fall through - - case ESetupTest: - GetNextTest(); - if (iTestState == ETestFinished) - { - iState = EFinished; - TRequestStatus* status = &aStatus; - User::RequestComplete(status, KErrNone); - } - else - { - SetupTestL(aStatus); - iState = ERunTest; - } - break; - - case ERunTest: - CheckProcessTermintationL(); - RunTestL(aStatus); - iState = EProcessResults; - break; - - case EProcessResults: - CheckProcessTermintationL(); - ProcessResultsL(aStatus); - iState = ESetupTest; - break; - - case EFinished: - iActionState = EPostrequisite; - TRequestStatus* status = &aStatus; - User::RequestComplete(status, aStatus.Int()); - break; - } - } - -void CPolicyTest::StartProcessL(const TDesC& aExe, const TDesC& aCommandLine, TRequestStatus& aStatus) - { - iOut.writeString(_L("Starting child process: ")); - iOut.writeString(aExe); - iOut.writeString(_L(" ")); - iOut.writeString(aCommandLine); - iOut.writeNewLine(); - - User::LeaveIfError(iProcess.Create(aExe, aCommandLine)); - iProcess.Logon(aStatus); - iProcess.Resume(); - } - -void CPolicyTest::CheckProcessTermintationL() - { - if (iProcess.ExitType() == EExitPanic) - { - iOut.writeString(_L("Child process panicked: ")); - iOut.writeString(iProcess.ExitCategory()); - iOut.writeString(_L(" ")); - iOut.writeNum(iProcess.ExitReason()); - iOut.writeNewLine(); - User::Leave(KErrGeneral); - } - ASSERT(iProcess.ExitType() == EExitKill); - iProcess.Close(); - } - -void CPolicyTest::GetNextTest() - { - // Step through capabilities to be tested - if (iTestState == ETestFailCap) - { - ++iCapIndex; - if (iCapIndex < iCapabilities.Count()) - return; - } - - // Step through possible tests until we hit a vaild test - do - { - iTestState = static_cast(iTestState + 1); - } - while (!((iTestState == ETestFailSID && iSecureId) || - (iTestState == ETestFailVID && iVendorId) || - (iTestState == ETestFailCap && iCapabilities.Count()) || - (iTestState == ETestPass) || - (iTestState == ETestFinished))); - } - -void CPolicyTest::SetupTestL(TRequestStatus& aStatus) - { - switch (iTestState) - { - case ETestFailSID: - { - TInt wrongSecureId = iSecureId + 1; - iOut.write(_L("Failure test: Wrong SID (%08x):\n\n"), wrongSecureId); - SetTestSecurityInfoL(wrongSecureId, iVendorId, KCapabilityAll, aStatus); - } - break; - - case ETestFailVID: - { - TInt wrongVendorId = iVendorId + 1; - iOut.write(_L("Failure test: Wrong VID (%08x):\n\n"), wrongVendorId); - SetTestSecurityInfoL(iSecureId, wrongVendorId, KCapabilityAll, aStatus); - } - break; - - case ETestFailCap: - { - TCapability missingCap = iCapabilities[iCapIndex]; - - iOut.writeString(_L("Failure test: Missing capability (")); - iOut.writeCapabilityL(missingCap); - iOut.writeString(_L("):\n\n")); - - TUint capSet = ~ (1 << missingCap); - SetTestSecurityInfoL(iSecureId, iVendorId, capSet, aStatus); - } - break; - - case ETestPass: - { - iOut.write(_L("Pass test:\n\n")); - - TUint capSet = 0; - for (TInt i = 0 ; i < iCapabilities.Count() ; ++i) - { - capSet |= 1 << iCapabilities[i]; - } - - SetTestSecurityInfoL(iSecureId, iVendorId, capSet, aStatus); - } - break; - - default: - User::Invariant(); - } - } - -void CPolicyTest::SetTestSecurityInfoL(TInt aSecureId, TInt aVendorId, TUint aCapSet, TRequestStatus& aStatus) - { - // Remove excluded capabilities - for (TInt i = 0 ; i < ECapability_Limit ; ++i) - { - if (iExcludedCaps.HasCapability(static_cast(i))) - { - aCapSet &= ~ (1 << i); - } - } - - TBuf<128> commandLine; - commandLine.AppendFormat(_L("%S %08x "), iTestExe, aCapSet); - if (aSecureId) - { - commandLine.AppendFormat(_L("-SID %08x "), aSecureId); - } - if (aVendorId) - { - commandLine.AppendFormat(_L("-VID %08x "), aVendorId); - } - // commandLine.Append(KTestExeTmpPath); - iTestExeTmpNewPath = KTestPath; - iTestExeTmpNewPath.Append(*iTestExe); - commandLine.Append(iTestExeTmpNewPath); - - TBuf<128> isetcapTmpNewPath1; //stores the value of commandline - TBuf<128> isetcapTmpNewPath; //stores the value of KsetCapexe2 - isetcapTmpNewPath = KSetCapExe2; - isetcapTmpNewPath1= commandLine; - isetcapTmpNewPath.Append(isetcapTmpNewPath1); - RDebug::RawPrint(isetcapTmpNewPath); - StartProcessL(KSetCapExe, commandLine, aStatus); - - } - -void CPolicyTest::WriteScriptFileL(const TDesC& aPath, const TDesC8& aAction) - { - iFs.Delete(aPath); // ignore errors - - RFile file; - User::LeaveIfError(file.Create(iFs, aPath, EFileShareExclusive | EFileWrite)); - CleanupClosePushL(file); - - User::LeaveIfError(file.Write(*iPreActions)); - User::LeaveIfError(file.Write(aAction)); - User::LeaveIfError(file.Write(*iPostActions)); - - CleanupStack::PopAndDestroy(&file); - } - -void CPolicyTest::RunTestL(TRequestStatus& aStatus) - { - - HBufC* hptr16; - hptr16 = CnvUtfConverter::ConvertToUnicodeFromUtf8L(*iNameInfo); - RDebug::Print(KFormat,hptr16); - delete hptr16; - - TDriveUnit sysDrive (RFs::GetSystemDrive()); - TDriveName sysDriveName (sysDrive.Name()); - - TBuf<128> passScriptFile (sysDriveName); - passScriptFile.Append(KPassScriptPath); - - TBuf<128> failScriptFile (sysDriveName); - failScriptFile.Append(KFailScriptPath); - - TPtrC script = (iTestState == ETestPass) ? passScriptFile : failScriptFile; - (iTestState == ETestPass) ? RDebug::RawPrint(KPassTestRunning) : RDebug::RawPrint(KFailTestRunning); - - - TBuf<128> logTmpFile (sysDriveName); - logTmpFile.Append(KLogTmpPath); - iFs.Delete(logTmpFile); // ignore errors - - TBuf<128> commandLine; - commandLine.AppendFormat(_L("%S %S"), &script, &logTmpFile); - - StartProcessL(iTestExeTmpNewPath, commandLine, aStatus); - } - -void CPolicyTest::ProcessResultsL(TRequestStatus& aStatus) - { - _LIT8(KSummaryLine, " tests failed out of "); - _LIT8(KNewLine, "\r\n"); - - TInt failCount = KErrNotFound, runCount; - - // Read entire log file into memory to process - RFile file; - TDriveUnit sysDrive (RFs::GetSystemDrive()); - TBuf<128> logTmpFile (sysDrive.Name()); - logTmpFile.Append(KLogTmpPath); - User::LeaveIfError(file.Open(iFs, logTmpFile, EFileShareReadersOnly | EFileRead)); - CleanupClosePushL(file); - - TInt size; - User::LeaveIfError(file.Size(size)); - HBufC8* buffer = HBufC8::NewLC(size); - TPtr8 ptr = buffer->Des(); - - User::LeaveIfError(file.Read(ptr)); - - iOut.writeString(_L("Child test output:\n")); - - TInt pos = 0; - while (pos < size) - { - TInt nextNewline = buffer->Mid(pos).Find(KNewLine); - - // Split buffer into lines - TPtrC8 line; - if (nextNewline == KErrNotFound) - { - line.Set(buffer->Mid(pos)); - } - else - { - line.Set(buffer->Mid(pos, nextNewline + KNewLine().Length())); - } - pos += line.Length(); - - // Search for summary line - TInt pos2 = line.Find(KSummaryLine); - if (pos2 != KErrNotFound) - { - // Parse the summary line to work out if the test passed - TLex8 lex1(line.Left(pos2)); - TInt err1 = lex1.Val(failCount); - TLex8 lex2(line.Mid(pos2 + KSummaryLine().Length())); - TInt err2 = lex2.Val(runCount); - - if (err1 != KErrNone || err2 != KErrNone) - { - iOut.writeString(_L("Failed to parse summary line\n")); - User::LeaveIfError(err1); - User::LeaveIfError(err2); - } - } - else - { - // Don't print the summary line as this will confuse whatever parsed - // the main log - iOut.writeString(_L("> ")); - iOut.writeString(line); - } - } - - if (failCount == KErrNotFound) - { - iOut.writeString(_L("Couldn't find summary line in test output\n")); - User::Leave(KErrNotFound); - } - iFailCount += failCount; - - // Print results in different format - iOut.write(_L("Tests run: %d\n"), runCount); - iOut.write(_L("Tests failed: %d\n"), failCount); - iOut.writeNewLine(); - - CleanupStack::PopAndDestroy(2, &file); - - TRequestStatus* status = &aStatus; - User::RequestComplete(status, KErrNone); - } - -void CPolicyTest::PerformCancel() - { - // not implemented - need to pass original status object to LogonCancel - User::Invariant(); - /* - switch (iState) - { - case ESetCapsPass: - case ERunTest: - iProcess.LogonCancel(); - iProcess.Kill(KErrCancel); - iProcess.Close(); - break; - } - */ - } - -void CPolicyTest::Reset() - { - iProcess.Close(); - iState = ESetupTest; - iTestState = ETestNone; - iCapIndex = -1; - iFailCount = 0; - } - -void CPolicyTest::DoReportAction() - { - iOut.writeString(_L("Running policy tests...\n\n")); - } - -void CPolicyTest::DoCheckResult(TInt aError) - { - if (aError == KErrNone && iFailCount > 0) - { - iOut.write(_L("%d tests failed\n"), iFailCount); - aError = KErrGeneral; - } - - iResult = (aError == iExpectedResult); - } +/* +* 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 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: +* +*/ + + +#include "t_policy.h" +#include "t_input.h" +#include "t_output.h" +#include "t_testhandler.h" +#include "utf.h" + +#include + +// run failure tests first + +_LIT8(KTestExeStart, ""); +_LIT8(KExcludedCapsStart, ""); +_LIT8(KPolicyStart, ""); +_LIT8(KPreActionsStart, ""); +_LIT8(KPassAcionStart, ""); +_LIT8(KFailAcionStart, ""); +_LIT8(KPostActionsStart, ""); +_LIT8(KSecureIdStart, ""); +_LIT8(KSecureIdEnd, ""); +_LIT8(KVendorIdStart, ""); +_LIT8(KVendorIdEnd, ""); + +_LIT(KFormat,"Action Name : %S \n"); +_LIT(KSetCapExe, "setcap"); +_LIT(KSetCapExe2, "setcap : "); +//NOTE :If the below literal is uncommented , remove the c:\hardcoded reference +// and replace with RFs::GetSystemDrive(). +//_LIT(KTestExeTmpPath, "c:\\sys\\bin\\policytest_exe.exe"); +_LIT(KPassScriptPath, "\\policytest_script_pass.txt"); +_LIT(KFailScriptPath, "\\policytest_script_fail.txt"); +_LIT(KLogTmpPath, "\\policytest_log.txt"); +_LIT(KTestPath, "policytest_"); +_LIT(KFailTestRunning, "Fail Test Script Running"); +_LIT(KPassTestRunning, "Pass Test Script Running"); + + +const TUint KCapabilityAll = 0xffffffff; + +CPolicyTest* CPolicyTest::NewL(CConsoleBase& aConsole, + Output& aOut, + const TTestActionSpec& aTestActionSpec) + { + CPolicyTest* self = CPolicyTest::NewLC(aConsole, aOut, aTestActionSpec); + CleanupStack::Pop(self); + return self; + } + +CPolicyTest* CPolicyTest::NewLC(CConsoleBase& aConsole, + Output& aOut, + const TTestActionSpec& aTestActionSpec) + { + CPolicyTest* self = new(ELeave) CPolicyTest(aConsole, aOut); + CleanupStack::PushL(self); + self->ConstructL(aTestActionSpec); + return self; + } + +CPolicyTest::CPolicyTest(CConsoleBase& aConsole, + Output& aOut) + : CTestAction(aConsole, aOut) + { + } + +void CPolicyTest::ConstructL(const TTestActionSpec& aTestActionSpec) + { + CTestAction::ConstructL(aTestActionSpec); + iExpectedResult = KErrNone; + + User::LeaveIfError(iFs.Connect()); + + RProcess thisProcess; + User::LeaveIfError(thisProcess.Open(thisProcess.Id())); + iProcessSecureId = thisProcess.SecureId(); + iProcessVendorId = thisProcess.VendorId(); + thisProcess.Close(); + + SetTestExeL(Input::ParseElement(aTestActionSpec.iActionBody, KTestExeStart)); + Input::ParseCapabilitySetL(Input::ParseElement(aTestActionSpec.iActionBody, KExcludedCapsStart), iExcludedCaps); + SetPolicyL(Input::ParseElement(aTestActionSpec.iActionBody, KPolicyStart)); + iPreActions = Input::ParseElement(aTestActionSpec.iActionBody, KPreActionsStart).AllocL(); + SetTestActionL(Input::ParseElement(aTestActionSpec.iActionBody, KPassAcionStart), + Input::ParseElement(aTestActionSpec.iActionBody, KFailAcionStart)); + iPostActions = Input::ParseElement(aTestActionSpec.iActionBody, KPostActionsStart).AllocL(); + } + +CPolicyTest::~CPolicyTest() + { + iFs.Close(); + delete iTestExe; + iCapabilities.Close(); + delete iPreActions; + delete iPassAction; + delete iFailAction; + delete iPostActions; + iProcess.Close(); + } + +void CPolicyTest::BadUsageL(const TDesC& aMessage) + { + iOut.writeString(_L("Error in script action testpolicy")); + iOut.writeNewLine(); + iOut.writeString(aMessage); + iOut.writeNewLine(); + User::Leave(KErrArgument); + } + +void CPolicyTest::SetTestExeL(const TDesC8& aPath) + { + if (aPath == KNullDesC8) + { + BadUsageL(_L("testexe not specified")); + } + + iTestExe = HBufC::NewMaxL(aPath.Length()); + TPtr ptr = iTestExe->Des(); + ptr.Copy(aPath); + } + +void CPolicyTest::SetPolicyL(const TDesC8& aSpec) + { + iSecureId = Input::ParseIntElement(aSpec, KSecureIdStart, KSecureIdEnd); + iVendorId = Input::ParseIntElement(aSpec, KVendorIdStart, KVendorIdEnd); + + TCapabilitySet capSet; + Input::ParseCapabilitySetL(aSpec, capSet); + + // Extract capabilities into array + for (TInt i = 0 ; i < ECapability_Limit ; ++i) + { + TCapability c = static_cast(i); + if (capSet.HasCapability(c)) + { + User::LeaveIfError(iCapabilities.Append(c)); + } + } + } + +void CPolicyTest::SetTestActionL(const TDesC8& aPassAction, const TDesC8& aFailAction) + { + if (aPassAction == KNullDesC8) + { + BadUsageL(_L("passactions not specified")); + } + + iPassAction = aPassAction.AllocL(); + + if (aFailAction == KNullDesC8) + { + BadUsageL(_L("failactions not specified")); + } + + iFailAction = aFailAction.AllocL(); +} + +void CPolicyTest::PerformAction(TRequestStatus& aStatus) + { + if (aStatus < 0) + { + iState = EFinished; + } + + switch (iState) + { + case EInit: + { + TDriveUnit sysDrive (RFs::GetSystemDrive()); + TDriveName sysDriveName (sysDrive.Name()); + + TBuf<128> scriptFile (sysDriveName); + scriptFile.Append(KPassScriptPath); + WriteScriptFileL(scriptFile, *iPassAction); + + scriptFile.Copy(sysDriveName); + scriptFile.Append(KFailScriptPath); + WriteScriptFileL(scriptFile, *iFailAction); + } + // fall through + + case ESetupTest: + GetNextTest(); + if (iTestState == ETestFinished) + { + iState = EFinished; + TRequestStatus* status = &aStatus; + User::RequestComplete(status, KErrNone); + } + else + { + SetupTestL(aStatus); + iState = ERunTest; + } + break; + + case ERunTest: + CheckProcessTermintationL(); + RunTestL(aStatus); + iState = EProcessResults; + break; + + case EProcessResults: + CheckProcessTermintationL(); + ProcessResultsL(aStatus); + iState = ESetupTest; + break; + + case EFinished: + iActionState = EPostrequisite; + TRequestStatus* status = &aStatus; + User::RequestComplete(status, aStatus.Int()); + break; + } + } + +void CPolicyTest::StartProcessL(const TDesC& aExe, const TDesC& aCommandLine, TRequestStatus& aStatus) + { + iOut.writeString(_L("Starting child process: ")); + iOut.writeString(aExe); + iOut.writeString(_L(" ")); + iOut.writeString(aCommandLine); + iOut.writeNewLine(); + + User::LeaveIfError(iProcess.Create(aExe, aCommandLine)); + iProcess.Logon(aStatus); + iProcess.Resume(); + } + +void CPolicyTest::CheckProcessTermintationL() + { + if (iProcess.ExitType() == EExitPanic) + { + iOut.writeString(_L("Child process panicked: ")); + iOut.writeString(iProcess.ExitCategory()); + iOut.writeString(_L(" ")); + iOut.writeNum(iProcess.ExitReason()); + iOut.writeNewLine(); + User::Leave(KErrGeneral); + } + ASSERT(iProcess.ExitType() == EExitKill); + iProcess.Close(); + } + +void CPolicyTest::GetNextTest() + { + // Step through capabilities to be tested + if (iTestState == ETestFailCap) + { + ++iCapIndex; + if (iCapIndex < iCapabilities.Count()) + return; + } + + // Step through possible tests until we hit a vaild test + do + { + iTestState = static_cast(iTestState + 1); + } + while (!((iTestState == ETestFailSID && iSecureId) || + (iTestState == ETestFailVID && iVendorId) || + (iTestState == ETestFailCap && iCapabilities.Count()) || + (iTestState == ETestPass) || + (iTestState == ETestFinished))); + } + +void CPolicyTest::SetupTestL(TRequestStatus& aStatus) + { + switch (iTestState) + { + case ETestFailSID: + { + TInt wrongSecureId = iSecureId + 1; + iOut.write(_L("Failure test: Wrong SID (%08x):\n\n"), wrongSecureId); + SetTestSecurityInfoL(wrongSecureId, iVendorId, KCapabilityAll, aStatus); + } + break; + + case ETestFailVID: + { + TInt wrongVendorId = iVendorId + 1; + iOut.write(_L("Failure test: Wrong VID (%08x):\n\n"), wrongVendorId); + SetTestSecurityInfoL(iSecureId, wrongVendorId, KCapabilityAll, aStatus); + } + break; + + case ETestFailCap: + { + TCapability missingCap = iCapabilities[iCapIndex]; + + iOut.writeString(_L("Failure test: Missing capability (")); + iOut.writeCapabilityL(missingCap); + iOut.writeString(_L("):\n\n")); + + TUint capSet = ~ (1 << missingCap); + SetTestSecurityInfoL(iSecureId, iVendorId, capSet, aStatus); + } + break; + + case ETestPass: + { + iOut.write(_L("Pass test:\n\n")); + + TUint capSet = 0; + for (TInt i = 0 ; i < iCapabilities.Count() ; ++i) + { + capSet |= 1 << iCapabilities[i]; + } + + SetTestSecurityInfoL(iSecureId, iVendorId, capSet, aStatus); + } + break; + + default: + User::Invariant(); + } + } + +void CPolicyTest::SetTestSecurityInfoL(TInt aSecureId, TInt aVendorId, TUint aCapSet, TRequestStatus& aStatus) + { + // Remove excluded capabilities + for (TInt i = 0 ; i < ECapability_Limit ; ++i) + { + if (iExcludedCaps.HasCapability(static_cast(i))) + { + aCapSet &= ~ (1 << i); + } + } + + TBuf<128> commandLine; + commandLine.AppendFormat(_L("%S %08x "), iTestExe, aCapSet); + if (aSecureId) + { + commandLine.AppendFormat(_L("-SID %08x "), aSecureId); + } + if (aVendorId) + { + commandLine.AppendFormat(_L("-VID %08x "), aVendorId); + } + // commandLine.Append(KTestExeTmpPath); + iTestExeTmpNewPath = KTestPath; + iTestExeTmpNewPath.Append(*iTestExe); + commandLine.Append(iTestExeTmpNewPath); + + TBuf<128> isetcapTmpNewPath1; //stores the value of commandline + TBuf<128> isetcapTmpNewPath; //stores the value of KsetCapexe2 + isetcapTmpNewPath = KSetCapExe2; + isetcapTmpNewPath1= commandLine; + isetcapTmpNewPath.Append(isetcapTmpNewPath1); + RDebug::RawPrint(isetcapTmpNewPath); + StartProcessL(KSetCapExe, commandLine, aStatus); + + } + +void CPolicyTest::WriteScriptFileL(const TDesC& aPath, const TDesC8& aAction) + { + iFs.Delete(aPath); // ignore errors + + RFile file; + User::LeaveIfError(file.Create(iFs, aPath, EFileShareExclusive | EFileWrite)); + CleanupClosePushL(file); + + User::LeaveIfError(file.Write(*iPreActions)); + User::LeaveIfError(file.Write(aAction)); + User::LeaveIfError(file.Write(*iPostActions)); + + CleanupStack::PopAndDestroy(&file); + } + +void CPolicyTest::RunTestL(TRequestStatus& aStatus) + { + + HBufC* hptr16; + hptr16 = CnvUtfConverter::ConvertToUnicodeFromUtf8L(*iNameInfo); + RDebug::Print(KFormat,hptr16); + delete hptr16; + + TDriveUnit sysDrive (RFs::GetSystemDrive()); + TDriveName sysDriveName (sysDrive.Name()); + + TBuf<128> passScriptFile (sysDriveName); + passScriptFile.Append(KPassScriptPath); + + TBuf<128> failScriptFile (sysDriveName); + failScriptFile.Append(KFailScriptPath); + + TPtrC script = (iTestState == ETestPass) ? passScriptFile : failScriptFile; + (iTestState == ETestPass) ? RDebug::RawPrint(KPassTestRunning) : RDebug::RawPrint(KFailTestRunning); + + + TBuf<128> logTmpFile (sysDriveName); + logTmpFile.Append(KLogTmpPath); + iFs.Delete(logTmpFile); // ignore errors + + TBuf<128> commandLine; + commandLine.AppendFormat(_L("%S %S"), &script, &logTmpFile); + + StartProcessL(iTestExeTmpNewPath, commandLine, aStatus); + } + +void CPolicyTest::ProcessResultsL(TRequestStatus& aStatus) + { + _LIT8(KSummaryLine, " tests failed out of "); + _LIT8(KNewLine, "\r\n"); + + TInt failCount = KErrNotFound, runCount; + + // Read entire log file into memory to process + RFile file; + TDriveUnit sysDrive (RFs::GetSystemDrive()); + TBuf<128> logTmpFile (sysDrive.Name()); + logTmpFile.Append(KLogTmpPath); + User::LeaveIfError(file.Open(iFs, logTmpFile, EFileShareReadersOnly | EFileRead)); + CleanupClosePushL(file); + + TInt size; + User::LeaveIfError(file.Size(size)); + HBufC8* buffer = HBufC8::NewLC(size); + TPtr8 ptr = buffer->Des(); + + User::LeaveIfError(file.Read(ptr)); + + iOut.writeString(_L("Child test output:\n")); + + TInt pos = 0; + while (pos < size) + { + TInt nextNewline = buffer->Mid(pos).Find(KNewLine); + + // Split buffer into lines + TPtrC8 line; + if (nextNewline == KErrNotFound) + { + line.Set(buffer->Mid(pos)); + } + else + { + line.Set(buffer->Mid(pos, nextNewline + KNewLine().Length())); + } + pos += line.Length(); + + // Search for summary line + TInt pos2 = line.Find(KSummaryLine); + if (pos2 != KErrNotFound) + { + // Parse the summary line to work out if the test passed + TLex8 lex1(line.Left(pos2)); + TInt err1 = lex1.Val(failCount); + TLex8 lex2(line.Mid(pos2 + KSummaryLine().Length())); + TInt err2 = lex2.Val(runCount); + + if (err1 != KErrNone || err2 != KErrNone) + { + iOut.writeString(_L("Failed to parse summary line\n")); + User::LeaveIfError(err1); + User::LeaveIfError(err2); + } + } + else + { + // Don't print the summary line as this will confuse whatever parsed + // the main log + iOut.writeString(_L("> ")); + iOut.writeString(line); + } + } + + if (failCount == KErrNotFound) + { + iOut.writeString(_L("Couldn't find summary line in test output\n")); + User::Leave(KErrNotFound); + } + iFailCount += failCount; + + // Print results in different format + iOut.write(_L("Tests run: %d\n"), runCount); + iOut.write(_L("Tests failed: %d\n"), failCount); + iOut.writeNewLine(); + + CleanupStack::PopAndDestroy(2, &file); + + TRequestStatus* status = &aStatus; + User::RequestComplete(status, KErrNone); + } + +void CPolicyTest::PerformCancel() + { + // not implemented - need to pass original status object to LogonCancel + User::Invariant(); + /* + switch (iState) + { + case ESetCapsPass: + case ERunTest: + iProcess.LogonCancel(); + iProcess.Kill(KErrCancel); + iProcess.Close(); + break; + } + */ + } + +void CPolicyTest::Reset() + { + iProcess.Close(); + iState = ESetupTest; + iTestState = ETestNone; + iCapIndex = -1; + iFailCount = 0; + } + +void CPolicyTest::DoReportAction() + { + iOut.writeString(_L("Running policy tests...\n\n")); + } + +void CPolicyTest::DoCheckResult(TInt aError) + { + if (aError == KErrNone && iFailCount > 0) + { + iOut.write(_L("%d tests failed\n"), iFailCount); + aError = KErrGeneral; + } + + iResult = (aError == iExpectedResult); + }