tests: coap_client: Improve socket stubs
* Use sys_rand_get() and seed the CoAP library, so our MIDs are
random.
* Set socket events per socket, so we don't accidentally receive
on wrong socket
* Reply with correct tokens
Signed-off-by: Seppo Takalo <seppo.takalo@nordicsemi.no>
diff --git a/tests/net/lib/coap_client/prj.conf b/tests/net/lib/coap_client/prj.conf
index c726502..8405a56 100644
--- a/tests/net/lib/coap_client/prj.conf
+++ b/tests/net/lib/coap_client/prj.conf
@@ -1,3 +1,4 @@
#Testing
CONFIG_ZTEST=y
CONFIG_ZTEST_STACK_SIZE=4096
+CONFIG_TEST_RANDOM_GENERATOR=y
diff --git a/tests/net/lib/coap_client/src/main.c b/tests/net/lib/coap_client/src/main.c
index f06a0ce..e066f86 100644
--- a/tests/net/lib/coap_client/src/main.c
+++ b/tests/net/lib/coap_client/src/main.c
@@ -11,7 +11,7 @@
#include "stubs.h"
-LOG_MODULE_REGISTER(coap_client_test);
+LOG_MODULE_REGISTER(coap_client_test, LOG_LEVEL_DBG);
DEFINE_FFF_GLOBALS;
#define FFF_FAKES_LIST(FAKE)
@@ -23,11 +23,14 @@
(CONFIG_COAP_INIT_ACK_TIMEOUT_MS + CONFIG_COAP_INIT_ACK_TIMEOUT_MS / 2)
#define VALID_MESSAGE_ID BIT(31)
+#define TOKEN_OFFSET 4
static int16_t last_response_code;
static const char *test_path = "test";
static uint32_t messages_needing_response[2];
+static uint8_t last_token[2][COAP_TOKEN_MAX_LEN];
+static const uint8_t empty_token[COAP_TOKEN_MAX_LEN] = {0};
static struct coap_client client;
@@ -61,6 +64,27 @@
}
}
+static void store_token(uint8_t *buf)
+{
+ for (int i = 0; i < ARRAY_SIZE(last_token); i++) {
+ if (memcmp(last_token[i], empty_token, 8) == 0) {
+ memcpy(last_token[i], buf + TOKEN_OFFSET, COAP_TOKEN_MAX_LEN);
+ return;
+ }
+ }
+}
+
+static void restore_token(uint8_t *buf)
+{
+ for (int i = 0; i < ARRAY_SIZE(last_token); i++) {
+ if (memcmp(last_token[i], empty_token, 8) != 0) {
+ memcpy(buf + TOKEN_OFFSET, last_token[i], COAP_TOKEN_MAX_LEN);
+ memset(last_token[i], 0, COAP_TOKEN_MAX_LEN);
+ return;
+ }
+ }
+}
+
static ssize_t z_impl_zsock_recvfrom_custom_fake(int sock, void *buf, size_t max_len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen)
{
@@ -74,10 +98,11 @@
ack_data[2] = (uint8_t)(last_message_id >> 8);
ack_data[3] = (uint8_t)last_message_id;
+ restore_token(ack_data);
memcpy(buf, ack_data, sizeof(ack_data));
- clear_socket_events(ZSOCK_POLLIN);
+ clear_socket_events(sock, ZSOCK_POLLIN);
return sizeof(ack_data);
}
@@ -90,14 +115,14 @@
last_message_id |= ((uint8_t *)buf)[2] << 8;
last_message_id |= ((uint8_t *)buf)[3];
-
type = (((uint8_t *)buf)[0] & 0x30) >> 4;
+ store_token(buf);
set_next_pending_message_id(last_message_id);
LOG_INF("Latest message ID: %d", last_message_id);
if (type == 0) {
- set_socket_events(ZSOCK_POLLIN);
+ set_socket_events(sock, ZSOCK_POLLIN);
}
return 1;
@@ -111,6 +136,7 @@
last_message_id |= ((uint8_t *)buf)[2] << 8;
last_message_id |= ((uint8_t *)buf)[3];
+ store_token(buf);
set_next_pending_message_id(last_message_id);
LOG_INF("Latest message ID: %d", last_message_id);
@@ -128,6 +154,7 @@
last_message_id |= ((uint8_t *)buf)[2] << 8;
last_message_id |= ((uint8_t *)buf)[3];
+ store_token(buf);
set_next_pending_message_id(last_message_id);
LOG_INF("Latest message ID: %d", last_message_id);
@@ -144,7 +171,7 @@
z_impl_zsock_sendto_fake.custom_fake = z_impl_zsock_sendto_custom_fake;
- set_socket_events(ZSOCK_POLLIN);
+ set_socket_events(sock, ZSOCK_POLLIN);
return 1;
}
@@ -160,6 +187,7 @@
last_message_id |= ((uint8_t *)buf)[2] << 8;
last_message_id |= ((uint8_t *)buf)[3];
+ store_token(buf);
set_next_pending_message_id(last_message_id);
LOG_INF("Latest message ID: %d", last_message_id);
@@ -184,7 +212,7 @@
z_impl_zsock_sendto_fake.custom_fake = z_impl_zsock_sendto_custom_fake;
- set_socket_events(ZSOCK_POLLIN);
+ set_socket_events(sock, ZSOCK_POLLIN);
return 1;
}
@@ -202,10 +230,11 @@
ack_data[2] = (uint8_t)(last_message_id >> 8);
ack_data[3] = (uint8_t)last_message_id;
+ restore_token(ack_data);
memcpy(buf, ack_data, sizeof(ack_data));
- clear_socket_events(ZSOCK_POLLIN);
+ clear_socket_events(sock, ZSOCK_POLLIN);
return sizeof(ack_data);
}
@@ -216,7 +245,7 @@
{
uint16_t last_message_id = 0;
- static uint8_t ack_data[] = {0x68, 0x00, 0x00, 0x00, 0x00, 0x00,
+ static uint8_t ack_data[] = {0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
last_message_id = get_next_pending_message_id();
@@ -247,7 +276,7 @@
memcpy(buf, ack_data, sizeof(ack_data));
- clear_socket_events(ZSOCK_POLLIN);
+ clear_socket_events(sock, ZSOCK_POLLIN);
return sizeof(ack_data);
}
@@ -267,13 +296,14 @@
ack_data[2] = (uint8_t)(last_message_id >> 8);
ack_data[3] = (uint8_t)last_message_id;
+ restore_token(ack_data);
memcpy(buf, ack_data, sizeof(ack_data));
z_impl_zsock_recvfrom_fake.custom_fake = z_impl_zsock_recvfrom_custom_fake_response;
z_impl_zsock_sendto_fake.custom_fake = z_impl_zsock_sendto_custom_fake_echo;
- clear_socket_events(ZSOCK_POLLIN);
+ clear_socket_events(sock, ZSOCK_POLLIN);
return sizeof(ack_data);
}
@@ -293,19 +323,23 @@
ack_data[2] = (uint8_t)(last_message_id >> 8);
ack_data[3] = (uint8_t)last_message_id;
+ restore_token(ack_data);
memcpy(buf, ack_data, sizeof(ack_data));
z_impl_zsock_recvfrom_fake.custom_fake = z_impl_zsock_recvfrom_custom_fake_response;
z_impl_zsock_sendto_fake.custom_fake = z_impl_zsock_sendto_custom_fake_echo_next_req;
- clear_socket_events(ZSOCK_POLLIN);
+ clear_socket_events(sock, ZSOCK_POLLIN);
return sizeof(ack_data);
}
+extern void net_coap_init(void);
+
static void *suite_setup(void)
{
+ net_coap_init();
coap_client_init(&client, NULL);
return NULL;
@@ -315,6 +349,8 @@
{
int i;
+ k_mutex_lock(&client.lock, K_FOREVER);
+
/* Register resets */
DO_FOREACH_FAKE(RESET_FAKE);
/* reset common FFF internal structures */
@@ -322,13 +358,19 @@
z_impl_zsock_recvfrom_fake.custom_fake = z_impl_zsock_recvfrom_custom_fake;
z_impl_zsock_sendto_fake.custom_fake = z_impl_zsock_sendto_custom_fake;
- clear_socket_events(ZSOCK_POLLIN | ZSOCK_POLLOUT | ZSOCK_POLLERR);
+ clear_socket_events(0, ZSOCK_POLLIN | ZSOCK_POLLOUT | ZSOCK_POLLERR);
+ clear_socket_events(1, ZSOCK_POLLIN | ZSOCK_POLLOUT | ZSOCK_POLLERR);
for (i = 0; i < ARRAY_SIZE(messages_needing_response); i++) {
messages_needing_response[i] = 0;
}
+ memset(&client.requests, 0, sizeof(client.requests));
+ memset(last_token, 0, sizeof(last_token));
+
last_response_code = 0;
+
+ k_mutex_unlock(&client.lock);
}
void coap_callback(int16_t code, size_t offset, const uint8_t *payload, size_t len, bool last_block,
@@ -396,7 +438,7 @@
ret = coap_client_req(&client, 0, &address, &client_request, NULL);
zassert_true(ret >= 0, "Sending request failed, %d", ret);
k_sleep(K_MSEC(MORE_THAN_ACK_TIMEOUT_MS));
- set_socket_events(ZSOCK_POLLIN | ZSOCK_POLLOUT);
+ set_socket_events(client.fd, ZSOCK_POLLIN | ZSOCK_POLLOUT);
k_sleep(K_MSEC(MORE_THAN_EXCHANGE_LIFETIME_MS));
zassert_equal(last_response_code, COAP_RESPONSE_CODE_OK, "Unexpected response");
@@ -551,7 +593,7 @@
client_request.len = strlen(short_payload);
z_impl_zsock_sendto_fake.custom_fake = z_impl_zsock_sendto_custom_fake_no_reply;
- set_socket_events(ZSOCK_POLLOUT);
+ set_socket_events(client.fd, ZSOCK_POLLOUT);
k_sleep(K_MSEC(1));
@@ -628,7 +670,7 @@
ret = coap_client_req(&client, 0, &address, &req2, NULL);
zassert_true(ret >= 0, "Sending request failed, %d", ret);
- set_socket_events(ZSOCK_POLLIN);
+ set_socket_events(client.fd, ZSOCK_POLLIN);
while (last_response_code == 0 && retry > 0) {
retry--;
k_sleep(K_MSEC(1));
@@ -636,7 +678,7 @@
zassert_equal(last_response_code, COAP_RESPONSE_CODE_OK, "Unexpected response");
last_response_code = 0;
- set_socket_events(ZSOCK_POLLIN);
+ set_socket_events(client.fd, ZSOCK_POLLIN);
zassert_ok(k_sem_take(&sem1, K_MSEC(MORE_THAN_EXCHANGE_LIFETIME_MS)));
zassert_ok(k_sem_take(&sem2, K_MSEC(MORE_THAN_EXCHANGE_LIFETIME_MS)));
zassert_equal(last_response_code, COAP_RESPONSE_CODE_OK, "Unexpected response");
@@ -665,7 +707,7 @@
client_request.len = strlen(short_payload);
z_impl_zsock_recvfrom_fake.custom_fake = z_impl_zsock_recvfrom_custom_fake_unmatching;
- set_socket_events(ZSOCK_POLLIN | ZSOCK_POLLOUT);
+ set_socket_events(client.fd, ZSOCK_POLLIN | ZSOCK_POLLOUT);
k_sleep(K_MSEC(1));
@@ -681,9 +723,6 @@
{
int ret;
int retry = MORE_THAN_EXCHANGE_LIFETIME_MS;
- static struct coap_client client2 = {
- .fd = 2,
- };
struct k_sem sem1, sem2;
struct sockaddr address = {0};
struct coap_client_request req1 = {
@@ -710,17 +749,17 @@
k_sleep(K_MSEC(1));
LOG_INF("Sending requests");
- ret = coap_client_req(&client, 1, &address, &req1, NULL);
+ ret = coap_client_req(&client, client.fd, &address, &req1, NULL);
zassert_true(ret >= 0, "Sending request failed, %d", ret);
- ret = coap_client_req(&client2, 2, &address, &req2, NULL);
+ ret = coap_client_req(&client2, client2.fd, &address, &req2, NULL);
zassert_true(ret >= 0, "Sending request failed, %d", ret);
while (last_response_code == 0 && retry > 0) {
retry--;
k_sleep(K_MSEC(1));
}
- set_socket_events(ZSOCK_POLLIN);
+ set_socket_events(client2.fd, ZSOCK_POLLIN);
k_sleep(K_SECONDS(1));
@@ -746,7 +785,7 @@
};
z_impl_zsock_sendto_fake.custom_fake = z_impl_zsock_sendto_custom_fake_no_reply;
- set_socket_events(ZSOCK_POLLERR);
+ set_socket_events(client.fd, ZSOCK_POLLERR);
k_sleep(K_MSEC(1));
@@ -776,7 +815,7 @@
zassert_ok(k_sem_init(&sem1, 0, 1));
z_impl_zsock_sendto_fake.custom_fake = z_impl_zsock_sendto_custom_fake_no_reply;
- set_socket_events(ZSOCK_POLLIN);
+ set_socket_events(client.fd, ZSOCK_POLLIN);
k_sleep(K_MSEC(1));
@@ -787,6 +826,6 @@
zassert_ok(k_sem_take(&sem1, K_MSEC(MORE_THAN_EXCHANGE_LIFETIME_MS)));
zassert_equal(last_response_code, COAP_RESPONSE_CODE_OK, "Unexpected response");
- set_socket_events(ZSOCK_POLLERR);
+ set_socket_events(client.fd, ZSOCK_POLLERR);
zassert_not_ok(k_sem_take(&sem1, K_MSEC(MORE_THAN_EXCHANGE_LIFETIME_MS)));
}
diff --git a/tests/net/lib/coap_client/src/stubs.c b/tests/net/lib/coap_client/src/stubs.c
index d698248..8d25115 100644
--- a/tests/net/lib/coap_client/src/stubs.c
+++ b/tests/net/lib/coap_client/src/stubs.c
@@ -10,7 +10,6 @@
LOG_MODULE_DECLARE(coap_client_test);
DEFINE_FAKE_VALUE_FUNC(uint32_t, z_impl_sys_rand32_get);
-DEFINE_FAKE_VOID_FUNC(z_impl_sys_rand_get, void *, size_t);
DEFINE_FAKE_VALUE_FUNC(ssize_t, z_impl_zsock_recvfrom, int, void *, size_t, int, struct sockaddr *,
socklen_t *);
DEFINE_FAKE_VALUE_FUNC(ssize_t, z_impl_zsock_sendto, int, void *, size_t, int,
@@ -22,21 +21,17 @@
short revents;
};
-static short my_events;
+static short my_events[NUM_FD];
-void set_socket_events(short events)
+void set_socket_events(int fd, short events)
{
- my_events |= events;
+ __ASSERT_NO_MSG(fd < NUM_FD);
+ my_events[fd] |= events;
}
-void clear_socket_events(short events)
+void clear_socket_events(int fd, short events)
{
- my_events &= ~events;
-}
-
-int z_impl_zsock_socket(int family, int type, int proto)
-{
- return 0;
+ my_events[fd] &= ~events;
}
int z_impl_zvfs_poll(struct zvfs_pollfd *fds, int nfds, int poll_timeout)
@@ -44,7 +39,8 @@
int events = 0;
k_sleep(K_MSEC(1));
for (int i = 0; i < nfds; i++) {
- fds[i].revents = my_events & (fds[i].events | ZSOCK_POLLERR | ZSOCK_POLLHUP);
+ fds[i].revents =
+ my_events[fds[i].fd] & (fds[i].events | ZSOCK_POLLERR | ZSOCK_POLLHUP);
if (fds[i].revents) {
events++;
}
diff --git a/tests/net/lib/coap_client/src/stubs.h b/tests/net/lib/coap_client/src/stubs.h
index 9a9f929..c302453 100644
--- a/tests/net/lib/coap_client/src/stubs.h
+++ b/tests/net/lib/coap_client/src/stubs.h
@@ -36,12 +36,12 @@
#define ZSOCK_POLLNVAL 0x20
/** @} */
+#define NUM_FD 2
-void set_socket_events(short events);
-void clear_socket_events(short events);
+void set_socket_events(int fd, short events);
+void clear_socket_events(int fd, short events);
DECLARE_FAKE_VALUE_FUNC(uint32_t, z_impl_sys_rand32_get);
-DECLARE_FAKE_VOID_FUNC(z_impl_sys_rand_get, void *, size_t);
DECLARE_FAKE_VALUE_FUNC(ssize_t, z_impl_zsock_recvfrom, int, void *, size_t, int, struct sockaddr *,
socklen_t *);
DECLARE_FAKE_VALUE_FUNC(ssize_t, z_impl_zsock_sendto, int, void*, size_t, int,
@@ -50,7 +50,6 @@
#define DO_FOREACH_FAKE(FUNC) \
do { \
FUNC(z_impl_sys_rand32_get) \
- FUNC(z_impl_sys_rand_get) \
FUNC(z_impl_zsock_recvfrom) \
FUNC(z_impl_zsock_sendto) \
} while (0)