diff -r 000000000000 -r a41df078684a kerneltest/e32test/usbho/t_usbdi/inc/BaseTestCase.h --- /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 +#include +#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 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