VirtualBox

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

Last change on this file since 62627 was 62571, checked in by vboxsync, 8 years ago

IPRT: More unused parameters.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 8.3 KB
Line 
1/* $Id: tstRTTcp-1.cpp 62571 2016-07-26 15:58:26Z vboxsync $ */
2/** @file
3 * IPRT testcase - TCP.
4 */
5
6/*
7 * Copyright (C) 2010-2016 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * The contents of this file may alternatively be used under the terms
18 * of the Common Development and Distribution License Version 1.0
19 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
20 * VirtualBox OSE distribution, in which case the provisions of the
21 * CDDL are applicable instead of those of the GPL.
22 *
23 * You may elect to license modified versions of this file under the
24 * terms and conditions of either the GPL or the CDDL or both.
25 */
26
27
28#include <iprt/tcp.h>
29
30#include <iprt/string.h>
31#include <iprt/test.h>
32
33
34/*********************************************************************************************************************************
35* Global Variables *
36*********************************************************************************************************************************/
37static RTTEST g_hTest;
38
39
40/* * * * * * * * Test 3 * * * * * * * */
41
42static DECLCALLBACK(int) test3Server(RTSOCKET hSocket, void *pvUser)
43{
44 RT_NOREF_PV(pvUser);
45
46 RTTestSetDefault(g_hTest, NULL);
47 char szBuf[4096];
48
49 /* say hello */
50 RTTESTI_CHECK_RC_RET(RTTcpWrite(hSocket, "hello\n", sizeof("hello\n") - 1), VINF_SUCCESS, VERR_TCP_SERVER_STOP);
51 RT_ZERO(szBuf);
52 RTTESTI_CHECK_RC_RET(RTTcpRead(hSocket, szBuf, sizeof("dude!\n") - 1, NULL), VINF_SUCCESS, VERR_TCP_SERVER_STOP);
53 szBuf[sizeof("dude!\n") - 1] = '\0';
54 RTTESTI_CHECK_RET(strcmp(szBuf, "dude!\n") == 0, VERR_TCP_SERVER_STOP);
55
56 /* Send ~20 MB of data that the client receives while trying to disconnect. */
57 RT_ZERO(szBuf);
58 size_t cbSent = 0;
59 while (cbSent < 20 * _1M)
60 {
61 RTTESTI_CHECK_RC_RET(RTTcpWrite(hSocket, szBuf, sizeof(szBuf)), VINF_SUCCESS, VERR_TCP_SERVER_STOP);
62 cbSent += sizeof(szBuf);
63 }
64
65 return VERR_TCP_SERVER_STOP;
66}
67
68
69void test3()
70{
71 RTTestSub(g_hTest, "Graceful disconnect");
72
73 uint32_t cStartErrors = RTTestErrorCount(g_hTest);
74 for (unsigned i = 0; i < 100 && cStartErrors == RTTestErrorCount(g_hTest); i++)
75 {
76 PRTTCPSERVER pServer;
77 int rc = RTTcpServerCreate("localhost", 9999, RTTHREADTYPE_DEFAULT, "server-2", test3Server, NULL, &pServer);
78#ifdef RT_OS_SOLARIS
79 /** @todo testboxsh1 occationally hits this for some stupid reason. i=21 in
80 * one occurrence. Fudge a bit for now and see if it helps. */
81 if (rc == VERR_NET_ADDRESS_IN_USE)
82 {
83 RTThreadSleep(500);
84 rc = RTTcpServerCreate("localhost", 9999, RTTHREADTYPE_DEFAULT, "server-2", test3Server, NULL, &pServer);
85 }
86#endif
87 if (rc != VINF_SUCCESS)
88 {
89 RTTestIFailed("RTTcpServerCreate -> %Rrc, i=%d", rc, i);
90 return;
91 }
92
93 RTSOCKET hSocket;
94 RTTESTI_CHECK_RC(rc = RTTcpClientConnect("localhost", 9999, &hSocket), VINF_SUCCESS);
95 if (RT_SUCCESS(rc))
96 {
97 char szBuf[512];
98 RT_ZERO(szBuf);
99 do /* break non-loop */
100 {
101 RTTESTI_CHECK_RC_BREAK(RTTcpRead(hSocket, szBuf, sizeof("hello\n") - 1, NULL), VINF_SUCCESS);
102 RTTESTI_CHECK_BREAK(strcmp(szBuf, "hello\n") == 0);
103 RTTESTI_CHECK_RC_BREAK(RTTcpWrite(hSocket, "dude!\n", sizeof("dude!\n") - 1), VINF_SUCCESS);
104 } while (0);
105
106 RTTESTI_CHECK_RC(RTTcpClientClose(hSocket), VINF_SUCCESS);
107 }
108
109 RTTESTI_CHECK_RC(RTTcpServerDestroy(pServer), VINF_SUCCESS);
110 }
111}
112
113
114/* * * * * * * * Test 2 * * * * * * * */
115
116static DECLCALLBACK(int) test2Server(RTSOCKET hSocket, void *pvUser)
117{
118 RT_NOREF_PV(pvUser);
119
120 RTTestSetDefault(g_hTest, NULL);
121 char szBuf[512];
122
123 /* say hello */
124 RTTESTI_CHECK_RC_RET(RTTcpWrite(hSocket, "hello\n", sizeof("hello\n") - 1), VINF_SUCCESS, VERR_TCP_SERVER_STOP);
125 RT_ZERO(szBuf);
126 RTTESTI_CHECK_RC_RET(RTTcpRead(hSocket, szBuf, sizeof("dude!\n") - 1, NULL), VINF_SUCCESS, VERR_TCP_SERVER_STOP);
127 szBuf[sizeof("dude!\n") - 1] = '\0';
128 RTTESTI_CHECK_RET(strcmp(szBuf, "dude!\n") == 0, VERR_TCP_SERVER_STOP);
129
130 /* wait for a goodbye which doesn't arrive. */
131 RT_ZERO(szBuf);
132 RTTESTI_CHECK_RC_RET(RTTcpRead(hSocket, szBuf, sizeof("byebye\n") - 1, NULL), VERR_NET_SHUTDOWN, VERR_TCP_SERVER_STOP);
133
134 return VERR_TCP_SERVER_STOP;
135}
136
137
138void test2()
139{
140 RTTestSub(g_hTest, "Rude client");
141
142 PRTTCPSERVER pServer;
143 RTTESTI_CHECK_RC_RETV(RTTcpServerCreate("localhost", 9999, RTTHREADTYPE_DEFAULT, "server-2",
144 test2Server, NULL, &pServer), VINF_SUCCESS);
145
146 int rc;
147 RTSOCKET hSocket;
148 RTTESTI_CHECK_RC(rc = RTTcpClientConnect("localhost", 9999, &hSocket), VINF_SUCCESS);
149 if (RT_SUCCESS(rc))
150 {
151 char szBuf[512];
152 RT_ZERO(szBuf);
153 do /* break non-loop */
154 {
155 RTTESTI_CHECK_RC_BREAK(RTTcpRead(hSocket, szBuf, sizeof("hello\n") - 1, NULL), VINF_SUCCESS);
156 RTTESTI_CHECK_BREAK(strcmp(szBuf, "hello\n") == 0);
157 RTTESTI_CHECK_RC_BREAK(RTTcpWrite(hSocket, "dude!\n", sizeof("dude!\n") - 1), VINF_SUCCESS);
158 } while (0);
159
160 RTTESTI_CHECK_RC(RTTcpClientClose(hSocket), VINF_SUCCESS);
161 }
162
163 RTTESTI_CHECK_RC(RTTcpServerDestroy(pServer), VINF_SUCCESS);
164}
165
166
167/* * * * * * * * Test 1 * * * * * * * */
168
169static DECLCALLBACK(int) test1Server(RTSOCKET hSocket, void *pvUser)
170{
171 RTTestSetDefault(g_hTest, NULL);
172
173 char szBuf[512];
174 RTTESTI_CHECK_RET(pvUser == NULL, VERR_TCP_SERVER_STOP);
175
176 /* say hello */
177 RTTESTI_CHECK_RC_RET(RTTcpWrite(hSocket, "hello\n", sizeof("hello\n") - 1), VINF_SUCCESS, VERR_TCP_SERVER_STOP);
178 RTTESTI_CHECK_RC_RET(RTTcpRead(hSocket, szBuf, sizeof("dude!\n") - 1, NULL), VINF_SUCCESS, VERR_TCP_SERVER_STOP);
179 szBuf[sizeof("dude!\n") - 1] = '\0';
180 RTTESTI_CHECK_RET(strcmp(szBuf, "dude!\n") == 0, VERR_TCP_SERVER_STOP);
181
182 /* say goodbye */
183 RTTESTI_CHECK_RC_RET(RTTcpRead(hSocket, szBuf, sizeof("byebye\n") - 1, NULL), VINF_SUCCESS, VERR_TCP_SERVER_STOP);
184 szBuf[sizeof("byebye\n") - 1] = '\0';
185 RTTESTI_CHECK_RET(strcmp(szBuf, "byebye\n") == 0, VERR_TCP_SERVER_STOP);
186 RTTESTI_CHECK_RC_RET(RTTcpWrite(hSocket, "bye\n", sizeof("bye\n") - 1), VINF_SUCCESS, VERR_TCP_SERVER_STOP);
187
188 return VERR_TCP_SERVER_STOP;
189}
190
191
192void test1()
193{
194 RTTestSub(g_hTest, "Simple server-client setup");
195
196 PRTTCPSERVER pServer;
197 RTTESTI_CHECK_RC_RETV(RTTcpServerCreate("localhost", 9999, RTTHREADTYPE_DEFAULT, "server-1",
198 test1Server, NULL, &pServer), VINF_SUCCESS);
199
200 int rc;
201 RTSOCKET hSocket;
202 RTTESTI_CHECK_RC(rc = RTTcpClientConnect("localhost", 9999, &hSocket), VINF_SUCCESS);
203 if (RT_SUCCESS(rc))
204 {
205 do /* break non-loop */
206 {
207 char szBuf[512];
208 RT_ZERO(szBuf);
209 RTTESTI_CHECK_RC_BREAK(RTTcpRead(hSocket, szBuf, sizeof("hello\n") - 1, NULL), VINF_SUCCESS);
210 RTTESTI_CHECK_BREAK(strcmp(szBuf, "hello\n") == 0);
211 RTTESTI_CHECK_RC_BREAK(RTTcpWrite(hSocket, "dude!\n", sizeof("dude!\n") - 1), VINF_SUCCESS);
212
213 RTTESTI_CHECK_RC_BREAK(RTTcpWrite(hSocket, "byebye\n", sizeof("byebye\n") - 1), VINF_SUCCESS);
214 RT_ZERO(szBuf);
215 RTTESTI_CHECK_RC_BREAK(RTTcpRead(hSocket, szBuf, sizeof("bye\n") - 1, NULL), VINF_SUCCESS);
216 RTTESTI_CHECK_BREAK(strcmp(szBuf, "bye\n") == 0);
217 } while (0);
218
219 RTTESTI_CHECK_RC(RTTcpClientClose(hSocket), VINF_SUCCESS);
220 }
221
222 RTTESTI_CHECK_RC(RTTcpServerDestroy(pServer), VINF_SUCCESS);
223}
224
225
226int main()
227{
228 RTEXITCODE rcExit = RTTestInitAndCreate("tstRTTcp-1", &g_hTest);
229 if (rcExit != RTEXITCODE_SUCCESS)
230 return rcExit;
231 RTTestBanner(g_hTest);
232
233 test1();
234 test2();
235 test3();
236
237 /** @todo test the full RTTcp API. */
238
239 return RTTestSummaryAndDestroy(g_hTest);
240}
241
Note: See TracBrowser for help on using the repository browser.

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