VirtualBox

source: vbox/trunk/src/VBox/Runtime/testcase/tstRTTcp-1.cpp@ 45258

Last change on this file since 45258 was 45258, checked in by vboxsync, 12 years ago

tstRTTcp-1.cpp: More details on test3 on testboxsh1.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.7 KB
Line 
1#include <iprt/tcp.h>
2
3#include <iprt/string.h>
4#include <iprt/test.h>
5
6
7/*******************************************************************************
8* Global Variables *
9*******************************************************************************/
10static RTTEST g_hTest;
11
12
13/* * * * * * * * Test 3 * * * * * * * */
14
15static DECLCALLBACK(int) test3Server(RTSOCKET hSocket, void *pvUser)
16{
17 RTTestSetDefault(g_hTest, NULL);
18 char szBuf[4096];
19
20 /* say hello */
21 RTTESTI_CHECK_RC_RET(RTTcpWrite(hSocket, "hello\n", sizeof("hello\n") - 1), VINF_SUCCESS, VERR_TCP_SERVER_STOP);
22 RT_ZERO(szBuf);
23 RTTESTI_CHECK_RC_RET(RTTcpRead(hSocket, szBuf, sizeof("dude!\n") - 1, NULL), VINF_SUCCESS, VERR_TCP_SERVER_STOP);
24 szBuf[sizeof("dude!\n") - 1] = '\0';
25 RTTESTI_CHECK_RET(strcmp(szBuf, "dude!\n") == 0, VERR_TCP_SERVER_STOP);
26
27 /* Send ~20 MB of data that the client receives while trying to disconnect. */
28 RT_ZERO(szBuf);
29 size_t cbSent = 0;
30 while (cbSent < 20 * _1M)
31 {
32 RTTESTI_CHECK_RC_RET(RTTcpWrite(hSocket, szBuf, sizeof(szBuf)), VINF_SUCCESS, VERR_TCP_SERVER_STOP);
33 cbSent += sizeof(szBuf);
34 }
35
36 return VERR_TCP_SERVER_STOP;
37}
38
39
40void test3()
41{
42 RTTestSub(g_hTest, "Graceful disconnect");
43
44 uint32_t cStartErrors = RTTestErrorCount(g_hTest);
45 for (unsigned i = 0; i < 100 && cStartErrors == RTTestErrorCount(g_hTest); i++)
46 {
47 PRTTCPSERVER pServer;
48 int rc = RTTcpServerCreate("localhost", 9999, RTTHREADTYPE_DEFAULT, "server-2",
49 test3Server, NULL, &pServer);
50 if (rc != VINF_SUCCESS)
51 {
52 RTTestIFailed("RTTcpServerCreate -> %Rrc, i=%d", rc, i);
53 return;
54 }
55
56 RTSOCKET hSocket;
57 RTTESTI_CHECK_RC(rc = RTTcpClientConnect("localhost", 9999, &hSocket), VINF_SUCCESS);
58 if (RT_SUCCESS(rc))
59 {
60 char szBuf[512];
61 RT_ZERO(szBuf);
62 do /* break non-loop */
63 {
64 RTTESTI_CHECK_RC_BREAK(RTTcpRead(hSocket, szBuf, sizeof("hello\n") - 1, NULL), VINF_SUCCESS);
65 RTTESTI_CHECK_BREAK(strcmp(szBuf, "hello\n") == 0);
66 RTTESTI_CHECK_RC_BREAK(RTTcpWrite(hSocket, "dude!\n", sizeof("dude!\n") - 1), VINF_SUCCESS);
67 } while (0);
68
69 RTTESTI_CHECK_RC(RTTcpClientClose(hSocket), VINF_SUCCESS);
70 }
71
72 RTTESTI_CHECK_RC(RTTcpServerDestroy(pServer), VINF_SUCCESS);
73 }
74}
75
76
77/* * * * * * * * Test 2 * * * * * * * */
78
79static DECLCALLBACK(int) test2Server(RTSOCKET hSocket, void *pvUser)
80{
81 RTTestSetDefault(g_hTest, NULL);
82 char szBuf[512];
83
84 /* say hello */
85 RTTESTI_CHECK_RC_RET(RTTcpWrite(hSocket, "hello\n", sizeof("hello\n") - 1), VINF_SUCCESS, VERR_TCP_SERVER_STOP);
86 RT_ZERO(szBuf);
87 RTTESTI_CHECK_RC_RET(RTTcpRead(hSocket, szBuf, sizeof("dude!\n") - 1, NULL), VINF_SUCCESS, VERR_TCP_SERVER_STOP);
88 szBuf[sizeof("dude!\n") - 1] = '\0';
89 RTTESTI_CHECK_RET(strcmp(szBuf, "dude!\n") == 0, VERR_TCP_SERVER_STOP);
90
91 /* wait for a goodbye which doesn't arrive. */
92 RT_ZERO(szBuf);
93 RTTESTI_CHECK_RC_RET(RTTcpRead(hSocket, szBuf, sizeof("byebye\n") - 1, NULL), VERR_NET_SHUTDOWN, VERR_TCP_SERVER_STOP);
94
95 return VERR_TCP_SERVER_STOP;
96}
97
98
99void test2()
100{
101 RTTestSub(g_hTest, "Rude client");
102
103 PRTTCPSERVER pServer;
104 RTTESTI_CHECK_RC_RETV(RTTcpServerCreate("localhost", 9999, RTTHREADTYPE_DEFAULT, "server-2",
105 test2Server, NULL, &pServer), VINF_SUCCESS);
106
107 int rc;
108 RTSOCKET hSocket;
109 RTTESTI_CHECK_RC(rc = RTTcpClientConnect("localhost", 9999, &hSocket), VINF_SUCCESS);
110 if (RT_SUCCESS(rc))
111 {
112 char szBuf[512];
113 RT_ZERO(szBuf);
114 do /* break non-loop */
115 {
116 RTTESTI_CHECK_RC_BREAK(RTTcpRead(hSocket, szBuf, sizeof("hello\n") - 1, NULL), VINF_SUCCESS);
117 RTTESTI_CHECK_BREAK(strcmp(szBuf, "hello\n") == 0);
118 RTTESTI_CHECK_RC_BREAK(RTTcpWrite(hSocket, "dude!\n", sizeof("dude!\n") - 1), VINF_SUCCESS);
119 } while (0);
120
121 RTTESTI_CHECK_RC(RTTcpClientClose(hSocket), VINF_SUCCESS);
122 }
123
124 RTTESTI_CHECK_RC(RTTcpServerDestroy(pServer), VINF_SUCCESS);
125}
126
127
128/* * * * * * * * Test 1 * * * * * * * */
129
130static DECLCALLBACK(int) test1Server(RTSOCKET hSocket, void *pvUser)
131{
132 RTTestSetDefault(g_hTest, NULL);
133
134 char szBuf[512];
135 RTTESTI_CHECK_RET(pvUser == NULL, VERR_TCP_SERVER_STOP);
136
137 /* say hello */
138 RTTESTI_CHECK_RC_RET(RTTcpWrite(hSocket, "hello\n", sizeof("hello\n") - 1), VINF_SUCCESS, VERR_TCP_SERVER_STOP);
139 RTTESTI_CHECK_RC_RET(RTTcpRead(hSocket, szBuf, sizeof("dude!\n") - 1, NULL), VINF_SUCCESS, VERR_TCP_SERVER_STOP);
140 szBuf[sizeof("dude!\n") - 1] = '\0';
141 RTTESTI_CHECK_RET(strcmp(szBuf, "dude!\n") == 0, VERR_TCP_SERVER_STOP);
142
143 /* say goodbye */
144 RTTESTI_CHECK_RC_RET(RTTcpRead(hSocket, szBuf, sizeof("byebye\n") - 1, NULL), VINF_SUCCESS, VERR_TCP_SERVER_STOP);
145 szBuf[sizeof("byebye\n") - 1] = '\0';
146 RTTESTI_CHECK_RET(strcmp(szBuf, "byebye\n") == 0, VERR_TCP_SERVER_STOP);
147 RTTESTI_CHECK_RC_RET(RTTcpWrite(hSocket, "bye\n", sizeof("bye\n") - 1), VINF_SUCCESS, VERR_TCP_SERVER_STOP);
148
149 return VERR_TCP_SERVER_STOP;
150}
151
152
153void test1()
154{
155 RTTestSub(g_hTest, "Simple server-client setup");
156
157 PRTTCPSERVER pServer;
158 RTTESTI_CHECK_RC_RETV(RTTcpServerCreate("localhost", 9999, RTTHREADTYPE_DEFAULT, "server-1",
159 test1Server, NULL, &pServer), VINF_SUCCESS);
160
161 int rc;
162 RTSOCKET hSocket;
163 RTTESTI_CHECK_RC(rc = RTTcpClientConnect("localhost", 9999, &hSocket), VINF_SUCCESS);
164 if (RT_SUCCESS(rc))
165 {
166 do /* break non-loop */
167 {
168 char szBuf[512];
169 RT_ZERO(szBuf);
170 RTTESTI_CHECK_RC_BREAK(RTTcpRead(hSocket, szBuf, sizeof("hello\n") - 1, NULL), VINF_SUCCESS);
171 RTTESTI_CHECK_BREAK(strcmp(szBuf, "hello\n") == 0);
172 RTTESTI_CHECK_RC_BREAK(RTTcpWrite(hSocket, "dude!\n", sizeof("dude!\n") - 1), VINF_SUCCESS);
173
174 RTTESTI_CHECK_RC_BREAK(RTTcpWrite(hSocket, "byebye\n", sizeof("byebye\n") - 1), VINF_SUCCESS);
175 RT_ZERO(szBuf);
176 RTTESTI_CHECK_RC_BREAK(RTTcpRead(hSocket, szBuf, sizeof("bye\n") - 1, NULL), VINF_SUCCESS);
177 RTTESTI_CHECK_BREAK(strcmp(szBuf, "bye\n") == 0);
178 } while (0);
179
180 RTTESTI_CHECK_RC(RTTcpClientClose(hSocket), VINF_SUCCESS);
181 }
182
183 RTTESTI_CHECK_RC(RTTcpServerDestroy(pServer), VINF_SUCCESS);
184}
185
186
187int main()
188{
189 RTEXITCODE rcExit = RTTestInitAndCreate("tstRTTcp-1", &g_hTest);
190 if (rcExit != RTEXITCODE_SUCCESS)
191 return rcExit;
192 RTTestBanner(g_hTest);
193
194 test1();
195 test2();
196 test3();
197
198 /** @todo test the full RTTcp API. */
199
200 return RTTestSummaryAndDestroy(g_hTest);
201}
202
Note: See TracBrowser for help on using the repository browser.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette