📄 t_gsdp.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 + -