aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2017-09-15 09:32:53 -0700
committerGarrett D'Amore <garrett@damore.org>2017-09-22 12:36:08 -0700
commit97824a96b06f294476c6e1cabb3216282e86a308 (patch)
treeff7869451b57a856da9ed177b998fcf515bb511d
parente236dc8141f4d00dc926fbfba7739dabf96ebcdd (diff)
downloadnng-97824a96b06f294476c6e1cabb3216282e86a308.tar.gz
nng-97824a96b06f294476c6e1cabb3216282e86a308.tar.bz2
nng-97824a96b06f294476c6e1cabb3216282e86a308.zip
Add test for sending and receiving large amounts of data.
We send and receive 128k at a time. This validates that fragmentation and reassembly in the ZeroTier transport work as intended. It also is larger than any single TCP segment.
-rw-r--r--tests/trantest.h55
1 files changed, 55 insertions, 0 deletions
diff --git a/tests/trantest.h b/tests/trantest.h
index d4d65eee..afb5a881 100644
--- a/tests/trantest.h
+++ b/tests/trantest.h
@@ -166,6 +166,60 @@ trantest_send_recv(trantest *tt)
nng_msg_free(recv);
});
}
+
+void
+trantest_send_recv_large(trantest *tt)
+{
+ Convey("Send and recv large data", {
+ nng_listener l;
+ nng_dialer d;
+ nng_msg * send;
+ nng_msg * recv;
+ char * data;
+ size_t size;
+
+ size = 1024 * 128; // bigger than any transport segment
+ So((data = nng_alloc(size)) != NULL);
+
+ for (int i = 0; i < size; i++) {
+ data[i] = nni_random() & 0xff;
+ }
+
+ So(nng_listen(tt->repsock, tt->addr, &l, 0) == 0);
+ So(l != 0);
+ So(nng_dial(tt->reqsock, tt->addr, &d, 0) == 0);
+ So(d != 0);
+
+ nng_usleep(20000); // listener may be behind slightly
+
+ send = NULL;
+ So(nng_msg_alloc(&send, size) == 0);
+ So(send != NULL);
+ memcpy(nng_msg_body(send), data, size);
+
+ So(nng_sendmsg(tt->reqsock, send, 0) == 0);
+ recv = NULL;
+ So(nng_recvmsg(tt->repsock, &recv, 0) == 0);
+ So(recv != NULL);
+ So(nng_msg_len(recv) == size);
+ So(memcmp(nng_msg_body(recv), data, size) == 0);
+ nng_msg_free(recv);
+
+ memset(data, 0x2, size);
+
+ So(nng_msg_alloc(&send, 0) == 0);
+ So(nng_msg_append(send, data, size) == 0);
+ So(nng_sendmsg(tt->repsock, send, 0) == 0);
+ So(nng_recvmsg(tt->reqsock, &recv, 0) == 0);
+ So(recv != NULL);
+ So(nng_msg_len(recv) == size);
+ So(memcmp(nng_msg_body(recv), data, size) == 0);
+ nng_msg_free(recv);
+
+ nng_free(data, size);
+ })
+}
+
void
trantest_test_all(const char *addr)
{
@@ -181,5 +235,6 @@ trantest_test_all(const char *addr)
trantest_duplicate_listen(&tt);
trantest_listen_accept(&tt);
trantest_send_recv(&tt);
+ trantest_send_recv_large(&tt);
})
}