2 Unix SMB/CIFS implementation.
4 local testing of socket routines.
6 Copyright (C) Andrew Tridgell 2005
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>.
23 #include "lib/socket/socket.h"
24 #include "lib/events/events.h"
25 #include "system/network.h"
26 #include "lib/socket/netif.h"
27 #include "torture/torture.h"
30 basic testing of udp routines
32 static bool test_udp(struct torture_context
*tctx
)
34 struct socket_context
*sock1
, *sock2
;
36 struct socket_address
*srv_addr
, *from_addr
, *localhost
;
37 size_t size
= 100 + (random() % 100);
38 DATA_BLOB blob
, blob2
;
40 TALLOC_CTX
*mem_ctx
= tctx
;
42 status
= socket_create("ip", SOCKET_TYPE_DGRAM
, &sock1
, 0);
43 torture_assert_ntstatus_ok(tctx
, status
, "creating DGRAM IP socket 1");
44 talloc_steal(mem_ctx
, sock1
);
46 status
= socket_create("ip", SOCKET_TYPE_DGRAM
, &sock2
, 0);
47 torture_assert_ntstatus_ok(tctx
, status
, "creating DGRAM IP socket 1");
48 talloc_steal(mem_ctx
, sock2
);
50 localhost
= socket_address_from_strings(sock1
, sock1
->backend_name
,
51 iface_best_ip(tctx
->lp_ctx
, "127.0.0.1"), 0);
53 torture_assert(tctx
, localhost
, "Localhost not found");
55 status
= socket_listen(sock1
, localhost
, 0, 0);
56 torture_assert_ntstatus_ok(tctx
, status
, "listen on socket 1");
58 srv_addr
= socket_get_my_addr(sock1
, mem_ctx
);
59 torture_assert(tctx
, srv_addr
!= NULL
&&
60 strcmp(srv_addr
->addr
, iface_best_ip(tctx
->lp_ctx
, "127.0.0.1")) == 0,
62 "Expected server address of %s but got %s",
63 iface_best_ip(tctx
->lp_ctx
, "127.0.0.1"), srv_addr
? srv_addr
->addr
: NULL
));
65 torture_comment(tctx
, "server port is %d\n", srv_addr
->port
);
67 blob
= data_blob_talloc(mem_ctx
, NULL
, size
);
68 blob2
= data_blob_talloc(mem_ctx
, NULL
, size
);
69 generate_random_buffer(blob
.data
, blob
.length
);
72 status
= socket_sendto(sock2
, &blob
, &sent
, srv_addr
);
73 torture_assert_ntstatus_ok(tctx
, status
, "sendto() on socket 2");
75 status
= socket_recvfrom(sock1
, blob2
.data
, size
, &nread
,
77 torture_assert_ntstatus_ok(tctx
, status
, "recvfrom() on socket 1");
79 torture_assert_str_equal(tctx
, from_addr
->addr
, srv_addr
->addr
,
82 torture_assert_int_equal(tctx
, nread
, size
, "Unexpected recvfrom size");
84 torture_assert(tctx
, memcmp(blob2
.data
, blob
.data
, size
) == 0,
85 "Bad data in recvfrom");
87 generate_random_buffer(blob
.data
, blob
.length
);
88 status
= socket_sendto(sock1
, &blob
, &sent
, from_addr
);
89 torture_assert_ntstatus_ok(tctx
, status
, "sendto() on socket 1");
91 status
= socket_recvfrom(sock2
, blob2
.data
, size
, &nread
,
93 torture_assert_ntstatus_ok(tctx
, status
, "recvfrom() on socket 2");
94 torture_assert_str_equal(tctx
, from_addr
->addr
, srv_addr
->addr
,
95 "Unexpected recvfrom addr");
97 torture_assert_int_equal(tctx
, nread
, size
, "Unexpected recvfrom size");
99 torture_assert_int_equal(tctx
, from_addr
->port
, srv_addr
->port
,
100 "Unexpected recvfrom port");
102 torture_assert(tctx
, memcmp(blob2
.data
, blob
.data
, size
) == 0,
103 "Bad data in recvfrom");
111 basic testing of tcp routines
113 static bool test_tcp(struct torture_context
*tctx
)
115 struct socket_context
*sock1
, *sock2
, *sock3
;
117 struct socket_address
*srv_addr
, *from_addr
, *localhost
;
118 size_t size
= 100 + (random() % 100);
119 DATA_BLOB blob
, blob2
;
121 TALLOC_CTX
*mem_ctx
= tctx
;
122 struct event_context
*ev
= event_context_init(mem_ctx
);
124 status
= socket_create("ip", SOCKET_TYPE_STREAM
, &sock1
, 0);
125 torture_assert_ntstatus_ok(tctx
, status
, "creating IP stream socket 1");
126 talloc_steal(mem_ctx
, sock1
);
128 status
= socket_create("ip", SOCKET_TYPE_STREAM
, &sock2
, 0);
129 torture_assert_ntstatus_ok(tctx
, status
, "creating IP stream socket 1");
130 talloc_steal(mem_ctx
, sock2
);
132 localhost
= socket_address_from_strings(sock1
, sock1
->backend_name
,
133 iface_best_ip(tctx
->lp_ctx
, "127.0.0.1"), 0);
134 torture_assert(tctx
, localhost
, "Localhost not found");
136 status
= socket_listen(sock1
, localhost
, 0, 0);
137 torture_assert_ntstatus_ok(tctx
, status
, "listen on socket 1");
139 srv_addr
= socket_get_my_addr(sock1
, mem_ctx
);
140 torture_assert(tctx
, srv_addr
&& srv_addr
->addr
,
141 "Unexpected socket_get_my_addr NULL\n");
143 torture_assert_str_equal(tctx
, srv_addr
->addr
, iface_best_ip(tctx
->lp_ctx
, "127.0.0.1"),
144 "Unexpected server address");
146 torture_comment(tctx
, "server port is %d\n", srv_addr
->port
);
148 status
= socket_connect_ev(sock2
, NULL
, srv_addr
, 0, ev
);
149 torture_assert_ntstatus_ok(tctx
, status
, "connect() on socket 2");
151 status
= socket_accept(sock1
, &sock3
);
152 torture_assert_ntstatus_ok(tctx
, status
, "accept() on socket 1");
153 talloc_steal(mem_ctx
, sock3
);
156 blob
= data_blob_talloc(mem_ctx
, NULL
, size
);
157 blob2
= data_blob_talloc(mem_ctx
, NULL
, size
);
158 generate_random_buffer(blob
.data
, blob
.length
);
161 status
= socket_send(sock2
, &blob
, &sent
);
162 torture_assert_ntstatus_ok(tctx
, status
, "send() on socket 2");
164 status
= socket_recv(sock3
, blob2
.data
, size
, &nread
);
165 torture_assert_ntstatus_ok(tctx
, status
, "recv() on socket 3");
167 from_addr
= socket_get_peer_addr(sock3
, mem_ctx
);
169 torture_assert(tctx
, from_addr
&& from_addr
->addr
,
170 "Unexpected recvfrom addr NULL");
172 torture_assert_str_equal(tctx
, from_addr
->addr
, srv_addr
->addr
,
173 "Unexpected recvfrom addr");
175 torture_assert_int_equal(tctx
, nread
, size
, "Unexpected recvfrom size");
177 torture_assert(tctx
, memcmp(blob2
.data
, blob
.data
, size
) == 0,
182 struct torture_suite
*torture_local_socket(TALLOC_CTX
*mem_ctx
)
184 struct torture_suite
*suite
= torture_suite_create(mem_ctx
,
187 torture_suite_add_simple_test(suite
, "udp", test_udp
);
188 torture_suite_add_simple_test(suite
, "tcp", test_tcp
);