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"
28 #include "torture/local/proto.h"
29 #include "param/param.h"
30 #include "libcli/resolve/resolve.h"
33 basic testing of udp routines
35 static bool test_udp(struct torture_context
*tctx
)
37 struct socket_context
*sock1
, *sock2
;
39 struct socket_address
*srv_addr
, *from_addr
, *localhost
;
40 size_t size
= 100 + (random() % 100);
41 DATA_BLOB blob
, blob2
;
43 TALLOC_CTX
*mem_ctx
= tctx
;
44 struct interface
*ifaces
;
46 load_interface_list(tctx
, tctx
->lp_ctx
, &ifaces
);
48 status
= socket_create("ip", SOCKET_TYPE_DGRAM
, &sock1
, 0);
49 torture_assert_ntstatus_ok(tctx
, status
, "creating DGRAM IP socket 1");
50 talloc_steal(mem_ctx
, sock1
);
52 status
= socket_create("ip", SOCKET_TYPE_DGRAM
, &sock2
, 0);
53 torture_assert_ntstatus_ok(tctx
, status
, "creating DGRAM IP socket 1");
54 talloc_steal(mem_ctx
, sock2
);
56 localhost
= socket_address_from_strings(sock1
, sock1
->backend_name
,
57 iface_list_best_ip(ifaces
, "127.0.0.1"), 0);
59 torture_assert(tctx
, localhost
, "Localhost not found");
61 status
= socket_listen(sock1
, localhost
, 0, 0);
62 torture_assert_ntstatus_ok(tctx
, status
, "listen on socket 1");
64 srv_addr
= socket_get_my_addr(sock1
, mem_ctx
);
65 torture_assert(tctx
, srv_addr
!= NULL
&&
66 strcmp(srv_addr
->addr
, iface_list_best_ip(ifaces
, "127.0.0.1")) == 0,
68 "Expected server address of %s but got %s",
69 iface_list_best_ip(ifaces
, "127.0.0.1"), srv_addr
? srv_addr
->addr
: NULL
));
71 torture_comment(tctx
, "server port is %d\n", srv_addr
->port
);
73 blob
= data_blob_talloc(mem_ctx
, NULL
, size
);
74 blob2
= data_blob_talloc(mem_ctx
, NULL
, size
);
75 generate_random_buffer(blob
.data
, blob
.length
);
78 status
= socket_sendto(sock2
, &blob
, &sent
, srv_addr
);
79 torture_assert_ntstatus_ok(tctx
, status
, "sendto() on socket 2");
81 status
= socket_recvfrom(sock1
, blob2
.data
, size
, &nread
,
83 torture_assert_ntstatus_ok(tctx
, status
, "recvfrom() on socket 1");
85 torture_assert_str_equal(tctx
, from_addr
->addr
, srv_addr
->addr
,
88 torture_assert_int_equal(tctx
, nread
, size
, "Unexpected recvfrom size");
90 torture_assert_mem_equal(tctx
, blob2
.data
, blob
.data
, size
,
91 "Bad data in recvfrom");
93 generate_random_buffer(blob
.data
, blob
.length
);
94 status
= socket_sendto(sock1
, &blob
, &sent
, from_addr
);
95 torture_assert_ntstatus_ok(tctx
, status
, "sendto() on socket 1");
97 status
= socket_recvfrom(sock2
, blob2
.data
, size
, &nread
,
99 torture_assert_ntstatus_ok(tctx
, status
, "recvfrom() on socket 2");
100 torture_assert_str_equal(tctx
, from_addr
->addr
, srv_addr
->addr
,
101 "Unexpected recvfrom addr");
103 torture_assert_int_equal(tctx
, nread
, size
, "Unexpected recvfrom size");
105 torture_assert_int_equal(tctx
, from_addr
->port
, srv_addr
->port
,
106 "Unexpected recvfrom port");
108 torture_assert_mem_equal(tctx
, blob2
.data
, blob
.data
, size
,
109 "Bad data in recvfrom");
117 basic testing of tcp routines
119 static bool test_tcp(struct torture_context
*tctx
)
121 struct socket_context
*sock1
, *sock2
, *sock3
;
123 struct socket_address
*srv_addr
, *from_addr
, *localhost
;
124 size_t size
= 100 + (random() % 100);
125 DATA_BLOB blob
, blob2
;
127 TALLOC_CTX
*mem_ctx
= tctx
;
128 struct tevent_context
*ev
= tctx
->ev
;
129 struct interface
*ifaces
;
131 status
= socket_create("ip", SOCKET_TYPE_STREAM
, &sock1
, 0);
132 torture_assert_ntstatus_ok(tctx
, status
, "creating IP stream socket 1");
133 talloc_steal(mem_ctx
, sock1
);
135 status
= socket_create("ip", SOCKET_TYPE_STREAM
, &sock2
, 0);
136 torture_assert_ntstatus_ok(tctx
, status
, "creating IP stream socket 1");
137 talloc_steal(mem_ctx
, sock2
);
139 load_interface_list(tctx
, tctx
->lp_ctx
, &ifaces
);
140 localhost
= socket_address_from_strings(sock1
, sock1
->backend_name
,
141 iface_list_best_ip(ifaces
, "127.0.0.1"), 0);
142 torture_assert(tctx
, localhost
, "Localhost not found");
144 status
= socket_listen(sock1
, localhost
, 0, 0);
145 torture_assert_ntstatus_ok(tctx
, status
, "listen on socket 1");
147 srv_addr
= socket_get_my_addr(sock1
, mem_ctx
);
148 torture_assert(tctx
, srv_addr
&& srv_addr
->addr
,
149 "Unexpected socket_get_my_addr NULL\n");
151 torture_assert_str_equal(tctx
, srv_addr
->addr
, iface_list_best_ip(ifaces
, "127.0.0.1"),
152 "Unexpected server address");
154 torture_comment(tctx
, "server port is %d\n", srv_addr
->port
);
156 status
= socket_connect_ev(sock2
, NULL
, srv_addr
, 0, ev
);
157 torture_assert_ntstatus_ok(tctx
, status
, "connect() on socket 2");
159 status
= socket_accept(sock1
, &sock3
);
160 torture_assert_ntstatus_ok(tctx
, status
, "accept() on socket 1");
161 talloc_steal(mem_ctx
, sock3
);
164 blob
= data_blob_talloc(mem_ctx
, NULL
, size
);
165 blob2
= data_blob_talloc(mem_ctx
, NULL
, size
);
166 generate_random_buffer(blob
.data
, blob
.length
);
169 status
= socket_send(sock2
, &blob
, &sent
);
170 torture_assert_ntstatus_ok(tctx
, status
, "send() on socket 2");
172 status
= socket_recv(sock3
, blob2
.data
, size
, &nread
);
173 torture_assert_ntstatus_ok(tctx
, status
, "recv() on socket 3");
175 from_addr
= socket_get_peer_addr(sock3
, mem_ctx
);
177 torture_assert(tctx
, from_addr
&& from_addr
->addr
,
178 "Unexpected recvfrom addr NULL");
180 torture_assert_str_equal(tctx
, from_addr
->addr
, srv_addr
->addr
,
181 "Unexpected recvfrom addr");
183 torture_assert_int_equal(tctx
, nread
, size
, "Unexpected recvfrom size");
185 torture_assert_mem_equal(tctx
, blob2
.data
, blob
.data
, size
,
190 struct torture_suite
*torture_local_socket(TALLOC_CTX
*mem_ctx
)
192 struct torture_suite
*suite
= torture_suite_create(mem_ctx
, "socket");
194 torture_suite_add_simple_test(suite
, "udp", test_udp
);
195 torture_suite_add_simple_test(suite
, "tcp", test_tcp
);