tests: add test for gnrc_netif_ipv6_wait_for_global_address()
This commit is contained in:
parent
9c783ac7c4
commit
ea3e23eda3
19
tests/gnrc_netif_ipv6_wait_for_global_address/Makefile
Normal file
19
tests/gnrc_netif_ipv6_wait_for_global_address/Makefile
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
include ../Makefile.tests_common
|
||||||
|
|
||||||
|
USEMODULE += embunit
|
||||||
|
USEMODULE += gnrc_netif
|
||||||
|
USEMODULE += gnrc_netif_bus
|
||||||
|
USEMODULE += gnrc_ipv6
|
||||||
|
USEMODULE += netdev_test
|
||||||
|
USEMODULE += xtimer
|
||||||
|
|
||||||
|
# deactivate automatically emitted packets from IPv6 neighbor discovery
|
||||||
|
CFLAGS += -DCONFIG_GNRC_IPV6_NIB_ARSM=0
|
||||||
|
CFLAGS += -DCONFIG_GNRC_IPV6_NIB_SLAAC=0
|
||||||
|
CFLAGS += -DCONFIG_GNRC_IPV6_NIB_NO_RTR_SOL=1
|
||||||
|
CFLAGS += -DGNRC_NETIF_ADDRS_NUMOF=16
|
||||||
|
CFLAGS += -DGNRC_NETIF_GROUPS_NUMOF=8
|
||||||
|
CFLAGS += -DLOG_LEVEL=LOG_NONE
|
||||||
|
CFLAGS += -DTEST_SUITES
|
||||||
|
|
||||||
|
include $(RIOTBASE)/Makefile.include
|
||||||
28
tests/gnrc_netif_ipv6_wait_for_global_address/Makefile.ci
Normal file
28
tests/gnrc_netif_ipv6_wait_for_global_address/Makefile.ci
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
BOARD_INSUFFICIENT_MEMORY := \
|
||||||
|
arduino-duemilanove \
|
||||||
|
arduino-leonardo \
|
||||||
|
arduino-mega2560 \
|
||||||
|
arduino-nano \
|
||||||
|
arduino-uno \
|
||||||
|
atmega328p \
|
||||||
|
atmega328p-xplained-mini \
|
||||||
|
bluepill-stm32f030c8 \
|
||||||
|
i-nucleo-lrwan1 \
|
||||||
|
msb-430 \
|
||||||
|
msb-430h \
|
||||||
|
nucleo-f030r8 \
|
||||||
|
nucleo-f031k6 \
|
||||||
|
nucleo-f042k6 \
|
||||||
|
nucleo-f303k8 \
|
||||||
|
nucleo-f334r8 \
|
||||||
|
nucleo-l011k4 \
|
||||||
|
nucleo-l031k6 \
|
||||||
|
nucleo-l053r8 \
|
||||||
|
samd10-xmini \
|
||||||
|
slstk3400a \
|
||||||
|
stk3200 \
|
||||||
|
stm32f030f4-demo \
|
||||||
|
stm32f0discovery \
|
||||||
|
stm32l0538-disco \
|
||||||
|
waspmote-pro \
|
||||||
|
#
|
||||||
161
tests/gnrc_netif_ipv6_wait_for_global_address/main.c
Normal file
161
tests/gnrc_netif_ipv6_wait_for_global_address/main.c
Normal file
@ -0,0 +1,161 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2021 ML!PA Consulting GmbH
|
||||||
|
*
|
||||||
|
* This file is subject to the terms and conditions of the GNU Lesser
|
||||||
|
* General Public License v2.1. See the file LICENSE in the top level
|
||||||
|
* directory for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ingroup tests
|
||||||
|
* @{
|
||||||
|
*
|
||||||
|
* @file
|
||||||
|
* @brief Tests notification for global address
|
||||||
|
*
|
||||||
|
* @author Benjamin Valentin <benjamin.valentin@ml-pa.com>
|
||||||
|
*
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "embUnit.h"
|
||||||
|
#include "embUnit/embUnit.h"
|
||||||
|
#include "net/ipv6.h"
|
||||||
|
#include "net/gnrc/netif.h"
|
||||||
|
#include "net/gnrc/netif/raw.h"
|
||||||
|
#include "net/netdev_test.h"
|
||||||
|
#include "xtimer.h"
|
||||||
|
|
||||||
|
#define TEST_NETIF_NUMOF 2
|
||||||
|
#define TEST_NETIF_PRIO 3
|
||||||
|
|
||||||
|
static netdev_test_t netdev_test[TEST_NETIF_NUMOF];
|
||||||
|
static gnrc_netif_t netif_test[TEST_NETIF_NUMOF];
|
||||||
|
static char netif_stack[TEST_NETIF_NUMOF][THREAD_STACKSIZE_DEFAULT];
|
||||||
|
static char adder_stack[THREAD_STACKSIZE_DEFAULT];
|
||||||
|
|
||||||
|
static gnrc_netif_t *_test_netif;
|
||||||
|
static const ipv6_addr_t _test_addr = {{ 0x20, 0x01, 0x0d, 0xd8,
|
||||||
|
0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x01 }};
|
||||||
|
static void tear_down(void)
|
||||||
|
{
|
||||||
|
if (_test_netif == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
gnrc_netif_ipv6_addr_remove(_test_netif, &_test_addr);
|
||||||
|
_test_netif = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void *_adder_thread(void *netif)
|
||||||
|
{
|
||||||
|
xtimer_msleep(10);
|
||||||
|
gnrc_netif_ipv6_addr_add(netif, &_test_addr, 64,
|
||||||
|
GNRC_NETIF_IPV6_ADDRS_FLAGS_STATE_VALID);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void _add_delayed_addr(gnrc_netif_t *netif)
|
||||||
|
{
|
||||||
|
_test_netif = netif;
|
||||||
|
memset(adder_stack, 0, sizeof(adder_stack));
|
||||||
|
thread_create(adder_stack, sizeof(adder_stack),
|
||||||
|
THREAD_PRIORITY_MAIN - 1,
|
||||||
|
THREAD_CREATE_STACKTEST,
|
||||||
|
_adder_thread, netif, "add_addr");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void _assert_wait_blocks(gnrc_netif_t *add_netif,
|
||||||
|
gnrc_netif_t *wait_netif,
|
||||||
|
bool success)
|
||||||
|
{
|
||||||
|
uint32_t now = xtimer_now_usec();
|
||||||
|
uint32_t timeout = 20;
|
||||||
|
|
||||||
|
_add_delayed_addr(add_netif);
|
||||||
|
TEST_ASSERT(gnrc_netif_ipv6_wait_for_global_address(wait_netif,
|
||||||
|
timeout) == success);
|
||||||
|
if (success) {
|
||||||
|
TEST_ASSERT(((xtimer_now_usec() - now) / US_PER_MS) < timeout);
|
||||||
|
} else {
|
||||||
|
TEST_ASSERT(((xtimer_now_usec() - now) / US_PER_MS) >= timeout);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void test_wait_timeout(void)
|
||||||
|
{
|
||||||
|
TEST_ASSERT_EQUAL_INT(TEST_NETIF_NUMOF, gnrc_netif_numof());
|
||||||
|
TEST_ASSERT(!gnrc_netif_ipv6_wait_for_global_address(NULL, 10));
|
||||||
|
TEST_ASSERT(!gnrc_netif_ipv6_wait_for_global_address(&netif_test[0], 10));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void test_wait_timeout_other_iface(void)
|
||||||
|
{
|
||||||
|
TEST_ASSERT_EQUAL_INT(TEST_NETIF_NUMOF, gnrc_netif_numof());
|
||||||
|
|
||||||
|
/* no event when adding addr to other interface */
|
||||||
|
_assert_wait_blocks(&netif_test[1], &netif_test[0], false);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void test_wait_success(void)
|
||||||
|
{
|
||||||
|
/* event when adding addr to specified interface */
|
||||||
|
_assert_wait_blocks(&netif_test[0], &netif_test[0], true);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void test_wait_success_any_iface(void)
|
||||||
|
{
|
||||||
|
/* event when adding addr to any interface */
|
||||||
|
_assert_wait_blocks(&netif_test[0], NULL, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Test *embunit_tests_gnrc_netif(void)
|
||||||
|
{
|
||||||
|
EMB_UNIT_TESTFIXTURES(fixtures) {
|
||||||
|
new_TestFixture(test_wait_timeout),
|
||||||
|
new_TestFixture(test_wait_timeout_other_iface),
|
||||||
|
new_TestFixture(test_wait_success),
|
||||||
|
new_TestFixture(test_wait_success_any_iface),
|
||||||
|
};
|
||||||
|
EMB_UNIT_TESTCALLER(tests, NULL, tear_down, fixtures);
|
||||||
|
|
||||||
|
return (Test *)&tests;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int netdev_get_device_type(netdev_t *dev, void *value, size_t max_len)
|
||||||
|
{
|
||||||
|
(void)dev;
|
||||||
|
(void)max_len;
|
||||||
|
const uint16_t type = NETDEV_TYPE_SLIP;
|
||||||
|
memcpy(value, &type, sizeof(type));
|
||||||
|
return sizeof(uint16_t);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void _setup_mock_netif(netdev_test_t *dev, gnrc_netif_t *netif,
|
||||||
|
void *stack, size_t stack_size, unsigned prio)
|
||||||
|
{
|
||||||
|
netdev_test_setup(dev, NULL);
|
||||||
|
netdev_test_set_get_cb(dev, NETOPT_DEVICE_TYPE, netdev_get_device_type);
|
||||||
|
gnrc_netif_raw_create(netif, stack, stack_size, prio,
|
||||||
|
"netdev_test", &dev->netdev.netdev);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
for (unsigned i = 0; i < TEST_NETIF_NUMOF; ++i) {
|
||||||
|
_setup_mock_netif(&netdev_test[i], &netif_test[i],
|
||||||
|
netif_stack[i], sizeof(netif_stack[i]),
|
||||||
|
TEST_NETIF_PRIO);
|
||||||
|
}
|
||||||
|
|
||||||
|
TESTS_START();
|
||||||
|
TESTS_RUN(embunit_tests_gnrc_netif());
|
||||||
|
TESTS_END();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
18
tests/gnrc_netif_ipv6_wait_for_global_address/tests/01-run.py
Executable file
18
tests/gnrc_netif_ipv6_wait_for_global_address/tests/01-run.py
Executable file
@ -0,0 +1,18 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
# Copyright (C) 2021 Benjamin Valentin <benjamin.valentin@ml-pa.com>
|
||||||
|
#
|
||||||
|
# This file is subject to the terms and conditions of the GNU Lesser
|
||||||
|
# General Public License v2.1. See the file LICENSE in the top level
|
||||||
|
# directory for more details.
|
||||||
|
|
||||||
|
import sys
|
||||||
|
from testrunner import run
|
||||||
|
|
||||||
|
|
||||||
|
def testfunc(child):
|
||||||
|
child.expect_exact("OK")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
sys.exit(run(testfunc))
|
||||||
Loading…
x
Reference in New Issue
Block a user