diff options
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/tcp.c | 4 | ||||
| -rw-r--r-- | tests/udp.c | 197 |
2 files changed, 193 insertions, 8 deletions
diff --git a/tests/tcp.c b/tests/tcp.c index 92e50a8b..54ce26b0 100644 --- a/tests/tcp.c +++ b/tests/tcp.c @@ -31,7 +31,7 @@ check_props_v4(nng_msg *msg, nng_listener l, nng_dialer d) So(nng_pipe_getopt(p, NNG_OPT_LOCADDR, &la, &z) == 0); So(z == sizeof(la)); So(la.s_un.s_family == NNG_AF_INET); - // So(la.s_un.s_in.sa_port == (trantest_port - 1)); + So(la.s_un.s_in.sa_port == htons(trantest_port - 1)); So(la.s_un.s_in.sa_port != 0); So(la.s_un.s_in.sa_addr == htonl(0x7f000001)); }); @@ -44,8 +44,6 @@ check_props_v4(nng_msg *msg, nng_listener l, nng_dialer d) So(ra.s_un.s_family == NNG_AF_INET); So(ra.s_un.s_in.sa_port != 0); So(ra.s_un.s_in.sa_addr == htonl(0x7f000001)); - - So(nng_dialer_getopt(d, NNG_OPT_REMADDR, &ra, &z) != 0); }); return (0); diff --git a/tests/udp.c b/tests/udp.c index 7f681ae1..e343bbab 100644 --- a/tests/udp.c +++ b/tests/udp.c @@ -36,16 +36,16 @@ TestMain("UDP support", { loopback = htonl(0x7f000001); // 127.0.0.1 + p1 = trantest_port++; + p2 = trantest_port++; + sa1.s_un.s_in.sa_family = NNG_AF_INET; sa1.s_un.s_in.sa_addr = loopback; - sa1.s_un.s_in.sa_port = trantest_port++; + sa1.s_un.s_in.sa_port = htons(p1); sa2.s_un.s_in.sa_family = NNG_AF_INET; sa2.s_un.s_in.sa_addr = loopback; - sa2.s_un.s_in.sa_port = trantest_port++; - - p1 = sa1.s_un.s_in.sa_port; - p2 = sa2.s_un.s_in.sa_port; + sa2.s_un.s_in.sa_port = htons(p2); So(nni_plat_udp_open(&u1, &sa1) == 0); So(nni_plat_udp_open(&u2, &sa2) == 0); @@ -92,9 +92,196 @@ TestMain("UDP support", { So(from.s_un.s_in.sa_port == sa1.s_un.s_in.sa_port); So(from.s_un.s_in.sa_addr == sa1.s_un.s_in.sa_addr); + // Set up some calls that will ever complete, so + // we test cancellation, etc. + nni_plat_udp_recv(u2, aio2); + nni_plat_udp_send(u2, aio1); + + nni_aio_fini(aio1); + nni_aio_fini(aio2); + }); + + Convey("Sending without an address fails", { + nni_aio *aio1; + char * msg = "nope"; + + nni_aio_init(&aio1, NULL, NULL); + aio1->a_niov = 1; + aio1->a_iov[0].iov_buf = msg; + aio1->a_iov[0].iov_len = strlen(msg) + 1; + + nni_plat_udp_send(u1, aio1); + nni_aio_wait(aio1); + So(nni_aio_result(aio1) == NNG_EADDRINVAL); + nni_aio_fini(aio1); + }); + + Convey("Multiple operations work", { + char msg1[] = "hello"; + char msg2[] = "there"; + char rbuf1[32]; + char rbuf2[32]; + nng_sockaddr to1; + nng_sockaddr to2; + nng_sockaddr from1; + nng_sockaddr from2; + nni_aio * aio1; + nni_aio * aio2; + nni_aio * aio3; + nni_aio * aio4; + + nni_aio_init(&aio1, NULL, NULL); + nni_aio_init(&aio2, NULL, NULL); + nni_aio_init(&aio3, NULL, NULL); + nni_aio_init(&aio4, NULL, NULL); + + to1 = sa2; + aio1->a_niov = 1; + aio1->a_iov[0].iov_buf = msg1; + aio1->a_iov[0].iov_len = strlen(msg1) + 1; + aio1->a_addr = &to1; + + to2 = sa2; + aio2->a_niov = 1; + aio2->a_iov[0].iov_buf = msg2; + aio2->a_iov[0].iov_len = strlen(msg2) + 1; + aio2->a_addr = &to2; + + aio3->a_niov = 1; + aio3->a_iov[0].iov_buf = rbuf1; + aio3->a_iov[0].iov_len = 1024; + aio3->a_addr = &from1; + + aio4->a_niov = 1; + aio4->a_iov[0].iov_buf = rbuf2; + aio4->a_iov[0].iov_len = 1024; + aio4->a_addr = &from2; + + nni_plat_udp_recv(u2, aio4); + nni_plat_udp_recv(u2, aio3); + nni_plat_udp_send(u1, aio2); + // This delay here is required to test for a race + // condition that does not occur if it is absent. + nng_usleep(200); + nni_plat_udp_send(u1, aio1); + + nni_aio_wait(aio2); + nni_aio_wait(aio1); + nni_aio_wait(aio3); + nni_aio_wait(aio4); + + So(nni_aio_result(aio1) == 0); + So(nni_aio_result(aio2) == 0); + So(nni_aio_result(aio3) == 0); + So(nni_aio_result(aio4) == 0); + + So(from1.s_un.s_in.sa_family == + sa1.s_un.s_in.sa_family); + So(from1.s_un.s_in.sa_port == sa1.s_un.s_in.sa_port); + So(from1.s_un.s_in.sa_addr == sa1.s_un.s_in.sa_addr); + nni_aio_fini(aio1); nni_aio_fini(aio2); + nni_aio_fini(aio3); + nni_aio_fini(aio4); }); + + Convey("Sending without an address fails", { + nni_aio *aio1; + char * msg = "nope"; + + nni_aio_init(&aio1, NULL, NULL); + aio1->a_niov = 1; + aio1->a_iov[0].iov_buf = msg; + aio1->a_iov[0].iov_len = strlen(msg) + 1; + + nni_plat_udp_send(u1, aio1); + nni_aio_wait(aio1); + So(nni_aio_result(aio1) == NNG_EADDRINVAL); + nni_aio_fini(aio1); + }); + + Convey("Sending to an IPv6 address on IPv4 fails", { + nni_aio * aio1; + char * msg = "nope"; + nng_sockaddr sa; + int rv; + + sa.s_un.s_in6.sa_family = NNG_AF_INET6; + // address is for google.com + inet_ntop(AF_INET6, "2607:f8b0:4007:804::200e", + (void *) sa.s_un.s_in6.sa_addr, 16); + sa.s_un.s_in6.sa_port = 80; + nni_aio_init(&aio1, NULL, NULL); + aio1->a_niov = 1; + aio1->a_iov[0].iov_buf = msg; + aio1->a_iov[0].iov_len = strlen(msg) + 1; + aio1->a_addr = &sa; + + nni_plat_udp_send(u1, aio1); + nni_aio_wait(aio1); + So((rv = nni_aio_result(aio1)) != 0); + So(rv == NNG_EADDRINVAL || rv == NNG_ENOTSUP || + rv == NNG_EUNREACHABLE); + nni_aio_fini(aio1); + }); + + Convey("Sending to an IPC address fails", { + nni_aio * aio1; + char * msg = "nope"; + nng_sockaddr sa; + int rv; + + sa.s_un.s_in6.sa_family = NNG_AF_INET6; + // address is for google.com + inet_ntop(AF_INET6, "2607:f8b0:4007:804::200e", + (void *) sa.s_un.s_in6.sa_addr, 16); + sa.s_un.s_in6.sa_port = 80; + nni_aio_init(&aio1, NULL, NULL); + aio1->a_niov = 1; + aio1->a_iov[0].iov_buf = msg; + aio1->a_iov[0].iov_len = strlen(msg) + 1; + aio1->a_addr = &sa; + + nni_plat_udp_send(u1, aio1); + nni_aio_wait(aio1); + So((rv = nni_aio_result(aio1)) != 0); + So(rv == NNG_EADDRINVAL || rv == NNG_ENOTSUP || + rv == NNG_EUNREACHABLE); + nni_aio_fini(aio1); + }); + + }); + + Convey("Cannot open using bogus sockaddr", { + nni_plat_udp *u; + nng_sockaddr sa; + int rv; + + sa.s_un.s_path.sa_family = NNG_AF_IPC; + strcpy(sa.s_un.s_path.sa_path, "/tmp/t"); + So((rv = nni_plat_udp_open(&u, &sa)) != 0); + // Some platforms reject IPC addresses altogether (Windows), + // whereas others just say it's not supported with UDP. + So((rv == NNG_ENOTSUP) || (rv == NNG_EADDRINVAL)); + + // NULL address also bad. + So((rv = nni_plat_udp_open(&u, NULL)) == NNG_EADDRINVAL); + }); + + Convey("Duplicate binds fail", { + nni_plat_udp *u1; + nni_plat_udp *u2; + nng_sockaddr sa; + uint16_t p1; + + p1 = trantest_port++; + sa.s_un.s_in.sa_family = NNG_AF_INET; + sa.s_un.s_in.sa_port = htons(p1); + sa.s_un.s_in.sa_addr = htonl(0x7f000001); + So(nni_plat_udp_open(&u1, &sa) == 0); + So(nni_plat_udp_open(&u2, &sa) == NNG_EADDRINUSE); + nni_plat_udp_close(u1); }); }); |
