⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 t_gsdp.cpp

📁 《SymbianOSC手机应用开发》源码
💻 CPP
字号:
//
// Test code for the GSDP server
//

#include <e32std.h>
#include <e32test.h>
#include <f32file.h>

#include <ecom/ecom.h>
#include "gsdp.h"
#include "gdpbad.h"

#include <gdp.h>

RTest test(_L("GSDP Server tests"));

class CTestPacketHandler : public CBase, public MGsdpPacketHandler
	{
	void GsdpHandleL(const TDesC8& /*aData*/) {};
	};

class CLoopbackTest : public CBase, public MGsdpPacketHandler
	{
	void GsdpHandleL(const TDesC8& aData);
	};

class CQueueTest : public CBase, public MGsdpPacketHandler
	{
	void GsdpHandleL(const TDesC8& aData);
	TInt iState;
	};

void SetupTestsL()
	/**
	   Setup the environment for tests.
	*/
	{
	// Check that files are in the right places
	RFs fs;
	test(fs.Connect() == KErrNone);
	TInt err;
	TUint stat;
	err=fs.Att(_L("c:\\system\\libs\\plugins\\gdpbad.dll"), stat);
	if(err != KErrNotFound)
		{
		// Try to delete
		fs.Delete(_L("c:\\system\\libs\\plugins\\gdpbad.dll"));
		err=fs.Att(_L("c:\\system\\libs\\plugins\\gdpbad.dll"), stat);
		}

	test(err == KErrNotFound);
	err=fs.Att(_L("c:\\gdpbad.dll"), stat);
	test(err == KErrNone);
	err = fs.Att(_L("c:\\system\\libs\\plugins\\101f8b55.rsc"), stat);
	if(err != KErrNotFound)
		{
		// Try to delete
		fs.Delete(_L("c:\\system\\libs\\plugins\\101f8b55.rsc"));
		err=fs.Att(_L("c:\\system\\libs\\plugins\\101f8b55.rsc"), stat);
		}

	test(err == KErrNotFound);
	err = fs.Att(_L("c:\\101f8b55.rsc"), stat);
	test(err== KErrNone);

	fs.Close();
	}

void TestProtocolInfoL()
	/**
	   Test the protocol information query functions
	 */
	{
	test.Start(_L("Protocol query functions"));
	
	RGsdpSession session;
	__UHEAP_MARK;
	CTestPacketHandler* tph = new (ELeave) CTestPacketHandler;
	
	session.ConnectL(*tph);

	test.Next(_L("Test sharing session"));
	test(session.Share(RSessionBase::EAutoAttach) == KErrNone);

	TInt protos = session.CountGdpProtocols();
	test(protos >= 1);
	TInt i;
	TGdpProtocolInfo info;
	
	for(i=0; i< protos; i++)
		{
		test(session.GetGdpProtocolInfo(i, info) == KErrNone);
		test.Printf(_L("Proto %d:  Uid: 0x%08x  Name: %S\n"), i, info.iUid, &info.iDisplayName);
		if(info.iUid == KGdpLoopbackUid)
			{
			// Check the loopback details
			test(info.iDisplayName.Match(_L("Loopback")) == 0);
			test(info.iNetworked == 0);
			}
		}

	test.Next(_L("Info for invalid protocol"));
	test(session.GetGdpProtocolInfo(protos + 2, info) == KErrArgument);
	
	session.Close();
	delete tph;
	
	__UHEAP_MARKEND;
	test.End();
	}

