bluetooth/btsdp/test/protocolmanl.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 26 Jan 2010 13:05:56 +0200
changeset 3 4e39398d58ed
parent 0 29b1cd4cb562
permissions -rw-r--r--
Revision: 201001 Kit: 201004

// 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:
// protocol manual from protocol main
// a test harness for SDP protocol to send manual PDUs into the server
// and onto the wire.
// 
//



#include <e32test.h>
#include <f32file.h>
#include <c32comm.h>
#include "listener.h"
#include "protocolmanl.h"
#include "reqhandler.h"
// #include "builddb.h" we need one of these
#include "debug.h"

#if defined (__WINS__)
#define PDD_NAME _L("ECDRV")
#define LDD_NAME _L("ECOMM")
#else  // __GCC32__
#define PDD_NAME _L("EUART1")
#define LDD_NAME _L("ECOMM")
// #define ETNA_PDD_NAME _L("EUART2") // for debugging over com2
#endif

CSdpDatabase* BuildDbL();
CSdpDatabase* BuildUpf4DbL();
// in Builddb.cpp

// tsdpdb.cpp
void HexDes(const TDesC8& aDes);


// being called by tsdpdb
// GLDEF_D RTest test(_L("SDP Server injection tests"));

GLDEF_D CSdpDatabase* gSdpTestDatabase;
GLDEF_D TInt sdp_debug_level = 4;

/*
 ** Injector test
 *
 *  load up manual packets to 
		respond synthetically to requests
		send into the server
 */  
static TUint8 transId = 42;

// Inject dummy SDP requests
// inject buffers and return the response
// first parameter is the request ID, and returns the response ID
// so if an error occurs this can be checked...
HBufC8* InjectLC(TUint8& aReqResID, const TPtr8& aReqBuf, TUint aMTU)
{
	TSdpPdu iRequest;
	TSdpPdu iOutput;
               
	iRequest.iTransId = transId++;
	iRequest.iPduId = aReqResID;
	iRequest.iParams.Set(aReqBuf);
	SDP_DEBUG(2, FPrint(_L("InjectLC")));
	SDP_DEBUG(3, FPrint(_L("SDP PDU ID %d, transaction ID %d, parameter length %d, [params]"), iRequest.iPduId, iRequest.iTransId, iRequest.iParams.Length()));
	SDP_DEBUG(4, FHex(iRequest.iParams));

	HBufC8* iWriteHBuf = HBufC8::NewL(aMTU);
	CleanupStack::PushL(iWriteHBuf);

	iOutput.iParams.Set(iWriteHBuf->Des());
	iOutput.iParams.Zero();
	__UHEAP_MARK;
	TRAPD(errorCode, SdpReqHandler::HandleL(*gSdpTestDatabase, iRequest, iOutput));
	__UHEAP_MARKEND;
	if (errorCode != KErrNone)
		{
		errorCode = SdpReqHandler::RunError(errorCode, iRequest, iOutput);
		}
	aReqResID = iOutput.iPduId;
	SDP_DEBUG(3, FPrint(_L("Writing %d bytes of response data [contents]"), iWriteHBuf->Des().Length()));
	SDP_DEBUG(4, FHex(iWriteHBuf->Des()));
	return iWriteHBuf;
}

#define KErrorResponse 0x01
#define KServiceSearchRequest 0x02
#define KServiceSearchResponse 0x03
#define KAttributeRequest 0x04
#define KAttributeResponse 0x05
#define KServiceAttSearchRequest 0x06
#define KServiceAttSearchResponse 0x07

#define DUMMTU 156


