Skip to content

Commit 3c0124a

Browse files
MarekPorwiszcarlescufi
authored andcommitted
tests: openthread: Test passing net_pkt to OpenThread thread
Passing TX messages from sockets was reworked for openthread thus tests need to be created/updated in order to pass. Signed-off-by: Marek Porwisz <[email protected]>
1 parent 1130f84 commit 3c0124a

File tree

1 file changed

+147
-10
lines changed

1 file changed

+147
-10
lines changed

tests/subsys/openthread/radio_test.c

Lines changed: 147 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include <net/net_pkt.h>
1515

1616
#include <openthread/platform/radio.h>
17+
#include <openthread/message.h>
1718
#include <platform-zephyr.h>
1819

1920
/**
@@ -36,6 +37,7 @@ energy_scan_done_cb_t scan_done_cb;
3637
* Should not be null to be sure it was properly passed.
3738
*/
3839
otInstance *ot = (otInstance *)0xAAAA;
40+
otMessage *ip_msg = (otMessage *)0xBBBB;
3941

4042
/* forward declarations */
4143
static int scan_mock(struct device *dev, uint16_t duration,
@@ -273,6 +275,35 @@ struct device *device_get_binding_stub(const char *name)
273275
return &radio;
274276
}
275277

278+
otError otIp6Send(otInstance *aInstance, otMessage *aMessage)
279+
{
280+
zassert_equal(aInstance, ot, "Incorrect instance.");
281+
ztest_check_expected_value(aMessage);
282+
return ztest_get_return_value();
283+
}
284+
285+
otMessage *otIp6NewMessage(otInstance *aInstance,
286+
const otMessageSettings *aSettings)
287+
{
288+
zassert_equal(aInstance, ot, "Incorrect instance.");
289+
return ip_msg;
290+
}
291+
292+
otError otMessageAppend(otMessage *aMessage, const void *aBuf, uint16_t aLength)
293+
{
294+
void *buf = (void *)aBuf;
295+
296+
ztest_check_expected_value(aMessage);
297+
ztest_check_expected_value(aLength);
298+
ztest_check_expected_data(buf, aLength);
299+
return ztest_get_return_value();
300+
}
301+
302+
void otMessageFree(otMessage *aMessage)
303+
{
304+
ztest_check_expected_value(aMessage);
305+
}
306+
276307
void otPlatRadioTxStarted(otInstance *aInstance, otRadioFrame *aFrame)
277308
{
278309
zassert_equal(aInstance, ot, "Incorrect instance.");
@@ -752,6 +783,31 @@ static void test_address_test(void)
752783
otPlatRadioSetExtendedAddress(ot, &ieee_addr);
753784
}
754785

