tests: lwm2m: Add engine tests on security and socket opts

Add tests regarding socket options and various security
options.

Signed-off-by: Seppo Takalo <seppo.takalo@nordicsemi.no>
This commit is contained in:
Seppo Takalo 2023-06-27 17:31:10 +03:00 committed by Fabio Baltieri
commit 0da806736e
4 changed files with 81 additions and 7 deletions

View file

@ -0,0 +1 @@
CONFIG_NATIVE_POSIX_SLOWDOWN_TO_REAL_TIME=y

View file

@ -7,11 +7,15 @@
#include <zephyr/fff.h>
#include <zephyr/logging/log.h>
#include <zephyr/ztest.h>
#include <zephyr/net/socket.h>
#include "lwm2m_engine.h"
#include "lwm2m_rd_client.h"
#include "stubs.h"
#if defined(CONFIG_NATIVE_POSIX_SLOWDOWN_TO_REAL_TIME)
#include "timer_model.h"
#endif
LOG_MODULE_REGISTER(lwm2m_engine_test);
@ -19,6 +23,7 @@ DEFINE_FFF_GLOBALS;
#define FFF_FAKES_LIST(FAKE)
static uint8_t my_buf[256];
static uint16_t my_data_len = 1;
static struct lwm2m_message my_msg;
static struct lwm2m_engine_obj_field my_obj_field;
@ -31,7 +36,7 @@ static int lwm2m_get_res_buf_custom_fake(const struct lwm2m_obj_path *path, void
if (buffer_len)
*buffer_len = sizeof(my_buf);
if (data_len)
*data_len = 1;
*data_len = my_data_len;
return 0;
}
@ -62,6 +67,12 @@ static void test_service(struct k_work *work)
static void setup(void *data)
{
#if defined(CONFIG_NATIVE_POSIX_SLOWDOWN_TO_REAL_TIME)
/* It is enough that some slow-down is happening on sleeps, it does not have to be
* real time
*/
hwtimer_set_rt_ratio(100.0);
#endif
/* Register resets */
DO_FOREACH_FAKE(RESET_FAKE);
@ -95,6 +106,14 @@ ZTEST(lwm2m_engine, test_start_stop)
ret = lwm2m_engine_start(&ctx);
zassert_equal(ret, 0);
struct lwm2m_ctx **eng_ctx = lwm2m_sock_ctx();
int nfds = lwm2m_sock_nfds();
zassert_not_null(eng_ctx);
zassert_true(nfds > 0);
zassert_equal(eng_ctx[0], &ctx);
/* wait for socket receive thread */
k_sleep(K_MSEC(1000));
ret = lwm2m_engine_stop(&ctx);
@ -160,6 +179,7 @@ ZTEST(lwm2m_engine, test_no_sa_family)
ret = lwm2m_engine_start(&ctx);
zassert_equal(ret, -EPROTONOSUPPORT);
lwm2m_engine_stop(&ctx);
}
ZTEST(lwm2m_engine, test_connect_fail)
@ -177,6 +197,7 @@ ZTEST(lwm2m_engine, test_connect_fail)
z_impl_zsock_connect_fake.return_val = -1;
ret = lwm2m_engine_start(&ctx);
zassert_equal(ret, -ENETDOWN);
lwm2m_engine_stop(&ctx);
}
ZTEST(lwm2m_engine, test_socket_suspend_resume_connection)
@ -198,6 +219,7 @@ ZTEST(lwm2m_engine, test_socket_suspend_resume_connection)
ret = lwm2m_engine_connection_resume(&ctx);
zassert_equal(ret, 0);
zassert_equal(ctx.connection_suspended, false);
lwm2m_engine_stop(&ctx);
}
ZTEST(lwm2m_engine, test_check_notifications)
@ -360,7 +382,7 @@ ZTEST(lwm2m_engine, test_socket_recv)
k_sleep(K_MSEC(1000));
ret = lwm2m_engine_stop(&ctx);
zassert_equal(ret, 0);
zassert_equal(lwm2m_udp_receive_fake.call_count, 1, "udp receive was not called");
zassert_true(lwm2m_udp_receive_fake.call_count > 0);
}
ZTEST(lwm2m_engine, test_socket_send)
@ -392,3 +414,56 @@ ZTEST(lwm2m_engine, test_socket_send)
LOG_INF("Count %d", coap_pending_cycle_fake.call_count);
zassert_equal(coap_pending_cycle_fake.call_count, 1, "coap_pending_cycle not called");
}
ZTEST(lwm2m_engine, test_security)
{
struct lwm2m_ctx ctx;
char host_name[10] = "my_host";
(void)memset(&ctx, 0x0, sizeof(ctx));
my_data_len = snprintk(my_buf, sizeof(my_buf), "-----BEGIN SOMETHING");
ctx.remote_addr.sa_family = AF_INET;
ctx.sock_fd = -1;
ctx.load_credentials = NULL;
ctx.desthostname = host_name;
ctx.desthostnamelen = strlen(host_name);
ctx.hostname_verify = true;
ctx.use_dtls = false;
lwm2m_security_mode_fake.return_val = LWM2M_SECURITY_NOSEC;
zassert_equal(lwm2m_engine_start(&ctx), 0);
zassert_equal(lwm2m_engine_stop(&ctx), 0);
ctx.use_dtls = true;
zassert_equal(lwm2m_engine_start(&ctx), -EINVAL);
zassert_equal(lwm2m_engine_stop(&ctx), 0);
RESET_FAKE(z_impl_zsock_setsockopt);
lwm2m_security_mode_fake.return_val = LWM2M_SECURITY_PSK;
zassert_equal(lwm2m_engine_start(&ctx), 0);
zassert_equal(z_impl_zsock_setsockopt_fake.arg2_history[0], TLS_SEC_TAG_LIST);
zassert_equal(z_impl_zsock_setsockopt_fake.arg2_history[1], TLS_HOSTNAME);
zassert_equal(z_impl_zsock_setsockopt_fake.arg2_history[2], TLS_PEER_VERIFY);
zassert_equal(z_impl_zsock_setsockopt_fake.arg2_history[3], TLS_CIPHERSUITE_LIST);
zassert_true(tls_credential_delete_fake.call_count > 3);
zassert_true(tls_credential_add_fake.call_count == 2);
zassert_equal(tls_credential_add_fake.arg1_history[0], TLS_CREDENTIAL_PSK_ID);
zassert_equal(tls_credential_add_fake.arg1_history[1], TLS_CREDENTIAL_PSK);
zassert_equal(lwm2m_engine_stop(&ctx), 0);
RESET_FAKE(z_impl_zsock_setsockopt);
RESET_FAKE(tls_credential_add);
lwm2m_security_mode_fake.return_val = LWM2M_SECURITY_CERT;
ctx.hostname_verify = false;
zassert_equal(lwm2m_engine_start(&ctx), 0);
zassert_equal(z_impl_zsock_setsockopt_fake.arg2_history[0], TLS_SEC_TAG_LIST);
zassert_equal(z_impl_zsock_setsockopt_fake.arg2_history[1], TLS_PEER_VERIFY);
zassert_equal(z_impl_zsock_setsockopt_fake.arg2_history[2], TLS_CIPHERSUITE_LIST);
zassert_true(tls_credential_add_fake.call_count == 3);
zassert_equal(tls_credential_add_fake.arg1_history[0], TLS_CREDENTIAL_SERVER_CERTIFICATE);
zassert_equal(tls_credential_add_fake.arg1_history[1], TLS_CREDENTIAL_PRIVATE_KEY);
zassert_equal(tls_credential_add_fake.arg1_history[2], TLS_CREDENTIAL_CA_CERTIFICATE);
zassert_equal(lwm2m_engine_stop(&ctx), 0);
}