// send a request and match a known response, show data only if a mismatch
TBool testSdpReqL(RTest& test, TUint8* aReqData, TUint aReqLen, TUint8 aReqId, TUint8* aRespData, TUint aRespLen, TUint8 aRespId, TUint aRespSize)
{
	TUint8 pduId = aReqId;
	TBool testMatch;
	HBufC8* requestHBuf = HBufC8::New(aReqLen);
	HBufC8* responseHBuf;
	TPtr8 request = requestHBuf->Des();

	request.SetLength(0);
	request.Append(aReqData, aReqLen);
	responseHBuf = InjectLC(pduId, request, aRespSize);
	if (pduId == aRespId)
		{
		TInt respCmp = Mem::Compare(aRespData, aRespLen, &responseHBuf->Des()[0], responseHBuf->Length());
		if (respCmp)
			{
			test.Printf(_L("no match at offset %d:\n"), respCmp);
			HexDes(responseHBuf->Des());
			test.Printf(_L("\n"));
			testMatch = EFalse;
			}
		else
			{
			test.Printf(_L("Response OK\n"));
			testMatch = ETrue;
			}
		}
	else
		{
			test.Printf(_L("Error:"));
			HexDes(responseHBuf->Des());
			test.Printf(_L("\n"));
			testMatch = EFalse;
		}
	CleanupStack::PopAndDestroy(/*responseHBuf*/);
	delete requestHBuf;
	return testMatch;
}

// send a request and resend any continuations - use SDP_DEBUG to dump
TUint testSdpContL(RTest& test, TUint8* aReqData, TUint aReqLen, TUint8 aReqId, /*TUint8* aRespData,*/ TUint aMtu)
{
	TUint8 pduId = aReqId;
	HBufC8* requestHBuf = HBufC8::New(aReqLen + 10 /*KSdpContinuationStateLength*/);
	HBufC8* responseHBuf;
	TPtr8 request = requestHBuf->Des();
	TPtr8 buf(0,0);
	TInt continuationLen = 0;
	TInt partial = 0;
	TInt continutations = 0;

	request.SetLength(0);
	request.Append(aReqData, aReqLen);
	do
		{
		pduId = aReqId;
		responseHBuf = InjectLC(pduId, request, aMtu);
		buf.Set(responseHBuf->Des());

		switch(pduId)
			{
			case 0x03:
				test.Printf(_L("Got SDP_ServiceSearchResponse\n"));
				partial = BigEndian::Get16(&buf[2]);
				partial *= 4;
				partial += 4;
				continuationLen = buf[partial];
				break;
			
			case 0x05:
				test.Printf(_L("Got SDP_ServiceAttributeResponse\n"));
				partial = BigEndian::Get16(&buf[0]);
				partial += 2;
				continuationLen = buf[partial];
				break;
			
			case 0x07:
				test.Printf(_L("Got SDP_ServiceSearchAttributeResponse\n"));
				partial = BigEndian::Get16(&buf[0]);
				partial += 2;
				continuationLen = buf[partial];
				break;
			default:

				test.Printf(_L("Got UnknownResponse (0x%x)\n"), buf[0]);
				continuationLen = 0;	// create a dummy non-continuation
				break;
			}
		continutations++;

		request.Zero();
		request.Append(aReqData, aReqLen-1);
		request.Append(&buf[partial], continuationLen+1);  //1 for continuation len
		CleanupStack::PopAndDestroy(/*responseHBuf*/);
		} while (continuationLen != 0);

	
	delete requestHBuf;
	return continutations;
}


