tstRTTcp-1.cpp revision a5c7010d7b20deb9d71dbdc64bb34fdb16ea1124
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync#include <iprt/tcp.h>
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync#include <iprt/string.h>
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync#include <iprt/test.h>
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync/*******************************************************************************
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync* Global Variables *
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync*******************************************************************************/
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncstatic RTTEST g_hTest;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync/* * * * * * * * Test 3 * * * * * * * */
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncstatic DECLCALLBACK(int) test3Server(RTSOCKET hSocket, void *pvUser)
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync{
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTestSetDefault(g_hTest, NULL);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync char szBuf[4096];
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync /* say hello */
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC_RET(RTTcpWrite(hSocket, "hello\n", sizeof("hello\n") - 1), VINF_SUCCESS, VERR_TCP_SERVER_STOP);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RT_ZERO(szBuf);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC_RET(RTTcpRead(hSocket, szBuf, sizeof("dude!\n") - 1, NULL), VINF_SUCCESS, VERR_TCP_SERVER_STOP);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync szBuf[sizeof("dude!\n") - 1] = '\0';
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RET(strcmp(szBuf, "dude!\n") == 0, VERR_TCP_SERVER_STOP);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync /* Send ~20 MB of data that the client receives while trying to disconnect. */
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RT_ZERO(szBuf);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync size_t cbSent = 0;
8302394f164acb4adb187954f6ac8ef7a9efa629vboxsync while (cbSent < 20 * _1M)
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync {
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC_RET(RTTcpWrite(hSocket, szBuf, sizeof(szBuf)), VINF_SUCCESS, VERR_TCP_SERVER_STOP);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync cbSent += sizeof(szBuf);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync }
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync return VERR_TCP_SERVER_STOP;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync}
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncvoid test3()
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync{
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTestSub(g_hTest, "Graceful disconnect");
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync uint32_t cStartErrors = RTTestErrorCount(g_hTest);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync for (unsigned i = 0; i < 100 && cStartErrors == RTTestErrorCount(g_hTest); i++)
8302394f164acb4adb187954f6ac8ef7a9efa629vboxsync {
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync PRTTCPSERVER pServer;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync int rc = RTTcpServerCreate("localhost", 9999, RTTHREADTYPE_DEFAULT, "server-2",
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync test3Server, NULL, &pServer);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync if (rc != VINF_SUCCESS)
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync {
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTestIFailed("RTTcpServerCreate -> %Rrc, i=%d", rc, i);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync return;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync }
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTSOCKET hSocket;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(rc = RTTcpClientConnect("localhost", 9999, &hSocket), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync if (RT_SUCCESS(rc))
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync {
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync char szBuf[512];
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RT_ZERO(szBuf);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync do /* break non-loop */
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync {
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC_BREAK(RTTcpRead(hSocket, szBuf, sizeof("hello\n") - 1, NULL), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_BREAK(strcmp(szBuf, "hello\n") == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC_BREAK(RTTcpWrite(hSocket, "dude!\n", sizeof("dude!\n") - 1), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync } while (0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTTcpClientClose(hSocket), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync }
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTTcpServerDestroy(pServer), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync }
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync}
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync/* * * * * * * * Test 2 * * * * * * * */
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsyncstatic DECLCALLBACK(int) test2Server(RTSOCKET hSocket, void *pvUser)
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync{
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync RTTestSetDefault(g_hTest, NULL);
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync char szBuf[512];
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync /* say hello */
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync RTTESTI_CHECK_RC_RET(RTTcpWrite(hSocket, "hello\n", sizeof("hello\n") - 1), VINF_SUCCESS, VERR_TCP_SERVER_STOP);
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync RT_ZERO(szBuf);
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync RTTESTI_CHECK_RC_RET(RTTcpRead(hSocket, szBuf, sizeof("dude!\n") - 1, NULL), VINF_SUCCESS, VERR_TCP_SERVER_STOP);
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync szBuf[sizeof("dude!\n") - 1] = '\0';
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync RTTESTI_CHECK_RET(strcmp(szBuf, "dude!\n") == 0, VERR_TCP_SERVER_STOP);
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync /* wait for a goodbye which doesn't arrive. */
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync RT_ZERO(szBuf);
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync RTTESTI_CHECK_RC_RET(RTTcpRead(hSocket, szBuf, sizeof("byebye\n") - 1, NULL), VERR_NET_SHUTDOWN, VERR_TCP_SERVER_STOP);
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync return VERR_TCP_SERVER_STOP;
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync}
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsyncvoid test2()
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync{
74f7805911fff84c2dec0fb3b727ef9ddc4df8b0vboxsync RTTestSub(g_hTest, "Rude client");
74f7805911fff84c2dec0fb3b727ef9ddc4df8b0vboxsync
74f7805911fff84c2dec0fb3b727ef9ddc4df8b0vboxsync PRTTCPSERVER pServer;
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync RTTESTI_CHECK_RC_RETV(RTTcpServerCreate("localhost", 9999, RTTHREADTYPE_DEFAULT, "server-2",
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync test2Server, NULL, &pServer), VINF_SUCCESS);
74f7805911fff84c2dec0fb3b727ef9ddc4df8b0vboxsync
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync int rc;
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync RTSOCKET hSocket;
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync RTTESTI_CHECK_RC(rc = RTTcpClientConnect("localhost", 9999, &hSocket), VINF_SUCCESS);
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync if (RT_SUCCESS(rc))
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync {
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync char szBuf[512];
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync RT_ZERO(szBuf);
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync do /* break non-loop */
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync {
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync RTTESTI_CHECK_RC_BREAK(RTTcpRead(hSocket, szBuf, sizeof("hello\n") - 1, NULL), VINF_SUCCESS);
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync RTTESTI_CHECK_BREAK(strcmp(szBuf, "hello\n") == 0);
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync RTTESTI_CHECK_RC_BREAK(RTTcpWrite(hSocket, "dude!\n", sizeof("dude!\n") - 1), VINF_SUCCESS);
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync } while (0);
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync RTTESTI_CHECK_RC(RTTcpClientClose(hSocket), VINF_SUCCESS);
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync }
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync
8302394f164acb4adb187954f6ac8ef7a9efa629vboxsync RTTESTI_CHECK_RC(RTTcpServerDestroy(pServer), VINF_SUCCESS);
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync}
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync/* * * * * * * * Test 1 * * * * * * * */
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsyncstatic DECLCALLBACK(int) test1Server(RTSOCKET hSocket, void *pvUser)
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync{
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync RTTestSetDefault(g_hTest, NULL);
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync
0b8ed19cf8df49d6fcd144b43ae4af5c21316ce9vboxsync char szBuf[512];
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync RTTESTI_CHECK_RET(pvUser == NULL, VERR_TCP_SERVER_STOP);
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync /* say hello */
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync RTTESTI_CHECK_RC_RET(RTTcpWrite(hSocket, "hello\n", sizeof("hello\n") - 1), VINF_SUCCESS, VERR_TCP_SERVER_STOP);
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync RTTESTI_CHECK_RC_RET(RTTcpRead(hSocket, szBuf, sizeof("dude!\n") - 1, NULL), VINF_SUCCESS, VERR_TCP_SERVER_STOP);
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync szBuf[sizeof("dude!\n") - 1] = '\0';
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync RTTESTI_CHECK_RET(strcmp(szBuf, "dude!\n") == 0, VERR_TCP_SERVER_STOP);
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync /* say goodbye */
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync RTTESTI_CHECK_RC_RET(RTTcpRead(hSocket, szBuf, sizeof("byebye\n") - 1, NULL), VINF_SUCCESS, VERR_TCP_SERVER_STOP);
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync szBuf[sizeof("byebye\n") - 1] = '\0';
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync RTTESTI_CHECK_RET(strcmp(szBuf, "byebye\n") == 0, VERR_TCP_SERVER_STOP);
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync RTTESTI_CHECK_RC_RET(RTTcpWrite(hSocket, "bye\n", sizeof("bye\n") - 1), VINF_SUCCESS, VERR_TCP_SERVER_STOP);
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync return VERR_TCP_SERVER_STOP;
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync}
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsyncvoid test1()
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync{
d1e6154d21dcc739e31ac7d8b139ee0fdfe60d45vboxsync RTTestSub(g_hTest, "Simple server-client setup");
a60be2c64ea23bb7ce4c9998bcd541c4db879fbavboxsync
a60be2c64ea23bb7ce4c9998bcd541c4db879fbavboxsync PRTTCPSERVER pServer;
a60be2c64ea23bb7ce4c9998bcd541c4db879fbavboxsync RTTESTI_CHECK_RC_RETV(RTTcpServerCreate("localhost", 9999, RTTHREADTYPE_DEFAULT, "server-1",
a60be2c64ea23bb7ce4c9998bcd541c4db879fbavboxsync test1Server, NULL, &pServer), VINF_SUCCESS);
a60be2c64ea23bb7ce4c9998bcd541c4db879fbavboxsync
a60be2c64ea23bb7ce4c9998bcd541c4db879fbavboxsync int rc;
a60be2c64ea23bb7ce4c9998bcd541c4db879fbavboxsync RTSOCKET hSocket;
a60be2c64ea23bb7ce4c9998bcd541c4db879fbavboxsync RTTESTI_CHECK_RC(rc = RTTcpClientConnect("localhost", 9999, &hSocket), VINF_SUCCESS);
a60be2c64ea23bb7ce4c9998bcd541c4db879fbavboxsync if (RT_SUCCESS(rc))
{
do /* break non-loop */
{
char szBuf[512];
RT_ZERO(szBuf);
RTTESTI_CHECK_RC_BREAK(RTTcpRead(hSocket, szBuf, sizeof("hello\n") - 1, NULL), VINF_SUCCESS);
RTTESTI_CHECK_BREAK(strcmp(szBuf, "hello\n") == 0);
RTTESTI_CHECK_RC_BREAK(RTTcpWrite(hSocket, "dude!\n", sizeof("dude!\n") - 1), VINF_SUCCESS);
RTTESTI_CHECK_RC_BREAK(RTTcpWrite(hSocket, "byebye\n", sizeof("byebye\n") - 1), VINF_SUCCESS);
RT_ZERO(szBuf);
RTTESTI_CHECK_RC_BREAK(RTTcpRead(hSocket, szBuf, sizeof("bye\n") - 1, NULL), VINF_SUCCESS);
RTTESTI_CHECK_BREAK(strcmp(szBuf, "bye\n") == 0);
} while (0);
RTTESTI_CHECK_RC(RTTcpClientClose(hSocket), VINF_SUCCESS);
}
RTTESTI_CHECK_RC(RTTcpServerDestroy(pServer), VINF_SUCCESS);
}
int main()
{
RTEXITCODE rcExit = RTTestInitAndCreate("tstRTTcp-1", &g_hTest);
if (rcExit != RTEXITCODE_SUCCESS)
return rcExit;
RTTestBanner(g_hTest);
test1();
test2();
test3();
/** @todo test the full RTTcp API. */
return RTTestSummaryAndDestroy(g_hTest);
}