f6b0f03097eec1898e59f05c5bbb3876647d61a5
[swifty.git] / src / raw / test / test_sw_close.c
1 /*
2  * Test sw_close "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_raw.h"
15 #include "swift_types.h"
16
17 #include "debug.h"
18 #include "util.h"
19
20 #include "test_sw.h"
21 #include "test.h"
22
23 static void close_dummy(void);
24 static void close_invalid_descriptor(void);
25 static void close_descriptor_is_not_a_socket(void);
26 static void close_ok_descriptor_is_not_bound(void);
27 static void close_ok_descriptor_is_bound(void);
28
29 void close_test_suite(void)
30 {
31         start_suite();
32         close_dummy();
33         close_invalid_descriptor();
34         close_descriptor_is_not_a_socket();
35         close_ok_descriptor_is_not_bound();
36         close_ok_descriptor_is_bound();
37 }
38
39 static void close_dummy(void)
40 {
41         test(1 == 1);
42 }
43
44 /* Pass invalid file descriptor to sw_close. */
45 static void close_invalid_descriptor(void)
46 {
47         int rc;
48
49         rc = sw_close(-1);
50
51         test(rc < 0 && errno == EBADF);
52 }
53
54 /* Pass a duplicate of standard output to sw_close. */
55 static void close_descriptor_is_not_a_socket(void)
56 {
57         int fd;
58         int rc;
59
60         fd = dup(STDOUT_FILENO);
61         DIE(fd < 0, "dup");
62
63         rc = sw_close(fd);
64
65         test(rc < 0 && errno == EBADF);
66
67         close(fd);
68 }
69
70 /* Pass a non-bound socket. */
71 static void close_ok_descriptor_is_not_bound(void)
72 {
73         int s;
74         int rc;
75
76         s = sw_socket(PF_INET, SOCK_DGRAM, IPPROTO_SWIFT);
77         DIE(s < 0, "sw_socket");
78
79         rc = sw_close(s);
80
81         test(rc == 0);
82 }
83
84 /* Pass a bound socket. */
85 static void close_ok_descriptor_is_bound(void)
86 {
87         int s;
88         int rc;
89         struct sockaddr_sw addr;
90
91         s = sw_socket(PF_INET, SOCK_DGRAM, IPPROTO_SWIFT);
92         DIE(s < 0, "sw_socket");
93
94         /* TODO: Initialize bind address. */
95
96         rc = sw_bind(s, (struct sockaddr *) &addr, sizeof(addr));
97         DIE(rc < 0, "sw_bind");
98
99         rc = sw_close(s);
100
101         test(rc == 0);
102 }