9a24efbe4defba67d7fd702128f4afd13efd7b8bvboxsync/*******************************************************************************
9a24efbe4defba67d7fd702128f4afd13efd7b8bvboxsync* Global Variables *
9a24efbe4defba67d7fd702128f4afd13efd7b8bvboxsync*******************************************************************************/
b34bbc1afcc3a1d2bfbb9814f95a965abd8563e2vboxsync/* * * * * * * * Test 3 * * * * * * * */
b34bbc1afcc3a1d2bfbb9814f95a965abd8563e2vboxsyncstatic DECLCALLBACK(int) test3Server(RTSOCKET hSocket, void *pvUser)
b34bbc1afcc3a1d2bfbb9814f95a965abd8563e2vboxsync /* say hello */
b34bbc1afcc3a1d2bfbb9814f95a965abd8563e2vboxsync RTTESTI_CHECK_RC_RET(RTTcpWrite(hSocket, "hello\n", sizeof("hello\n") - 1), VINF_SUCCESS, VERR_TCP_SERVER_STOP);
b34bbc1afcc3a1d2bfbb9814f95a965abd8563e2vboxsync RTTESTI_CHECK_RC_RET(RTTcpRead(hSocket, szBuf, sizeof("dude!\n") - 1, NULL), VINF_SUCCESS, VERR_TCP_SERVER_STOP);
b34bbc1afcc3a1d2bfbb9814f95a965abd8563e2vboxsync RTTESTI_CHECK_RET(strcmp(szBuf, "dude!\n") == 0, VERR_TCP_SERVER_STOP);
b34bbc1afcc3a1d2bfbb9814f95a965abd8563e2vboxsync /* Send ~20 MB of data that the client receives while trying to disconnect. */
b34bbc1afcc3a1d2bfbb9814f95a965abd8563e2vboxsync RTTESTI_CHECK_RC_RET(RTTcpWrite(hSocket, szBuf, sizeof(szBuf)), VINF_SUCCESS, VERR_TCP_SERVER_STOP);
b34bbc1afcc3a1d2bfbb9814f95a965abd8563e2vboxsync for (unsigned i = 0; i < 100 && cStartErrors == RTTestErrorCount(g_hTest); i++)
e99cdffa1ee7d0d0451908d60a5d2faa124f14e9vboxsync int rc = RTTcpServerCreate("localhost", 9999, RTTHREADTYPE_DEFAULT, "server-2", test3Server, NULL, &pServer);
e99cdffa1ee7d0d0451908d60a5d2faa124f14e9vboxsync /** @todo testboxsh1 occationally hits this for some stupid reason. i=21 in
e99cdffa1ee7d0d0451908d60a5d2faa124f14e9vboxsync * one occurrence. Fudge a bit for now and see if it helps. */
e99cdffa1ee7d0d0451908d60a5d2faa124f14e9vboxsync rc = RTTcpServerCreate("localhost", 9999, RTTHREADTYPE_DEFAULT, "server-2", test3Server, NULL, &pServer);
a5c7010d7b20deb9d71dbdc64bb34fdb16ea1124vboxsync RTTestIFailed("RTTcpServerCreate -> %Rrc, i=%d", rc, i);
b34bbc1afcc3a1d2bfbb9814f95a965abd8563e2vboxsync RTTESTI_CHECK_RC(rc = RTTcpClientConnect("localhost", 9999, &hSocket), VINF_SUCCESS);
b34bbc1afcc3a1d2bfbb9814f95a965abd8563e2vboxsync do /* break non-loop */
b34bbc1afcc3a1d2bfbb9814f95a965abd8563e2vboxsync RTTESTI_CHECK_RC_BREAK(RTTcpRead(hSocket, szBuf, sizeof("hello\n") - 1, NULL), VINF_SUCCESS);
b34bbc1afcc3a1d2bfbb9814f95a965abd8563e2vboxsync RTTESTI_CHECK_BREAK(strcmp(szBuf, "hello\n") == 0);
b34bbc1afcc3a1d2bfbb9814f95a965abd8563e2vboxsync RTTESTI_CHECK_RC_BREAK(RTTcpWrite(hSocket, "dude!\n", sizeof("dude!\n") - 1), VINF_SUCCESS);
b34bbc1afcc3a1d2bfbb9814f95a965abd8563e2vboxsync } while (0);
b34bbc1afcc3a1d2bfbb9814f95a965abd8563e2vboxsync RTTESTI_CHECK_RC(RTTcpClientClose(hSocket), VINF_SUCCESS);
b34bbc1afcc3a1d2bfbb9814f95a965abd8563e2vboxsync RTTESTI_CHECK_RC(RTTcpServerDestroy(pServer), VINF_SUCCESS);
b34bbc1afcc3a1d2bfbb9814f95a965abd8563e2vboxsync/* * * * * * * * Test 2 * * * * * * * */
9a24efbe4defba67d7fd702128f4afd13efd7b8bvboxsyncstatic DECLCALLBACK(int) test2Server(RTSOCKET hSocket, void *pvUser)
9a24efbe4defba67d7fd702128f4afd13efd7b8bvboxsync /* say hello */
9a24efbe4defba67d7fd702128f4afd13efd7b8bvboxsync RTTESTI_CHECK_RC_RET(RTTcpWrite(hSocket, "hello\n", sizeof("hello\n") - 1), VINF_SUCCESS, VERR_TCP_SERVER_STOP);
9a24efbe4defba67d7fd702128f4afd13efd7b8bvboxsync RTTESTI_CHECK_RC_RET(RTTcpRead(hSocket, szBuf, sizeof("dude!\n") - 1, NULL), VINF_SUCCESS, VERR_TCP_SERVER_STOP);
9a24efbe4defba67d7fd702128f4afd13efd7b8bvboxsync RTTESTI_CHECK_RET(strcmp(szBuf, "dude!\n") == 0, VERR_TCP_SERVER_STOP);
9a24efbe4defba67d7fd702128f4afd13efd7b8bvboxsync /* wait for a goodbye which doesn't arrive. */
9a24efbe4defba67d7fd702128f4afd13efd7b8bvboxsync RTTESTI_CHECK_RC_RET(RTTcpRead(hSocket, szBuf, sizeof("byebye\n") - 1, NULL), VERR_NET_SHUTDOWN, VERR_TCP_SERVER_STOP);
9a24efbe4defba67d7fd702128f4afd13efd7b8bvboxsync RTTESTI_CHECK_RC_RETV(RTTcpServerCreate("localhost", 9999, RTTHREADTYPE_DEFAULT, "server-2",
9a24efbe4defba67d7fd702128f4afd13efd7b8bvboxsync RTTESTI_CHECK_RC(rc = RTTcpClientConnect("localhost", 9999, &hSocket), VINF_SUCCESS);
9a24efbe4defba67d7fd702128f4afd13efd7b8bvboxsync do /* break non-loop */
9a24efbe4defba67d7fd702128f4afd13efd7b8bvboxsync RTTESTI_CHECK_RC_BREAK(RTTcpRead(hSocket, szBuf, sizeof("hello\n") - 1, NULL), VINF_SUCCESS);
9a24efbe4defba67d7fd702128f4afd13efd7b8bvboxsync RTTESTI_CHECK_BREAK(strcmp(szBuf, "hello\n") == 0);
9a24efbe4defba67d7fd702128f4afd13efd7b8bvboxsync RTTESTI_CHECK_RC_BREAK(RTTcpWrite(hSocket, "dude!\n", sizeof("dude!\n") - 1), VINF_SUCCESS);
9a24efbe4defba67d7fd702128f4afd13efd7b8bvboxsync } while (0);
9a24efbe4defba67d7fd702128f4afd13efd7b8bvboxsync RTTESTI_CHECK_RC(RTTcpClientClose(hSocket), VINF_SUCCESS);
9a24efbe4defba67d7fd702128f4afd13efd7b8bvboxsync RTTESTI_CHECK_RC(RTTcpServerDestroy(pServer), VINF_SUCCESS);
b34bbc1afcc3a1d2bfbb9814f95a965abd8563e2vboxsync/* * * * * * * * Test 1 * * * * * * * */
9a24efbe4defba67d7fd702128f4afd13efd7b8bvboxsyncstatic DECLCALLBACK(int) test1Server(RTSOCKET hSocket, void *pvUser)
9a24efbe4defba67d7fd702128f4afd13efd7b8bvboxsync RTTESTI_CHECK_RET(pvUser == NULL, VERR_TCP_SERVER_STOP);
9a24efbe4defba67d7fd702128f4afd13efd7b8bvboxsync /* say hello */
9a24efbe4defba67d7fd702128f4afd13efd7b8bvboxsync RTTESTI_CHECK_RC_RET(RTTcpWrite(hSocket, "hello\n", sizeof("hello\n") - 1), VINF_SUCCESS, VERR_TCP_SERVER_STOP);
9a24efbe4defba67d7fd702128f4afd13efd7b8bvboxsync RTTESTI_CHECK_RC_RET(RTTcpRead(hSocket, szBuf, sizeof("dude!\n") - 1, NULL), VINF_SUCCESS, VERR_TCP_SERVER_STOP);
9a24efbe4defba67d7fd702128f4afd13efd7b8bvboxsync RTTESTI_CHECK_RET(strcmp(szBuf, "dude!\n") == 0, VERR_TCP_SERVER_STOP);
9a24efbe4defba67d7fd702128f4afd13efd7b8bvboxsync /* say goodbye */
9a24efbe4defba67d7fd702128f4afd13efd7b8bvboxsync RTTESTI_CHECK_RC_RET(RTTcpRead(hSocket, szBuf, sizeof("byebye\n") - 1, NULL), VINF_SUCCESS, VERR_TCP_SERVER_STOP);
9a24efbe4defba67d7fd702128f4afd13efd7b8bvboxsync RTTESTI_CHECK_RET(strcmp(szBuf, "byebye\n") == 0, VERR_TCP_SERVER_STOP);
9a24efbe4defba67d7fd702128f4afd13efd7b8bvboxsync RTTESTI_CHECK_RC_RET(RTTcpWrite(hSocket, "bye\n", sizeof("bye\n") - 1), VINF_SUCCESS, VERR_TCP_SERVER_STOP);
9a24efbe4defba67d7fd702128f4afd13efd7b8bvboxsync RTTESTI_CHECK_RC_RETV(RTTcpServerCreate("localhost", 9999, RTTHREADTYPE_DEFAULT, "server-1",
9a24efbe4defba67d7fd702128f4afd13efd7b8bvboxsync RTTESTI_CHECK_RC(rc = RTTcpClientConnect("localhost", 9999, &hSocket), VINF_SUCCESS);
9a24efbe4defba67d7fd702128f4afd13efd7b8bvboxsync do /* break non-loop */
9a24efbe4defba67d7fd702128f4afd13efd7b8bvboxsync RTTESTI_CHECK_RC_BREAK(RTTcpRead(hSocket, szBuf, sizeof("hello\n") - 1, NULL), VINF_SUCCESS);
9a24efbe4defba67d7fd702128f4afd13efd7b8bvboxsync RTTESTI_CHECK_BREAK(strcmp(szBuf, "hello\n") == 0);
9a24efbe4defba67d7fd702128f4afd13efd7b8bvboxsync RTTESTI_CHECK_RC_BREAK(RTTcpWrite(hSocket, "dude!\n", sizeof("dude!\n") - 1), VINF_SUCCESS);
9a24efbe4defba67d7fd702128f4afd13efd7b8bvboxsync RTTESTI_CHECK_RC_BREAK(RTTcpWrite(hSocket, "byebye\n", sizeof("byebye\n") - 1), VINF_SUCCESS);
9a24efbe4defba67d7fd702128f4afd13efd7b8bvboxsync RTTESTI_CHECK_RC_BREAK(RTTcpRead(hSocket, szBuf, sizeof("bye\n") - 1, NULL), VINF_SUCCESS);
9a24efbe4defba67d7fd702128f4afd13efd7b8bvboxsync } while (0);
9a24efbe4defba67d7fd702128f4afd13efd7b8bvboxsync RTTESTI_CHECK_RC(RTTcpClientClose(hSocket), VINF_SUCCESS);
9a24efbe4defba67d7fd702128f4afd13efd7b8bvboxsync RTTESTI_CHECK_RC(RTTcpServerDestroy(pServer), VINF_SUCCESS);
9a24efbe4defba67d7fd702128f4afd13efd7b8bvboxsync RTEXITCODE rcExit = RTTestInitAndCreate("tstRTTcp-1", &g_hTest);
9a24efbe4defba67d7fd702128f4afd13efd7b8bvboxsync /** @todo test the full RTTcp API. */