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 2 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, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 #include "lib/socket/socket.h"
25 #include "lib/events/events.h"
26 #include "system/network.h"
27 #include "netif/netif.h"
29 #define CHECK_STATUS(status, correct) do { \
30 if (!NT_STATUS_EQUAL(status, correct)) { \
31 printf("(%s) Incorrect status %s - should be %s\n", \
32 __location__, nt_errstr(status), nt_errstr(correct)); \
39 basic testing of udp routines
41 static BOOL test_udp(TALLOC_CTX *mem_ctx)
43 struct socket_context *sock1, *sock2;
45 struct socket_address *srv_addr, *from_addr, *localhost;
46 size_t size = 100 + (random() % 100);
47 DATA_BLOB blob, blob2;
51 printf("TESTING UDP SOCKETS\n");
53 status = socket_create("ip", SOCKET_TYPE_DGRAM, &sock1, 0);
54 CHECK_STATUS(status, NT_STATUS_OK);
55 talloc_steal(mem_ctx, sock1);
57 status = socket_create("ip", SOCKET_TYPE_DGRAM, &sock2, 0);
58 CHECK_STATUS(status, NT_STATUS_OK);
59 talloc_steal(mem_ctx, sock2);
61 localhost = socket_address_from_strings(sock1, sock1->backend_name,
62 iface_best_ip("127.0.0.1"), 0);
67 status = socket_listen(sock1, localhost, 0, 0);
68 CHECK_STATUS(status, NT_STATUS_OK);
70 srv_addr = socket_get_my_addr(sock1, mem_ctx);
71 if (srv_addr == NULL || strcmp(srv_addr->addr, iface_best_ip("127.0.0.1")) != 0) {
72 printf("Expected server address of %s but got %s\n",
73 iface_best_ip("127.0.0.1"), srv_addr ? srv_addr->addr : NULL);
77 printf("server port is %d\n", srv_addr->port);
79 blob = data_blob_talloc(mem_ctx, NULL, size);
80 blob2 = data_blob_talloc(mem_ctx, NULL, size);
81 generate_random_buffer(blob.data, blob.length);
84 status = socket_sendto(sock2, &blob, &sent, 0, srv_addr);
85 CHECK_STATUS(status, NT_STATUS_OK);
87 status = socket_recvfrom(sock1, blob2.data, size, &nread, 0,
89 CHECK_STATUS(status, NT_STATUS_OK);
91 if (strcmp(from_addr->addr, srv_addr->addr) != 0) {
92 printf("Unexpected recvfrom addr %s\n", from_addr->addr);
96 printf("Unexpected recvfrom size %d should be %d\n", (int)nread, (int)size);
100 if (memcmp(blob2.data, blob.data, size) != 0) {
101 printf("Bad data in recvfrom\n");
105 generate_random_buffer(blob.data, blob.length);
106 status = socket_sendto(sock1, &blob, &sent, 0, from_addr);
107 CHECK_STATUS(status, NT_STATUS_OK);
109 status = socket_recvfrom(sock2, blob2.data, size, &nread, 0,
111 CHECK_STATUS(status, NT_STATUS_OK);
112 if (strcmp(from_addr->addr, srv_addr->addr) != 0) {
113 printf("Unexpected recvfrom addr %s\n", from_addr->addr);
117 printf("Unexpected recvfrom size %d should be %d\n", (int)nread, (int)size);
120 if (from_addr->port != srv_addr->port) {
121 printf("Unexpected recvfrom port %d should be %d\n",
122 from_addr->port, srv_addr->port);
125 if (memcmp(blob2.data, blob.data, size) != 0) {
126 printf("Bad data in recvfrom\n");
138 basic testing of tcp routines
140 static BOOL test_tcp(TALLOC_CTX *mem_ctx)
142 struct socket_context *sock1, *sock2, *sock3;
144 struct socket_address *srv_addr, *from_addr, *localhost;
145 size_t size = 100 + (random() % 100);
146 DATA_BLOB blob, blob2;
149 struct event_context *ev = event_context_init(mem_ctx);
151 printf("TESTING TCP SOCKETS\n");
153 status = socket_create("ip", SOCKET_TYPE_STREAM, &sock1, 0);
154 CHECK_STATUS(status, NT_STATUS_OK);
155 talloc_steal(mem_ctx, sock1);
157 status = socket_create("ip", SOCKET_TYPE_STREAM, &sock2, 0);
158 CHECK_STATUS(status, NT_STATUS_OK);
159 talloc_steal(mem_ctx, sock2);
161 localhost = socket_address_from_strings(sock1, sock1->backend_name,
162 iface_best_ip("127.0.0.1"), 0);
167 status = socket_listen(sock1, localhost, 0, 0);
168 CHECK_STATUS(status, NT_STATUS_OK);
170 srv_addr = socket_get_my_addr(sock1, mem_ctx);
171 if (srv_addr == NULL || !srv_addr->addr) {
172 printf("Unexpected socket_get_my_addr NULL\n");
176 if (strcmp(srv_addr->addr, iface_best_ip("127.0.0.1")) != 0) {
177 printf("Expected server address of %s but got %s\n",
178 iface_best_ip("127.0.0.1"), srv_addr ? srv_addr->addr : NULL);
182 printf("server port is %d\n", srv_addr->port);
184 status = socket_connect_ev(sock2, NULL, srv_addr, 0, ev);
185 CHECK_STATUS(status, NT_STATUS_OK);
187 status = socket_accept(sock1, &sock3);
188 CHECK_STATUS(status, NT_STATUS_OK);
189 talloc_steal(mem_ctx, sock3);
192 blob = data_blob_talloc(mem_ctx, NULL, size);
193 blob2 = data_blob_talloc(mem_ctx, NULL, size);
194 generate_random_buffer(blob.data, blob.length);
197 status = socket_send(sock2, &blob, &sent, 0);
198 CHECK_STATUS(status, NT_STATUS_OK);
200 status = socket_recv(sock3, blob2.data, size, &nread, 0);
201 CHECK_STATUS(status, NT_STATUS_OK);
203 from_addr = socket_get_peer_addr(sock3, mem_ctx);
205 if (!from_addr || !from_addr->addr) {
206 printf("Unexpected recvfrom addr NULL\n");
209 if (strcmp(from_addr->addr, srv_addr->addr) != 0) {
210 printf("Unexpected recvfrom addr %s\n", from_addr ? from_addr->addr : NULL);
214 printf("Unexpected recvfrom size %d should be %d\n", (int)nread, (int)size);
218 if (memcmp(blob2.data, blob.data, size) != 0) {
219 printf("Bad data in recvfrom\n");
223 generate_random_buffer(blob.data, blob.length);
224 status = socket_send(sock3, &blob, &sent, 0);
225 CHECK_STATUS(status, NT_STATUS_OK);
227 status = socket_recv(sock2, blob2.data, size, &nread, 0);
228 CHECK_STATUS(status, NT_STATUS_OK);
230 from_addr = socket_get_peer_addr(sock2, mem_ctx);
232 if (!from_addr || !from_addr->addr) {
233 printf("Unexpected recvfrom addr NULL\n");
236 if (strcmp(from_addr->addr, srv_addr->addr) != 0) {
237 printf("Unexpected recvfrom addr %s\n", from_addr ? from_addr->addr : NULL);
241 printf("Unexpected recvfrom size %d should be %d\n", (int)nread, (int)size);
244 if (from_addr->port != srv_addr->port) {
245 printf("Unexpected recvfrom port %d should be %d\n",
246 from_addr->port, srv_addr->port);
249 if (memcmp(blob2.data, blob.data, size) != 0) {
250 printf("Bad data in recvfrom\n");
259 BOOL torture_local_socket(void)
262 TALLOC_CTX *mem_ctx = talloc_new(NULL);
264 ret &= test_udp(mem_ctx);
265 ret &= test_tcp(mem_ctx);