graphicstest/graphicstestharness/src/T_RebootTests.cpp
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicstest/graphicstestharness/src/T_RebootTests.cpp	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,339 @@
+// T_RebootTests.cpp
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "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 <e32base.h>
+#include <e32cons.h>
+#include <bacline.h>
+#include <hal.h>
+#include <hal_data.h>
+#include <f32file.h>
+#include <s32file.h>
+#include "T_RebootTests.h"
+
+GLDEF_C TInt E32Main();
+
+const TInt8 KMemoryCardDrive = 0x65; //e
+
+const TInt8 KSystemDrive = 0x63; //c
+
+_LIT(KCurrTestFilePath, "%c:%Scurrtest.txt");
+
+_LIT(KCurrentTestBatPath, "%c:\\thistest.script");
+
+_LIT(KTestScriptList, "z:\\autoexec.txt");
+
+_LIT(KScriptFileFlag, "cd test");
+
+_LIT(KDummyLogFile, "z:\\reboot\\dummylog.htm");
+
+_LIT(KRebootTestsPanic, "REBOOTTEST");
+
+const TInt KPathBufLen = 36;
+
+//Global variables to contain formatted paths for file locations.
+TBuf<KPathBufLen> KCurrTestFile;
+TBuf<KPathBufLen> KCurrentTestBat;
+
+CTRebootTestHelper::CTRebootTestHelper()
+	{
+	}
+
+CTRebootTestHelper::~CTRebootTestHelper()
+	{
+	iFs.Close();
+	}
+
+CTRebootTestHelper* CTRebootTestHelper::NewLC()
+	{
+	CTRebootTestHelper* self = new(ELeave) CTRebootTestHelper();
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	return self;
+	}
+
+void CTRebootTestHelper::ConstructL()
+	{
+	User::LeaveIfError(iFs.Connect());
+	}
+
+/**
+ Generate a command script to run the specified test from the test script list.
+ 
+ @param aFileIn The source script file
+ @param aFileOut The target batch file
+ @param aPos The test case from the source file to be placed in the destination
+ 
+ @leave One of the system wide error codes
+ */
+void CTRebootTestHelper::BuildCommandScriptL(const TDesC& aFileIn, const TDesC& aFileOut, TInt aTestCase)
+	{
+	aTestCase = aTestCase+2;
+	RFile f;
+	User::LeaveIfError(f.Open(iFs, aFileIn, EFileRead));
+	CleanupClosePushL(f);
+	RFileReadStream frs;
+	CleanupClosePushL(frs);
+	frs.Attach(f);
+	
+	TInt err = KErrNone;
+	TBuf<256> thisLine;
+	
+	TInt offset = -1; //Flag = 0, Init Script = 1, first script = 2
+	
+	TChar thisChar = ' ';
+
+	while (err == KErrNone)
+		{
+		TRAP(err, thisChar = (TChar) frs.ReadInt8L());
+		
+		if ( (thisChar != '\n') && (thisChar != '\r') )
+			thisLine.Append(thisChar);
+		
+		//This line is complete
+		if (thisChar == '\n')
+			{
+			
+			if ( (offset == -1) && (thisLine.CompareF(KScriptFileFlag) == 0) )
+				{
+				offset++;
+				}
+			
+			if (offset >= 0)
+				{
+				offset++;
+				}
+			
+			if (offset == aTestCase)
+				{
+				RDebug::Printf("The next test script to be run will be...");
+				RDebug::RawPrint(thisLine);
+				break;
+				}
+			thisLine.Delete(0, thisLine.Length());
+			}
+		}	
+
+	RFile fo;
+	TInt ret = fo.Replace(iFs, aFileOut, EFileWrite);
+	if (ret != KErrNone)
+			ret = fo.Open(iFs, aFileOut, EFileWrite);
+	
+	User::LeaveIfError(ret);
+	
+	TFileText fto;
+	fto.Set(fo);
+	//Add the TEF command to execute the test correctly
+	thisLine.Insert(0,_L("RUN_PROGRAM -1 "));
+	fo.Write(0, thisLine.Collapse(), thisLine.Length());
+	
+	CleanupStack::PopAndDestroy(2, &f);
+	}
+/**
+ Retrieve the previous test run on the previous boot.
+ 
+ @param aFile The full path of the file containing the test count
+ @param aValue The current test being run (-1 if none have been).
+ 
+ @return TInt8 The previous test cases index
+ */
+TInt8 CTRebootTestHelper::FindLastTestL(const TDesC& aFile)
+	{
+	RFileReadStream fr;
+	CleanupClosePushL(fr);
+	
+	TInt8 currtest = -1;
+
+	if (fr.Open(iFs, aFile, EFileRead) == KErrNone)
+		{
+		currtest = fr.ReadInt8L();
+		RDebug::Printf("Restart Test Manager >> Retrieved %i from file", currtest);
+		}
+	else
+		{
+		RDebug::Printf("Restart Test Manager >> Beginning Tests");
+		}
+
+	CleanupStack::PopAndDestroy(&fr);
+	
+  return currtest;
+	}
+/**
+Update the file containing the current test being run.
+
+@param aFile The full path of the file containing the test count
+@param aValue The value to be written to the file.
+ */
+void CTRebootTestHelper::WriteTestOutL(const TDesC& aFile, TInt8 aValue)
+	{
+	RFileWriteStream fw;
+	CleanupClosePushL(fw);
+	
+	if (fw.Replace(iFs, aFile, EFileWrite) != KErrNone)
+		{
+		User::LeaveIfError(fw.Create(iFs, aFile, EFileWrite));
+		}
+	
+	fw.WriteInt8L(aValue);
+	RDebug::Printf("Wrote %i to file", aValue);
+	fw.CommitL();
+	CleanupStack::PopAndDestroy(&fw);
+	
+	}
+
+/**
+The rebooting harness prevents the script that initiates it from displaying
+any results in DABS; this function generates this file so that "No Tests To Run"
+is displayed in the ONB logs. The initiating script should not run any test code
+that results are expected from.
+
+@param aScriptName The name of the script file minus its file extension.
+@param aLogFile The file containing the dummy log file. All instances of <!LOGFILE!> will be replaced with aScriptName
+*/
+void CTRebootTestHelper::WriteDummyLogFileL(const TDesC& aScriptName, const TDesC& aLogFile)
+    {
+    RFile f;
+    User::LeaveIfError(f.Open(iFs, aLogFile, EFileRead));
+    CleanupClosePushL(f);
+    RFileReadStream frs;
+    CleanupClosePushL(frs);
+    frs.Attach(f);
+    
+    TInt err = KErrNone;
+    TBuf<256> thisLine;
+    TChar thisChar = ' ';
+
+    while (err == KErrNone)
+        {
+        TRAP(err, thisChar = (TChar) frs.ReadInt8L());
+        
+        if (err == KErrNone)
+            {
+            thisLine.Append(thisChar);
+            
+            if (thisLine.Length() > 1)
+                {
+                //Replace occurrences of %S with aScriptName
+                if (thisLine.Right(2).Compare(_L("%S")) == 0)
+                    {
+                    thisLine.Delete(thisLine.Length()-2, 2);
+                    thisLine.Append(aScriptName);
+                    thisLine.Append(_L(".htm"));
+                    }
+                }
+            
+            if (thisChar == '\n')
+                {
+                RDebug::RawPrint(thisLine);
+                thisLine.Delete(0, thisLine.Length());
+                }
+            }
+        }   
+
+    CleanupStack::PopAndDestroy(2, &f);
+
+    }
+
+/**
+Runs the rebooting test harness. Not providing any command line parameters will set up
+the test runs; or execute the next test depening on the availability of the test data files.
+Passing restart as the parameter will force a reboot. 
+ */
+LOCAL_C void MainL()
+	{
+	
+	CCommandLineArguments* args = CCommandLineArguments::NewLC();
+	CTRebootTestHelper* testHelper = CTRebootTestHelper::NewLC();
+
+	//private path length (includes slashes)
+	TBuf<21> privPath;
+	testHelper->iFs.PrivatePath(privPath);
+	
+	KCurrTestFile.Format(KCurrTestFilePath, KMemoryCardDrive, &privPath);
+	KCurrentTestBat.Format(KCurrentTestBatPath, KSystemDrive);
+	
+	if ((args->Count() == 2) && (args->Arg(1).CompareF(_L("r")) != 0))
+		{
+		TRAPD(dirErr,testHelper->iFs.MkDirAll(KCurrTestFile));
+		
+		if (dirErr != KErrAlreadyExists)
+			{
+			User::LeaveIfError(dirErr);
+			}
+		
+		//Retrieve the previous test from the configuation file.
+		TInt8 testCase = testHelper->FindLastTestL(KCurrTestFile);
+
+		if (testCase == -1)
+			{
+			//If there was no configuration file set the test to be the first one
+			testCase = 1;
+			}
+
+		//Write out the dummy log file for DABS
+		testHelper->WriteDummyLogFileL(args->Arg(1), KDummyLogFile);
+		
+		//Construct the TEF script to run the current test case.
+		testHelper->BuildCommandScriptL(KTestScriptList, KCurrentTestBat, testCase);
+		
+		//Write out the current state to MMC
+		testCase++;
+		testHelper->WriteTestOutL(KCurrTestFile, testCase);
+
+		
+		}
+	else if (args->Count() == 2)
+		{
+		//If the app is run with restart in the command line then force a reboot
+		if (args->Arg(1).CompareF(_L("r"))==0)
+			{
+			RDebug::Printf("Restart Test Manager >> Batch File Requested Restart");
+			testHelper->iFs.Delete(KCurrentTestBat);
+			HAL::Set(HALData::ECustomRestart, 25);
+			}
+		}
+	CleanupStack::PopAndDestroy(2,args); 
+	}
+
+LOCAL_C void DoStartL()
+	{
+	CActiveScheduler* scheduler = new (ELeave) CActiveScheduler();
+	CleanupStack::PushL(scheduler);
+	CActiveScheduler::Install(scheduler);
+	TRAPD(ret, MainL());
+	
+	//If a leave has occurred then prevent the tests from continuing
+	if (ret != KErrNone)
+		{
+		RDebug::Printf("Restart Test Manager >> About to panic; MainL exited with error %i", ret);
+		User::SetCritical(User::ESystemCritical);
+		User::Panic(KRebootTestsPanic, 0);
+		}
+
+	CleanupStack::PopAndDestroy(scheduler);
+	}
+
+
+GLDEF_C TInt E32Main()
+	{
+	__UHEAP_MARK;
+	CTrapCleanup* cleanup = CTrapCleanup::New();
+	TRAPD(mainError, DoStartL());
+	if (mainError)
+		RDebug::Printf("Restart Test Manager >> Error %i", mainError);
+	delete cleanup;
+	__UHEAP_MARKEND;
+	return KErrNone;
+	}
+