1 | #include <iprt/tcp.h>
|
---|
2 |
|
---|
3 | #include <iprt/string.h>
|
---|
4 | #include <iprt/test.h>
|
---|
5 |
|
---|
6 |
|
---|
7 | /*******************************************************************************
|
---|
8 | * Global Variables *
|
---|
9 | *******************************************************************************/
|
---|
10 | static RTTEST g_hTest;
|
---|
11 |
|
---|
12 |
|
---|
13 | static DECLCALLBACK(int) test2Server(RTSOCKET hSocket, void *pvUser)
|
---|
14 | {
|
---|
15 | RTTestSetDefault(g_hTest, NULL);
|
---|
16 | char szBuf[512];
|
---|
17 |
|
---|
18 | /* say hello */
|
---|
19 | RTTESTI_CHECK_RC_RET(RTTcpWrite(hSocket, "hello\n", sizeof("hello\n") - 1), VINF_SUCCESS, VERR_TCP_SERVER_STOP);
|
---|
20 | RT_ZERO(szBuf);
|
---|
21 | RTTESTI_CHECK_RC_RET(RTTcpRead(hSocket, szBuf, sizeof("dude!\n") - 1, NULL), VINF_SUCCESS, VERR_TCP_SERVER_STOP);
|
---|
22 | szBuf[sizeof("dude!\n") - 1] = '\0';
|
---|
23 | RTTESTI_CHECK_RET(strcmp(szBuf, "dude!\n") == 0, VERR_TCP_SERVER_STOP);
|
---|
24 |
|
---|
25 | /* wait for a goodbye which doesn't arrive. */
|
---|
26 | RT_ZERO(szBuf);
|
---|
27 | RTTESTI_CHECK_RC_RET(RTTcpRead(hSocket, szBuf, sizeof("byebye\n") - 1, NULL), VERR_NET_SHUTDOWN, VERR_TCP_SERVER_STOP);
|
---|
28 |
|
---|
29 | return VERR_TCP_SERVER_STOP;
|
---|
30 | }
|
---|
31 |
|
---|
32 |
|
---|
33 | void test2()
|
---|
34 | {
|
---|
35 | RTTestSub(g_hTest, "Rude client");
|
---|
36 |
|
---|
37 | PRTTCPSERVER pServer;
|
---|
38 | RTTESTI_CHECK_RC_RETV(RTTcpServerCreate("localhost", 9999, RTTHREADTYPE_DEFAULT, "server-2",
|
---|
39 | test2Server, NULL, &pServer), VINF_SUCCESS);
|
---|
40 |
|
---|
41 | int rc;
|
---|
42 | RTSOCKET hSocket;
|
---|
43 | RTTESTI_CHECK_RC(rc = RTTcpClientConnect("localhost", 9999, &hSocket), VINF_SUCCESS);
|
---|
44 | if (RT_SUCCESS(rc))
|
---|
45 | {
|
---|
46 | char szBuf[512];
|
---|
47 | RT_ZERO(szBuf);
|
---|
48 | do /* break non-loop */
|
---|
49 | {
|
---|
50 | RTTESTI_CHECK_RC_BREAK(RTTcpRead(hSocket, szBuf, sizeof("hello\n") - 1, NULL), VINF_SUCCESS);
|
---|
51 | RTTESTI_CHECK_BREAK(strcmp(szBuf, "hello\n") == 0);
|
---|
52 | RTTESTI_CHECK_RC_BREAK(RTTcpWrite(hSocket, "dude!\n", sizeof("dude!\n") - 1), VINF_SUCCESS);
|
---|
53 | } while (0);
|
---|
54 |
|
---|
55 | RTTESTI_CHECK_RC(RTTcpClientClose(hSocket), VINF_SUCCESS);
|
---|
56 | }
|
---|
57 |
|
---|
58 | RTTESTI_CHECK_RC(RTTcpServerDestroy(pServer), VINF_SUCCESS);
|
---|
59 | }
|
---|
60 |
|
---|
61 |
|
---|
62 | static DECLCALLBACK(int) test1Server(RTSOCKET hSocket, void *pvUser)
|
---|
63 | {
|
---|
64 | RTTestSetDefault(g_hTest, NULL);
|
---|
65 |
|
---|
66 | char szBuf[512];
|
---|
67 | RTTESTI_CHECK_RET(pvUser == NULL, VERR_TCP_SERVER_STOP);
|
---|
68 |
|
---|
69 | /* say hello */
|
---|
70 | RTTESTI_CHECK_RC_RET(RTTcpWrite(hSocket, "hello\n", sizeof("hello\n") - 1), VINF_SUCCESS, VERR_TCP_SERVER_STOP);
|
---|
71 | RTTESTI_CHECK_RC_RET(RTTcpRead(hSocket, szBuf, sizeof("dude!\n") - 1, NULL), VINF_SUCCESS, VERR_TCP_SERVER_STOP);
|
---|
72 | szBuf[sizeof("dude!\n") - 1] = '\0';
|
---|
73 | RTTESTI_CHECK_RET(strcmp(szBuf, "dude!\n") == 0, VERR_TCP_SERVER_STOP);
|
---|
74 |
|
---|
75 | /* say goodbye */
|
---|
76 | RTTESTI_CHECK_RC_RET(RTTcpRead(hSocket, szBuf, sizeof("byebye\n") - 1, NULL), VINF_SUCCESS, VERR_TCP_SERVER_STOP);
|
---|
77 | szBuf[sizeof("byebye\n") - 1] = '\0';
|
---|
78 | RTTESTI_CHECK_RET(strcmp(szBuf, "byebye\n") == 0, VERR_TCP_SERVER_STOP);
|
---|
79 | RTTESTI_CHECK_RC_RET(RTTcpWrite(hSocket, "bye\n", sizeof("bye\n") - 1), VINF_SUCCESS, VERR_TCP_SERVER_STOP);
|
---|
80 |
|
---|
81 | return VERR_TCP_SERVER_STOP;
|
---|
82 | }
|
---|
83 |
|
---|
84 |
|
---|
85 | void test1()
|
---|
86 | {
|
---|
87 | RTTestSub(g_hTest, "Simple server-client setup");
|
---|
88 |
|
---|
89 | PRTTCPSERVER pServer;
|
---|
90 | RTTESTI_CHECK_RC_RETV(RTTcpServerCreate("localhost", 9999, RTTHREADTYPE_DEFAULT, "server-1",
|
---|
91 | test1Server, NULL, &pServer), VINF_SUCCESS);
|
---|
92 |
|
---|
93 | int rc;
|
---|
94 | RTSOCKET hSocket;
|
---|
95 | RTTESTI_CHECK_RC(rc = RTTcpClientConnect("localhost", 9999, &hSocket), VINF_SUCCESS);
|
---|
96 | if (RT_SUCCESS(rc))
|
---|
97 | {
|
---|
98 | do /* break non-loop */
|
---|
99 | {
|
---|
100 | char szBuf[512];
|
---|
101 | RT_ZERO(szBuf);
|
---|
102 | RTTESTI_CHECK_RC_BREAK(RTTcpRead(hSocket, szBuf, sizeof("hello\n") - 1, NULL), VINF_SUCCESS);
|
---|
103 | RTTESTI_CHECK_BREAK(strcmp(szBuf, "hello\n") == 0);
|
---|
104 | RTTESTI_CHECK_RC_BREAK(RTTcpWrite(hSocket, "dude!\n", sizeof("dude!\n") - 1), VINF_SUCCESS);
|
---|
105 |
|
---|
106 | RTTESTI_CHECK_RC_BREAK(RTTcpWrite(hSocket, "byebye\n", sizeof("byebye\n") - 1), VINF_SUCCESS);
|
---|
107 | RT_ZERO(szBuf);
|
---|
108 | RTTESTI_CHECK_RC_BREAK(RTTcpRead(hSocket, szBuf, sizeof("bye\n") - 1, NULL), VINF_SUCCESS);
|
---|
109 | RTTESTI_CHECK_BREAK(strcmp(szBuf, "bye\n") == 0);
|
---|
110 | } while (0);
|
---|
111 |
|
---|
112 | RTTESTI_CHECK_RC(RTTcpClientClose(hSocket), VINF_SUCCESS);
|
---|
113 | }
|
---|
114 |
|
---|
115 | RTTESTI_CHECK_RC(RTTcpServerDestroy(pServer), VINF_SUCCESS);
|
---|
116 | }
|
---|
117 |
|
---|
118 |
|
---|
119 | int main()
|
---|
120 | {
|
---|
121 | RTEXITCODE rcExit = RTTestInitAndCreate("tstRTTcp-1", &g_hTest);
|
---|
122 | if (rcExit != RTEXITCODE_SUCCESS)
|
---|
123 | return rcExit;
|
---|
124 | RTTestBanner(g_hTest);
|
---|
125 |
|
---|
126 | test1();
|
---|
127 | test2();
|
---|
128 |
|
---|
129 | /** @todo test the full RTTcp API. */
|
---|
130 |
|
---|
131 | return RTTestSummaryAndDestroy(g_hTest);
|
---|
132 | }
|
---|
133 |
|
---|