kerneltest/e32test/rm_debug/t_rmdebug.cpp
author Tom Cosgrove <tom.cosgrove@nokia.com>
Fri, 28 May 2010 16:29:07 +0100
changeset 30 8aab599e3476
parent 0 a41df078684a
permissions -rw-r--r--
Fix for bug 2283 (RVCT 4.0 support is missing from PDK 3.0.h) Have multiple extension sections in the bld.inf, one for each version of the compiler. The RVCT version building the tools will build the runtime libraries for its version, but make sure we extract all the other versions from zip archives. Also add the archive for RVCT4.

// Copyright (c) 2006-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:
// Tests the functionality of the run mode debug device driver.
// 
//

#include <e32base.h>
#include <e32base_private.h>
#include <e32cons.h>
#include <e32test.h>
#include <e32ldr.h>
#include <f32dbg.h>
#include "d_rmdebugclient.h"
#include "d_rmdebugthread.h"
#include "t_rmdebug.h"

IMPORT_C TInt StartDebugThread(RThread& aServerThread);
IMPORT_D extern TInt TestData;
IMPORT_D extern TBuf8<SYMBIAN_RMDBG_MEMORYSIZE> gMemoryAccessBytes;

LOCAL_D RTest test(_L("T_RMDEBUG"));

CRunModeAgent::CRunModeAgent()
//
// CRunModeAgent constructor
//
	{
	}

CRunModeAgent* CRunModeAgent::NewL()
//
// CRunModeAgent::NewL
//
	{
	CRunModeAgent* self = new(ELeave) CRunModeAgent();

  	self->ConstructL();

   if (self->iState != ERunModeAgentRunning)
       {
       delete self;
       self = NULL;
       }       
	return self;
	}

CRunModeAgent::~CRunModeAgent()
//
// CRunModeAgent destructor
//
	{
	iServSession.Close();
	iDebugThread.Close();
   iState = ERunModeAgentUnInit;
	}

void CRunModeAgent::ConstructL()
//
// CRunModeAgent::ConstructL
//
	{
	TInt err;
	err = StartDebugThread(iDebugThread);

	if (err == KErrNone)
		{
		if (iServSession.Open() == KErrNone)
           {
           iState = ERunModeAgentRunning;
           }
       else
           {
           iState = ERunModeAgentUnInit;
           }
		}
	else
		{
		User::Panic(_L("Can't start debug thread"), err);
		}
}



CRunModeAgent *RunModeAgent;

// Test process names
_LIT(ProcessName1,"T_RMDEBUG");
_LIT(ProcessName1a,"t_rmdebug");
//_LIT(ProcessName2,"ekern");
//_LIT(ProcessName3,"efile");
_LIT(KWildCard,"*");


//---------------------------------------------
//! @SYMTestCaseID KBase-0185
//! @SYMTestType 
//! @SYMPREQ PREQ1426
//! @SYMTestCaseDesc Test reading process list
//! @SYMTestActions Several calls to read the process list
//! @SYMTestExpectedResults KErrNone and the owning process ID set
//! @SYMTestPriority High
//! @SYMTestStatus Implemented
//---------------------------------------------
void CRunModeAgent::TestProcessList()
	{
	TInt    err=KErrNone;
	TBool	found = FALSE;

	test.Next(_L("TestProcessList - Read Process List\n"));

	TFindProcess find(KWildCard);
	TFullName name;
	while(find.Next(name)==KErrNone)
		{
		RProcess process;
		err = process.Open(find);
		if (err == KErrNone)
			{
			if ((name.Find(ProcessName1) != KErrNotFound) ||
				(name.Find(ProcessName1a) != KErrNotFound))
				{				
					iProcessID = process.Id();
					found = TRUE;				
				}
			process.Close();				
			}
	   }   
	test(found== TRUE);   
	}

// Test thread name
_LIT(ThreadName1,"DebugThread");

//---------------------------------------------
//! @SYMTestCaseID KBase-0186
//! @SYMTestType 
//! @SYMPREQ PREQ1426
//! @SYMTestCaseDesc Test reading thread list
//! @SYMTestActions Several calls to read the thread list
//! @SYMTestExpectedResults KErrNone and the debug thread ID set
//! @SYMTestPriority High
//! @SYMTestStatus Implemented
//---------------------------------------------
void CRunModeAgent::TestThreadList()
	{
	TInt        err=KErrNone;
	TBool       found = FALSE;

	test.Next(_L("TestThreadList - Read Thread List\n"));

   	TFindThread find(KWildCard);
	TFullName name;
	while(find.Next(name)==KErrNone)
		{
		RThread thread;
		err = thread.Open(find);
       	if (err == KErrNone)
			{
			RProcess process;
			thread.Process(process);
			if (((TUint32)process.Id() == iProcessID) &&
				(name.Find(ThreadName1) != KErrNotFound))
				{
				found = TRUE;           
				iThreadID = thread.Id();
				}
			}
			thread.Close();
   		}   

	test(found==TRUE);   
	}

   