void TestProtocolUpdateL()
	/**
	   Test the protocol updating functions
	 */
	{
	test.Start(_L("Protocol updating functions"));
	
	RGsdpSession session;
	__UHEAP_MARK;
	CTestPacketHandler* tph = new (ELeave) CTestPacketHandler;

	
	session.ConnectL(*tph);

	TInt protos = session.CountGdpProtocols();
	test(protos >= 1);
	TInt i;
	TGdpProtocolInfo info;
	
	for(i=0; i< protos; i++)
		{
		test(session.GetGdpProtocolInfo(i, info) == KErrNone);
		test.Printf(_L("Name: %S\n"), &info.iDisplayName);
		}

	test.Next(_L("Changing the protocol info\n"));

	RFs fs;
	test(fs.Connect() == KErrNone);
	CFileMan* fileman = CFileMan::NewL(fs);
	TInt err;
	err = fileman->Copy(_L("c:\\101f8b55.rsc"),
					   _L("c:\\system\\libs\\plugins\\101f8b55.rsc"));
	test(err == KErrNone);

	err = fileman->Copy(_L("c:\\gdpbad.dll"),
					   _L("c:\\system\\libs\\plugins\\gdpbad.dll"));

	test(err == KErrNone);
	delete fileman;
	fs.Close();

	// Wait for a bit
	REComSession ecom = REComSession::OpenL();
	TRequestStatus status;
	ecom.NotifyOnChange(status);
	User::WaitForRequest(status);
	test(status == KErrNone);
	
	// Check manually
	RImplInfoPtrArray imps;
	ecom.ListImplementationsL(KGdpProtocolImpl, imps);
	test(imps.Count() == protos+1);

	TInt nprotos = session.CountGdpProtocols();
	test(nprotos == protos+1);
	protos = nprotos;
	
	for(i=0; i< protos; i++)
		{
		test(session.GetGdpProtocolInfo(i, info) == KErrNone);
		test.Printf(_L("Name: %S\n"), &info.iDisplayName);
		}
	ecom.Close();
	imps.ResetAndDestroy();
	session.Close();
	delete tph;
	
	__UHEAP_MARKEND;
	test.End();
	}

void TestProtocolSelectL()
	{
	test.Start(_L("Protocol selection"));

	RGsdpSession session;
	__UHEAP_MARK;
	CTestPacketHandler* tph = new (ELeave) CTestPacketHandler;
	
	session.ConnectL(*tph);

	test.Next(_L("Select loopback protocol"));
	test(session.SetGdpProtocol(KGdpLoopbackUid) == KErrNone);
	test(session.GetGdpProtocol() == KGdpLoopbackUid);
	test(session.GdpIsNetworked() == EFalse);

	for(TInt i=0; i < session.CountGdpProtocols(); i++)
		{
		TGdpProtocolInfo info;
		test(session.GetGdpProtocolInfo(i, info) == KErrNone);
		if(info.iUid != KGdpEvilUid)
			{
			TInt err=session.SetGdpProtocol(info.iUid);
			if(err == KErrNone)
				{
				test(session.GetGdpProtocol() == info.iUid);
				test(session.GdpIsNetworked() == info.iNetworked);
				}
			}
		else
			{
			test(session.SetGdpProtocol(info.iUid) == KErrNotSupported);
			}
		}
		
	session.Close();
	delete tph;
	__UHEAP_MARKEND;
	test.End();
	}

void CLoopbackTest::GsdpHandleL(const TDesC8& aData)
	{
	test(aData.Compare(_L8("ABCDEFGHIJKLMNOPQRSTUVWXYZ")) == 0);
	test(aData.Compare(_L8("0123456789")) == 0);
	}


void TestLoopbackL()
	{
	test.Start(_L("Loopback test"));
	RGsdpSession session;
	CLoopbackTest* tph = new (ELeave) CLoopbackTest;

	session.ConnectL(*tph);

	test.Next(_L("Load loopback"));
	test(session.SetGdpProtocol(KGdpLoopbackUid) == KErrNone);

	session.SetGameProtocol(1);
	test(session.GetGameProtocol() == 1);
	session.SetMyPort(3);
	test(session.GetMyPort() == 3);
	session.SetOtherAddress(_L8("Loopback"));
	TBuf8<20> buf;
	session.GetOtherAddress(buf);
	test(buf.Compare(_L8("Loopback")) == 0);
	session.SetOtherPort(2);
	test(session.GetOtherPort() == 2);

	// Now start the sending
	session.Send(_L8("ABCDEFGHIJKLMNOPQRSTUVWXYZ"));
	session.Send(_L8("0123456789"));
	delete tph;
	session.Close();
	test.End();
	}