void TestBL(RTest& test)
	{
	__UHEAP_MARK;
	test.Start(_L("Test B -- UPF back to back tests"));

	gSdpTestDatabase = BuildUpf4DbL();
	gSdpTestDatabase->EncodeDbL();

	test.Printf(_L("SS for RFCOMM "));
	TUint8 requestdata00[] = {
		0x35, 0x03, 0x19, 0x00, 0x03,	// UUID list
		0x00, 0x03,						// max handles
		0x00							// continuation
		};
	TUint8 responsedata00[] = {
		0x00, 0x03,						// total handle count
		0x00, 0x03,						// this handle count
		0x00, 0x01, 0x00, 0x00,			// handle
		0x00, 0x01, 0x00, 0x01,			// handle
		0x00, 0x01, 0x00, 0x02,			// handle
		0x00							// continuation
		};
	testSdpReqL(test, &requestdata00[0], sizeof(requestdata00), KServiceSearchRequest, &responsedata00[0], sizeof(responsedata00), KServiceSearchResponse, DUMMTU);


	test.Printf(_L("AR for Server Description "));
	TUint8 requestdata01[] = {
		0x00, 0x00, 0x00, 0x00,			// handle
		0x01, 0x00,						// max bytes
		0x35, 0x03,						// DES header attrib list
		0x09, 0x01, 0x01,				// attribute ID 0101
		0x00							// continuation
		};
	TUint8 responsedata01[] = {
		0x00, 0x1c,						// this byte count
		0x35, 0x1a,						// DES of attribute list
		0x09, 0x01, 0x01,				// attribute ID 0101
		0x25, 0x15,						// string of 15h (21) bytes
		0x45, 0x50, 0x4f, 0x43, 0x20, 0x53, 0x44, 0x50, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x55, 0x50, 0x46, 0x2d, 0x34,
		0x00							// continuation
		};
	testSdpReqL(test, &requestdata01[0], sizeof(requestdata01), KAttributeRequest, &responsedata01[0], sizeof(responsedata01), KAttributeResponse, 0x100);

	test.Printf(_L("UPF test 01 SS "));
	TUint8 requestdataU01a[] = {
		0x35, 0x03, 0x19, 0x11, 0x03,	// UUID list
		0x00, 0x03,						// max handles
		0x00							// continuation
		};
	TUint8 responsedataU01a[] = {
		0x00, 0x01,						// total handle count
		0x00, 0x01,						// this handle count
		0x00, 0x01, 0x00, 0x00,			// handle
		0x00							// continuation
		};
	testSdpReqL(test, &requestdataU01a[0], sizeof(requestdataU01a), KServiceSearchRequest, &responsedataU01a[0], sizeof(responsedataU01a), KServiceSearchResponse, DUMMTU);

	test.Printf(_L("UPF test 01 AR "));
	TUint8 requestdataU01b[] = {
		0x00, 0x01, 0x00, 0x00,			// handle
		0x01, 0x00,						// max bytes
		0x35, 0x03,						// DES header attrib list
		0x09, 0x00, 0x04,				// attribute ID 0004
		0x00							// continuation
		};
	TUint8 responsedataU01b[] = {
		0x00, 0x13,						// this byte count
		0x35, 0x11,						// DES of attribute list
		0x09, 0x00, 0x04,				// attribute ID 0101
		0x35, 0x0c,						// protocol DES
		0x35, 0x03,						// DES for L2Cap
		0x19, 0x01, 0x00,				// UUID L2CAP
		0x35, 0x05,						// DES for RFCOMM
		0x19, 0x00, 0x03,				// UUID for RFCOMM
		0x08, 0x01,						// RFCOMM port number
// 0x0a, 0x00, 0x00, 0x00, 0x01,			// RFCOMM port number
		0x00							// continuation
		};
	testSdpReqL(test, &requestdataU01b[0], sizeof(requestdataU01b), KAttributeRequest, &responsedataU01b[0], sizeof(responsedataU01b), KAttributeResponse, 0x100);

	test.Printf(_L("UPF test 02 "));
	TUint8 requestdataU02a[] = {
		0x35, 0x03, 0x19, 0x10, 0x02,	// UUID list
		0x01, 0x00,						// max byte count
		0x35, 0x03,						// DES header attrib list
		0x09, 0x01, 0x00,				// attribute ID 0100
		0x00							// continuation
		};
	TUint8 responsedataU02a[] = {
		0x00, 0x4d,						// this byte count
		0x35, 0x4b,						// DES of lists of attribute lists
		0x35, 0x0f,						// DES of first attribute list
		0x09, 0x01, 0x00,				// attribute ID 0100
		0x25, 0x0a,						// string of 0ah (10) bytes
		0x53, 0x44, 0x50, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72,
		0x35, 0x17,						// DES of second attribute list
		0x09, 0x01, 0x00,				// attribute ID 0100
		0x25, 0x12,						// string of 12h (18) bytes
		0x44, 0x69, 0x61, 0x6c, 0x2d, 0x75, 0x70, 0x20, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67,
		0x35, 0x08,						// DES of third attribute list
		0x09, 0x01, 0x00,				// attribute ID 0100
		0x25, 0x03,						// string of 03h bytes
		0x46, 0x61, 0x78,
		0x35, 0x15,						// DES of fourth attribute list
		0x09, 0x01, 0x00,				// attribute ID 0100
		0x25, 0x10,						// string of 10h (16) bytes
		0x4f, 0x42, 0x45, 0x58, 0x20, 0x4f, 0x62, 0x6a, 0x65, 0x78, 0x74, 0x20, 0x50, 0x75, 0x73, 0x68,
		0x00							// continuation
		};
	testSdpReqL(test, requestdataU02a, sizeof(requestdataU02a), KServiceAttSearchRequest, responsedataU02a, sizeof(responsedataU02a), KServiceAttSearchResponse, DUMMTU);

	test.Printf(_L("UPF test 03 part 1"));
	TUint8 requestdataU03a[] = {
		0x35, 0x03, 0x19, 0x11, 0x05,	// UUID list
		0x00, 0x45,						// max byte count
		0x35, 0x05, 0x0a, 0x00, 0x00, 0xff, 0xff, // atttribute range
		0x00							// continuation
		};
	TUint8 responsedataU03a[] = {
		0x00, 0x45,						// this byte count
		0x35, 0x6b,						// outer DES header
		0x35, 0x69,						// first record DES
		0x09, 0x00, 0x00,				// attribute 0
		0x0a, 0x00, 0x01, 0x00, 0x02,	// record 10002
		0x09, 0x00, 0x01,				// attribute 1
		0x35, 0x03, 0x19, 0x11, 0x05,	// service class ID
		0x09, 0x00, 0x04,				// attribute 4
		0x35, 0x14,						// protocol list
		0x35, 0x03, 0x19, 0x01, 0x00,
		0x35, 0x08, 0x19, 0x00, 0x03, 0x0a, 0x00, 0x00, 0x00, 0x03,
		0x35, 0x03, 0x19, 0x00, 0x08,
		0x09, 0x00, 0x05,
		0x35, 0x03, 0x19, 0x10, 0x02,
		0x09, 0x00, 0x06,				// attribute 6
		0x35, 0x0f,
		0x0a, 0x00, 0x00, 0x65, 0x6e,
		0x0a, 0x00, 0x00, 0x00, 0x6a,
		0x0a,							// start of next part
		0x0a, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x6d, 0x00, 0x00 // continuation
		};
	testSdpReqL(test, requestdataU03a, sizeof(requestdataU03a), KServiceAttSearchRequest, responsedataU03a, sizeof(responsedataU03a), KServiceAttSearchResponse, DUMMTU);

	test.Printf(_L("UPF test 03 cont. "));
	TUint8 requestdataU03b[] = {
		0x35, 0x03, 0x19, 0x11, 0x05,	// UUID list
		0x00, 0x45,						// max byte count
		0x35, 0x05, 0x0a, 0x00, 0x00, 0xff, 0xff, // atttribute range
		0x0a, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x6d, 0x00, 0x00 // continuation
		};
	TUint8 responsedataU03b[] = {
		0x00, 0x28,						// this byte count
		0x00, 0x00, 0x01, 0x00,			// the rest of a continuation
		0x09, 0x00, 0x09, 
		0x35, 0x0a, 
		0x35, 0x08, 
		0x19, 0x11, 0x05, 
		0x0a, 0x00, 0x00, 0x01, 0x00,
		0x09, 0x01, 0x00,
		0x25, 0x10, 0x4f, 0x42, 0x45, 0x58, 0x20, 0x4f, 0x62, 0x6a, 0x65, 0x78, 0x74, 0x20, 0x50, 0x75, 0x73, 0x68,
		0x00
		};
	testSdpReqL(test, requestdataU03b, sizeof(requestdataU03b), KServiceAttSearchRequest, responsedataU03b, sizeof(responsedataU03b), KServiceAttSearchResponse, DUMMTU);

	test.Printf(_L("UPF test 04 "));
	TUint8 requestdataU04[] = {
		0x35, 0x03, 0x19, 0x12, 0x34,	// UUID list
		0x00, 0x03,						// max handles
		0x00							// continuation
		};
	TUint8 responsedataU04[] = {
		0x00, 0x00,						// total handle count
		0x00, 0x00,						// this handle count
										// no handle
		0x00							// continuation
		};
	testSdpReqL(test, requestdataU04, sizeof(requestdataU04), KServiceSearchRequest, responsedataU04, sizeof(responsedataU04), KServiceSearchResponse, DUMMTU);

	test.Printf(_L("UPF test 05 "));
	TUint8 requestdataU05[] = {
		0x12, 0x34, 0x56, 0x78,			// handle
		0x01, 0x00,						// max bytes
		0x35, 0x03,						// DES header attrib list
		0x09, 0x00, 0x06,				// attribute ID 0006
		0x00							// continuation
		};
	TUint8 responsedataU05[] = {
		0x00, 0x02						// error response
		};
	testSdpReqL(test, &requestdataU05[0], sizeof(requestdataU05), KAttributeRequest, &responsedataU05[0], sizeof(responsedataU05), KErrorResponse, 0x100);

	test.Printf(_L("UPF test 06 "));
	TUint8 requestdataU06[] = {
		0x35, 0x03, 0x19, 0x11, 0x11,	// UUID list
		0x00, 0x45,						// max byte count
		0x35, 0x03, 0x09, 0xab, 0xcd,	// non existent attrib
		0x00
		};
	TUint8 responsedataU06[] = {
		0x00, 0x02,						// this byte count
		0x35, 0x00, 
		0x00
		};
	testSdpReqL(test, requestdataU06, sizeof(requestdataU06), KServiceAttSearchRequest, responsedataU06, sizeof(responsedataU06), KServiceAttSearchResponse, DUMMTU);

// can't do this test - length is handled in ParseNextPacket - fails with wrong code
	test.Printf(_L("UPF test 07 (can't test) "));
	TUint8 requestdataU07[] = {
		0x00, 0x01, 0x00, 0x02,			// handle for OBEX
		0x01, 0x00,						// max bytes
		0x35, 0x03,						// DES header attrib list
		0x09, 0x00, 0x09,				// attribute ID 0009
		0x00							// continuation
		};
	TUint8 responsedataU07[] = {
		0x00, 0x02						// error response
		};
	testSdpReqL(test, &requestdataU07[0], 50, KAttributeRequest, &responsedataU07[0], sizeof(responsedataU07), KErrorResponse, DUMMTU);


	test.Printf(_L("UPF test 08 "));
	TUint8 requestdataU08[] = {
		0x35, 0x03, 0x09, 0x11, 0x11,	// UINT list instead of UUID list
		0x00, 0x45,						// max byte count
		0x35, 0x03, 0x09, 0x00, 0x09,	// non existent attrib
		0x00
		};
	TUint8 responsedataU08[] = {
		0x00, 0x03						// invalid request syntax
		};
	testSdpReqL(test, requestdataU08, sizeof(requestdataU08), KServiceAttSearchRequest, responsedataU08, sizeof(responsedataU08), KErrorResponse, DUMMTU);

	test.Printf(_L("UPF test 09 "));
	TUint8 requestdataU09[] = {
		0x35, 0x09,						// UUID list
		0x19, 0x11, 0x05,				// OBEX
		0x19, 0x00, 0x03,				// RFCOMM
		0x19, 0x01, 0x00,				// L2CAP
		0x00, 0x45,						// max byte count
		0x35, 0x03, 0x09, 0x00, 0x04,	// attrib 04
		0x00
		};
	TUint8 responsedataU09[] = {
		0x00, 0x1d,
		0x35, 0x1b,
		0x35, 0x19,
		0x09, 0x00, 0x04,
		0x35, 0x14,
		0x35, 0x03, 0x19, 0x01, 0x00,
		0x35, 0x08, 0x19, 0x00, 0x03, 0x0a, 0x00, 0x00, 0x00, 0x03,
		0x35, 0x03, 0x19, 0x00, 0x08,
		0x00
		};
	testSdpReqL(test, requestdataU09, sizeof(requestdataU09), KServiceAttSearchRequest, responsedataU09, sizeof(responsedataU09), KServiceAttSearchResponse, DUMMTU);

	test.Printf(_L("UPF test 10 "));
	TUint8 requestdataU10[] = {
		0x35, 0x03, 0x19, 0x00, 0x03,	// UUID list
		0x00, 0x02,						// max handles
		0x00							// continuation
		};
	TUint8 responsedataU10[] = {
		0x00, 0x02,						// total handle count
		0x00, 0x02,						// this handle count
		0x00, 0x01, 0x00, 0x00,			// handle
		0x00, 0x01, 0x00, 0x01,			// handle
		0x00							// continuation
		};
	testSdpReqL(test, &requestdataU10[0], sizeof(requestdataU10), KServiceSearchRequest, &responsedataU10[0], sizeof(responsedataU10), KServiceSearchResponse, DUMMTU);

	test.Printf(_L("UPF test 11 "));
	TUint8 requestdataU11[] = {
		0x00, 0x01, 0x00, 0x00,			// handle for system
		0x01, 0x00,						// max bytes
		0x35, 0x09,						// DES header attrib list
		0x09, 0x00, 0x06,				// attribute exists
		0x09, 0x00, 0x11,				// attribute doesn't exist
		0x09, 0x01, 0x00,				// attribute exists
		0x00							// continuation
		};
	TUint8 responsedataU11[] = {
		0x00, 0x2d,						//  response
		0x35, 0x2b,
		0x09, 0x00, 0x06,
		0x35, 0x0f, 0x0a, 0x00, 0x00, 0x65, 0x6e, 0x0a, 0x00, 0x00, 0x00, 0x6a, 0x0a, 0x00, 0x00, 0x01, 0x00,
		0x09, 0x01, 0x00,
		0x25, 0x12, 0x44, 0x69, 0x61, 0x6c, 0x2d, 0x75, 0x70, 0x20, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67,
		0x00
		};
	testSdpReqL(test, &requestdataU11[0], sizeof(requestdataU11), KAttributeRequest, &responsedataU11[0], sizeof(responsedataU11), KAttributeResponse, DUMMTU);

	test.Printf(_L("UPF test 12 (can't test)"));
	
//	CleanupStack::PopAndDestroy(/*CSdpReqHandler*/);
	delete gSdpTestDatabase;
	gSdpTestDatabase = 0;
	__UHEAP_MARKEND;
	test.End();
	}


