os/ossrv/genericservices/taskscheduler/Test/PlatSec/platsectaskhandler.cpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
     1 // Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
     2 // All rights reserved.
     3 // This component and the accompanying materials are made available
     4 // under the terms of "Eclipse Public License v1.0"
     5 // which accompanies this distribution, and is available
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
     7 //
     8 // Initial Contributors:
     9 // Nokia Corporation - initial contribution.
    10 //
    11 // Contributors:
    12 //
    13 // Description:
    14 //
    15 
    16 #include <schinfo.h>
    17 #include <schinfointernal.h>
    18 #include <schtask.h>
    19 #include <s32file.h>
    20 #include <e32math.h>
    21 #include <e32cons.h>
    22 #include <e32test.h>
    23 
    24 #include "platsectaskcommon.h"
    25 
    26 
    27 // Constants
    28 _LIT(KConsoleName, "PlatSecTaskHandler");
    29 
    30 static void SignalTestExe()
    31 	{
    32 	_LIT(KSchSemaphoreName, "SCHMinimalTaskHandler");
    33 	RSemaphore sem;
    34 	TInt ret = sem.OpenGlobal(KSchSemaphoreName);
    35 	if (ret == KErrNone)
    36 		{
    37 		sem.Signal();
    38 		sem.Close();
    39 		}
    40 	}
    41 
    42 //***********************************************************************************
    43 LOCAL_C TInt GetRandomNumber(const TInt aLow, const TInt aHigh, TInt64& aSeed)
    44 	{
    45 	TReal initialRand = (Math::FRand(aSeed) * (aHigh - aLow));
    46 	TInt32 rand;
    47 
    48 	// Round to 0 decimal places, ie. the nearest whole numer
    49 	Math::Round(initialRand, initialRand, 0);
    50 	Math::Int(rand, initialRand);
    51 
    52 	return (aLow + rand);
    53 	}
    54 
    55 //***********************************************************************************
    56 LOCAL_C void DestroyArray(TAny* aArray)
    57 	{
    58 	static_cast<RArray<TCapability>*>(aArray)->Reset();
    59 	}
    60 /**
    61 @SYMTestCaseID          SYSLIB-SCHSVR-CT-1345
    62 @SYMTestCaseDesc	    Platform security Task handler test 
    63 @SYMTestPriority 	    High
    64 @SYMTestActions  	    Attempt to test the contents of a task file.
    65 @SYMTestExpectedResults Test must not fail
    66 @SYMREQ                 REQ0000
    67 */				
    68 LOCAL_C void ConstructConsoleL(RFile& aTaskFile, RTest& aTest)
    69 	{
    70 	
    71 	CConsoleBase* console=Console::NewL(KConsoleName, TSize(KConsFullScreen, KConsFullScreen));
    72 	CleanupStack::PushL(console);
    73 	console->Printf(_L(" contents of task file\n"));
    74 
    75 	RArray<TCapability> enforcedCaps;
    76 	CleanupStack::PushL(TCleanupItem(&DestroyArray,&enforcedCaps));
    77 
    78 	for (TInt i=0; i<ECapability_Limit; i++)
    79 		{
    80 		// we're checking here to see which capabilities are enforced, skipping
    81 		// ECapabilityMultimediaDD and ECapabilityWriteDeviceData as it is
    82 		// needed to write persistent schedules upon which this test relies.
    83 		
    84 		if (i == KPlatSecTestCapability)
    85 			continue;
    86 		else if (i == ECapabilityWriteDeviceData)
    87 			continue;
    88 		else if (PlatSec::IsCapabilityEnforced((TCapability)i))
    89 			enforcedCaps.Append((TCapability)i);
    90 		}
    91 	
    92 	TBool isTestCapabilityEnforced = PlatSec::IsCapabilityEnforced(KPlatSecTestCapability);
    93 	
    94 	CFileStore* store;
    95 	store = CDirectFileStore::FromLC(aTaskFile);
    96 
    97 	RStoreReadStream instream;
    98 	instream.OpenLC(*store,store->Root());
    99 	
   100 	TInt count = instream.ReadInt32L();
   101 	for (TInt i=0;i<count;i++)
   102 		{
   103 		CScheduledTask* task = CScheduledTask::NewLC(instream);
   104 		
   105 		aTest(task->Info().iName.CompareF(KPlatSecTaskName)==0);
   106 		aTest(task->Data().CompareF(KPlatSecTaskData)==0);
   107 		aTest(task->SecurityInfo().iSecureId==KPlatSecTestSid); //This is the SID of tschsvrplatsec
   108 
   109 		// check that client has capability it should have
   110 		if(isTestCapabilityEnforced)
   111 			aTest(task->SecurityInfo().iCaps.HasCapability(KPlatSecTestCapability));
   112 		
   113 		// check that the client has ECapabilityWriteDeviceData
   114 		aTest(task->SecurityInfo().iCaps.HasCapability(ECapabilityWriteDeviceData));
   115 		
   116 		// check that client doesn't have any other capabilities
   117 		for (TInt j=enforcedCaps.Count()-1; j>=0; --j)
   118 			{
   119 			aTest(!task->SecurityInfo().iCaps.HasCapability(enforcedCaps[j]));
   120 			}
   121 			
   122 		
   123 		CleanupStack::PopAndDestroy(task);
   124 		}
   125 		
   126 	console->Printf(_L("Pausing for a one second..."));
   127 	User::After(1000000);
   128 	
   129 	CleanupStack::PopAndDestroy(4); // instream, store, enforcedCaps, console
   130 	}
   131 
   132 
   133 //***********************************************************************************
   134 LOCAL_C TInt Execute()
   135 	{
   136 	TInt err = KErrNoMemory;
   137 	CTrapCleanup* cleanup=CTrapCleanup::New();	//can fail
   138 	if (cleanup)
   139 		{
   140 		_LIT(KPlatSecTestName, "PlatSectTaskHandlerTest");
   141 		RTest theTest(KPlatSecTestName);
   142 		theTest.Start(KPlatSecTestName);
   143 		theTest.Title();
   144 
   145 		RFile file;
   146 
   147 		// Adopt the task file from the Task Scheduler
   148 		err = file.AdoptFromCreator(TScheduledTaskFile::FsHandleIndex(),
   149 									TScheduledTaskFile::FileHandleIndex());
   150 		if (err != KErrNone)
   151 			return err;
   152 		
   153 		// The aParam is the name of a file where the relevant CTaskExCmdLine is
   154 		// do the executing 
   155 		theTest.Next(_L(" @SYMTestCaseID:SYSLIB-SCHSVR-CT-1345 "));
   156 		TRAPD(err, ConstructConsoleL(file, theTest));
   157 		if(err == KErrNone)
   158 			{
   159 			// Sometimes we want to return a bogus error value, 
   160 			// sometimes we don't.
   161 			TTime now;
   162 			now.HomeTime();
   163 			TInt64 seed = now.Int64();
   164 			err = GetRandomNumber(-50, 200, seed); //20% chance of error being returned
   165 			}
   166 		
   167 		file.Close();// Close the file
   168 		
   169 		theTest.End();
   170 		theTest.Close();
   171 				
   172 		delete cleanup;
   173 		}
   174 	SignalTestExe();		
   175 	return err;
   176 	}
   177 
   178 
   179 //***********************************************************************************
   180 GLDEF_C TInt E32Main()
   181 	{
   182 	return Execute();
   183 	}