void CQueueTest::GsdpHandleL(const TDesC8& aData)
	{
	switch(iState)
		{
		// 5 packets back to back
	case 0:
		test(aData.Compare(_L8("0")) == 0);
		iState++;
		break;
	case 1:
		test(aData.Compare(_L8("01")) == 0);
		iState++;
		break;
	case 2:
		test(aData.Compare(_L8("012")) == 0);
		iState++;
		break;
	case 3:
		test(aData.Compare(_L8("0123")) == 0);
		iState++;
		break;
	case 4:
		test(aData.Compare(_L8("01234")) == 0);
		iState++;
		break;
		
		// Overflow
	case 5:
	case 6:
	case 7:
	case 8:
	case 9:
	case 10:
	case 11:
	case 12:
	case 13:
	case 14:
		test(aData.Length() == iState);
		iState++;
		break;
		// Should now be after the overflow
	case 15:
		test(aData.Compare(_L8("Now OK")) == 0);
		iState++;
		break;
	default:
		test(EFalse);
		break;
		}
	}

void TestQueuesL()
	{
	test.Start(_L("Queueing test"));
	RGsdpSession session;
	CQueueTest* tph = new (ELeave) CQueueTest;
	TInt err;


	session.ConnectL(*tph);

	test.Getch();
	err=session.SetGdpProtocol(TUid::Uid(0x101f8b5a));

	test(err == KErrNone);
	session.SetOtherAddress(_L8("Queue"));
	session.SetOtherPort(23);
	session.SetMyPort(session.AllocMyNextPort());
	session.SetGameProtocol(10);

	// First, send 5 packets back-to-back
	TInt i;
	TBuf8<20> data;
	for(i=0;i<5;i++)
		{
		data.AppendNum(i);
		session.Send(data);
		}
	
	// Now enough packets to overflow the Q
	// depends on Q having 10 slots
	data.Zero();
	for(i=0;i<12;i++)
		{
		data.AppendNum(i);
		session.Send(data);
		}

	data = _L8("Now OK");
	session.Send(data);
	
	session.Close();
	delete tph;
	test.End();
	}

/*
  Scaffolding class to run the tests under an active scheduler
*/

class CTester : public CActive
	{
public:
	CTester() : CActive(EPriorityLow) {CActiveScheduler::Add(this);};
	void RunL();
	void DoCancel();
	void NextTest();
	TInt RunError(TInt aErr);
private:
	enum TTests
		{
		ESetupTests = 1,
		EQueue,
		EProtocolQuery,
		EProtocolSelect,
		ELoopback,
		EProtocolUpdates
		};
	TTests iState;
	};

void CTester::RunL()
	{
	switch(iState)
		{
	case ESetupTests:
		SetupTestsL();
		break;
	case EQueue:
		TestQueuesL();
		break;
	case EProtocolUpdates:
		TestProtocolUpdateL();
		break;
	case EProtocolQuery:
		TestProtocolInfoL();
		break;
	case EProtocolSelect:
		TestProtocolSelectL();
		break;
	case ELoopback:
		TestLoopbackL();
		break;
		
	default:
		CActiveScheduler::Stop();
		break;
		}
	
	NextTest();
	}

void CTester::NextTest()
	{
	iState = (TTests)(iState+1);

	TRequestStatus* p = &iStatus;
	User::RequestComplete(p, KErrNone);
	SetActive();
	}

TInt CTester::RunError(TInt aErr)
	{
	// One of the tests left - print error message
	test.Printf(_L("Error:  Leave in Test %d - error %d"), iState, aErr);
	return aErr;
	}



void CTester::DoCancel()
	{
	// Nothing to do here!
	}



TInt E32Main()
	{
	test.Start(_L("GSDP server tests"));
	
	CTrapCleanup* cleanup=CTrapCleanup::New();
	test(cleanup != 0);
	CActiveScheduler* sched = new CActiveScheduler();
	test(sched != 0);
	CActiveScheduler::Install(sched);
	CTester* tester = new CTester;
	test(tester != 0);
	tester->NextTest();

	CActiveScheduler::Start();
	
	delete cleanup;
	delete sched;

	test.Printf(_L("Press a key"));
	test.Getch();
	return KErrNone;
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -