bluetooth/btsdp/test/TSDPSAS.h
changeset 0 29b1cd4cb562
--- /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 <btsdp.h>
+#include "sdpkey.h"
+#include "SDPDatabase.h"
+#include <btmanclient.h>
+
+#ifndef __SDPSAS_H__
+#define __SDPSAS_H__
+
+#ifndef __ES_SOCK_H__
+#include <es_sock.h>
+#endif
+
+#ifndef __BT_SOCK_H__
+#include <bt_sock.h>
+#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