Skip to content

Commit 1fcec48

Browse files
alxelaxrlubos
authored andcommitted
tests: net: openthread: rpc: commissioning unit tests
Commit adds ot rpc commissioning unit tests as well as restructures ot rpc unit test folder structure. Signed-off-by: Aleksandr Khromykh <[email protected]>
1 parent 59ad79d commit 1fcec48

File tree

19 files changed

+620
-49
lines changed

19 files changed

+620
-49
lines changed
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
#
2+
# Copyright (c) 2024 Nordic Semiconductor ASA
3+
#
4+
# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
5+
#
6+
cmake_minimum_required(VERSION 3.20.0)
7+
8+
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
9+
project(ot_rpc_commissioning_client_test)
10+
11+
FILE(GLOB app_sources src/*.c)
12+
13+
target_include_directories(app PRIVATE
14+
# Needed to access OpenThread RPC command IDs.
15+
${ZEPHYR_NRF_MODULE_DIR}/subsys/net/openthread/rpc/common
16+
../../common
17+
)
18+
19+
target_sources(app PRIVATE
20+
${app_sources}
21+
../../common/net_l2_openthread.c
22+
../../common/nrf_rpc_single_thread.c
23+
)
24+
25+
# Fill the gaps due to not setting NET_L2_OPENTHREAD.
26+
zephyr_include_directories(
27+
${ZEPHYR_OPENTHREAD_MODULE_DIR}/include
28+
)
29+
30+
zephyr_compile_definitions(
31+
CONFIG_OPENTHREAD_PKT_LIST_SIZE=1
32+
)
33+
34+
# Enforce single-threaded nRF RPC command processing.
35+
target_link_options(app PUBLIC
36+
-Wl,--wrap=nrf_rpc_os_init,--wrap=nrf_rpc_os_thread_pool_send
37+
)
Lines changed: 200 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,200 @@
1+
/*
2+
* Copyright (c) 2024 Nordic Semiconductor ASA
3+
*
4+
* SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
5+
*/
6+
7+
#include <mock_nrf_rpc_transport.h>
8+
9+
#include <zephyr/ztest.h>
10+
#include <zephyr/kernel.h>
11+
12+
#include <nrf_rpc/nrf_rpc_cbkproxy.h>
13+
14+
#include <ot_rpc_ids.h>
15+
#include <ot_rpc_types.h>
16+
#include <ot_rpc_common.h>
17+
#include <test_rpc_env.h>
18+
19+
static int slot_cnt;
20+
static bool cb_called;
21+
22+
static void nrf_rpc_err_handler(const struct nrf_rpc_err_report *report)
23+
{
24+
zassert_ok(report->code);
25+
}
26+
27+
static void tc_setup(void *f)
28+
{
29+
mock_nrf_rpc_tr_expect_add(RPC_INIT_REQ, RPC_INIT_RSP);
30+
zassert_ok(nrf_rpc_init(nrf_rpc_err_handler));
31+
mock_nrf_rpc_tr_expect_reset();
32+
}
33+
34+
/* Test serialization of otThreadDiscover() */
35+
ZTEST(ot_rpc_commissioning_cli, test_otThreadDiscover)
36+
{
37+
otError error;
38+
uint32_t scan_channels = 0x7fff800;
39+
uint16_t pan_id = 0x4321;
40+
bool joiner = false;
41+
bool enable_eui64_filtering = true;
42+
otHandleActiveScanResult cb = (otHandleActiveScanResult)0xdeadbeef;
43+
void *cb_ctx = (void *)0xcafeface;
44+
45+
mock_nrf_rpc_tr_expect_add(RPC_CMD(OT_RPC_CMD_THREAD_DISCOVER, CBOR_UINT32(0x7fff800),
46+
CBOR_UINT16(0x4321), CBOR_FALSE, CBOR_TRUE, slot_cnt,
47+
CBOR_UINT32(0xcafeface)),
48+
RPC_RSP(OT_ERROR_NONE));
49+
error = otThreadDiscover(NULL, scan_channels, pan_id, joiner, enable_eui64_filtering, cb,
50+
cb_ctx);
51+
mock_nrf_rpc_tr_expect_done();
52+
zassert_equal(error, OT_ERROR_NONE);
53+
}
54+
55+
/* Test serialization of otDatasetIsCommissioned() */
56+
ZTEST(ot_rpc_commissioning_cli, test_otDatasetIsCommissioned)
57+
{
58+
bool result;
59+
60+
mock_nrf_rpc_tr_expect_add(RPC_CMD(OT_RPC_CMD_DATASET_IS_COMMISSIONED), RPC_RSP(CBOR_TRUE));
61+
result = otDatasetIsCommissioned(NULL);
62+
mock_nrf_rpc_tr_expect_done();
63+
zassert_true(result);
64+
65+
mock_nrf_rpc_tr_expect_add(RPC_CMD(OT_RPC_CMD_DATASET_IS_COMMISSIONED),
66+
RPC_RSP(CBOR_FALSE));
67+
result = otDatasetIsCommissioned(NULL);
68+
mock_nrf_rpc_tr_expect_done();
69+
zassert_false(result);
70+
}
71+
72+
/* Test serialization of otDatasetSetActiveTlvs() */
73+
ZTEST(ot_rpc_commissioning_cli, test_otDatasetSetActiveTlvs)
74+
{
75+
otError error;
76+
77+
const otOperationalDatasetTlvs dataset = {
78+
{INT_SEQUENCE(OT_OPERATIONAL_DATASET_MAX_LENGTH)},
79+
OT_OPERATIONAL_DATASET_MAX_LENGTH};
80+
81+
mock_nrf_rpc_tr_expect_add(RPC_CMD(OT_RPC_CMD_DATA_SET_ACTIVE_TLVS, TLVS),
82+
RPC_RSP(OT_ERROR_NONE));
83+
error = otDatasetSetActiveTlvs(NULL, &dataset);
84+
mock_nrf_rpc_tr_expect_done();
85+
zassert_equal(error, OT_ERROR_NONE);
86+
}
87+
88+
/* Test incoming parameters validation of otDatasetSetActiveTlvs() */
89+
ZTEST(ot_rpc_commissioning_cli, test_otDatasetSetActiveTlvs_negative)
90+
{
91+
otError error;
92+
const otOperationalDatasetTlvs dataset = {{0}, OT_OPERATIONAL_DATASET_MAX_LENGTH + 1};
93+
94+
error = otDatasetSetActiveTlvs(NULL, &dataset);
95+
zassert_equal(error, OT_ERROR_INVALID_ARGS);
96+
error = otDatasetSetActiveTlvs(NULL, NULL);
97+
zassert_equal(error, OT_ERROR_INVALID_ARGS);
98+
}
99+
100+
/* Test serialization of otDatasetGetActiveTlvs() */
101+
ZTEST(ot_rpc_commissioning_cli, test_otDatasetGetActiveTlvs)
102+
{
103+
otError error;
104+
otOperationalDatasetTlvs dataset;
105+
const otOperationalDatasetTlvs expected_dataset = {
106+
{INT_SEQUENCE(OT_OPERATIONAL_DATASET_MAX_LENGTH)},
107+
OT_OPERATIONAL_DATASET_MAX_LENGTH};
108+
109+
mock_nrf_rpc_tr_expect_add(RPC_CMD(OT_RPC_CMD_DATA_GET_ACTIVE_TLVS), RPC_RSP(TLVS));
110+
error = otDatasetGetActiveTlvs(NULL, &dataset);
111+
mock_nrf_rpc_tr_expect_done();
112+
zassert_equal(error, OT_ERROR_NONE);
113+
zassert_mem_equal(&dataset, &expected_dataset, sizeof(otOperationalDatasetTlvs));
114+
}
115+
116+
/* Test NULL replay on otDatasetGetActiveTlvs() and parameter validation. */
117+
ZTEST(ot_rpc_commissioning_cli, test_otDatasetGetActiveTlvs_null)
118+
{
119+
otError error;
120+
otOperationalDatasetTlvs dataset;
121+
122+
mock_nrf_rpc_tr_expect_add(RPC_CMD(OT_RPC_CMD_DATA_GET_ACTIVE_TLVS), RPC_RSP(CBOR_NULL));
123+
error = otDatasetGetActiveTlvs(NULL, &dataset);
124+
mock_nrf_rpc_tr_expect_done();
125+
zassert_equal(error, OT_ERROR_NOT_FOUND);
126+
127+
error = otDatasetGetActiveTlvs(NULL, NULL);
128+
zassert_equal(error, OT_ERROR_NOT_FOUND);
129+
}
130+
131+
static void discover_cb(otActiveScanResult *result, void *ctx)
132+
{
133+
uint8_t ext_addr[] = {INT_SEQUENCE(OT_EXT_ADDRESS_SIZE)};
134+
uint8_t nwk_name[] = {INT_SEQUENCE(OT_NETWORK_NAME_MAX_SIZE), 0};
135+
uint8_t ext_pan_id[] = {INT_SEQUENCE(OT_EXT_PAN_ID_SIZE)};
136+
uint8_t steer_data[] = {INT_SEQUENCE(OT_STEERING_DATA_MAX_LENGTH)};
137+
138+
cb_called = true;
139+
zassert_not_null(result);
140+
zassert_not_null(ctx);
141+
zassert_mem_equal(result->mExtAddress.m8, ext_addr, OT_EXT_ADDRESS_SIZE);
142+
zassert_mem_equal(result->mNetworkName.m8, nwk_name, OT_NETWORK_NAME_MAX_SIZE + 1);
143+
zassert_mem_equal(result->mExtendedPanId.m8, ext_pan_id, OT_EXT_PAN_ID_SIZE);
144+
zassert_mem_equal(result->mSteeringData.m8, steer_data, OT_STEERING_DATA_MAX_LENGTH);
145+
zassert_equal(result->mPanId, 0x1234);
146+
zassert_equal(result->mJoinerUdpPort, 0x4321);
147+
zassert_equal(result->mChannel, 0x22);
148+
zassert_equal(result->mRssi, 0x33);
149+
zassert_equal(result->mLqi, 0x44);
150+
zassert_equal(result->mVersion, 0x0f);
151+
zassert_false(!!result->mIsNative);
152+
zassert_true(!!result->mDiscover);
153+
zassert_false(!!result->mIsJoinable);
154+
zassert_equal_ptr(ctx, (void *)0xdeadbeef);
155+
}
156+
157+
/* Test reception of discover callback with active scan result. */
158+
ZTEST(ot_rpc_commissioning_cli, test_discover_cb_handler)
159+
{
160+
161+
int in_slot = nrf_rpc_cbkproxy_in_set(discover_cb);
162+
163+
slot_cnt++;
164+
cb_called = false;
165+
mock_nrf_rpc_tr_expect_add(RPC_RSP(), NO_RSP);
166+
mock_nrf_rpc_tr_receive(RPC_CMD(OT_RPC_CMD_THREAD_DISCOVER_CB, EXT_ADDR, NWK_NAME,
167+
EXT_PAN_ID, STEERING_DATA, CBOR_UINT16(0x1234),
168+
CBOR_UINT16(0x4321), CBOR_UINT8(0x22), CBOR_UINT8(0x33),
169+
CBOR_UINT8(0x44), 0x0f, CBOR_FALSE, CBOR_TRUE, CBOR_FALSE,
170+
CBOR_UINT32(0xdeadbeef), in_slot));
171+
mock_nrf_rpc_tr_expect_done();
172+
173+
zassert_true(cb_called);
174+
}
175+
176+
static void discover_empty_cb(otActiveScanResult *result, void *ctx)
177+
{
178+
cb_called = true;
179+
zassert_is_null(result);
180+
zassert_not_null(ctx);
181+
zassert_equal_ptr(ctx, (void *)0xdeadbeef);
182+
}
183+
184+
/* Test reception of discover callback with empty active scan result. */
185+
ZTEST(ot_rpc_commissioning_cli, test_discover_cb_handler_empty)
186+
{
187+
188+
int in_slot = nrf_rpc_cbkproxy_in_set(discover_empty_cb);
189+
190+
slot_cnt++;
191+
cb_called = false;
192+
mock_nrf_rpc_tr_expect_add(RPC_RSP(), NO_RSP);
193+
mock_nrf_rpc_tr_receive(RPC_CMD(OT_RPC_CMD_THREAD_DISCOVER_CB, CBOR_NULL,
194+
CBOR_UINT32(0xdeadbeef), in_slot));
195+
mock_nrf_rpc_tr_expect_done();
196+
197+
zassert_true(cb_called);
198+
}
199+
200+
ZTEST_SUITE(ot_rpc_commissioning_cli, NULL, NULL, tc_setup, NULL, NULL);
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
tests:
2+
net.openthread.rpc.client.commissioning:
3+
sysbuild: true
4+
platform_allow: native_sim
5+
tags: openthread ci_build sysbuild
6+
integration_platforms:
7+
- native_sim

tests/subsys/net/openthread/rpc/client/CMakeLists.txt renamed to tests/subsys/net/openthread/rpc/client/ctrl/CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,14 @@
66
cmake_minimum_required(VERSION 3.20.0)
77

88
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
9-
project(ot_rpc_client_test)
9+
project(ot_rpc_ctrl_client_test)
1010

1111
FILE(GLOB app_sources src/*.c)
1212

1313
target_include_directories(app PRIVATE
1414
# Needed to access OpenThread RPC command IDs.
1515
${ZEPHYR_NRF_MODULE_DIR}/subsys/net/openthread/rpc/common
16+
../../common
1617
)
1718

1819
target_sources(app PRIVATE
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
#
2+
# Copyright (c) 2024 Nordic Semiconductor ASA
3+
#
4+
# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
5+
#
6+
7+
# Ztest configuration
8+
CONFIG_ZTEST=y
9+
CONFIG_TEST_RANDOM_GENERATOR=y
10+
11+
CONFIG_OPENTHREAD_RPC=y
12+
CONFIG_OPENTHREAD_RPC_CLIENT=y
13+
CONFIG_NETWORKING=y
14+
CONFIG_NRF_RPC_CBKPROXY_OUT_SLOTS=0
15+
16+
CONFIG_MOCK_NRF_RPC=y
17+
CONFIG_MOCK_NRF_RPC_TRANSPORT=y
18+
19+
CONFIG_KERNEL_MEM_POOL=y
20+
CONFIG_HEAP_MEM_POOL_SIZE=4096

tests/subsys/net/openthread/rpc/client/src/main.c renamed to tests/subsys/net/openthread/rpc/client/ctrl/src/main.c

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -13,28 +13,7 @@
1313
#include <openthread/thread.h>
1414

1515
#include <ot_rpc_ids.h>
16-
17-
/* CBOR constants */
18-
19-
#define CBOR_FALSE 0xf4
20-
#define CBOR_TRUE 0xf5
21-
22-
/* Macros for constructing nRF RPC packets for the OpenThread command group. */
23-
24-
#define RPC_PKT(bytes...) \
25-
(mock_nrf_rpc_pkt_t) \
26-
{ \
27-
.data = (uint8_t[]){bytes}, .len = sizeof((uint8_t[]){bytes}), \
28-
}
29-
30-
#define RPC_INIT_REQ RPC_PKT(0x04, 0x00, 0xff, 0x00, 0xff, 0x00, 'o', 't')
31-
#define RPC_INIT_RSP RPC_PKT(0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 'o', 't')
32-
#define RPC_CMD(cmd, ...) RPC_PKT(0x80, cmd, 0xff, 0x00, 0x00 __VA_OPT__(,) __VA_ARGS__, 0xf6)
33-
#define RPC_RSP(...) RPC_PKT(0x01, 0xff, 0x00, 0x00, 0x00 __VA_OPT__(,) __VA_ARGS__, 0xf6)
34-
35-
/* Other test data */
36-
37-
#define MADDR_FF02_1 0xff, 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01
16+
#include <test_rpc_env.h>
3817

3918
static void nrf_rpc_err_handler(const struct nrf_rpc_err_report *report)
4019
{

tests/subsys/net/openthread/rpc/server/testcase.yaml renamed to tests/subsys/net/openthread/rpc/client/ctrl/testcase.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
tests:
2-
net.openthread.rpc.server:
2+
net.openthread.rpc.client.ctrl:
33
sysbuild: true
44
platform_allow: native_sim
55
tags: openthread ci_build sysbuild

0 commit comments

Comments
 (0)