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(mem_ctx
, "ip", SOCKET_TYPE_DGRAM
, &sock1
, 0);
49 torture_assert_ntstatus_ok(tctx
, status
, "creating DGRAM IP socket 1");
51 status
= socket_create(mem_ctx
, "ip", SOCKET_TYPE_DGRAM
, &sock2
, 0);
52 torture_assert_ntstatus_ok(tctx
, status
, "creating DGRAM IP socket 1");
54 localhost
= socket_address_from_strings(sock1
, sock1
->backend_name
,
55 iface_list_best_ip(ifaces
, "127.0.0.1"), 0);
57 torture_assert(tctx
, localhost
, "Localhost not found");
59 status
= socket_listen(sock1
, localhost
, 0, 0);
60 torture_assert_ntstatus_ok(tctx
, status
, "listen on socket 1");
62 srv_addr
= socket_get_my_addr(sock1
, mem_ctx
);
63 torture_assert(tctx
, srv_addr
!= NULL
&&
64 strcmp(srv_addr
->addr
, iface_list_best_ip(ifaces
, "127.0.0.1")) == 0,
66 "Expected server address of %s but got %s",
67 iface_list_best_ip(ifaces
, "127.0.0.1"), srv_addr
? srv_addr
->addr
: NULL
));
69 torture_comment(tctx
, "server port is %d\n", srv_addr
->port
);
71 blob
= data_blob_talloc(mem_ctx
, NULL
, size
);
72 blob2
= data_blob_talloc(mem_ctx
, NULL
, size
);
73 generate_random_buffer(blob
.data
, blob
.length
);
76 status
= socket_sendto(sock2
, &blob
, &sent
, srv_addr
);
77 torture_assert_ntstatus_ok(tctx
, status
, "sendto() on socket 2");
79 status
= socket_recvfrom(sock1
, blob2
.data
, size
, &nread
,
81 torture_assert_ntstatus_ok(tctx
, status
, "recvfrom() on socket 1");
83 torture_assert_str_equal(tctx
, from_addr
->addr
, srv_addr
->addr
,
86 torture_assert_int_equal(tctx
, nread
, size
, "Unexpected recvfrom size");
88 torture_assert_mem_equal(tctx
, blob2
.data
, blob
.data
, size
,
89 "Bad data in recvfrom");
91 generate_random_buffer(blob
.data
, blob
.length
);
92 status
= socket_sendto(sock1
, &blob
, &sent
, from_addr
);
93 torture_assert_ntstatus_ok(tctx
, status
, "sendto() on socket 1");
95 status
= socket_recvfrom(sock2
, blob2
.data
, size
, &nread
,
97 torture_assert_ntstatus_ok(tctx
, status
, "recvfrom() on socket 2");
98 torture_assert_str_equal(tctx
, from_addr
->addr
, srv_addr
->addr
,
99 "Unexpected recvfrom addr");
101 torture_assert_int_equal(tctx
, nread
, size
, "Unexpected recvfrom size");
103 torture_assert_int_equal(tctx
, from_addr
->port
, srv_addr
->port
,
104 "Unexpected recvfrom port");
106 torture_assert_mem_equal(tctx
, blob2
.data
, blob
.data
, size
,
107 "Bad data in recvfrom");
115 basic testing of tcp routines
117 static bool test_tcp(struct torture_context
*tctx
)
119 struct socket_context
*sock1
, *sock2
, *sock3
;
121 struct socket_address
*srv_addr
, *from_addr
, *localhost
;
122 size_t size
= 100 + (random() % 100);
123 DATA_BLOB blob
, blob2
;
125 TALLOC_CTX
*mem_ctx
= tctx
;
126 struct tevent_context
*ev
= tctx
->ev
;
127 struct interface
*ifaces
;
129 status
= socket_create(mem_ctx
, "ip", SOCKET_TYPE_STREAM
, &sock1
, 0);
130 torture_assert_ntstatus_ok(tctx
, status
, "creating IP stream socket 1");
132 status
= socket_create(mem_ctx
, "ip", SOCKET_TYPE_STREAM
, &sock2
, 0);
133 torture_assert_ntstatus_ok(tctx
, status
, "creating IP stream socket 1");
135 load_interface_list(tctx
, tctx
->lp_ctx
, &ifaces
);
136 localhost
= socket_address_from_strings(sock1
, sock1
->backend_name
,
137 iface_list_best_ip(ifaces
, "127.0.0.1"), 0);
138 torture_assert(tctx
, localhost
, "Localhost not found");
140 status
= socket_listen(sock1
, localhost
, 0, 0);
141 torture_assert_ntstatus_ok(tctx
, status
, "listen on socket 1");
143 srv_addr
= socket_get_my_addr(sock1
, mem_ctx
);
144 torture_assert(tctx
, srv_addr
&& srv_addr
->addr
,
145 "Unexpected socket_get_my_addr NULL\n");
147 torture_assert_str_equal(tctx
, srv_addr
->addr
, iface_list_best_ip(ifaces
, "127.0.0.1"),
148 "Unexpected server address");
150 torture_comment(tctx
, "server port is %d\n", srv_addr
->port
);
152 status
= socket_connect_ev(sock2
, NULL
, srv_addr
, 0, ev
);
153 torture_assert_ntstatus_ok(tctx
, status
, "connect() on socket 2");
155 status
= socket_accept(sock1
, &sock3
);
156 torture_assert_ntstatus_ok(tctx
, status
, "accept() on socket 1");
157 talloc_steal(mem_ctx
, sock3
);
160 blob
= data_blob_talloc(mem_ctx
, NULL
, size
);
161 blob2
= data_blob_talloc(mem_ctx
, NULL
, size
);
162 generate_random_buffer(blob
.data
, blob
.length
);
165 status
= socket_send(sock2
, &blob
, &sent
);
166 torture_assert_ntstatus_ok(tctx
, status
, "send() on socket 2");
168 status
= socket_recv(sock3
, blob2
.data
, size
, &nread
);
169 torture_assert_ntstatus_ok(tctx
, status
, "recv() on socket 3");
171 from_addr
= socket_get_peer_addr(sock3
, mem_ctx
);
173 torture_assert(tctx
, from_addr
&& from_addr
->addr
,
174 "Unexpected recvfrom addr NULL");
176 torture_assert_str_equal(tctx
, from_addr
->addr
, srv_addr
->addr
,
177 "Unexpected recvfrom addr");
179 torture_assert_int_equal(tctx
, nread
, size
, "Unexpected recvfrom size");
181 torture_assert_mem_equal(tctx
, blob2
.data
, blob
.data
, size
,
186 struct torture_suite
*torture_local_socket(TALLOC_CTX
*mem_ctx
)
188 struct torture_suite
*suite
= torture_suite_create(mem_ctx
, "socket");
190 torture_suite_add_simple_test(suite
, "udp", test_udp
);
191 torture_suite_add_simple_test(suite
, "tcp", test_tcp
);