blob: b36374b0747e8190f1bcb2fb8beb13b1cfcfcc4b [file] [log] [blame]
Benny Prijono5dcb38d2005-11-21 01:55:47 +00001/* $Id$ */
2/*
Benny Prijonoa771a512007-02-19 01:13:53 +00003 * Copyright (C)2003-2007 Benny Prijono <benny@prijono.org>
Benny Prijono5dcb38d2005-11-21 01:55:47 +00004 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 */
19#include <pjlib.h>
20#include "test.h"
21
22
23/**
24 * \page page_pjlib_sock_test Test: Socket
25 *
26 * This file provides implementation of \b sock_test(). It tests the
27 * various aspects of the socket API.
28 *
29 * \section sock_test_scope_sec Scope of the Test
30 *
31 * The scope of the test:
32 * - verify the validity of the address structs.
33 * - verify that address manipulation API works.
34 * - simple socket creation and destruction.
35 * - simple socket send/recv and sendto/recvfrom.
36 * - UDP connect()
37 * - send/recv big data.
38 * - all for both UDP and TCP.
39 *
40 * The APIs tested in this test:
41 * - pj_inet_aton()
42 * - pj_inet_ntoa()
Benny Prijonoc16c6e32007-11-18 14:53:47 +000043 * - pj_inet_pton() (only if IPv6 is enabled)
44 * - pj_inet_ntop() (only if IPv6 is enabled)
Benny Prijono5dcb38d2005-11-21 01:55:47 +000045 * - pj_gethostname()
46 * - pj_sock_socket()
47 * - pj_sock_close()
48 * - pj_sock_send()
49 * - pj_sock_sendto()
50 * - pj_sock_recv()
51 * - pj_sock_recvfrom()
52 * - pj_sock_bind()
53 * - pj_sock_connect()
54 * - pj_sock_listen()
55 * - pj_sock_accept()
Benny Prijono60cac482007-03-01 18:56:02 +000056 * - pj_gethostbyname()
Benny Prijono5dcb38d2005-11-21 01:55:47 +000057 *
58 *
59 * This file is <b>pjlib-test/sock.c</b>
60 *
61 * \include pjlib-test/sock.c
62 */
63
64#if INCLUDE_SOCK_TEST
65
66#define UDP_PORT 51234
67#define TCP_PORT (UDP_PORT+10)
Benny Prijonof260e462007-04-30 21:03:32 +000068#define BIG_DATA_LEN 8192
Benny Prijono42c5b9e2006-05-10 19:24:40 +000069#define ADDRESS "127.0.0.1"
Benny Prijono5dcb38d2005-11-21 01:55:47 +000070
71static char bigdata[BIG_DATA_LEN];
72static char bigbuffer[BIG_DATA_LEN];
73
74static int format_test(void)
75{
Benny Prijono42c5b9e2006-05-10 19:24:40 +000076 pj_str_t s = pj_str(ADDRESS);
77 unsigned char *p;
Benny Prijono5dcb38d2005-11-21 01:55:47 +000078 pj_in_addr addr;
Benny Prijono0e25e7c2006-06-28 11:10:02 +000079 char zero[64];
80 pj_sockaddr_in addr2;
Benny Prijono5dcb38d2005-11-21 01:55:47 +000081 const pj_str_t *hostname;
Benny Prijono8ab968f2007-07-20 08:08:30 +000082 const unsigned char A[] = {127, 0, 0, 1};
Benny Prijono5dcb38d2005-11-21 01:55:47 +000083
84 PJ_LOG(3,("test", "...format_test()"));
85
86 /* pj_inet_aton() */
87 if (pj_inet_aton(&s, &addr) != 1)
88 return -10;
89
90 /* Check the result. */
Benny Prijono42c5b9e2006-05-10 19:24:40 +000091 p = (unsigned char*)&addr;
Benny Prijonof260e462007-04-30 21:03:32 +000092 if (p[0]!=A[0] || p[1]!=A[1] || p[2]!=A[2] || p[3]!=A[3]) {
Benny Prijono42c5b9e2006-05-10 19:24:40 +000093 PJ_LOG(3,("test", " error: mismatched address. p0=%d, p1=%d, "
94 "p2=%d, p3=%d", p[0] & 0xFF, p[1] & 0xFF,
95 p[2] & 0xFF, p[3] & 0xFF));
Benny Prijono5dcb38d2005-11-21 01:55:47 +000096 return -15;
Benny Prijono42c5b9e2006-05-10 19:24:40 +000097 }
Benny Prijono5dcb38d2005-11-21 01:55:47 +000098
99 /* pj_inet_ntoa() */
Benny Prijonod8410532006-06-15 11:04:33 +0000100 p = (unsigned char*) pj_inet_ntoa(addr);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000101 if (!p)
102 return -20;
103
Benny Prijonod8410532006-06-15 11:04:33 +0000104 if (pj_strcmp2(&s, (char*)p) != 0)
Benny Prijonoc16c6e32007-11-18 14:53:47 +0000105 return -22;
106
107#if defined(PJ_HAS_IPV6) && PJ_HAS_IPV6!=0
108 /* pj_inet_pton() */
109 /* pj_inet_ntop() */
110 {
111 const pj_str_t s_ipv4 = pj_str("127.0.0.1");
112 const pj_str_t s_ipv6 = pj_str("fe80::2ff:83ff:fe7c:8b42");
113 char buf_ipv4[PJ_INET_ADDRSTRLEN];
114 char buf_ipv6[PJ_INET6_ADDRSTRLEN];
115 pj_in_addr ipv4;
116 pj_in6_addr ipv6;
117
118 if (pj_inet_pton(pj_AF_INET(), &s_ipv4, &ipv4) != PJ_SUCCESS)
119 return -24;
120
121 p = (unsigned char*)&ipv4;
122 if (p[0]!=A[0] || p[1]!=A[1] || p[2]!=A[2] || p[3]!=A[3]) {
123 return -25;
124 }
125
126 if (pj_inet_pton(pj_AF_INET6(), &s_ipv6, &ipv6) != PJ_SUCCESS)
127 return -26;
128
129 p = (unsigned char*)&ipv6;
130 if (p[0] != 0xfe || p[1] != 0x80 || p[2] != 0 || p[3] != 0 ||
131 p[4] != 0 || p[5] != 0 || p[6] != 0 || p[7] != 0 ||
132 p[8] != 0x02 || p[9] != 0xff || p[10] != 0x83 || p[11] != 0xff ||
133 p[12]!=0xfe || p[13]!=0x7c || p[14] != 0x8b || p[15]!=0x42)
134 {
135 return -27;
136 }
137
138 if (pj_inet_ntop(pj_AF_INET(), &ipv4, buf_ipv4, sizeof(buf_ipv4)) != PJ_SUCCESS)
139 return -28;
140 if (pj_stricmp2(&s_ipv4, buf_ipv4) != 0)
141 return -29;
142
143 if (pj_inet_ntop(pj_AF_INET6(), &ipv6, buf_ipv6, sizeof(buf_ipv6)) != PJ_SUCCESS)
144 return -30;
145 if (pj_stricmp2(&s_ipv6, buf_ipv6) != 0)
146 return -31;
147 }
148
149#endif /* PJ_HAS_IPV6 */
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000150
Benny Prijono0e25e7c2006-06-28 11:10:02 +0000151 /* Test that pj_sockaddr_in_init() initialize the whole structure,
152 * including sin_zero.
153 */
154 pj_sockaddr_in_init(&addr2, 0, 1000);
Benny Prijonoac623b32006-07-03 15:19:31 +0000155 pj_bzero(zero, sizeof(zero));
Benny Prijono0e25e7c2006-06-28 11:10:02 +0000156 if (pj_memcmp(addr2.sin_zero, zero, sizeof(addr2.sin_zero)) != 0)
157 return -35;
158
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000159 /* pj_gethostname() */
160 hostname = pj_gethostname();
161 if (!hostname || !hostname->ptr || !hostname->slen)
162 return -40;
163
Benny Prijono42c5b9e2006-05-10 19:24:40 +0000164 PJ_LOG(3,("test", "....hostname is %.*s",
165 (int)hostname->slen, hostname->ptr));
166
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000167 /* pj_gethostaddr() */
168
Benny Prijono0e25e7c2006-06-28 11:10:02 +0000169
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000170 return 0;
171}
172
173static int simple_sock_test(void)
174{
175 int types[2];
176 pj_sock_t sock;
177 int i;
178 pj_status_t rc = PJ_SUCCESS;
179
Benny Prijono8ab968f2007-07-20 08:08:30 +0000180 types[0] = pj_SOCK_STREAM();
181 types[1] = pj_SOCK_DGRAM();
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000182
183 PJ_LOG(3,("test", "...simple_sock_test()"));
184
Benny Prijonoa1e69682007-05-11 15:14:34 +0000185 for (i=0; i<(int)(sizeof(types)/sizeof(types[0])); ++i) {
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000186
Benny Prijono8ab968f2007-07-20 08:08:30 +0000187 rc = pj_sock_socket(pj_AF_INET(), types[i], 0, &sock);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000188 if (rc != PJ_SUCCESS) {
Benny Prijono8ab968f2007-07-20 08:08:30 +0000189 app_perror("...error: unable to create socket", rc);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000190 break;
191 } else {
192 rc = pj_sock_close(sock);
193 if (rc != 0) {
194 app_perror("...error: close socket", rc);
195 break;
196 }
197 }
198 }
199 return rc;
200}
201
202
203static int send_recv_test(int sock_type,
204 pj_sock_t ss, pj_sock_t cs,
205 pj_sockaddr_in *dstaddr, pj_sockaddr_in *srcaddr,
206 int addrlen)
207{
208 enum { DATA_LEN = 16 };
209 char senddata[DATA_LEN+4], recvdata[DATA_LEN+4];
210 pj_ssize_t sent, received, total_received;
211 pj_status_t rc;
212
213 TRACE_(("test", "....create_random_string()"));
214 pj_create_random_string(senddata, DATA_LEN);
215 senddata[DATA_LEN-1] = '\0';
216
217 /*
218 * Test send/recv small data.
219 */
220 TRACE_(("test", "....sendto()"));
221 if (dstaddr) {
222 sent = DATA_LEN;
223 rc = pj_sock_sendto(cs, senddata, &sent, 0, dstaddr, addrlen);
224 if (rc != PJ_SUCCESS || sent != DATA_LEN) {
225 app_perror("...sendto error", rc);
226 rc = -140; goto on_error;
227 }
228 } else {
229 sent = DATA_LEN;
230 rc = pj_sock_send(cs, senddata, &sent, 0);
231 if (rc != PJ_SUCCESS || sent != DATA_LEN) {
232 app_perror("...send error", rc);
233 rc = -145; goto on_error;
234 }
235 }
236
237 TRACE_(("test", "....recv()"));
238 if (srcaddr) {
239 pj_sockaddr_in addr;
240 int srclen = sizeof(addr);
241
Benny Prijonoac623b32006-07-03 15:19:31 +0000242 pj_bzero(&addr, sizeof(addr));
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000243
244 received = DATA_LEN;
245 rc = pj_sock_recvfrom(ss, recvdata, &received, 0, &addr, &srclen);
246 if (rc != PJ_SUCCESS || received != DATA_LEN) {
247 app_perror("...recvfrom error", rc);
248 rc = -150; goto on_error;
249 }
250 if (srclen != addrlen)
251 return -151;
252 if (pj_memcmp(&addr, srcaddr, srclen) != 0) {
253 char srcaddr_str[32], addr_str[32];
254 strcpy(srcaddr_str, pj_inet_ntoa(srcaddr->sin_addr));
255 strcpy(addr_str, pj_inet_ntoa(addr.sin_addr));
256 PJ_LOG(3,("test", "...error: src address mismatch (original=%s, "
257 "recvfrom addr=%s)",
258 srcaddr_str, addr_str));
259 return -152;
260 }
261
262 } else {
263 /* Repeat recv() until all data is received.
264 * This applies only for non-UDP of course, since for UDP
265 * we would expect all data to be received in one packet.
266 */
267 total_received = 0;
268 do {
269 received = DATA_LEN-total_received;
270 rc = pj_sock_recv(ss, recvdata+total_received, &received, 0);
271 if (rc != PJ_SUCCESS) {
272 app_perror("...recv error", rc);
273 rc = -155; goto on_error;
274 }
275 if (received <= 0) {
276 PJ_LOG(3,("", "...error: socket has closed! (received=%d)",
277 received));
278 rc = -156; goto on_error;
279 }
280 if (received != DATA_LEN-total_received) {
Benny Prijono8ab968f2007-07-20 08:08:30 +0000281 if (sock_type != pj_SOCK_STREAM()) {
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000282 PJ_LOG(3,("", "...error: expecting %u bytes, got %u bytes",
283 DATA_LEN-total_received, received));
284 rc = -157; goto on_error;
285 }
286 }
287 total_received += received;
288 } while (total_received < DATA_LEN);
289 }
290
291 TRACE_(("test", "....memcmp()"));
292 if (pj_memcmp(senddata, recvdata, DATA_LEN) != 0) {
293 PJ_LOG(3,("","...error: received data mismatch "
294 "(got:'%s' expecting:'%s'",
295 recvdata, senddata));
296 rc = -160; goto on_error;
297 }
298
299 /*
300 * Test send/recv big data.
301 */
302 TRACE_(("test", "....sendto()"));
303 if (dstaddr) {
304 sent = BIG_DATA_LEN;
305 rc = pj_sock_sendto(cs, bigdata, &sent, 0, dstaddr, addrlen);
306 if (rc != PJ_SUCCESS || sent != BIG_DATA_LEN) {
307 app_perror("...sendto error", rc);
308 rc = -161; goto on_error;
309 }
310 } else {
311 sent = BIG_DATA_LEN;
312 rc = pj_sock_send(cs, bigdata, &sent, 0);
313 if (rc != PJ_SUCCESS || sent != BIG_DATA_LEN) {
314 app_perror("...send error", rc);
315 rc = -165; goto on_error;
316 }
317 }
318
319 TRACE_(("test", "....recv()"));
320
321 /* Repeat recv() until all data is received.
322 * This applies only for non-UDP of course, since for UDP
323 * we would expect all data to be received in one packet.
324 */
325 total_received = 0;
326 do {
327 received = BIG_DATA_LEN-total_received;
328 rc = pj_sock_recv(ss, bigbuffer+total_received, &received, 0);
329 if (rc != PJ_SUCCESS) {
330 app_perror("...recv error", rc);
331 rc = -170; goto on_error;
332 }
333 if (received <= 0) {
334 PJ_LOG(3,("", "...error: socket has closed! (received=%d)",
335 received));
336 rc = -173; goto on_error;
337 }
338 if (received != BIG_DATA_LEN-total_received) {
Benny Prijono8ab968f2007-07-20 08:08:30 +0000339 if (sock_type != pj_SOCK_STREAM()) {
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000340 PJ_LOG(3,("", "...error: expecting %u bytes, got %u bytes",
341 BIG_DATA_LEN-total_received, received));
342 rc = -176; goto on_error;
343 }
344 }
345 total_received += received;
346 } while (total_received < BIG_DATA_LEN);
347
348 TRACE_(("test", "....memcmp()"));
349 if (pj_memcmp(bigdata, bigbuffer, BIG_DATA_LEN) != 0) {
350 PJ_LOG(3,("", "...error: received data has been altered!"));
351 rc = -180; goto on_error;
352 }
353
354 rc = 0;
355
356on_error:
357 return rc;
358}
359
360static int udp_test(void)
361{
362 pj_sock_t cs = PJ_INVALID_SOCKET, ss = PJ_INVALID_SOCKET;
363 pj_sockaddr_in dstaddr, srcaddr;
364 pj_str_t s;
365 pj_status_t rc = 0, retval;
366
367 PJ_LOG(3,("test", "...udp_test()"));
368
Benny Prijono8ab968f2007-07-20 08:08:30 +0000369 rc = pj_sock_socket(pj_AF_INET(), pj_SOCK_DGRAM(), 0, &ss);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000370 if (rc != 0) {
371 app_perror("...error: unable to create socket", rc);
372 return -100;
373 }
374
Benny Prijono8ab968f2007-07-20 08:08:30 +0000375 rc = pj_sock_socket(pj_AF_INET(), pj_SOCK_DGRAM(), 0, &cs);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000376 if (rc != 0)
377 return -110;
378
379 /* Bind server socket. */
Benny Prijonoac623b32006-07-03 15:19:31 +0000380 pj_bzero(&dstaddr, sizeof(dstaddr));
Benny Prijono8ab968f2007-07-20 08:08:30 +0000381 dstaddr.sin_family = pj_AF_INET();
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000382 dstaddr.sin_port = pj_htons(UDP_PORT);
Benny Prijono42c5b9e2006-05-10 19:24:40 +0000383 dstaddr.sin_addr = pj_inet_addr(pj_cstr(&s, ADDRESS));
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000384
385 if ((rc=pj_sock_bind(ss, &dstaddr, sizeof(dstaddr))) != 0) {
Benny Prijono42c5b9e2006-05-10 19:24:40 +0000386 app_perror("...bind error udp:"ADDRESS, rc);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000387 rc = -120; goto on_error;
388 }
389
390 /* Bind client socket. */
Benny Prijonoac623b32006-07-03 15:19:31 +0000391 pj_bzero(&srcaddr, sizeof(srcaddr));
Benny Prijono8ab968f2007-07-20 08:08:30 +0000392 srcaddr.sin_family = pj_AF_INET();
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000393 srcaddr.sin_port = pj_htons(UDP_PORT-1);
Benny Prijono42c5b9e2006-05-10 19:24:40 +0000394 srcaddr.sin_addr = pj_inet_addr(pj_cstr(&s, ADDRESS));
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000395
396 if ((rc=pj_sock_bind(cs, &srcaddr, sizeof(srcaddr))) != 0) {
397 app_perror("...bind error", rc);
398 rc = -121; goto on_error;
399 }
400
401 /* Test send/recv, with sendto */
Benny Prijono8ab968f2007-07-20 08:08:30 +0000402 rc = send_recv_test(pj_SOCK_DGRAM(), ss, cs, &dstaddr, NULL,
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000403 sizeof(dstaddr));
404 if (rc != 0)
405 goto on_error;
406
407 /* Test send/recv, with sendto and recvfrom */
Benny Prijono8ab968f2007-07-20 08:08:30 +0000408 rc = send_recv_test(pj_SOCK_DGRAM(), ss, cs, &dstaddr,
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000409 &srcaddr, sizeof(dstaddr));
410 if (rc != 0)
411 goto on_error;
412
Benny Prijonoaeeb1d12007-05-01 10:42:22 +0000413 /* Disable this test on Symbian since UDP connect()/send() failed
414 * with S60 3rd edition (including MR2).
415 * See http://www.pjsip.org/trac/ticket/264
416 */
417#if !defined(PJ_SYMBIAN) || PJ_SYMBIAN==0
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000418 /* connect() the sockets. */
419 rc = pj_sock_connect(cs, &dstaddr, sizeof(dstaddr));
420 if (rc != 0) {
421 app_perror("...connect() error", rc);
422 rc = -122; goto on_error;
423 }
424
425 /* Test send/recv with send() */
Benny Prijono8ab968f2007-07-20 08:08:30 +0000426 rc = send_recv_test(pj_SOCK_DGRAM(), ss, cs, NULL, NULL, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000427 if (rc != 0)
428 goto on_error;
429
430 /* Test send/recv with send() and recvfrom */
Benny Prijono8ab968f2007-07-20 08:08:30 +0000431 rc = send_recv_test(pj_SOCK_DGRAM(), ss, cs, NULL, &srcaddr,
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000432 sizeof(srcaddr));
433 if (rc != 0)
434 goto on_error;
Benny Prijonof260e462007-04-30 21:03:32 +0000435#endif
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000436
437on_error:
438 retval = rc;
439 if (cs != PJ_INVALID_SOCKET) {
440 rc = pj_sock_close(cs);
441 if (rc != PJ_SUCCESS) {
442 app_perror("...error in closing socket", rc);
443 return -1000;
444 }
445 }
446 if (ss != PJ_INVALID_SOCKET) {
447 rc = pj_sock_close(ss);
448 if (rc != PJ_SUCCESS) {
449 app_perror("...error in closing socket", rc);
450 return -1010;
451 }
452 }
453
454 return retval;
455}
456
457static int tcp_test(void)
458{
459 pj_sock_t cs, ss;
460 pj_status_t rc = 0, retval;
461
462 PJ_LOG(3,("test", "...tcp_test()"));
463
Benny Prijono8ab968f2007-07-20 08:08:30 +0000464 rc = app_socketpair(pj_AF_INET(), pj_SOCK_STREAM(), 0, &ss, &cs);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000465 if (rc != PJ_SUCCESS) {
466 app_perror("...error: app_socketpair():", rc);
467 return -2000;
468 }
469
470 /* Test send/recv with send() and recv() */
Benny Prijono8ab968f2007-07-20 08:08:30 +0000471 retval = send_recv_test(pj_SOCK_STREAM(), ss, cs, NULL, NULL, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000472
473 rc = pj_sock_close(cs);
474 if (rc != PJ_SUCCESS) {
475 app_perror("...error in closing socket", rc);
476 return -2000;
477 }
478
479 rc = pj_sock_close(ss);
480 if (rc != PJ_SUCCESS) {
481 app_perror("...error in closing socket", rc);
482 return -2010;
483 }
484
485 return retval;
486}
487
488static int ioctl_test(void)
489{
490 return 0;
491}
492
Benny Prijono60cac482007-03-01 18:56:02 +0000493static int gethostbyname_test(void)
494{
495 pj_str_t host;
496 pj_hostent he;
497 pj_status_t status;
498
499 /* Testing pj_gethostbyname() with invalid host */
500 host = pj_str("an-invalid-host-name");
501 status = pj_gethostbyname(&host, &he);
502
503 /* Must return failure! */
504 if (status == PJ_SUCCESS)
505 return -20100;
506 else
507 return 0;
508}
509
Benny Prijonof260e462007-04-30 21:03:32 +0000510#if 0
511#include "../pj/os_symbian.h"
512static int connect_test()
513{
514 RSocketServ rSockServ;
515 RSocket rSock;
516 TInetAddr inetAddr;
517 TRequestStatus reqStatus;
518 char buffer[16];
519 TPtrC8 data((const TUint8*)buffer, (TInt)sizeof(buffer));
520 int rc;
521
522 rc = rSockServ.Connect();
523 if (rc != KErrNone)
524 return rc;
525
526 rc = rSock.Open(rSockServ, KAfInet, KSockDatagram, KProtocolInetUdp);
527 if (rc != KErrNone)
528 {
529 rSockServ.Close();
530 return rc;
531 }
532
533 inetAddr.Init(KAfInet);
534 inetAddr.Input(_L("127.0.0.1"));
535 inetAddr.SetPort(80);
536
537 rSock.Connect(inetAddr, reqStatus);
538 User::WaitForRequest(reqStatus);
539
540 if (reqStatus != KErrNone) {
541 rSock.Close();
542 rSockServ.Close();
543 return rc;
544 }
545
546 rSock.Send(data, 0, reqStatus);
547 User::WaitForRequest(reqStatus);
548
549 if (reqStatus!=KErrNone) {
550 rSock.Close();
551 rSockServ.Close();
552 return rc;
553 }
554
555 rSock.Close();
556 rSockServ.Close();
557 return KErrNone;
558}
559#endif
560
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000561int sock_test()
562{
563 int rc;
564
565 pj_create_random_string(bigdata, BIG_DATA_LEN);
566
Benny Prijonof260e462007-04-30 21:03:32 +0000567// Enable this to demonstrate the error witn S60 3rd Edition MR2
568#if 0
569 rc = connect_test();
570 if (rc != 0)
571 return rc;
572#endif
573
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000574 rc = format_test();
575 if (rc != 0)
576 return rc;
577
Benny Prijono60cac482007-03-01 18:56:02 +0000578 rc = gethostbyname_test();
579 if (rc != 0)
580 return rc;
581
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000582 rc = simple_sock_test();
583 if (rc != 0)
584 return rc;
585
586 rc = ioctl_test();
587 if (rc != 0)
588 return rc;
589
590 rc = udp_test();
591 if (rc != 0)
592 return rc;
593
594 rc = tcp_test();
595 if (rc != 0)
596 return rc;
597
598 return 0;
599}
600
601
602#else
603/* To prevent warning about "translation unit is empty"
604 * when this test is disabled.
605 */
606int dummy_sock_test;
607#endif /* INCLUDE_SOCK_TEST */
608