void TestCL(RTest& test, CSdpDatabase *aDb)
	{
	test.Start(_L("Test C -- continuation stress test"));

	gSdpTestDatabase = aDb;
	gSdpTestDatabase->EncodeDbL();

	sdp_debug_level = 1;  // wind the noise down - this works
	test.Printf(_L("SS for KSdpContTestUUID\n"));
	TUint8 requestdata00a[] = {
		0x35, 0x03, 0x19, 0x01, 0x00,	// UUID list
		0xff, 0xff,						// max handles
		0x00							// continuation
		};

	TUint tCount = testSdpContL(test, requestdata00a, sizeof(requestdata00a), KServiceSearchRequest, /*TUint8* aRespData,*/ DUMMTU);
	test.Printf(_L("SS for KSdpContTestUUID %d continuations\n"), tCount);
	test.Getch();

	test.Printf(_L("AR for all attributes\n"));
	TUint8 requestdata01[] = {
		0x00, 0x00, 0x00, 0x00,			// handle
		0x01, 0x00,						// max bytes
		0x35, 0x05,						// DES header attrib list
		0x0a, 0x00, 0x00, 0xff, 0xff,	// attribute ID range 0000 to ffff
		0x00							// continuation
		};
	tCount = testSdpContL(test, requestdata01, sizeof(requestdata01), KAttributeRequest, /*TUint8* aRespData,*/ DUMMTU);
	test.Printf(_L("AR for all attributes, handle 00000000 %d continuations\n"), tCount);
	test.Getch();

	test.Printf(_L("AR for all attributes\n"));
	TUint8 requestdata02[] = {
		0x00, 0x01, 0x00, 0x00,			// handle
		0x01, 0x00,						// max bytes
		0x35, 0x05,						// DES header attrib list
		0x0a, 0x00, 0x00, 0xff, 0xff,	// attribute ID range 0000 to ffff
		0x00							// continuation
		};
	tCount = testSdpContL(test, requestdata02, sizeof(requestdata02), KAttributeRequest, /*TUint8* aRespData,*/ DUMMTU);
	test.Printf(_L("AR for all attributes, handle 00010000 %d continuations\n"), tCount);
	test.Getch();

	test.Printf(_L("AR for attribute 0004\n"));
	TUint8 requestdata03[] = {
		0x00, 0x01, 0x00, 0x00,			// handle
		0x01, 0x00,						// max bytes
		0x35, 0x03,						// DES header attrib list
		0x09, 0x00, 0x04,				// attribute ID 0004
		0x00							// continuation
		};
	tCount = testSdpContL(test, requestdata03, sizeof(requestdata03), KAttributeRequest, /*TUint8* aRespData,*/ DUMMTU);
	test.Printf(_L("AR for attribute 0004, handle 00010000 %d continuations\n"), tCount);
	test.Getch();

	test.Printf(_L("AR for all attributes\n"));
	TUint8 requestdata04[] = {
		0x00, 0x01, 0x00, 0x03e,		// handle
		0x01, 0x00,						// max bytes
		0x35, 0x05,						// DES header attrib list
		0x0a, 0x00, 0x00, 0xff, 0xff,	// attribute ID range 0000 to ffff
		0x00							// continuation
		};
	tCount = testSdpContL(test, requestdata04, sizeof(requestdata04), KAttributeRequest, /*TUint8* aRespData,*/ DUMMTU);
	test.Printf(_L("AR for all attributes, handle 0001003e %d continuations\n"), tCount);
	test.Getch();

	sdp_debug_level = 5;

	test.Printf(_L("SAS for all attributes\n"));
	TUint8 requestdata05[] = {
		0x35, 0x03, 0x19, 0x01, 0x00,	// UUID list
		0x01, 0x00,						// max byte count
		0x35, 0x05,						// DES header attrib list
		0x0a, 0x00, 0x00, 0xff, 0xff,	// attribute ID range 0000 to ffff
		0x00							// continuation
		};
	tCount = testSdpContL(test, requestdata05, sizeof(requestdata05), KServiceAttSearchRequest, /*TUint8* aRespData,*/ DUMMTU);
//	tCount = testSdpCont(test, requestdata05, sizeof(requestdata05), KServiceAttSearchRequest, /*TUint8* aRespData,*/ 102);
	test.Printf(_L("SAS for all attributes, %d continuations\n"), tCount);
	test.Getch();
	
//	CleanupStack::PopAndDestroy(/*CSdpReqHandler*/);
	delete gSdpTestDatabase;
	gSdpTestDatabase = 0;
	test.End();
	}