Wire selftest, and passes all tests.
This commit is contained in:
parent
b6241f6cb1
commit
3c1a59fa24
2 changed files with 182 additions and 29 deletions
134
selftest.cpp
134
selftest.cpp
|
@ -646,6 +646,139 @@ static int testOther()
|
|||
return 0;
|
||||
}
|
||||
|
||||
#ifdef ZT_TEST_WIRE
|
||||
#define ZT_TEST_WIRE_NUM_UDP_PACKETS 10000
|
||||
#define ZT_TEST_WIRE_UDP_PACKET_SIZE 1000
|
||||
#define ZT_TEST_WIRE_NUM_VALID_TCP_CONNECTS 10
|
||||
#define ZT_TEST_WIRE_NUM_INVALID_TCP_CONNECTS 2
|
||||
#define ZT_TEST_WIRE_TCP_MESSAGE_SIZE 1000000
|
||||
#define ZT_TEST_WIRE_TIMEOUT_MS 20000
|
||||
static unsigned long wireTestUdpPacketCount = 0;
|
||||
static unsigned long wireTestTcpByteCount = 0;
|
||||
static unsigned long wireTestTcpConnectSuccessCount = 0;
|
||||
static unsigned long wireTestTcpConnectFailCount = 0;
|
||||
static unsigned long wireTestTcpAcceptCount = 0;
|
||||
static SimpleFunctionWire *testWireInstance = (SimpleFunctionWire *)0;
|
||||
static void testWireOnDatagramFunction(WireSocket *sock,void **uptr,const struct sockaddr *from,void *data,unsigned long len)
|
||||
{
|
||||
++wireTestUdpPacketCount;
|
||||
}
|
||||
static void testWireOnTcpConnectFunction(WireSocket *sock,void **uptr,bool success)
|
||||
{
|
||||
if (success) {
|
||||
++wireTestTcpConnectSuccessCount;
|
||||
} else {
|
||||
++wireTestTcpConnectFailCount;
|
||||
}
|
||||
}
|
||||
static void testWireOnTcpAcceptFunction(WireSocket *sockL,WireSocket *sockN,void **uptrL,void **uptrN,const struct sockaddr *from)
|
||||
{
|
||||
++wireTestTcpAcceptCount;
|
||||
*uptrN = new std::string(ZT_TEST_WIRE_TCP_MESSAGE_SIZE,(char)0xff);
|
||||
testWireInstance->tcpSetNotifyWritable(sockN,true);
|
||||
}
|
||||
static void testWireOnTcpCloseFunction(WireSocket *sock,void **uptr)
|
||||
{
|
||||
delete (std::string *)*uptr; // delete testMessage if any
|
||||
}
|
||||
static void testWireOnTcpDataFunction(WireSocket *sock,void **uptr,void *data,unsigned long len)
|
||||
{
|
||||
wireTestTcpByteCount += len;
|
||||
}
|
||||
static void testWireOnTcpWritableFunction(WireSocket *sock,void **uptr)
|
||||
{
|
||||
std::string *testMessage = (std::string *)*uptr;
|
||||
if ((testMessage)&&(testMessage->length() > 0)) {
|
||||
long sent = testWireInstance->tcpSend(sock,(const void *)testMessage->data(),testMessage->length(),true);
|
||||
if (sent > 0)
|
||||
testMessage->erase(0,sent);
|
||||
}
|
||||
if ((!testMessage)||(!testMessage->length())) {
|
||||
testWireInstance->close(sock,true);
|
||||
}
|
||||
}
|
||||
#endif // ZT_TEST_WIRE
|
||||
|
||||
static int testWire()
|
||||
{
|
||||
#ifdef ZT_TEST_WIRE
|
||||
char udpTestPayload[ZT_TEST_WIRE_UDP_PACKET_SIZE];
|
||||
memset(udpTestPayload,0xff,sizeof(udpTestPayload));
|
||||
|
||||
struct sockaddr_in bindaddr;
|
||||
memset(&bindaddr,0,sizeof(bindaddr));
|
||||
bindaddr.sin_family = AF_INET;
|
||||
bindaddr.sin_port = Utils::hton((uint16_t)60002);
|
||||
bindaddr.sin_addr.s_addr = Utils::hton((uint32_t)0x7f000001);
|
||||
struct sockaddr_in invalidAddr;
|
||||
memset(&bindaddr,0,sizeof(bindaddr));
|
||||
bindaddr.sin_family = AF_INET;
|
||||
bindaddr.sin_port = Utils::hton((uint16_t)60004);
|
||||
bindaddr.sin_addr.s_addr = Utils::hton((uint32_t)0x7f000001);
|
||||
|
||||
std::cout << "[wire] Creating wire endpoint..." << std::endl;
|
||||
testWireInstance = new SimpleFunctionWire(testWireOnDatagramFunction,testWireOnTcpConnectFunction,testWireOnTcpAcceptFunction,testWireOnTcpCloseFunction,testWireOnTcpDataFunction,testWireOnTcpWritableFunction,false);
|
||||
|
||||
std::cout << "[wire] Binding UDP listen socket to 127.0.0.1/60002... ";
|
||||
WireSocket *udpListenSock = testWireInstance->udpBind((const struct sockaddr *)&bindaddr);
|
||||
if (!udpListenSock) {
|
||||
std::cout << "FAILED." << std::endl;
|
||||
return -1;
|
||||
}
|
||||
std::cout << "OK" << std::endl;
|
||||
|
||||
std::cout << "[wire] Binding TCP listen socket to 127.0.0.1/60002... ";
|
||||
WireSocket *tcpListenSock = testWireInstance->tcpListen((const struct sockaddr *)&bindaddr);
|
||||
if (!tcpListenSock) {
|
||||
std::cout << "FAILED." << std::endl;
|
||||
return -1;
|
||||
}
|
||||
std::cout << "OK" << std::endl;
|
||||
|
||||
unsigned long wireTestUdpPacketsSent = 0;
|
||||
unsigned long wireTestTcpValidConnectionsAttempted = 0;
|
||||
unsigned long wireTestTcpInvalidConnectionsAttempted = 0;
|
||||
|
||||
std::cout << "[wire] Testing UDP send/receive... "; std::cout.flush();
|
||||
uint64_t timeoutAt = Utils::now() + ZT_TEST_WIRE_TIMEOUT_MS;
|
||||
while ((Utils::now() < timeoutAt)&&(wireTestUdpPacketCount < ZT_TEST_WIRE_NUM_UDP_PACKETS)) {
|
||||
if (wireTestUdpPacketsSent < ZT_TEST_WIRE_NUM_UDP_PACKETS) {
|
||||
if (!testWireInstance->udpSend(udpListenSock,(const struct sockaddr *)&bindaddr,udpTestPayload,sizeof(udpTestPayload))) {
|
||||
std::cout << "FAILED." << std::endl;
|
||||
return -1;
|
||||
} else ++wireTestUdpPacketsSent;
|
||||
}
|
||||
testWireInstance->poll(100);
|
||||
}
|
||||
std::cout << "got " << wireTestUdpPacketCount << " packets, OK" << std::endl;
|
||||
|
||||
std::cout << "[wire] Testing TCP... "; std::cout.flush();
|
||||
timeoutAt = Utils::now() + ZT_TEST_WIRE_TIMEOUT_MS;
|
||||
while ((Utils::now() < timeoutAt)&&(wireTestTcpByteCount < (ZT_TEST_WIRE_NUM_VALID_TCP_CONNECTS * ZT_TEST_WIRE_TCP_MESSAGE_SIZE))) {
|
||||
if (wireTestTcpValidConnectionsAttempted < ZT_TEST_WIRE_NUM_VALID_TCP_CONNECTS) {
|
||||
++wireTestTcpValidConnectionsAttempted;
|
||||
bool connected = false;
|
||||
if (!testWireInstance->tcpConnect((const struct sockaddr *)&bindaddr,connected,(void *)0,true))
|
||||
++wireTestTcpConnectFailCount;
|
||||
}
|
||||
if (wireTestTcpInvalidConnectionsAttempted < ZT_TEST_WIRE_NUM_INVALID_TCP_CONNECTS) {
|
||||
++wireTestTcpInvalidConnectionsAttempted;
|
||||
bool connected = false;
|
||||
if (!testWireInstance->tcpConnect((const struct sockaddr *)&invalidAddr,connected,(void *)0,true))
|
||||
++wireTestTcpConnectFailCount;
|
||||
}
|
||||
testWireInstance->poll(100);
|
||||
}
|
||||
if (wireTestTcpByteCount < (ZT_TEST_WIRE_NUM_VALID_TCP_CONNECTS * ZT_TEST_WIRE_TCP_MESSAGE_SIZE)) {
|
||||
std::cout << "got " << wireTestTcpConnectSuccessCount << " connect successes, " << wireTestTcpConnectFailCount << " failures, and " << wireTestTcpByteCount << " bytes, FAILED." << std::endl;
|
||||
return -1;
|
||||
} else {
|
||||
std::cout << "got " << wireTestTcpConnectSuccessCount << " connect successes, " << wireTestTcpConnectFailCount << " failures, and " << wireTestTcpByteCount << " bytes, OK" << std::endl;
|
||||
}
|
||||
#endif // ZT_TEST_WIRE
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int testSqliteNetconfMaster()
|
||||
{
|
||||
#ifdef ZT_ENABLE_NETCONF_MASTER
|
||||
|
@ -717,6 +850,7 @@ int main(int argc,char **argv)
|
|||
|
||||
srand((unsigned int)time(0));
|
||||
|
||||
r |= testWire();
|
||||
r |= testSqliteNetconfMaster();
|
||||
r |= testCrypto();
|
||||
r |= testHttp();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue