Move MPTP ports to 16bit. Until now they were on 8bit.
[swifty.git] / src / kernel / test / test_sendto.c
1 /*
2  * Test sendto "syscall".
3  */
4
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <string.h>
8 #include <sys/types.h>
9 #include <unistd.h>
10 #include <sys/socket.h>
11 #include <netinet/in.h>
12 #include <errno.h>
13
14 #include "swift_types.h"
15
16 #include "debug.h"
17 #include "util.h"
18
19 #include "test_sw.h"
20 #include "test.h"
21
22 static void sendto_dummy(void);
23 static void sendto_invalid_descriptor(void);
24 static void sendto_descriptor_is_not_socket(void);
25 static void sendto_socket_is_not_bound(void);
26 static void sendto_ok(void);
27
28 // Additional function
29 static void fill_sockaddr_sw(struct sockaddr_sw *local_addr, struct sockaddr_sw *remote_addr, char * local_address, char * hash, char * dest_address);
30
31 void sendto_test_suite(void)
32 {
33         start_suite();
34         sendto_dummy();
35
36         sendto_invalid_descriptor();
37         sendto_descriptor_is_not_socket();
38         sendto_socket_is_not_bound();
39         sendto_ok();
40 }
41
42 static void sendto_dummy(void)
43 {
44         test(1 == 1);
45 }
46
47 static void sendto_invalid_descriptor() 
48 {
49         struct sockaddr_sw local_addr;
50         struct sockaddr_sw remote_addr;
51         ssize_t bytes_sent;
52         char buffer[BUFSIZ];
53
54         fill_sockaddr_sw(&local_addr, &remote_addr, "127.0.0.1", "myHash", "127.0.0.1");
55         bytes_sent = sendto(-1, buffer, BUFSIZ, 0, (struct sockaddr *) &remote_addr, sizeof(remote_addr));
56
57         test(bytes_sent < 0 && errno == EBADF);
58 }
59
60 static void sendto_descriptor_is_not_socket(void)
61 {
62         struct sockaddr_sw local_addr;
63         struct sockaddr_sw remote_addr;
64         ssize_t bytes_sent;
65         char buffer[BUFSIZ];
66
67         fill_sockaddr_sw(&local_addr, &remote_addr, "127.0.0.1", "myHash", "127.0.0.1");
68         bytes_sent = sendto(1, buffer, BUFSIZ, 0, (struct sockaddr *) &remote_addr, sizeof(remote_addr));
69
70         test(bytes_sent < 0 && errno == ENOTSOCK);
71 }
72
73 static void sendto_socket_is_not_bound(void)
74 {
75         int sockfd;
76         struct sockaddr_sw local_addr;
77         struct sockaddr_sw remote_addr;
78         ssize_t bytes_sent;
79         char buffer[BUFSIZ];
80         
81         sockfd = socket(PF_INET, SOCK_DGRAM, IPPROTO_SWIFT);
82         DIE(sockfd < 0, "socket");      
83         
84         fill_sockaddr_sw(&local_addr, &remote_addr, "127.0.0.1", "myHash", "127.0.0.1");
85         bytes_sent = sendto(sockfd, buffer, BUFSIZ, 0, (struct sockaddr *) &remote_addr, sizeof(remote_addr));
86
87         test( bytes_sent < 0 && errno == EAFNOSUPPORT );
88 }
89
90 static void sendto_ok(void) 
91 {
92         int sockfd;
93         struct sockaddr_sw local_addr;
94         struct sockaddr_sw remote_addr;
95         ssize_t bytes_sent;
96         char buffer[BUFSIZ];
97         int rc;
98
99         fill_sockaddr_sw(&local_addr, &remote_addr, "127.0.0.1", "myHash", "127.0.0.1");
100
101         sockfd = socket(PF_INET, SOCK_DGRAM, IPPROTO_SWIFT);
102         DIE(sockfd < 0, "socket");
103
104         rc = bind(sockfd, (struct sockaddr *) &local_addr, sizeof(local_addr));
105         DIE(rc < 0, "bind");
106
107         bytes_sent = sendto(sockfd, buffer, BUFSIZ, 0, (struct sockaddr *) &remote_addr, sizeof(remote_addr));
108         
109         perror("sendto");
110         test( bytes_sent >= 0 );
111
112 }
113
114 static void fill_sockaddr_sw(struct sockaddr_sw *local_addr, struct sockaddr_sw *remote_addr, char * local_address, char * hash, char * dest_address) 
115 {
116         inet_pton(PF_INET, local_address, &(local_addr->sin_addr));
117         memcpy(&local_addr->sw_hash, hash, sizeof(struct sw_hash));
118
119         inet_pton(PF_INET, dest_address, &(remote_addr->sin_addr));
120         memcpy(&remote_addr->sw_hash, hash, sizeof(struct sw_hash));
121 }