Commit 9a18da4c authored by Youness Alaoui's avatar Youness Alaoui

Updated unit tests for new API of stun usages

parent ca2acb6c
......@@ -97,8 +97,8 @@ static void bad_family (void)
addr.sa_len = sizeof (addr);
#endif
val = stun_bind_run (-1, &addr, sizeof (addr),
&dummy, &(socklen_t){ sizeof (dummy) }, 0);
val = stun_usage_bind_run (&addr, sizeof (addr),
&dummy, &(socklen_t){ sizeof (dummy) });
assert (val != 0);
}
......@@ -115,9 +115,9 @@ static void small_srv_addr (void)
addr.sa_len = sizeof (addr);
#endif
val = stun_bind_run (-1, &addr, 1,
&dummy, &(socklen_t){ sizeof (dummy) }, 0);
assert (val == EINVAL);
val = stun_usage_bind_run (&addr, 1,
&dummy, &(socklen_t){ sizeof (dummy) });
assert (val == STUN_USAGE_BIND_RETURN_ERROR);
}
......@@ -128,14 +128,11 @@ static void big_srv_addr (void)
struct sockaddr dummy;
int fd, val;
fd = socket (AF_INET, SOCK_DGRAM, 0);
assert (fd != -1);
memset (buf, 0, sizeof (buf));
val = stun_bind_run (fd, (struct sockaddr *)buf, sizeof (buf),
&dummy, &(socklen_t){ sizeof (dummy) }, 0);
assert (val == ENOBUFS);
close (fd);
val = stun_usage_bind_run ((struct sockaddr *)buf, sizeof (buf),
&dummy, &(socklen_t){ sizeof (dummy) });
assert (val == STUN_USAGE_BIND_RETURN_ERROR);
}
......@@ -154,22 +151,37 @@ static void timeout (void)
val = getsockname (servfd, (struct sockaddr *)&srv, &srvlen);
assert (val == 0);
val = stun_bind_run (-1, (struct sockaddr *)&srv, srvlen,
&dummy, &(socklen_t){ sizeof (dummy) }, 0);
assert (val == ETIMEDOUT);
val = stun_usage_bind_run ((struct sockaddr *)&srv, srvlen,
&dummy, &(socklen_t){ sizeof (dummy) });
assert (val == STUN_USAGE_BIND_RETURN_TIMEOUT);
close (servfd);
}
/** Malformed responses test */
static void bad_responses (void)
{
stun_bind_t *ctx;
struct sockaddr_storage addr;
socklen_t addrlen = sizeof (addr);
ssize_t val, len;
uint8_t buf[1000];
uint8_t buf[STUN_MAX_MESSAGE_SIZE];
uint8_t req[STUN_MAX_MESSAGE_SIZE];
size_t req_len;
StunAgent agent;
StunMessage msg;
StunMessage req_msg;
uint16_t known_attributes[] = {
STUN_ATTRIBUTE_MAPPED_ADDRESS,
STUN_ATTRIBUTE_XOR_MAPPED_ADDRESS,
STUN_ATTRIBUTE_XOR_INTERNAL_ADDRESS,
STUN_ATTRIBUTE_PRIORITY,
STUN_ATTRIBUTE_USERNAME,
STUN_ATTRIBUTE_MESSAGE_INTEGRITY,
STUN_ATTRIBUTE_ERROR_CODE, 0};
stun_agent_init (&agent, known_attributes,
STUN_COMPATIBILITY_3489BIS, 0);
/* Allocate a local UDP port */
int servfd = listen_dgram (), fd;
......@@ -181,8 +193,12 @@ static void bad_responses (void)
fd = socket (addr.ss_family, SOCK_DGRAM, 0);
assert (fd != -1);
val = stun_bind_start (&ctx, fd, (struct sockaddr *)&addr, addrlen, 0);
assert (val == 0);
req_len = stun_usage_bind_create (&agent, &req_msg, req, sizeof(req));
assert (req_len > 0);
val = sendto (fd, req, req_len, MSG_DONTWAIT | MSG_NOSIGNAL,
(struct sockaddr *)&addr, addrlen);
assert (val >= 0);
/* Send to/receive from our client instance only */
val = getsockname (fd, (struct sockaddr *)&addr, &addrlen);
......@@ -191,54 +207,47 @@ static void bad_responses (void)
val = connect (servfd, (struct sockaddr *)&addr, addrlen);
assert (val == 0);
/* Send crap response */
val = getsockname (servfd, (struct sockaddr *)&addr, &addrlen);
assert (val == 0);
val = stun_bind_process (ctx, "foobar", 6,
(struct sockaddr *)&addr, &addrlen);
assert (val == EAGAIN);
/* Send request instead of response */
val = getsockname (servfd, (struct sockaddr *)&addr, &addrlen);
assert (val == 0);
len = recv (servfd, buf, 1000, MSG_DONTWAIT);
assert (len >= 20);
val = stun_bind_process (ctx, buf, len,
(struct sockaddr *)&addr, &addrlen);
assert (val == EAGAIN);
assert (stun_agent_validate (&agent, &msg, buf, len, NULL, NULL)
== STUN_VALIDATION_SUCCESS);
val = stun_usage_bind_process (&msg,
(struct sockaddr *)&addr, &addrlen, (struct sockaddr *)&addr, &addrlen);
assert (val == STUN_USAGE_BIND_RETURN_RETRY);
/* Send response with wrong request type */
buf[0] |= 0x03;
val = stun_bind_process (ctx, buf, len,
(struct sockaddr *)&addr, &addrlen);
assert (val == EAGAIN);
buf[0] ^= 0x02;
/* Send error response without ERROR-CODE */
buf[1] |= 0x10;
val = stun_bind_process (ctx, buf, len,
(struct sockaddr *)&addr, &addrlen);
assert (val == EAGAIN);
val = stun_usage_bind_process (&msg,
(struct sockaddr *)&addr, &addrlen, (struct sockaddr *)&addr, &addrlen);
assert (val == STUN_USAGE_BIND_RETURN_RETRY);
stun_bind_cancel (ctx);
close (fd);
close (servfd);
}
/** Various responses test */
static void responses (void)
{
stun_bind_t *ctx;
struct sockaddr_storage addr;
socklen_t addrlen = sizeof (addr);
ssize_t val;
size_t len;
int servfd, fd;
uint8_t buf[STUN_MAX_MESSAGE_SIZE];
uint8_t req[STUN_MAX_MESSAGE_SIZE];
size_t req_len;
StunAgent agent;
StunMessage msg;
StunMessage req_msg;
uint16_t known_attributes[] = {
STUN_ATTRIBUTE_MAPPED_ADDRESS,
......@@ -274,53 +283,35 @@ static void responses (void)
assert (val == 0);
/* Send error response */
val = stun_bind_start (&ctx, fd, NULL, 0, 0);
assert (val == 0);
req_len = stun_usage_bind_create (&agent, &req_msg, req, sizeof(req));
assert (req_len > 0);
val = recv (servfd, buf, 1000, MSG_DONTWAIT);
val = send (fd, req, req_len, MSG_DONTWAIT | MSG_NOSIGNAL);
assert (val >= 0);
assert (stun_agent_validate (&agent, &msg, buf, val, NULL, NULL)
== STUN_VALIDATION_SUCCESS);
stun_agent_init_error (&agent, &msg, buf, sizeof (buf), &msg, STUN_ERROR_SERVER_ERROR);
len = stun_agent_finish_message (&agent, &msg, NULL, 0);
assert (len > 0);
val = getsockname (servfd, (struct sockaddr *)&addr, &addrlen);
assert (val == 0);
val = stun_bind_process (ctx, buf, len,
(struct sockaddr *)&addr, &addrlen);
assert (val == ECONNREFUSED);
/* Send response with an unknown attribute */
val = stun_bind_start (&ctx, fd, NULL, 0, 0);
assert (val == 0);
val = recv (servfd, buf, 1000, MSG_DONTWAIT);
assert (val >= 0);
assert (stun_agent_validate (&agent, &msg, buf, val, NULL, NULL)
== STUN_VALIDATION_SUCCESS);
stun_agent_init_response (&agent, &msg, buf, sizeof (buf), &msg);
val = stun_message_append_string (&msg, 0x6000,
"This is an unknown attribute!");
assert (val == 0);
stun_agent_init_error (&agent, &msg, buf, sizeof (buf), &msg, STUN_ERROR_SERVER_ERROR);
len = stun_agent_finish_message (&agent, &msg, NULL, 0);
assert (len > 0);
val = getsockname (servfd, (struct sockaddr *)&addr, &addrlen);
assert (val == 0);
val = stun_bind_process (ctx, buf, len,
(struct sockaddr *)&addr, &addrlen);
assert (val == EPROTO);
val = stun_usage_bind_process (&msg,
(struct sockaddr *)&addr, &addrlen, (struct sockaddr *)&addr, &addrlen);
assert (val == STUN_USAGE_BIND_RETURN_ERROR);
/* Send response with a no mapped address at all */
val = stun_bind_start (&ctx, fd, NULL, 0, 0);
assert (val == 0);
req_len = stun_usage_bind_create (&agent, &req_msg, req, sizeof(req));
assert (req_len > 0);
val = send (fd, req, req_len, MSG_DONTWAIT | MSG_NOSIGNAL);
assert (val >= 0);
val = recv (servfd, buf, 1000, MSG_DONTWAIT);
assert (val >= 0);
......@@ -332,16 +323,22 @@ static void responses (void)
len = stun_agent_finish_message (&agent, &msg, NULL, 0);
assert (len > 0);
assert (stun_agent_validate (&agent, &msg, buf, len, NULL, NULL)
== STUN_VALIDATION_SUCCESS);
val = getsockname (servfd, (struct sockaddr *)&addr, &addrlen);
assert (val == 0);
val = stun_bind_process (ctx, buf, len,
(struct sockaddr *)&addr, &addrlen);
assert (val == ENOENT);
val = stun_usage_bind_process (&msg,
(struct sockaddr *)&addr, &addrlen, (struct sockaddr *)&addr, &addrlen);
assert (val == STUN_USAGE_BIND_RETURN_ERROR);
/* Send old-style response */
val = stun_bind_start (&ctx, fd, NULL, 0, 0);
assert (val == 0);
req_len = stun_usage_bind_create (&agent, &req_msg, req, sizeof(req));
assert (req_len > 0);
val = send (fd, req, req_len, MSG_DONTWAIT | MSG_NOSIGNAL);
assert (val >= 0);
val = recv (servfd, buf, 1000, MSG_DONTWAIT);
assert (val >= 0);
......@@ -356,12 +353,15 @@ static void responses (void)
len = stun_agent_finish_message (&agent, &msg, NULL, 0);
assert (len > 0);
assert (stun_agent_validate (&agent, &msg, buf, len, NULL, NULL)
== STUN_VALIDATION_SUCCESS);
val = getsockname (servfd, (struct sockaddr *)&addr, &addrlen);
assert (val == 0);
val = stun_bind_process (ctx, buf, len,
(struct sockaddr *)&addr, &addrlen);
assert (val == 0);
val = stun_usage_bind_process (&msg,
(struct sockaddr *)&addr, &addrlen, (struct sockaddr *)&addr, &addrlen);
assert (val == STUN_USAGE_BIND_RETURN_SUCCESS);
/* End */
close (servfd);
......@@ -370,13 +370,29 @@ static void responses (void)
assert (val == 0);
}
static void keepalive (void)
{
struct sockaddr_storage addr;
socklen_t addrlen = sizeof (addr);
int val, servfd, fd;
uint8_t buf[STUN_MAX_MESSAGE_SIZE];
size_t len;
StunAgent agent;
StunMessage msg;
uint16_t known_attributes[] = {
STUN_ATTRIBUTE_MAPPED_ADDRESS,
STUN_ATTRIBUTE_XOR_MAPPED_ADDRESS,
STUN_ATTRIBUTE_XOR_INTERNAL_ADDRESS,
STUN_ATTRIBUTE_PRIORITY,
STUN_ATTRIBUTE_USERNAME,
STUN_ATTRIBUTE_MESSAGE_INTEGRITY,
STUN_ATTRIBUTE_ERROR_CODE, 0};
stun_agent_init (&agent, known_attributes,
STUN_COMPATIBILITY_3489BIS, 0);
/* Allocate a local UDP port for server */
servfd = listen_dgram ();
assert (servfd != -1);
......@@ -389,13 +405,19 @@ static void keepalive (void)
assert (fd != -1);
/* Keep alive sending smoke test */
val = stun_bind_keepalive (fd, (struct sockaddr *)&addr, addrlen, 0);
assert (val == 0);
len = stun_usage_bind_keepalive (&agent, &msg, buf, sizeof(buf));
assert (len == 28);
val = sendto (fd, buf, len, MSG_DONTWAIT | MSG_NOSIGNAL,
(struct sockaddr *)&addr, addrlen);
assert (val >= 0);
/* Wrong address family test */
addr.ss_family = addr.ss_family == AF_INET ? AF_INET6 : AF_INET;
val = stun_bind_keepalive (fd, (struct sockaddr *)&addr, addrlen, 0);
assert (val != 0);
val = sendto (fd, buf, len, MSG_DONTWAIT | MSG_NOSIGNAL,
(struct sockaddr *)&addr, addrlen);
assert (val < 0);
/* End */
close (servfd);
......@@ -407,7 +429,7 @@ static void keepalive (void)
static void test (void (*func) (void), const char *name)
{
//alarm (10);
alarm (10);
printf ("%s test... ", name);
func ();
......
......@@ -73,6 +73,7 @@ int main (void)
{ufrag, strlen (ufrag), pass, strlen (pass)},
{username, strlen (username), pass, strlen (pass)},
{NULL, 0, NULL, 0}};
StunValidationStatus valid;
stun_agent_init (&agent, STUN_ALL_KNOWN_ATTRIBUTES,
STUN_COMPATIBILITY_3489BIS,
......@@ -95,9 +96,9 @@ int main (void)
assert (rlen > 0);
len = sizeof (resp_buf);
val = stun_conncheck_reply (&agent, &req, req_buf, rlen,
val = stun_usage_ice_conncheck_create_reply (&agent, &req,
&resp, resp_buf, &len, (struct sockaddr *)&ip4,
sizeof (ip4), ufrag, strlen (ufrag), pass, strlen (pass), &control, tie, 0);
sizeof (ip4), &control, tie);
assert (val == EINVAL);
assert (len == 0);
......@@ -109,9 +110,9 @@ int main (void)
assert (rlen > 0);
len = sizeof (resp_buf);
val = stun_conncheck_reply (&agent, &req, req_buf, rlen,
val = stun_usage_ice_conncheck_create_reply (&agent, &req,
&resp, resp_buf, &len, (struct sockaddr *)&ip4,
sizeof (ip4), ufrag, strlen (ufrag), pass, strlen (pass), &control, tie, 0);
sizeof (ip4), &control, tie);
assert (val == EPROTO);
assert (len > 0);
......@@ -124,46 +125,32 @@ int main (void)
rlen = stun_agent_finish_message (&agent, &req, pass, strlen (pass));
assert (rlen > 0);
len = sizeof (resp_buf);
val = stun_conncheck_reply (&agent, &req, req_buf, rlen,
&resp, resp_buf, &len, (struct sockaddr *)&ip4,
sizeof (ip4), username, strlen (username), pass, strlen (pass), &control, tie, 0);
assert (val == EPROTO);
assert (len > 0);
valid = stun_agent_validate (&agent, &req, req_buf, rlen,
stun_agent_default_validater, validater_data);
assert (valid == STUN_VALIDATION_UNKNOWN_REQUEST_ATTRIBUTE);
/* Unauthenticated message */
assert (stun_agent_init_request (&agent, &req, req_buf, sizeof(req_buf), STUN_BINDING));
rlen = stun_agent_finish_message (&agent, &req, NULL, 0);
assert (rlen > 0);
len = sizeof (resp_buf);
val = stun_conncheck_reply (&agent, &req, req_buf, rlen,
&resp, resp_buf, &len, (struct sockaddr *)&ip4,
sizeof (ip4), ufrag, strlen (ufrag), pass, strlen (pass), &control, tie, 0);
assert (val == EPERM);
assert (len > 0);
assert (stun_agent_validate (&agent, &resp, resp_buf, len,
stun_agent_default_validater, validater_data) == STUN_VALIDATION_SUCCESS);
stun_message_find_error (&resp, &code);
assert (code == STUN_ERROR_BAD_REQUEST);
valid = stun_agent_validate (&agent, &req, req_buf, rlen,
stun_agent_default_validater, validater_data);
assert (valid == STUN_VALIDATION_UNAUTHORIZED_BAD_REQUEST);
/* No username */
assert (stun_agent_init_request (&agent, &req, req_buf, sizeof(req_buf), STUN_BINDING));
rlen = stun_agent_finish_message (&agent, &req, pass, strlen (pass));
assert (rlen > 0);
len = sizeof (resp_buf);
val = stun_conncheck_reply (&agent, &req, req_buf, rlen,
&resp, resp_buf, &len, (struct sockaddr *)&ip4,
sizeof (ip4), ufrag, strlen (ufrag), pass, strlen (pass), &control, tie, 0);
assert (val == EPERM);
assert (len > 0);
assert (stun_agent_validate (&agent, &resp, resp_buf, len,
stun_agent_default_validater, validater_data) == STUN_VALIDATION_SUCCESS);
stun_message_find_error (&resp, &code);
assert (code == STUN_ERROR_BAD_REQUEST);
assert (stun_conncheck_priority (&req) == 0);
assert (stun_conncheck_use_candidate (&req) == false);
valid = stun_agent_validate (&agent, &req, req_buf, rlen,
stun_agent_default_validater, validater_data);
assert (valid == STUN_VALIDATION_UNAUTHORIZED_BAD_REQUEST);
assert (stun_usage_ice_conncheck_priority (&req) == 0);
assert (stun_usage_ice_conncheck_use_candidate (&req) == false);
/* Good message */
assert (stun_agent_init_request (&agent, &req, req_buf, sizeof(req_buf), STUN_BINDING));
......@@ -177,55 +164,16 @@ int main (void)
assert (rlen > 0);
len = sizeof (resp_buf);
val = stun_conncheck_reply (&agent, &req, req_buf, rlen,
val = stun_usage_ice_conncheck_create_reply (&agent, &req,
&resp, resp_buf, &len, (struct sockaddr *)&ip4,
sizeof (ip4), ufrag, strlen (ufrag), pass, strlen (pass), &control, tie, 0);
sizeof (ip4), &control, tie);
assert (val == 0);
assert (len > 0);
assert (stun_agent_validate (&agent, &resp, resp_buf, len,
stun_agent_default_validater, validater_data) == STUN_VALIDATION_SUCCESS);
assert (stun_message_get_class (&resp) == STUN_RESPONSE);
assert (stun_conncheck_priority (&req) == 0x12345678);
assert (stun_conncheck_use_candidate (&req) == true);
/* Bad username */
assert (stun_agent_init_request (&agent, &req, req_buf, sizeof(req_buf), STUN_BINDING));
val = stun_message_append_string (&req, STUN_ATTRIBUTE_USERNAME, ufrag);
assert (val == 0);
rlen = stun_agent_finish_message (&agent, &req, pass, strlen (pass));
assert (rlen > 0);
len = sizeof (resp_buf);
val = stun_conncheck_reply (&agent, &req, req_buf, rlen,
&resp, resp_buf, &len, (struct sockaddr *)&ip4,
sizeof (ip4), "bad", strlen ("bad"), pass, strlen (pass), &control, tie, 0);
assert (val == EPERM);
assert (len > 0);
assert (stun_agent_validate (&agent, &resp, resp_buf, len,
stun_agent_default_validater, validater_data) == STUN_VALIDATION_SUCCESS);
assert (stun_message_get_class (&resp) == STUN_ERROR);
stun_message_find_error (&resp, &code);
assert (code == STUN_ERROR_UNAUTHORIZED);
/* Bad integrity (bad password) */
assert (stun_agent_init_request (&agent, &req, req_buf, sizeof(req_buf), STUN_BINDING));
val = stun_message_append_string (&req, STUN_ATTRIBUTE_USERNAME, ufrag);
assert (val == 0);
rlen = stun_agent_finish_message (&agent, &req, pass, strlen (pass));
assert (rlen > 0);
len = sizeof (resp_buf);
val = stun_conncheck_reply (&agent, &req, req_buf, rlen,
&resp, resp_buf, &len, (struct sockaddr *)&ip4,
sizeof (ip4), ufrag, strlen (ufrag), "bad", strlen ("bad"), &control, tie, 0);
assert (val == EPERM);
assert (len > 0);
assert (stun_agent_validate (&agent, &resp, resp_buf, len,
stun_agent_default_validater, validater_data) == STUN_VALIDATION_SUCCESS);
assert (stun_message_get_class (&resp) == STUN_ERROR);
stun_message_find_error (&resp, &code);
assert (code == STUN_ERROR_UNAUTHORIZED);
assert (stun_usage_ice_conncheck_priority (&req) == 0x12345678);
assert (stun_usage_ice_conncheck_use_candidate (&req) == true);
/* Invalid socket address */
assert (stun_agent_init_request (&agent, &req, req_buf, sizeof(req_buf), STUN_BINDING));
......@@ -236,29 +184,14 @@ int main (void)
ip4.sin_family = AF_UNSPEC;
len = sizeof (resp_buf);
val = stun_conncheck_reply (&agent, &req, req_buf, rlen,
val = stun_usage_ice_conncheck_create_reply (&agent, &req,
&resp, resp_buf, &len, (struct sockaddr *)&ip4,
sizeof (ip4), ufrag, strlen (ufrag), pass, strlen (pass), &control, tie, 0);
sizeof (ip4), &control, tie);
assert (val == EAFNOSUPPORT);
assert (len == 0);
ip4.sin_family = AF_INET;
/* Bad CRC32 */
assert (stun_agent_init_request (&agent, &req, req_buf, sizeof(req_buf), STUN_BINDING));
val = stun_message_append_string (&req, STUN_ATTRIBUTE_USERNAME, ufrag);
assert (val == 0);
rlen = stun_agent_finish_message (&agent, &req, pass, strlen (pass));
assert (rlen > 0);
((uint8_t *)stun_message_find (&req, STUN_ATTRIBUTE_FINGERPRINT, &alen))[0] ^= 1;
len = sizeof (resp_buf);
val = stun_conncheck_reply (&agent, &req, req_buf, rlen,
&resp, resp_buf, &len, (struct sockaddr *)&ip4,
sizeof (ip4), ufrag, strlen (ufrag), pass, strlen (pass), &control, tie, 0);
assert (val == EINVAL);
assert (len == 0);
/* Lost role conflict */
assert (stun_agent_init_request (&agent, &req, req_buf, sizeof(req_buf), STUN_BINDING));
val = stun_message_append64 (&req, STUN_ATTRIBUTE_ICE_CONTROLLING, tie + 1);
......@@ -271,9 +204,9 @@ int main (void)
len = sizeof (resp_buf);
control = true;
val = stun_conncheck_reply (&agent, &req, req_buf, rlen,
val = stun_usage_ice_conncheck_create_reply (&agent, &req,
&resp, resp_buf, &len, (struct sockaddr *)&ip4,
sizeof (ip4), ufrag, strlen (ufrag), pass, strlen (pass), &control, tie, 0);
sizeof (ip4), &control, tie);
assert (val == EACCES);
assert (len > 0);
assert (control == false);
......@@ -292,9 +225,9 @@ int main (void)
len = sizeof (resp_buf);
control = false;
val = stun_conncheck_reply (&agent, &req, req_buf, rlen,
val = stun_usage_ice_conncheck_create_reply (&agent, &req,
&resp, resp_buf, &len, (struct sockaddr *)&ip4,
sizeof (ip4), ufrag, strlen (ufrag), pass, strlen (pass), &control, tie, 0);
sizeof (ip4), &control, tie);
assert (val == 0);
assert (len > 0);
assert (control == false);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment