Skip to content

Commit

Permalink
test: add specific source multicast tests
Browse files Browse the repository at this point in the history
PR-URL: #2202
Reviewed-By: Saúl Ibarra Corretgé <saghul@gmail.com>
  • Loading branch information
santigimeno committed Aug 23, 2019
1 parent 80e931b commit 24e65f7
Show file tree
Hide file tree
Showing 2 changed files with 101 additions and 47 deletions.
74 changes: 51 additions & 23 deletions test/test-udp-multicast-join.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,12 @@
#define CHECK_HANDLE(handle) \
ASSERT((uv_udp_t*)(handle) == &server || (uv_udp_t*)(handle) == &client)

#define MULTICAST_ADDR "239.255.0.1"

static uv_udp_t server;
static uv_udp_t client;
static uv_udp_send_t req;
static uv_udp_send_t req_ss;

static int cl_recv_cb_called;

Expand Down Expand Up @@ -62,7 +66,26 @@ static void sv_send_cb(uv_udp_send_t* req, int status) {

sv_send_cb_called++;

uv_close((uv_handle_t*) req->handle, close_cb);
if (sv_send_cb_called == 2)
uv_close((uv_handle_t*) req->handle, close_cb);
}


static int do_send(uv_udp_send_t* send_req) {
uv_buf_t buf;
struct sockaddr_in addr;

buf = uv_buf_init("PING", 4);

ASSERT(0 == uv_ip4_addr(MULTICAST_ADDR, TEST_PORT, &addr));

/* client sends "PING" */
return uv_udp_send(send_req,
&client,
&buf,
1,
(const struct sockaddr*) &addr,
sv_send_cb);
}


Expand All @@ -74,8 +97,6 @@ static void cl_recv_cb(uv_udp_t* handle,
CHECK_HANDLE(handle);
ASSERT(flags == 0);

cl_recv_cb_called++;

if (nread < 0) {
ASSERT(0 && "unexpected error");
}
Expand All @@ -90,15 +111,32 @@ static void cl_recv_cb(uv_udp_t* handle,
ASSERT(nread == 4);
ASSERT(!memcmp("PING", buf->base, nread));

/* we are done with the client handle, we can close it */
uv_close((uv_handle_t*) &client, close_cb);
cl_recv_cb_called++;

if (cl_recv_cb_called == 2) {
/* we are done with the server handle, we can close it */
uv_close((uv_handle_t*) &server, close_cb);
} else {
int r;
char source_addr[64];

r = uv_ip4_name((const struct sockaddr_in*)addr, source_addr, sizeof(source_addr));
ASSERT(r == 0);

r = uv_udp_set_membership(&server, MULTICAST_ADDR, NULL, UV_LEAVE_GROUP);
ASSERT(r == 0);

r = uv_udp_set_source_membership(&server, MULTICAST_ADDR, NULL, source_addr, UV_JOIN_GROUP);
ASSERT(r == 0);

r = do_send(&req_ss);
ASSERT(r == 0);
}
}


TEST_IMPL(udp_multicast_join) {
int r;
uv_udp_send_t req;
uv_buf_t buf;
struct sockaddr_in addr;

ASSERT(0 == uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
Expand All @@ -110,29 +148,19 @@ TEST_IMPL(udp_multicast_join) {
ASSERT(r == 0);

/* bind to the desired port */
r = uv_udp_bind(&client, (const struct sockaddr*) &addr, 0);
r = uv_udp_bind(&server, (const struct sockaddr*) &addr, 0);
ASSERT(r == 0);

/* join the multicast channel */
r = uv_udp_set_membership(&client, "239.255.0.1", NULL, UV_JOIN_GROUP);
r = uv_udp_set_membership(&server, MULTICAST_ADDR, NULL, UV_JOIN_GROUP);
if (r == UV_ENODEV)
RETURN_SKIP("No multicast support.");
ASSERT(r == 0);

r = uv_udp_recv_start(&client, alloc_cb, cl_recv_cb);
r = uv_udp_recv_start(&server, alloc_cb, cl_recv_cb);
ASSERT(r == 0);

buf = uv_buf_init("PING", 4);

ASSERT(0 == uv_ip4_addr("239.255.0.1", TEST_PORT, &addr));

/* server sends "PING" */
r = uv_udp_send(&req,
&server,
&buf,
1,
(const struct sockaddr*) &addr,
sv_send_cb);
r = do_send(&req);
ASSERT(r == 0);

ASSERT(close_cb_called == 0);
Expand All @@ -142,8 +170,8 @@ TEST_IMPL(udp_multicast_join) {
/* run the loop till all events are processed */
uv_run(uv_default_loop(), UV_RUN_DEFAULT);

ASSERT(cl_recv_cb_called == 1);
ASSERT(sv_send_cb_called == 1);
ASSERT(cl_recv_cb_called == 2);
ASSERT(sv_send_cb_called == 2);
ASSERT(close_cb_called == 2);

MAKE_VALGRIND_HAPPY();
Expand Down
74 changes: 50 additions & 24 deletions test/test-udp-multicast-join6.c
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@

static uv_udp_t server;
static uv_udp_t client;
static uv_udp_send_t req;
static uv_udp_send_t req_ss;

static int cl_recv_cb_called;

Expand Down Expand Up @@ -76,7 +78,26 @@ static void sv_send_cb(uv_udp_send_t* req, int status) {

sv_send_cb_called++;

uv_close((uv_handle_t*) req->handle, close_cb);
if (sv_send_cb_called == 2)
uv_close((uv_handle_t*) req->handle, close_cb);
}


static int do_send(uv_udp_send_t* send_req) {
uv_buf_t buf;
struct sockaddr_in6 addr;

buf = uv_buf_init("PING", 4);

ASSERT(0 == uv_ip6_addr(MULTICAST_ADDR, TEST_PORT, &addr));

/* client sends "PING" */
return uv_udp_send(send_req,
&client,
&buf,
1,
(const struct sockaddr*) &addr,
sv_send_cb);
}


Expand All @@ -88,8 +109,6 @@ static void cl_recv_cb(uv_udp_t* handle,
CHECK_HANDLE(handle);
ASSERT(flags == 0);

cl_recv_cb_called++;

if (nread < 0) {
ASSERT(0 && "unexpected error");
}
Expand All @@ -104,8 +123,27 @@ static void cl_recv_cb(uv_udp_t* handle,
ASSERT(nread == 4);
ASSERT(!memcmp("PING", buf->base, nread));

/* we are done with the client handle, we can close it */
uv_close((uv_handle_t*) &client, close_cb);
cl_recv_cb_called++;

if (cl_recv_cb_called == 2) {
/* we are done with the server handle, we can close it */
uv_close((uv_handle_t*) &server, close_cb);
} else {
int r;
char source_addr[64];

r = uv_ip6_name((const struct sockaddr_in6*)addr, source_addr, sizeof(source_addr));
ASSERT(r == 0);

r = uv_udp_set_membership(&server, MULTICAST_ADDR, INTERFACE_ADDR, UV_LEAVE_GROUP);
ASSERT(r == 0);

r = uv_udp_set_source_membership(&server, MULTICAST_ADDR, INTERFACE_ADDR, source_addr, UV_JOIN_GROUP);
ASSERT(r == 0);

r = do_send(&req_ss);
ASSERT(r == 0);
}
}


Expand All @@ -130,8 +168,6 @@ static int can_ipv6_external(void) {

TEST_IMPL(udp_multicast_join6) {
int r;
uv_udp_send_t req;
uv_buf_t buf;
struct sockaddr_in6 addr;

if (!can_ipv6_external())
Expand All @@ -146,31 +182,21 @@ TEST_IMPL(udp_multicast_join6) {
ASSERT(r == 0);

/* bind to the desired port */
r = uv_udp_bind(&client, (const struct sockaddr*) &addr, 0);
r = uv_udp_bind(&server, (const struct sockaddr*) &addr, 0);
ASSERT(r == 0);

r = uv_udp_set_membership(&client, MULTICAST_ADDR, INTERFACE_ADDR, UV_JOIN_GROUP);
r = uv_udp_set_membership(&server, MULTICAST_ADDR, INTERFACE_ADDR, UV_JOIN_GROUP);
if (r == UV_ENODEV) {
MAKE_VALGRIND_HAPPY();
RETURN_SKIP("No ipv6 multicast route");
}

ASSERT(r == 0);

r = uv_udp_recv_start(&client, alloc_cb, cl_recv_cb);
r = uv_udp_recv_start(&server, alloc_cb, cl_recv_cb);
ASSERT(r == 0);

buf = uv_buf_init("PING", 4);

ASSERT(0 == uv_ip6_addr(MULTICAST_ADDR, TEST_PORT, &addr));

/* server sends "PING" */
r = uv_udp_send(&req,
&server,
&buf,
1,
(const struct sockaddr*) &addr,
sv_send_cb);

r = do_send(&req);
ASSERT(r == 0);

ASSERT(close_cb_called == 0);
Expand All @@ -180,8 +206,8 @@ TEST_IMPL(udp_multicast_join6) {
/* run the loop till all events are processed */
uv_run(uv_default_loop(), UV_RUN_DEFAULT);

ASSERT(cl_recv_cb_called == 1);
ASSERT(sv_send_cb_called == 1);
ASSERT(cl_recv_cb_called == 2);
ASSERT(sv_send_cb_called == 2);
ASSERT(close_cb_called == 2);

MAKE_VALGRIND_HAPPY();
Expand Down

0 comments on commit 24e65f7

Please sign in to comment.