void test_reallocmsg_reqrep () { int rc; int req; int rep; void *p; void *p2; /* Create sockets. */ req = nn_socket (AF_SP, NN_REQ); rep = nn_socket (AF_SP, NN_REP); rc = nn_bind (rep, "inproc://test"); errno_assert (rc >= 0); rc = nn_connect (req, "inproc://test"); errno_assert (rc >= 0); /* Create message, make sure we handle overflow. */ p = nn_allocmsg (100, 0); nn_assert (p); p2 = nn_reallocmsg (p, -1000); errno_assert (nn_errno () == ENOMEM); nn_assert (p2 == NULL); /* Realloc to fit data size. */ memcpy (p, "Hello World!", 12); p = nn_reallocmsg (p, 12); nn_assert (p); rc = nn_send (req, &p, NN_MSG, 0); errno_assert (rc == 12); /* Receive request and send response. */ rc = nn_recv (rep, &p, NN_MSG, 0); errno_assert (rc == 12); rc = nn_send (rep, &p, NN_MSG, 0); errno_assert (rc == 12); /* Receive response and free message. */ rc = nn_recv (req, &p, NN_MSG, 0); errno_assert (rc == 12); rc = memcmp (p, "Hello World!", 12); nn_assert (rc == 0); rc = nn_freemsg (p); errno_assert (rc == 0); /* Clean up. */ nn_close (req); nn_close (rep); }
void test_reallocmsg_pubsub () { int rc; int pub; int sub1; int sub2; void *p; void *p1; void *p2; /* Create sockets. */ pub = nn_socket (AF_SP, NN_PUB); sub1 = nn_socket (AF_SP, NN_SUB); sub2 = nn_socket (AF_SP, NN_SUB); rc = nn_bind (pub, "inproc://test"); errno_assert (rc >= 0); rc = nn_connect (sub1, "inproc://test"); errno_assert (rc >= 0); rc = nn_connect (sub2, "inproc://test"); errno_assert (rc >= 0); rc = nn_setsockopt (sub1, NN_SUB, NN_SUB_SUBSCRIBE, "", 0); errno_assert (rc == 0); rc = nn_setsockopt (sub2, NN_SUB, NN_SUB_SUBSCRIBE, "", 0); errno_assert (rc == 0); /* Publish message. */ p = nn_allocmsg (12, 0); nn_assert (p); memcpy (p, "Hello World!", 12); rc = nn_send (pub, &p, NN_MSG, 0); errno_assert (rc == 12); /* Receive messages, both messages are the same object with inproc. */ rc = nn_recv (sub1, &p1, NN_MSG, 0); errno_assert (rc == 12); rc = nn_recv (sub2, &p2, NN_MSG, 0); errno_assert (rc == 12); nn_assert (p1 == p2); rc = memcmp (p1, "Hello World!", 12); nn_assert (rc == 0); rc = memcmp (p2, "Hello World!", 12); nn_assert (rc == 0); /* Reallocate one message, both messages shouldn't be the same object anymore. */ p1 = nn_reallocmsg (p1, 15); errno_assert (p1); nn_assert (p1 != p2); memcpy ((char*)p1 + 12, " 42", 3); rc = memcmp (p1, "Hello World! 42", 15); nn_assert (rc == 0); /* Release messages. */ rc = nn_freemsg (p1); errno_assert (rc == 0); rc = nn_freemsg (p2); errno_assert (rc == 0); /* Clean up. */ nn_close (sub2); nn_close (sub1); nn_close (pub); }
int main (int argc, const char *argv[]) { int rc; int sb; int sc; unsigned char *buf1, *buf2; int i; struct nn_iovec iov; struct nn_msghdr hdr; char socket_address_tcp[128]; test_addr_from(socket_address_tcp, "tcp", "127.0.0.1", get_test_port(argc, argv)); sb = test_socket (AF_SP, NN_PAIR); test_bind (sb, SOCKET_ADDRESS); sc = test_socket (AF_SP, NN_PAIR); test_connect (sc, SOCKET_ADDRESS); buf1 = nn_allocmsg (256, 0); alloc_assert (buf1); for (i = 0; i != 256; ++i) buf1 [i] = (unsigned char) i; rc = nn_send (sc, &buf1, NN_MSG, 0); errno_assert (rc >= 0); nn_assert (rc == 256); buf2 = NULL; rc = nn_recv (sb, &buf2, NN_MSG, 0); errno_assert (rc >= 0); nn_assert (rc == 256); nn_assert (buf2); for (i = 0; i != 256; ++i) nn_assert (buf2 [i] == (unsigned char) i); rc = nn_freemsg (buf2); errno_assert (rc == 0); buf1 = nn_allocmsg (256, 0); alloc_assert (buf1); for (i = 0; i != 256; ++i) buf1 [i] = (unsigned char) i; iov.iov_base = &buf1; iov.iov_len = NN_MSG; memset (&hdr, 0, sizeof (hdr)); hdr.msg_iov = &iov; hdr.msg_iovlen = 1; rc = nn_sendmsg (sc, &hdr, 0); errno_assert (rc >= 0); nn_assert (rc == 256); buf2 = NULL; iov.iov_base = &buf2; iov.iov_len = NN_MSG; memset (&hdr, 0, sizeof (hdr)); hdr.msg_iov = &iov; hdr.msg_iovlen = 1; rc = nn_recvmsg (sb, &hdr, 0); errno_assert (rc >= 0); nn_assert (rc == 256); nn_assert (buf2); for (i = 0; i != 256; ++i) nn_assert (buf2 [i] == (unsigned char) i); rc = nn_freemsg (buf2); errno_assert (rc == 0); test_close (sc); test_close (sb); /* Test receiving of large message */ sb = test_socket (AF_SP, NN_PAIR); test_bind (sb, socket_address_tcp); sc = test_socket (AF_SP, NN_PAIR); test_connect (sc, socket_address_tcp); for (i = 0; i < (int) sizeof (longdata); ++i) longdata[i] = '0' + (i % 10); longdata [sizeof (longdata) - 1] = 0; test_send (sb, longdata); rc = nn_recv (sc, &buf2, NN_MSG, 0); errno_assert (rc >= 0); nn_assert (rc == sizeof (longdata) - 1); nn_assert (buf2); for (i = 0; i < (int) sizeof (longdata) - 1; ++i) nn_assert (buf2 [i] == longdata [i]); rc = nn_freemsg (buf2); errno_assert (rc == 0); test_close (sc); test_close (sb); /* Test reallocmsg */ buf1 = nn_allocmsg (8, 0); alloc_assert (buf1); buf2 = nn_reallocmsg (buf1, 1); nn_assert (buf2 == buf1); buf1 = nn_reallocmsg (buf2, 100); nn_assert (buf1 != buf2); nn_assert (buf1 != 0); nn_freemsg (buf1); return 0; }