dbgsrv/coredumpserver/test/automatictests/tcds_kernel/src/cds/t_coredumpserver.cpp
changeset 0 c6b0df440bee
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dbgsrv/coredumpserver/test/automatictests/tcds_kernel/src/cds/t_coredumpserver.cpp	Tue Mar 02 10:33:16 2010 +0530
@@ -0,0 +1,347 @@
+// Copyright (c) 2008-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:
+//
+
+/**
+ @file
+ @internalTechnology
+*/
+
+#include "t_coredumpserver.h"
+#include "flashdatasource.h"
+
+//Names of functions to be tested - referenced from script file
+_LIT(KDataViaDataSource, "DataViaDataSource");
+_LIT(KTraceViaDataSource, "TraceViaDataSource");
+_LIT(KUntrustedAccess, "UntrustedDataAccess");
+/**
+ * Constructor for test wrapper
+ */
+CCoreDumpServerWrapper::CCoreDumpServerWrapper()
+	{
+	}
+
+/**
+ * Destructor
+ */
+CCoreDumpServerWrapper::~CCoreDumpServerWrapper()
+	{
+	iCoreDumpSession.Close();
+	iSecSess.Close();
+	}
+
+/**
+ * Two phase constructor for CCoreDumpServerWrapper
+ * @return CProcessCrashWrapper object
+ * @leave
+ */
+CCoreDumpServerWrapper* CCoreDumpServerWrapper::NewL()
+	{
+	CCoreDumpServerWrapper* ret = new (ELeave) CCoreDumpServerWrapper();
+	CleanupStack::PushL(ret);
+	ret->ConstructL();
+	CleanupStack::Pop(ret);
+	return ret;
+	}
+
+/**
+ * Safe construction
+ * @leave
+ */
+void CCoreDumpServerWrapper::ConstructL()
+	{
+	User::LeaveIfError(iCoreDumpSession.Connect());
+
+	TVersion secVers(Debug::KDebugServMajorVersionNumber, Debug::KDebugServMinorVersionNumber, Debug::KDebugServPatchVersionNumber);
+	User::LeaveIfError(iSecSess.Connect(secVers));
+	}
+
+/**
+ * Assign the object
+ * @param aObject TAny* to the object to test
+ * @leave
+ */
+void CCoreDumpServerWrapper::SetObjectL(TAny* aObject)
+	{}
+
+/**
+ * Runs a test preamble
+ */
+void CCoreDumpServerWrapper::PrepareTestL()
+	{
+	SetBlockResult(EPass);
+	INFO_PRINTF1(_L("CCoreDumpMonitorWrapper::Ready to start test"));
+	}
+
+/**
+ * Handle a command invoked from the script
+ * @param aCommand Is the name of the command for a TBuf
+ * @param aSection Is the .ini file section where parameters to the command are located
+ * @param aAsyncErrorIndex Is used by the TEF Block framework to handle asynchronous commands.
+ */
+TBool CCoreDumpServerWrapper::DoCommandL(const TTEFFunction& aCommand, const TTEFSectionName& aSection, const TInt aAsyncErrorIndex)
+	{
+	//__UHEAP_MARK;
+
+	PrepareTestL();
+
+	if (KDataViaDataSource() == aCommand)
+		{
+		TestDataSourceReturnsSystemCrashDataL();
+		}
+	else if(KTraceViaDataSource() == aCommand)
+		{
+		TestDataSourceReturnsTraceDataL();
+		}
+	else if(KUntrustedAccess() == aCommand)
+		{
+		TestUntrustedServerAccessL();
+		}
+	else
+		{
+		return EFalse;
+		}
+
+	//__UHEAP_MARKEND;
+
+	return ETrue;
+	}
+
+/**
+ * This makes sure a formatter can retrieve data via the flash data source
+ */
+void CCoreDumpServerWrapper::TestDataSourceReturnsSystemCrashDataL()
+	{
+	INFO_PRINTF1(_L("TestDataSourceReturnsSystemCrashData"));
+
+	//Load Test Formatter
+	CFlashDataSource* src = CFlashDataSource::NewL(iSecSess);
+	CleanupStack::PushL(src);
+
+	RCrashInfoPointerList* crashList = new(ELeave)RCrashInfoPointerList;
+	TCleanupItem listCleanup(CCoreDumpServerWrapper::CleanupCrashList, (TAny*)crashList);
+	CleanupStack::PushL(listCleanup);
+
+	//Get the crashes from the flash partition
+	iCoreDumpSession.ListCrashesInFlashL(*crashList);
+
+	if(crashList->Count() == 0)
+		{
+		ERR_PRINTF1(_L("Failed to find any crashes in the flash that we could check out"));
+		SetBlockResult(EFail);
+		CleanupStack::PopAndDestroy(2);
+		return;
+		}
+
+	INFO_PRINTF2(_L("Found [%d] crash(es) on the partition"), crashList->Count());
+
+	INFO_PRINTF1(_L("Analysing crash 0"));
+	src->AnalyseCrashL(((*crashList)[0])->iCrashId);
+
+	INFO_PRINTF1(_L("Analysis successful"));
+
+	//Now we try and read back the core header via the flash data source
+	const TCrashInfoHeader& header = src->GetCrashHeader();
+
+	//There isn't much checking we can do here as a lot of the things are determinable.
+	//Its only a smoke test anyway to make sure the data source is functioning
+	INFO_PRINTF1(_L("Checking the process ID that crashed was 1"));
+	if(header.iPid != 0x1)
+		{
+		ERR_PRINTF1(_L("Failed to retrieve proper crashed process ID"));
+		SetBlockResult(EFail);
+		CleanupStack::PopAndDestroy(2);
+		return;
+		}
+
+	INFO_PRINTF1(_L("Checking a valid crashed process ID"));
+	if(header.iTid <= 0x1)
+		{
+		ERR_PRINTF1(_L("Failed to retrieve proper crashed process ID"));
+		SetBlockResult(EFail);
+		CleanupStack::PopAndDestroy(2);
+		return;
+		}
+
+	const TRmdArmExcInfo registers = src->GetCrashContext();
+
+	const TUint32 cpsr = registers.iCpsr;
+
+	INFO_PRINTF1(_L("Checking a valid CPSR and were in SVR mode when we crashed"));
+	if(KCPSRUsrMode == (cpsr & 0x1F))
+		{
+		ERR_PRINTF2(_L("CPSR = 0x%X    --> Not in SVR mode"), cpsr);
+		SetBlockResult(EFail);
+		CleanupStack::PopAndDestroy(2);
+		return;
+		}
+	
+	//Now, erase the partition
+
+	TRAPD(err, iCoreDumpSession.DeleteCrashPartitionL());
+	if(KErrNone != err)
+		{
+		RDebug::Printf("\ndeleteing failed with %d", err);
+		}
+
+	INFO_PRINTF1(_L("Negative test. Testing flash data source does as expected when there is no data in partition"));
+
+	TRAP(err, src->AnalyseCrashL(0));
+	if(KErrNone == err)
+		{
+		ERR_PRINTF1(_L("Were able to analyse a non existant crash with KErrNone"));
+		SetBlockResult(EFail);
+		CleanupStack::PopAndDestroy(2);
+		return;
+		}
+
+	INFO_PRINTF2(_L("Analysis gave %d as expected"), err);
+
+	CleanupStack::PopAndDestroy(2);
+	}
+
+/**
+ * Testing we can retrieve trace data when it is present
+ */
+void CCoreDumpServerWrapper::TestDataSourceReturnsTraceDataL()
+	{
+	INFO_PRINTF1(_L("TestDataSourceReturnsTraceDataL"));
+
+	//Load Test Formatter
+	CFlashDataSource* src = CFlashDataSource::NewL(iSecSess);
+	CleanupStack::PushL(src);
+
+	RCrashInfoPointerList* crashList = new(ELeave)RCrashInfoPointerList;
+	TCleanupItem listCleanup(CCoreDumpServerWrapper::CleanupCrashList, (TAny*)crashList);
+	CleanupStack::PushL(listCleanup);
+
+	//Get the crashes from the flash partition
+	iCoreDumpSession.ListCrashesInFlashL(*crashList);
+
+	if(crashList->Count() == 0)
+		{
+		ERR_PRINTF1(_L("Failed to find any crashes in the flash that we could check out"));
+		SetBlockResult(EFail);
+		CleanupStack::PopAndDestroy(2);
+		return;
+		}
+
+	INFO_PRINTF2(_L("Found [%d] crash(es) on the partition"), crashList->Count());
+
+	INFO_PRINTF1(_L("Analysing crash 0"));
+	src->AnalyseCrashL(((*crashList)[0])->iCrashId);
+
+	INFO_PRINTF1(_L("Analysis successful"));
+
+	TUint sizeToRead = 0x100;
+	RBuf8 traceData;
+	traceData.CreateL(sizeToRead);
+	traceData.CleanupClosePushL();
+
+	INFO_PRINTF1(_L("Reading the trace buffer"));
+
+	TRAPD(err, src->ReadTraceBufferL(traceData));
+	if(err != KErrNone)
+		{
+		ERR_PRINTF1(_L("Failed to get trace data"));
+		SetBlockResult(EFail);
+		CleanupStack::PopAndDestroy(3);
+		return;
+		}
+
+	INFO_PRINTF1(_L("Making sure the trace data is correct"));
+
+	//Can't analyse this data, just make sure its there
+	if(sizeToRead != traceData.Length())
+		{
+		ERR_PRINTF1(_L("Didnt read all the trace data there"));
+		SetBlockResult(EFail);
+		CleanupStack::PopAndDestroy(3);
+		return;
+		}
+
+	INFO_PRINTF1(_L("Trying to read with a zero sized buffer"));
+
+	//See what happens when we put in a zero size buffer
+	RBuf8 buf;
+	buf.CreateL(0);
+	buf.CleanupClosePushL();
+
+	TRAP(err, src->ReadTraceBufferL(buf));
+	if(err != KErrNone)
+		{
+		ERR_PRINTF1(_L("Failed to get trace data with a zero size buffer"));
+		SetBlockResult(EFail);
+		CleanupStack::PopAndDestroy(4);
+		return;
+		}
+
+	CleanupStack::PopAndDestroy(4);
+	}
+
+/**
+ * This tests that untrusted clients cannot do things with the CDS that they shouldnt
+ */
+void CCoreDumpServerWrapper::TestUntrustedServerAccessL()
+	{
+	INFO_PRINTF1(_L("TestUntrustedServerAccessL"));
+
+	INFO_PRINTF1(_L("Testing we can't list crashes from the flash partition"));
+
+	RCrashInfoPointerList* crashList = new(ELeave)RCrashInfoPointerList;
+	TRAPD(err, iCoreDumpSession.ListCrashesInFlashL(*crashList));
+	if(err != KErrPermissionDenied)
+		{
+		delete crashList;
+		ERR_PRINTF1(_L("Allowed to List crashes - shouldnt be. Are you sure the CDS token isn't in the ROM or on the device?"));
+		SetBlockResult(EFail);
+		return;
+		}
+
+	delete crashList;
+
+	INFO_PRINTF1(_L("Testing we can't delete the flash partition"));
+	TRAP(err, iCoreDumpSession.DeleteCrashPartitionL());
+	if(err != KErrPermissionDenied)
+		{
+		ERR_PRINTF1(_L("Allowed to delete flash partition - shouldnt be. Are you sure the CDS token isn't in the ROM or on the device?"));
+		SetBlockResult(EFail);
+		return;
+		}
+
+	INFO_PRINTF1(_L("Testing we can't process crash logs"));
+	TRAP(err, iCoreDumpSession.ProcessCrashLogL(0));
+	if(err != KErrPermissionDenied)
+		{
+		ERR_PRINTF2(_L("Allowed to process crash logs (%d) - shouldn't be. Are you sure the CDS token isn't in the ROM or on the device?"), err);
+		SetBlockResult(EFail);
+		return;
+		}
+
+	INFO_PRINTF1(_L("All is good. Move along, nothing to see here"));
+	}
+
+/**
+ * Cleanup item implementation for RCrashInfoPointerList
+ * @param aArray pointer to the list that is supposed to be freed
+*/
+void CCoreDumpServerWrapper::CleanupCrashList(TAny *aArray)
+	{
+	RCrashInfoPointerList* crashList = static_cast<RCrashInfoPointerList*> (aArray);
+	crashList->ResetAndDestroy();
+	crashList->Close();
+	delete crashList;
+	}
+
+//eof