diff -r 000000000000 -r 29b1cd4cb562 bluetooth/btsdp/test/TSDPSAS.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bluetooth/btsdp/test/TSDPSAS.h Fri Jan 15 08:13:17 2010 +0200 @@ -0,0 +1,336 @@ +// Copyright (c) 2005-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: +// Verification Test SDP +// +// + +#include +#include "sdpkey.h" +#include "SDPDatabase.h" +#include + +#ifndef __SDPSAS_H__ +#define __SDPSAS_H__ + +#ifndef __ES_SOCK_H__ +#include +#endif + +#ifndef __BT_SOCK_H__ +#include +#endif + + +// Constants +const TInt KMaxRequestableUUIDs = 12; +const TInt KMaxNumRecordHandles = 50; +const TInt KMaxNumBrowseUUIDs = 50; +const TInt KNumSDPServiceTests = 6; +const TInt KNumSDPAttributeTests = 23; +const TInt KNumSDPServiceAttributeTests = 24; +const TInt KMaxAttributeListByteCount = 200; + +// SDP test base class. Provides untilities for running raw SDP tests over +// L2CAP. +class CSdpTestBase : public CBase + { +public: + enum TUuidType {EUuid16, + EUuid32, + EUuid128, + EUuidInvalid} ; + CSdpTestBase(CConsoleBase& aConsole); + ~CSdpTestBase(); + + // Utility functions + // + void StartSDPServerL(); + void SendCloseL(); + void WaitForCloseL(); + void RegisterDatabaseInServerL(CSdpDatabase& aDb); + void SdpConnectL(); + virtual CSdpDatabase* BuildDbL() = 0; // To be implemented according to test types. + +protected: + // SDP database stuff + // + RSdp iSdp; + RSdpDatabase iSdpDatabase; + CSdpDatabase* iTheDb; + CConsoleBase& iConsole; + RSocket iRawSock; // Socket for sending raw bytes over L2CAP PSM 1 (SDP). + + TUint16 iRawTransactionId; // Incremented to provide a unique ID for every query. + + }; + +// Class to represent the SDP header bytes +class TSDPHeader +{ +public: + TSDPHeader(); + TSDPHeader(TUint8 aPduId, TUint16 aTranId, TUint16 aLen); + void AppendHeader(TDes8& aBuf); + + inline TUint8 GetPduUd(){return iPduId;} + inline TUint16 GetTransactionId(){return iTransactionId;} + inline TUint16 GetParamsLen(){return iParamLen;} +private: + TUint8 iPduId; + TUint16 iTransactionId; + TUint16 iParamLen; +}; + +// Class to represent the SDP service request bytes +class TServiceRequest // Note this doesn't contain continuation + { +public: + TServiceRequest(); + //TServiceRequest(TUint8* aDes, const TUint8* aUuid128, TUint16 aMaxRecordCount); + TServiceRequest(TUint8* aDes, TUUID aUuid, CSdpTestBase::TUuidType aUuidType, TUint16 aMaxRecordCount); + TServiceRequest(TUint8* aDes, CSdpSearchPattern& aSP, CSdpTestBase::TUuidType aUuidType, TUint16 aMaxRecordCount); + TServiceRequest(TUUID aUuid, CSdpTestBase::TUuidType aUuidType, TUint16 aMaxRecordCount); + TServiceRequest(CSdpSearchPattern& aSP, CSdpTestBase::TUuidType aUuidType, TUint16 aMaxRecordCount); + void SetupDES(); + void SetUuidType(CSdpTestBase::TUuidType aUuidType); + void AppendRequest(TDes8& aBuf); + + inline TUUID Uuid(){return iUuid;} + inline CSdpSearchPattern* SP(){return iSP;} + inline CSdpTestBase::TUuidType UuidType(){return iUuidType;} + inline TUint16 MaxRecordCount(){return iMaxRecordCount;} + inline TUint8* Des(){return iDes;} +private: + TUint8 iDes[3]; + //TUint32 iUuid32; + TUUID iUuid; + CSdpSearchPattern* iSP;//for multiple uuid requests + TUint16 iMaxRecordCount; + CSdpTestBase::TUuidType iUuidType; //inticates which length of Uuid used + TBool iAutoDes; + }; + +// Class to represent the SDP attribute request bytes +class TAttributeRequest + { +public: + TAttributeRequest(); + TAttributeRequest(TUint32 aRecordHandle, TUint16 aMaxByteCount, TUint8* aDes, TUint16 aAttributeId); + TAttributeRequest(TUint32 aRecordHandle, TUint16 aMaxByteCount, TUint8* aDes, TUint32 aAttributeIdRange); + TAttributeRequest(TUint32 aRecordHandle, TUint16 aMaxByteCount, TUint16 aAttributeId); + TAttributeRequest(TUint32 aRecordHandle, TUint16 aMaxByteCount, TUint32 aAttributeIdRange); + void SetupDES(); + void AppendRequest(TDes8& aBuf); + + inline TUint32 RecordHandle(){return iRecordHandle;} + inline void SetRecordHandle(TUint16 aRecordHandle){iRecordHandle=aRecordHandle;} + inline TUint16 MaxByteCount(){return iMaxByteCount;} + inline TUint16 AttributeId(){return iAttributeId;} + inline TUint32 AttributeIdRange(){return iAttributeIdRange;} + inline TUint8* Des(){return iDes;} + +private: + TUint32 iRecordHandle; + TUint16 iMaxByteCount; + TUint8 iDes[3]; + TUint16 iAttributeId; + TUint32 iAttributeIdRange; + TBool iAutoDes; + }; + +// +// TServiceAttributeRequest +// +class TServiceAttributeRequest + { +public: + TServiceAttributeRequest(); + + //TServiceAttributeRequest(TUint8* aServiceDes, TUint16 aServiceUuid, TUint16 aMaxByteCount, TUint8* aAttribDes, TUint16 aAttributeId); + //TServiceAttributeRequest(TUint8* aServiceDes, TUint32 aServiceUuid, TUint16 aMaxByteCount, TUint8* aAttribDes, TUint16 aAttributeId); + TServiceAttributeRequest(TUint8* aServiceDes, TUUID aServiceUuid, CSdpTestBase::TUuidType aUuidType, TUint16 aMaxByteCount, TUint8* aAttribDes, TUint16 aAttributeId); + TServiceAttributeRequest(TUUID aServiceUuid, CSdpTestBase::TUuidType aUuidType, TUint16 aMaxByteCount, TUint16 aAttributeId); + + //TServiceAttributeRequest(TUint8* aServiceDes, TUint16 aServiceUuid, TUint16 aMaxByteCount, TUint8* aAttribDes, TUint32 aAttributeIdRange); + //TServiceAttributeRequest(TUint8* aServiceDes, TUint32 aServiceUuid, TUint16 aMaxByteCount, TUint8* aAttribDes, TUint32 aAttributeIdRange); + TServiceAttributeRequest(TUint8* aServiceDes, TUUID aServiceUuid, CSdpTestBase::TUuidType aUuidType, TUint16 aMaxByteCount, TUint8* aAttribDes, TUint32 aAttributeIdRange); + TServiceAttributeRequest(TUUID aServiceUuid, CSdpTestBase::TUuidType aUuidType, TUint16 aMaxByteCount, TUint32 aAttributeIdRange); + + void SetUuidType(CSdpTestBase::TUuidType aUuidType); + void AppendRequest(TDes8& aBuf); + + inline TUint16 MaxByteCount(){return iAttributeRequest.MaxByteCount();} + + inline TServiceRequest& ServiceParams(){return iServiceRequest;} + inline TAttributeRequest& AttributeParams(){return iAttributeRequest;} +private: + //Have this as a combination of service and attribute requests + // + TServiceRequest iServiceRequest; + TAttributeRequest iAttributeRequest; + + }; + + + +// Class for the SDP verification test group. +class CSdpVerificationTests : public CSdpTestBase , public MSdpElementBuilder + { +public: + static void RunTestL(CConsoleBase& aConsole); + CSdpVerificationTests(CConsoleBase& aConsole); + ~CSdpVerificationTests(); + + // Master + void RunMasterTestL(); + CSdpDatabase* BuildDbL(); + void PrintDb(CSdpDatabase& aDb, CConsoleBase& aConsole); +private: + + // Test functions + void DoTestsL(); + void SDPQueryL(); + void RunSDPSearchL(); + void SDPServiceSearchL(); + void SDPAttributeSearchL(); + void SDPServiceAttributeSearch(); + void SDPBrowseTestL(TUuidType aUuidType); + TBool AnotherQuery(); + TBool Continue(); + TInt GetUuidSize(); + void UpdateTestString(); + void FlogTestId(); + TInt MaxCountFoundAfterServiceSearchPatternOrWhatYouWill(TDesC8& aString); + void FlogParsedPDUHeader(TDesC8& aString); + void FlogString(const TText* aLineStart, TDesC8& aString); + void FlogReadString(TDesC8& aString); + void FlogContinuationString(TDesC8&aString); + void FlogWriteString(TDesC8& aString); + void WaitForStartSignalL(); + void SendStartSignalL(); + void PromptedGetch(); + + // Browse tests + // + void BuildBrowseDbL(CConsoleBase& aConsole); + + // Initialisation + void SetUpServiceTestParams(); + void SetUpAttributeTestParams(); + void SetUpServiceAttributeTestParams(); + + // Process results + TInt ProcessSearchResults(TDesC8& aResult1, TDesC8& aResult2); + TInt ProcessServiceSearchResults(TDesC8& aResult1, TDesC8& aResult2); + TInt ProcessAttributeSearchResults(TDesC8& aResult1, TDesC8& aResult2); + TInt ProcessServiceAttributeSearchResults(TDesC8& aResult1, TDesC8& aResult2); + + // MSdpElementBuilder implementations + MSdpElementBuilder* BuildUintL(const TDesC8& aUint); + MSdpElementBuilder* BuildUUIDL(const TUUID& aUUID); + MSdpElementBuilder* BuildStringL(const TDesC8& aString); + MSdpElementBuilder* BuildDESL(); // Must not return NULL + MSdpElementBuilder* BuildURLL(const TDesC8& aURL); + MSdpElementBuilder* StartListL(); + MSdpElementBuilder* EndListL(); + MSdpElementBuilder* BuildNilL(); + + + // Private data + // + TServiceRequest iServiceTests[KNumSDPServiceTests + KNumSDPAttributeTests]; // Holds the service test params. + // Attribute tests involve a service query as well. + TAttributeRequest iAttributeTests[KNumSDPAttributeTests]; //Holds the attribute test params + TServiceAttributeRequest iServiceAttributeTests[KNumSDPServiceAttributeTests]; + + CSdpSearchPattern* iSP; + + + TUint8 iContinuationBuffer[KSdpContinuationStateMaxLength]; // Buffer for continuation state + TUint8 iContLength; // Continuation state length + TBuf8<14000> iContinuationStore; // Holds the growing buffer while the requests + // are returning one by one + TUint32 iAttributeTestServiceRecordHandle; + TUint32 iBrowseTestServiceRecordHandle[KMaxNumRecordHandles]; + TUint32 iBrowseTestNumRecordHandlesStored; + TUUID iBrowseUUID[KMaxNumBrowseUUIDs]; + TInt iNumBrowseUUIDs; + + enum TTestType {EServiceRequest, + EServiceAttributeRequest, + EServiceSearchAttributeRequest} ; + + TTestType iType; // The type of test currently being run + TInt8 iQueryIndex; // For the tests that have 2 queries. + TTestType iQueryState; + TUint iTestNum; // THe number of test running. + TBool iNeedAttributeId; + TInt iBuildingList; + TInt iBrowseIter; + TInt iIndent; + TInt iRequestMaxCount; + TInt iRequestMaxCount1; + TInt iRequestMaxCount2; + TInt iRequestTransId; + TInt iRequestTransId1; + TInt iRequestTransId2; + TBool iNeedMoreRecordHandles; + CSdpTestBase::TUuidType iUuidType; //indicates which length of Uuid to be used + TBuf<77> iTestName; + }; + +class CBrowseResponseBuilder : public CBase, public MSdpElementBuilder + { +public: + CBrowseResponseBuilder(TDes& aTestName, TInt aBrowseIter, CSdpSearchPattern& aBrowseSP); + ~CBrowseResponseBuilder(); + MSdpElementBuilder* BuildUintL(const TDesC8& aUint); + MSdpElementBuilder* BuildUUIDL(const TUUID& aUUID); + MSdpElementBuilder* BuildDESL(); // Must not return NULL + MSdpElementBuilder* StartListL(); + MSdpElementBuilder* EndListL(); +private: + TDes& iTestName; + TInt iBrowseIter; + TBool iNeedAttributeId; + TInt iBuildingList; + CSdpSearchPattern& iBrowseSP; + }; + + +class CPrintBuilder : public CBase, public MSdpElementBuilder + { +public: + CPrintBuilder(CConsoleBase& aConsole); + ~CPrintBuilder(); + + void HexDumpVT(const TDesC8& aDes); + MSdpElementBuilder* BuildUnknown(TUint8 aType, TUint8 aSizeDesc, const TDesC8& aData); + MSdpElementBuilder* BuildUintL(const TDesC8& aUint); + MSdpElementBuilder* BuildIntL(const TDesC8& aUint); + MSdpElementBuilder* BuildUUIDL(const TUUID& aUUID); + MSdpElementBuilder* BuildBooleanL(TBool aBool); + MSdpElementBuilder* BuildStringL(const TDesC8& aString); + MSdpElementBuilder* BuildDESL(); // Must not return NULL + MSdpElementBuilder* BuildDEAL(); // Must not return NULL + MSdpElementBuilder* BuildURLL(const TDesC8& aURL); + MSdpElementBuilder* StartListL(); + MSdpElementBuilder* EndListL(); + MSdpElementBuilder* BuildNilL(); + +private: + TInt iIndent; + CConsoleBase& iConsole; + }; +#endif