1 #include <darwintest.h>
6 #include <sys/socket.h>
7 #include <netinet/in.h>
12 T_GLOBAL_META(T_META_RUN_CONCURRENTLY(true));
14 #define TEST_ADDR "127.0.0.1"
15 #define TEST_PORT 4242
19 struct sockaddr_in addr
;
27 server
.fd
= socket(AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
);
28 T_ASSERT_POSIX_SUCCESS(server
.fd
, "socket");
30 memset(&server
.addr
, 0, sizeof(server
.addr
));
31 server
.addr
.sin_family
= AF_INET
;
32 server
.addr
.sin_port
= htons(TEST_PORT
);
34 inet_pton(AF_INET
, TEST_ADDR
, &server
.addr
.sin_addr
);
36 r
= bind(server
.fd
, (struct sockaddr
*) &server
.addr
, sizeof(server
.addr
));
37 T_ASSERT_POSIX_SUCCESS(r
, "bind");
47 fd
= socket(AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
);
48 T_ASSERT_POSIX_SUCCESS(fd
, "socket");
50 memset(&msg
, 0, sizeof(msg
));
52 msg
.msg_name
= &server
.addr
;
53 msg
.msg_namelen
= sizeof(server
.addr
);
60 ssize_t r
= sendmsg(fd
, &msg
, 0);
61 T_ASSERT_EQ(r
, (ssize_t
)iov
.iov_len
, "sendmsg");
70 struct kevent event
= {
72 .filter
= EVFILT_READ
,
73 .ident
= (unsigned long)server
.fd
,
78 T_ASSERT_POSIX_SUCCESS(kq
, "kqueue");
81 r
= kevent(kq
, &event
, 1, &event
, 1, NULL
);
82 T_EXPECT_EQ(r
, 1, "should return an event");
87 T_DECL(socket_0byte_udp_poll_58140856
,
88 "Tests that 0-sized UDP packets wake up kevent")
90 T_LOG("Starting...\n");
92 /* Listen on UDP port */
95 T_LOG("Server bound to [%s]:%d\n", TEST_ADDR
, TEST_PORT
);
97 /* Send 0-UDP packet to that port */
100 T_LOG("Sent message to server\n");
102 /* Poll kqueue events */
105 T_LOG("Got kqueue event\n");