786+
787+
uint8_t alloc_pkt(struct net_pkt **out_packet, uint8_t buf_ct, uint8_t offset)
788+
{
789+
struct net_pkt *packet;
790+
struct net_buf *buf;
791+
uint8_t len = 0;
792+
uint8_t buf_num;
793+
794+
packet = net_pkt_alloc(K_NO_WAIT);
795+
for (buf_num = 0; buf_num < buf_ct; buf_num++) {
796+
buf = net_pkt_get_reserve_tx_data(K_NO_WAIT);
797+
net_pkt_append_buffer(packet, buf);
798+
799+
for (int i = 0; i < buf->size; i++) {
800+
buf->data[i] = (offset + i + buf_num) & 0xFF;
801+
}
802+
803+
len = buf->size - 3;
804+
buf->len = len;
805+
}
806+
807+
*out_packet = packet;
808+
return len;
809+
}
810+
755811
/**
756812
* @brief Test received messages handling.
757813
* Tests if received frames are properly passed to the OpenThread
@@ -767,15 +823,8 @@ static void test_receive_test(void)
767823
const int8_t rssi = -90;
768824
uint8_t len;
769825

770-
packet = net_pkt_alloc(K_NO_WAIT);
771-
buf = net_pkt_get_reserve_tx_data(K_NO_WAIT);
772-
net_pkt_append_buffer(packet, buf);
773-
774-
for (int i = 0; i < buf->size; i++) {
775-
buf->data[i] = ('a' + i) & 0xFF;
776-
}
777-
len = buf->size - 3;
778-
buf->len = len;
826+
len = alloc_pkt(&packet, 1, 'a');
827+
buf = packet->buffer;
779828

780829
net_pkt_set_ieee802154_lqi(packet, lqi);
781830
net_pkt_set_ieee802154_rssi(packet, rssi);
@@ -803,6 +852,92 @@ static void test_receive_test(void)
803852
platformRadioProcess(ot);
804853
}
805854

855+
/**
856+
* @brief Test received messages handling.
857+
* Tests if received frames are properly passed to the OpenThread
858+
*
859+
*/
860+
static void test_net_pkt_transmit(void)
861+
{
862+
struct net_pkt *packet;
863+
struct net_buf *buf;
864+
const uint8_t channel = 21;
865+
const int8_t power = -5;
866+
uint8_t len;
867+
868+
/* success */
869+
len = alloc_pkt(&packet, 2, 'a');
870+
buf = packet->buffer;
871+
otPlatRadioSetTransmitPower(ot, power);
872+
873+
ztest_returns_value(set_channel_mock, 0);
874+
ztest_expect_value(set_channel_mock, channel, channel);
875+
ztest_expect_value(set_txpower_mock, dbm, power);
876+
ztest_expect_value(start_mock, dev, &radio);
877+
otPlatRadioReceive(ot, channel);
878+
879+
notify_new_tx_frame(packet);
880+
881+
make_sure_sem_set(Z_TIMEOUT_MS(100));
882+
883+
ztest_expect_value(otMessageAppend, aMessage, ip_msg);
884+
ztest_expect_value(otMessageAppend, aLength, len);
885+
ztest_expect_data(otMessageAppend, buf, buf->data);
886+
ztest_returns_value(otMessageAppend, OT_ERROR_NONE);
887+
888+
buf = buf->frags;
889+
ztest_expect_value(otMessageAppend, aMessage, ip_msg);
890+
ztest_expect_value(otMessageAppend, aLength, len);
891+
ztest_expect_data(otMessageAppend, buf, buf->data);
892+
ztest_returns_value(otMessageAppend, OT_ERROR_NONE);
893+
894+
ztest_expect_value(otIp6Send, aMessage, ip_msg);
895+
ztest_returns_value(otIp6Send, OT_ERROR_NONE);
896+
897+
/* Do not expect free in case of success */
898+
899+
platformRadioProcess(ot);
900+
901+
/* fail on append */
902+
len = alloc_pkt(&packet, 2, 'b');
903+
buf = packet->buffer;
904+
905+
notify_new_tx_frame(packet);
906+
907+
make_sure_sem_set(Z_TIMEOUT_MS(100));
908+
909+
ztest_expect_value(otMessageAppend, aMessage, ip_msg);
910+
ztest_expect_value(otMessageAppend, aLength, len);
911+
ztest_expect_data(otMessageAppend, buf, buf->data);
912+
ztest_returns_value(otMessageAppend, OT_ERROR_NO_BUFS);
913+
914+
/* Expect free in case of failure in appending buffer*/
915+
ztest_expect_value(otMessageFree, aMessage, ip_msg);
916+
917+
platformRadioProcess(ot);
918+
919+
/* fail on send */
920+
len = alloc_pkt(&packet, 1, 'c');
921+
buf = packet->buffer;
922+
923+
notify_new_tx_frame(packet);
924+
925+
make_sure_sem_set(Z_TIMEOUT_MS(100));
926+
927+
ztest_expect_value(otMessageAppend, aMessage, ip_msg);
928+
ztest_expect_value(otMessageAppend, aLength, len);
929+
ztest_expect_data(otMessageAppend, buf, buf->data);
930+
ztest_returns_value(otMessageAppend, OT_ERROR_NONE);
931+
932+
ztest_expect_value(otIp6Send, aMessage, ip_msg);
933+
ztest_returns_value(otIp6Send, OT_ERROR_BUSY);
934+
935+
/* Do not expect free in case of failure in send */
936+
937+
platformRadioProcess(ot);
938+
939+
}
940+
806941
void test_main(void)
807942
{
808943
platformRadioInit();
@@ -819,7 +954,9 @@ void test_main(void)
819954
ztest_unit_test(test_get_rssi_test),
820955
ztest_unit_test(test_radio_state_test),
821956
ztest_unit_test(test_address_test),
822-
ztest_unit_test(test_receive_test));
957+
ztest_unit_test(test_receive_test),
958+
ztest_unit_test(test_net_pkt_transmit));
959+
823960

824961
ztest_run_test_suite(openthread_radio);
825962
}

0 commit comments

Comments
 (0)