kerneltest/e32test/usbho/t_usbdi/inc/BaseTestCase.h
changeset 0 a41df078684a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/e32test/usbho/t_usbdi/inc/BaseTestCase.h	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,358 @@
+#ifndef __BASE_TEST_CASE_H
+#define __BASE_TEST_CASE_H
+
+/*
+* Copyright (c) 2007-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:
+* @file BaseTestCase.h
+* @internalComponent
+* 
+*
+*/
+
+
+
+#include <e32base.h>
+#include <d32usbdi.h>
+#include "FDFActor.h"
+#include "testdebug.h"
+
+namespace NUnitTesting_USBDI
+	{
+
+#ifdef _DEBUG
+#define _LITDBG(a)	_LIT(lit, a)
+#else
+#define _LITDBG(a)
+#endif
+	
+// Constants for CBaseTestCase::GetEndpointAddress
+
+extern const TUint8 KEpDirectionIn;
+extern const TUint8 KEpDirectionOut;
+extern const TUint8 KTransferTypeControl;
+extern const TUint8 KTransferTypeIsoch;
+extern const TUint8 KTransferTypeBulk;
+extern const TUint8 KTransferTypeInterrupt;
+	
+// Forward declarations
+
+class CBasicTestPolicy;
+
+#define WS_FILENAME(f)	_LIT(KFileName, f);
+#define WS_CONDITION(c)	_LIT(KCondition, c);
+_LIT(KFailText, "CHECK fails ---> %S, in file %S @ line %i");
+
+// Utility macro to tidy up the test
+#define CHECK(aCondition)\
+	if(!(aCondition))\
+		{\
+		WS_FILENAME(__FILE__);\
+		WS_CONDITION(#aCondition);\
+		CBaseTestCase::LogWithCondAndInfo(KCondition, KFileName, __LINE__);\
+		return TestFailed(KErrAbort);\
+		}\
+		
+// Utility macro to tidy up the test
+#define CHECK_RET_BOOL(aCondition)\
+	if(!(aCondition))\
+		{\
+		WS_FILENAME(__FILE__);\
+		WS_CONDITION(#aCondition);\
+		CBaseTestCase::LogWithCondAndInfo(KCondition, KFileName, __LINE__);\
+		return EFalse;\
+		}\
+/**
+Base policy class for test cases.  Test cases are active objects that execute their respective test cases
+and asynchronously complete when test case has finished
+*/
+class CBaseTestCase : public CActive
+	{
+public:
+	/**
+	Destructor
+	*/
+	virtual ~CBaseTestCase();
+	
+	/**
+	*/
+	void SetTestPolicy(CBasicTestPolicy* aTestPolicy);
+	
+	/**
+	Performs the test case
+	*/
+	void PerformTestL();
+	
+	/**
+	Provides to the caller the identity of this test case
+	@return descriptor referrence to the test case identity
+	*/
+	TDesC& TestCaseId();
+	
+	/**
+	Retrieve the test result for the executed test case
+	@return the test case result
+	*/
+	TInt TestResult() const;
+		
+	/**
+	Check if the test is only be run on the host(no synch. with client needed)
+	@return True if test to be run in host only.
+	*/
+	TBool IsHostOnly() const;
+	
+	/**
+	Check if the test is only be run on the host(no synch. with client needed)
+	@return True if test to be run in host only.
+	*/
+	TBool IsHost() const;
+	
+	/** 
+	static method(util), used to log a test condition.
+	@param[in] aCondition checked condition	
+	@param[in] aFileName __FILE__	
+	@param[in] aLine __LINE__ 	
+	*/	 
+	static void LogWithCondAndInfo(const TDesC& aCondition, const TDesC& aFileName, TInt aLine);
+	
+protected: // From CActive 
+	
+	/**
+	Called when Cancel is called (if active)
+	*/
+	void DoCancel();
+	
+	/**
+	Called when the this AO has been scheduled
+	*/
+	void RunL();
+	
+	/**
+	This default implementation just informs the test controller that this specific test case RunL
+	left with the error code so that the active scheduler will not Panic.  This indicates that the test case failed.
+	Derived test cases are expected to override for exact knowledge of error
+	@param aError the error from a derived test case execution
+	@return KErrNone
+	*/
+	virtual TInt RunError(TInt aError);
+	
+protected: // Tree checks
+
+	/**
+	Store dev. and config. desc into internal buffer and check if it is identical to the reference one. 
+	@param[in] aDevDesc parsed device descriptor
+	@param[in] aConfigDesc parsed config. descriptor
+	@param[in] aFileName file to be compared with the current tree(doesn't contain the path nor extension)
+	or to build a reference tree(after being manually checked once, it could be used as a ref.)
+	@return KErrNone if tree is identical to the ref. tree
+	*/
+	TInt CheckTree(TUsbGenericDescriptor& aDevDesc, TUsbGenericDescriptor& aConfigDesc, const TDesC& aFileName);
+	 
+	/**
+	Parse configuration descriptor raw data and check if the generated tree is identical to the ref. one.
+	FAILS the test if there is any difference.
+	@param[in] devDesc already parsed device descriptor
+	@param[in] configSet configuration descriptor raw data to be parsed
+	@param[in] indexTest index of the test(used to append a number to the generated file name)
+	@return KErrNone if parsing is ok and tree is identical to the ref. tree
+	*/
+	TInt ParseConfigDescriptorAndCheckTree(TUsbDeviceDescriptor *devDesc, const TDesC8& configSet, TUint indexTest);
+    	/**
+	Parse configuration descriptor raw data and check if the generated tree is identical to the ref. one.
+	FAILS the test if there is any difference.
+	@param[in] aTestDevice device being tested tested
+	@param[in] aFileName file to be compared with the current tree(doesn't contain the path nor extension)
+	@return KErrNone if tree is identical to the ref. tree after a real device has been inserted.
+	*/
+    TInt CheckTreeAfterDeviceInsertion(CUsbTestDevice& aTestDevice, const TDesC& aFileName);
+
+protected:
+	/**
+	Constructor
+	@param aTestCaseId the identity that this test case is to represent
+	@param aHostFlag the flag for host role
+	*/
+	CBaseTestCase(const TDesC& aTestCaseId,TBool aHostFlag, TBool aHostOnly = EFalse);
+	
+	/**
+	Base class 2nd phase constructor
+	*/
+	void BaseConstructL();	
+	virtual void ConstructL() = 0;
+	
+	/**
+	State that the test case has failed with the given error code
+	@param aFailResult the failiure result for the test case
+	*/
+	void TestFailed(TInt aFailResult);
+	
+	/**
+	Instruct the test case that it has passed
+	*/
+	void TestPassed();
+	
+	/**
+	Instruct the test case to asynchronously complete itself now
+	*/
+	void SelfComplete();
+	
+	/**
+	Instruct the test case to asynchronously complete itself now with the supplied error code.
+	@param aError the error code to complete this test case with.
+	*/
+	void SelfComplete(TInt aError);
+
+	/**
+	Timeout in the specified number of seconds
+	@param aTimeoutPeriod the timeout interval 
+	*/
+	void TimeoutIn(TInt aTimeoutPeriod);
+	
+	/**
+	Cancels the timeout for the test case step
+	*/
+	void CancelTimeout();
+	
+	/**
+	*/	
+	CBasicTestPolicy& TestPolicy();
+	
+	/**
+	*/
+	virtual void ExecuteHostTestCaseL() = 0;
+	virtual void HostRunL() = 0;
+	virtual void HostDoCancel() = 0;
+	
+	/**
+	*/
+	virtual void ExecuteDeviceTestCaseL() = 0;
+	virtual void DeviceRunL() = 0;
+	virtual void DeviceDoCancel() = 0;
+
+protected:
+
+/**
+Finds the address of the first endpoint with the specification of direction and type
+@param aUsbInterface the interface that has the correct interface setting
+@param aInterfaceSetting the alternate interface setting which has the endpoint
+@param aTransferType the type of transfer for this endpoint
+@param aDirection the direction of the endpoint in the host transfer
+@param[out] on return, the first endpoint address found
+@return KErrNone if successful or a system wide error code
+*/
+TInt GetEndpointAddress(RUsbInterface& aUsbInterface,TInt aInterfaceSetting,
+		TUint8 aTransferType,TUint8 aDirection,TInt& aEndpointAddress);
+
+/**
+Finds the address of the (index+1)th endpoint with the specification of direction and type
+@param aUsbInterface the interface that has the correct interface setting
+@param aInterfaceSetting the alternate interface setting which has the endpoint
+@param aTransferType the type of transfer for this endpoint
+@param aDirection the direction of the endpoint in the host transfer
+@param[out] on return, the first endpoint address found
+@return KErrNone if successful or a system wide error code
+*/
+TInt GetEndpointAddress(RUsbInterface& aUsbInterface,TInt aInterfaceSetting,
+		TUint8 aTransferType,TUint8 aDirection,TUint8 aIndex, TInt& aEndpointAddress);
+
+protected:
+
+	/**
+	The timer resource for timeout of test actions
+	and possibly other uses
+	*/
+	RTimer iTimer;	
+	
+	/**
+	The execution result for the test case
+	*/
+	TInt iTestResult;
+	
+private:  // Tree 
+
+	/**
+	Print the tree(logging) and store it into iTreeBuffer.
+	@param[in] aDesc usb descriptor(likely to be device descriptor or configuration one)
+	@param[in] aDepth tree depth
+	*/
+    void PrintAndStoreTree(TUsbGenericDescriptor& aDesc, TInt aDepth = 0);
+    
+    /**
+	Print a blob(logging) and store it into iTreeBuffer.
+	@param[in] aBuf usb descriptor(likely to be device descriptor or configuration one)
+	@param[in] aBlob tree depth
+	*/	
+	void PrintAndStoreBlob(TDes8& aBuf, TPtrC8& aBlob);
+	
+	/** 
+	Print a chunk(logging) and store it into iTreeBuffer.
+	@param[in] aChunk chunk buffer
+	@param[in] aSize nb of data(for writtings in one go)
+	@param[in] aBlob whole Blob
+	@param[in] aOffset offset of blob(for writtings in several times)
+	@param[in] aIter index of chunk(for writtings in several times)
+	@param[in] aBuf buffer needed for proper indentation
+	*/
+    void PrintAndStoreChunk(HBufC8* aChunk, TUint aSize, TPtrC8& aBlob, TUint aOffset, TUint aIter, TDes8& aBuf);
+   	
+   	/** 
+	Generate a Ref. file representing the tree(flushing iTreeBuffer)
+	@param[in] aFileName file name(doesn't contain the path nor extension)
+	@return KErrNone if successfull.
+	*/
+	TInt GenerateRefFile(const TDesC& aFileName);
+	
+	/** 
+	Compare the current tree(iTreeBuffer) to a reference.
+	@param[in] aFileName ref. file name(doesn't contain the path nor extension)
+	@param[out] aIsIdentical True if equal to the ref.
+	@return KErrNone if successfull.
+	*/
+	TInt CompareCurrentTreeToRef(const TDesC& aFileName, TBool& aIsIdentical);
+	
+private :
+
+	/**
+	The identity of the test case
+	*/
+	TBuf<KMaxName> iTestCaseId;
+	
+	/**
+	*/
+	CBasicTestPolicy* iTestPolicy;
+	
+	/**
+	The flag to indicate if this is a test case that performs host test actions
+	*/
+	TBool iHost;
+	
+	/** 
+	The flag to indicate if this is a test case that is only run in host, and doesn't need synch. with a device.
+	*/
+	TBool iHostOnly;
+	
+	/** 
+	Heap buffer which contains the descriptors tree.
+	*/
+	RBuf8 iTreeBuffer;
+	
+	/**
+	Hanlde to a file session server
+	*/
+	RFs iFs;
+	};
+
+	}
+	
+#endif