r4831: added udp support to our generic sockets library.
[bbaumbach/samba-autobuild/.git] / source4 / torture / local / socket.c
1 /* 
2    Unix SMB/CIFS implementation.
3
4    local testing of socket routines.
5
6    Copyright (C) Andrew Tridgell 2005
7    
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.
12    
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.
17    
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.
21 */
22
23 #include "includes.h"
24
25 #define CHECK_STATUS(status, correct) do { \
26         if (!NT_STATUS_EQUAL(status, correct)) { \
27                 printf("(%s) Incorrect status %s - should be %s\n", \
28                        __location__, nt_errstr(status), nt_errstr(correct)); \
29                 ret = False; \
30                 goto done; \
31         }} while (0)
32
33
34 /*
35   basic testing of udp routines
36 */
37 static BOOL test_udp(TALLOC_CTX *mem_ctx)
38 {
39         struct socket_context *sock1, *sock2;
40         NTSTATUS status;
41         int srv_port, from_port;
42         const char *srv_addr, *from_addr;
43         size_t size = 100 + (random() % 100);
44         DATA_BLOB blob, blob2;
45         size_t sent, nread;
46         BOOL ret = True;
47
48         status = socket_create("ip", SOCKET_TYPE_DGRAM, &sock1, 0);
49         CHECK_STATUS(status, NT_STATUS_OK);
50         talloc_steal(mem_ctx, sock1);
51
52         status = socket_create("ip", SOCKET_TYPE_DGRAM, &sock2, 0);
53         CHECK_STATUS(status, NT_STATUS_OK);
54         talloc_steal(mem_ctx, sock2);
55
56         status = socket_listen(sock1, "127.0.0.1", 0, 0, 0);
57         CHECK_STATUS(status, NT_STATUS_OK);
58
59         srv_addr = socket_get_my_addr(sock1, mem_ctx);
60         if (srv_addr == NULL || strcmp(srv_addr, "127.0.0.1") != 0) {
61                 printf("Expected server address of 127.0.0.1 but got %s\n", srv_addr);
62                 return False;
63         }
64
65         srv_port = socket_get_my_port(sock1);
66         printf("server port is %d\n", srv_port);
67
68         blob  = data_blob_talloc(mem_ctx, NULL, size);
69         blob2 = data_blob_talloc(mem_ctx, NULL, size);
70         generate_random_buffer(blob.data, blob.length);
71
72         sent = size;
73         status = socket_sendto(sock2, &blob, &sent, 0, srv_addr, srv_port);
74         CHECK_STATUS(status, NT_STATUS_OK);
75
76         status = socket_recvfrom(sock1, blob2.data, size, &nread, 0, 
77                                  &from_addr, &from_port);
78         CHECK_STATUS(status, NT_STATUS_OK);
79
80         if (strcmp(from_addr, srv_addr) != 0) {
81                 printf("Unexpected recvfrom addr %s\n", from_addr);
82                 ret = False;
83         }
84         if (nread != size) {
85                 printf("Unexpected recvfrom size %d should be %d\n", nread, size);
86                 ret = False;
87         }
88
89         if (memcmp(blob2.data, blob.data, size) != 0) {
90                 printf("Bad data in recvfrom\n");
91                 ret = False;
92         }
93
94         generate_random_buffer(blob.data, blob.length);
95         status = socket_sendto(sock1, &blob, &sent, 0, from_addr, from_port);
96         CHECK_STATUS(status, NT_STATUS_OK);
97
98         status = socket_recvfrom(sock2, blob2.data, size, &nread, 0, 
99                                  &from_addr, &from_port);
100         CHECK_STATUS(status, NT_STATUS_OK);
101         if (strcmp(from_addr, srv_addr) != 0) {
102                 printf("Unexpected recvfrom addr %s\n", from_addr);
103                 ret = False;
104         }
105         if (nread != size) {
106                 printf("Unexpected recvfrom size %d should be %d\n", nread, size);
107                 ret = False;
108         }
109         if (from_port != srv_port) {
110                 printf("Unexpected recvfrom port %d should be %d\n", 
111                        from_port, srv_port);
112                 ret = False;
113         }
114         if (memcmp(blob2.data, blob.data, size) != 0) {
115                 printf("Bad data in recvfrom\n");
116                 ret = False;
117         }
118
119 done:
120         talloc_free(sock1);
121         talloc_free(sock2);
122
123         return ret;
124 }
125
126 BOOL torture_local_socket(void) 
127 {
128         BOOL ret = True;
129         TALLOC_CTX *mem_ctx = talloc_new(NULL);
130
131         ret &= test_udp(mem_ctx);
132
133         return ret;
134 }