View file

@ -40,6 +40,7 @@ DEFINE_FAKE_VALUE_FUNC(int, lwm2m_get_bool, const struct lwm2m_obj_path *, bool
DEFINE_FAKE_VALUE_FUNC(int, lwm2m_delete_obj_inst, uint16_t, uint16_t);
DEFINE_FAKE_VOID_FUNC(lwm2m_clear_block_contexts);
DEFINE_FAKE_VALUE_FUNC(int, lwm2m_security_mode, struct lwm2m_ctx *);
DEFINE_FAKE_VALUE_FUNC(int, z_impl_zsock_setsockopt, int, int, int, const void *, socklen_t);
static sys_slist_t obs_obj_path_list = SYS_SLIST_STATIC_INIT(&obs_obj_path_list);
sys_slist_t *lwm2m_obs_obj_path_list(void)
@ -126,11 +127,6 @@ int z_impl_zsock_poll(struct zsock_pollfd *fds, int nfds, int poll_timeout)
return 0;
}
int z_impl_zsock_setsockopt(int sock, int level, int optname, const void *optval, socklen_t optlen)
{
return 0;
}
int z_impl_zsock_fcntl(int sock, int cmd, int flags)
{
return 0;

View file

@ -55,6 +55,7 @@ DECLARE_FAKE_VALUE_FUNC(int, lwm2m_delete_obj_inst, uint16_t, uint16_t);
DECLARE_FAKE_VOID_FUNC(lwm2m_clear_block_contexts);
DECLARE_FAKE_VALUE_FUNC(int, z_impl_zsock_connect, int, const struct sockaddr *, socklen_t);
DECLARE_FAKE_VALUE_FUNC(int, lwm2m_security_mode, struct lwm2m_ctx *);
DECLARE_FAKE_VALUE_FUNC(int, z_impl_zsock_setsockopt, int, int, int, const void *, socklen_t);
#define DO_FOREACH_FAKE(FUNC) \
do { \
@ -83,6 +84,7 @@ DECLARE_FAKE_VALUE_FUNC(int, lwm2m_security_mode, struct lwm2m_ctx *);
FUNC(lwm2m_clear_block_contexts) \
FUNC(z_impl_zsock_connect) \
FUNC(lwm2m_security_mode) \
FUNC(z_impl_zsock_setsockopt) \
} while (0)
#endif /* STUBS_H */