//---------------------------------------------
//! @SYMTestCaseID KBase-0187
//! @SYMTestType 
//! @SYMPREQ PREQ1426
//! @SYMTestCaseDesc Test reading and writing thread memory
//! @SYMTestActions Several call to read and write blocks of thread memory
//! @SYMTestExpectedResults KErrNone
//! @SYMTestPriority High
//! @SYMTestStatus Implemented
//---------------------------------------------
void CRunModeAgent::TestMemoryAccess()
{
	TInt err=KErrNone;
	TMemoryInfo MemoryInfo;
	TInt i;

	test.Next(_L("TestMemoryAccess - Read Memory\n"));     

	for (i = 0; i < SYMBIAN_RMDBG_MEMORYSIZE; i++)
		{
		gMemoryAccessBytes.Append(i);
		}

	MemoryInfo.iAddress = (TUint32)(&gMemoryAccessBytes[0]);
	MemoryInfo.iSize = SYMBIAN_RMDBG_MEMORYSIZE;

	HBufC8 *data = HBufC8::NewLC(SYMBIAN_RMDBG_MEMORYSIZE);
	TPtr8 ptr_memread(data->Des());   
	MemoryInfo.iDataPtr = &ptr_memread;

//	test.Printf(_L("Read address = 0x%x Read size = 0x%x\n"),MemoryInfo.iAddress,MemoryInfo.iSize);

	err = iServSession.ReadMemory(iThreadID, &MemoryInfo);

	for (i = 0; i < MemoryInfo.iSize; i++)
		{
		if (ptr_memread.Ptr()[i] != gMemoryAccessBytes[i])
			{
			err = KErrCorrupt;       		
			}
		}


	// Test out writing memory.   
	test.Next(_L("TestMemoryAccess - Write Memory\n"));
//	test.Printf(_L("Write address = 0x%x Write size = 0x%x\n"),MemoryInfo.iAddress,MemoryInfo.iSize);
	if (err== KErrNone)
		{
		// Now reset the buffer
		for (i = 0; i < SYMBIAN_RMDBG_MEMORYSIZE; i++)
			{
			gMemoryAccessBytes[i] = 0;
			}      

		// Write our data into the buffer
		err = iServSession.WriteMemory(iThreadID, &MemoryInfo);

		for (i = 0; i < MemoryInfo.iSize; i++)
			{
			if (ptr_memread.Ptr()[i] != gMemoryAccessBytes[i])
				{
				err = KErrCorrupt;       		
				}
			}

		}

	if (gMemoryAccessBytes[5] == 0)
		{
		err = KErrCorrupt;
		}

	CleanupStack::PopAndDestroy(data);       
	test(err==KErrNone);   
	}


//---------------------------------------------
//! @SYMTestCaseID KBase-0188
//! @SYMTestType 
//! @SYMPREQ PREQ1426
//! @SYMTestCaseDesc Test suspending and resuming a task
//! @SYMTestActions Suspends a thread checks the contents of a variable then waits and tests it hasnt changed
//! @SYMTestExpectedResults KErrNone
//! @SYMTestPriority High
//! @SYMTestStatus Implemented
//---------------------------------------------
void CRunModeAgent::TestSuspendResume()
	{
	TInt err;

	test.Next(_L("TestSuspendResume - Suspend\n"));
	// Suspend the thread
	err = iServSession.SuspendThread(iThreadID);
	test(err==KErrNone);
	TInt localtestdata;
	localtestdata = TestData;

	// Wait 3 seconds (suspends this thread) and hopefully resumes the
	// thread we are controlling via the iServSession.SuspendThread request
	User::After(3000000);

	// Now check data hasnt changed
	test(localtestdata==TestData);

	// Resume the thread
	test.Next(_L("TestSuspendResume - Resume\n"));
	err = iServSession.ResumeThread(iThreadID);
	test(err==KErrNone);

	// Wait 3 seconds (suspends this thread) and hopefully resumes the
	// thread we are controlling via the iServSession.SuspendThread request
	User::After(3000000);

	// Now check that the thread being controlled has resumed and is
	// updating the variable
	test(localtestdata!=TestData);
	}
   
void CRunModeAgent::ClientAppL()
//
// Performs each test in turn
//
	{
	test.Start(_L("ClientAppL"));

	TestProcessList();
	TestThreadList();
	TestMemoryAccess();
	TestSuspendResume();
	test.End();   
	}

GLDEF_C TInt E32Main()
//
// Entry point for run mode debug driver test
//
	{
   TInt ret = KErrNone;
   
	// client
	CTrapCleanup* trap = CTrapCleanup::New();
	if (!trap)
		return KErrNoMemory;

   RunModeAgent = CRunModeAgent::NewL();
   if (RunModeAgent != NULL)
       {
   	test.Title();

        __UHEAP_MARK;
	    TRAPD(r,RunModeAgent->ClientAppL());
       ret = r;
	    __UHEAP_MARKEND;

	    delete RunModeAgent;
       }
       
	delete trap;

	return ret;
	}