summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorgoldsimon <[email protected]>2018-01-12 22:27:15 +0100
committergoldsimon <[email protected]>2018-01-12 22:27:15 +0100
commitfa75ffed9dfc15e3a3e12711fe739b79e941fc08 (patch)
tree32c8fbedb57781e5265512100fc6904d981589ea /test
parent452c6a53785c1ef8a85d5364e1c79c438a9c8670 (diff)
unit tests: added test_netif (checking ext_callbacks only, for now)
Diffstat (limited to 'test')
-rw-r--r--test/unit/Filelists.mk1
-rw-r--r--test/unit/core/test_netif.c189
-rw-r--r--test/unit/core/test_netif.h8
-rw-r--r--test/unit/lwip_unittests.c2
-rw-r--r--test/unit/lwipopts.h3
5 files changed, 203 insertions, 0 deletions
diff --git a/test/unit/Filelists.mk b/test/unit/Filelists.mk
index acb9148f..49f7bdee 100644
--- a/test/unit/Filelists.mk
+++ b/test/unit/Filelists.mk
@@ -35,6 +35,7 @@ TESTFILES=$(TESTDIR)/lwip_unittests.c \
$(TESTDIR)/arch/sys_arch.c \
$(TESTDIR)/core/test_def.c \
$(TESTDIR)/core/test_mem.c \
+ $(TESTDIR)/core/test_netif.c \
$(TESTDIR)/core/test_pbuf.c \
$(TESTDIR)/core/test_timers.c \
$(TESTDIR)/dhcp/test_dhcp.c \
diff --git a/test/unit/core/test_netif.c b/test/unit/core/test_netif.c
new file mode 100644
index 00000000..fabc49ec
--- /dev/null
+++ b/test/unit/core/test_netif.c
@@ -0,0 +1,189 @@
+#include "test_netif.h"
+
+#include "lwip/netif.h"
+#include "lwip/stats.h"
+#include "lwip/etharp.h"
+#include "netif/ethernet.h"
+
+#if !LWIP_NETIF_EXT_STATUS_CALLBACK
+#error "This tests needs LWIP_NETIF_EXT_STATUS_CALLBACK enabled"
+#endif
+
+struct netif net_test;
+
+
+/* Setups/teardown functions */
+
+static void
+netif_setup(void)
+{
+ lwip_check_ensure_no_alloc(SKIP_POOL(MEMP_SYS_TIMEOUT));
+}
+
+static void
+netif_teardown(void)
+{
+ lwip_check_ensure_no_alloc(SKIP_POOL(MEMP_SYS_TIMEOUT));
+}
+
+/* test helper functions */
+
+static err_t
+testif_tx_func(struct netif *netif, struct pbuf *p)
+{
+ LWIP_UNUSED_ARG(netif);
+ LWIP_UNUSED_ARG(p);
+ return ERR_OK;
+}
+
+static err_t
+testif_init(struct netif *netif)
+{
+ netif->name[0] = 'c';
+ netif->name[1] = 'h';
+ netif->output = etharp_output;
+ netif->linkoutput = testif_tx_func;
+ netif->mtu = 1500;
+ netif->hwaddr_len = 6;
+ netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_ETHERNET | NETIF_FLAG_IGMP | NETIF_FLAG_MLD6;
+
+ netif->hwaddr[0] = 0x02;
+ netif->hwaddr[1] = 0x03;
+ netif->hwaddr[2] = 0x04;
+ netif->hwaddr[3] = 0x05;
+ netif->hwaddr[4] = 0x06;
+ netif->hwaddr[5] = 0x07;
+
+ return ERR_OK;
+}
+
+#define MAX_NSC_REASON_IDX 10
+static int ext_cb_counters[MAX_NSC_REASON_IDX];
+static netif_nsc_reason_t reasons;
+
+static netif_ext_callback_args_t *expected_args;
+
+static int dummy_active;
+
+static void
+test_netif_ext_callback_dummy(struct netif* netif, netif_nsc_reason_t reason, const netif_ext_callback_args_t* args)
+{
+ LWIP_UNUSED_ARG(netif);
+ LWIP_UNUSED_ARG(reason);
+ LWIP_UNUSED_ARG(args);
+
+ fail_unless(dummy_active);
+}
+
+static void
+test_netif_ext_callback(struct netif* netif, netif_nsc_reason_t reason, const netif_ext_callback_args_t* args)
+{
+ int i;
+ u32_t reason_flags = (u32_t)reason;
+ u32_t mask;
+
+ reasons = reasons | reason;
+
+ fail_unless(netif == &net_test);
+ fail_unless(reason != 0);
+ fail_unless((((u32_t)reason) & ~((1U << MAX_NSC_REASON_IDX) - 1U)) == 0);
+
+ LWIP_UNUSED_ARG(args);
+
+ for (i = 0, mask = 1U; i < MAX_NSC_REASON_IDX; i++, mask <<= 1) {
+ if (reason_flags & mask) {
+ ext_cb_counters[i]++;
+ }
+ }
+ if (expected_args != NULL) {
+ fail_unless(memcmp(expected_args, args, sizeof(netif_ext_callback_args_t)) == 0);
+ }
+}
+
+static void
+test_netif_ext_callback_assert_flag_count(netif_nsc_reason_t reason, int expected_count)
+{
+ int i;
+ u32_t reason_flags = (u32_t)reason;
+ u32_t mask;
+ for (i = 0, mask = 1U; i < MAX_NSC_REASON_IDX; i++, mask <<= 1) {
+ if (reason_flags & mask) {
+ fail_unless(ext_cb_counters[i] == expected_count);
+ }
+ }
+}
+
+static void
+test_netif_ext_callback_reset(void)
+{
+ memset(ext_cb_counters, 0, sizeof(ext_cb_counters));
+ reasons = 0;
+}
+
+/* Test functions */
+
+NETIF_DECLARE_EXT_CALLBACK(netif_callback_1)
+NETIF_DECLARE_EXT_CALLBACK(netif_callback_2)
+NETIF_DECLARE_EXT_CALLBACK(netif_callback_3)
+
+START_TEST(test_netif_extcallbacks)
+{
+ ip4_addr_t addr;
+ ip4_addr_t netmask;
+ ip4_addr_t gw;
+ LWIP_UNUSED_ARG(_i);
+
+ IP4_ADDR(&addr, 0, 0, 0, 0);
+ IP4_ADDR(&netmask, 0, 0, 0, 0);
+ IP4_ADDR(&gw, 0, 0, 0, 0);
+
+ netif_add_ext_callback(&netif_callback_3, test_netif_ext_callback_dummy);
+ netif_add_ext_callback(&netif_callback_2, test_netif_ext_callback);
+ netif_add_ext_callback(&netif_callback_1, test_netif_ext_callback_dummy);
+
+ dummy_active = 1;
+
+ reasons = 0;
+ netif_add(&net_test, &addr, &netmask, &gw, &net_test, testif_init, ethernet_input);
+ fail_unless(reasons == LWIP_NSC_NETIF_ADDED);
+ test_netif_ext_callback_assert_flag_count(LWIP_NSC_NETIF_ADDED, 1);
+ test_netif_ext_callback_reset();
+
+ netif_set_link_up(&net_test);
+ fail_unless(reasons == LWIP_NSC_LINK_CHANGED);
+ test_netif_ext_callback_assert_flag_count(LWIP_NSC_LINK_CHANGED, 1);
+ test_netif_ext_callback_reset();
+ netif_set_up(&net_test);
+ fail_unless(reasons == LWIP_NSC_STATUS_CHANGED);
+ test_netif_ext_callback_assert_flag_count(LWIP_NSC_STATUS_CHANGED, 1);
+ test_netif_ext_callback_reset();
+
+ IP4_ADDR(&addr, 1, 2, 3, 4);
+ netif_set_ipaddr(&net_test, &addr);
+ fail_unless(reasons == LWIP_NSC_IPV4_ADDRESS_CHANGED);
+ test_netif_ext_callback_assert_flag_count(LWIP_NSC_IPV4_ADDRESS_CHANGED, 1);
+ test_netif_ext_callback_reset();
+
+ netif_remove(&net_test);
+ fail_unless(reasons == (LWIP_NSC_NETIF_REMOVED | LWIP_NSC_STATUS_CHANGED));
+ test_netif_ext_callback_assert_flag_count(LWIP_NSC_NETIF_REMOVED, 1);
+ test_netif_ext_callback_assert_flag_count(LWIP_NSC_STATUS_CHANGED, 1);
+ test_netif_ext_callback_reset();
+
+ netif_remove_ext_callback(&netif_callback_2);
+ netif_remove_ext_callback(&netif_callback_3);
+ netif_remove_ext_callback(&netif_callback_1);
+ dummy_active = 0;
+}
+END_TEST
+
+
+/** Create the suite including all tests for this module */
+Suite *
+netif_suite(void)
+{
+ testfunc tests[] = {
+ TESTFUNC(test_netif_extcallbacks)
+ };
+ return create_suite("NETIF", tests, sizeof(tests)/sizeof(testfunc), netif_setup, netif_teardown);
+}
diff --git a/test/unit/core/test_netif.h b/test/unit/core/test_netif.h
new file mode 100644
index 00000000..8f2b6b46
--- /dev/null
+++ b/test/unit/core/test_netif.h
@@ -0,0 +1,8 @@
+#ifndef LWIP_HDR_TEST_NETIF_H
+#define LWIP_HDR_TEST_NETIF_H
+
+#include "../lwip_check.h"
+
+Suite *netif_suite(void);
+
+#endif
diff --git a/test/unit/lwip_unittests.c b/test/unit/lwip_unittests.c
index 4a34d869..be740777 100644
--- a/test/unit/lwip_unittests.c
+++ b/test/unit/lwip_unittests.c
@@ -6,6 +6,7 @@
#include "tcp/test_tcp_oos.h"
#include "core/test_def.h"
#include "core/test_mem.h"
+#include "core/test_netif.h"
#include "core/test_pbuf.h"
#include "core/test_timers.h"
#include "etharp/test_etharp.h"
@@ -66,6 +67,7 @@ int main(void)
tcp_oos_suite,
def_suite,
mem_suite,
+ netif_suite,
pbuf_suite,
timers_suite,
etharp_suite,
diff --git a/test/unit/lwipopts.h b/test/unit/lwipopts.h
index 94a1ecb9..619f263c 100644
--- a/test/unit/lwipopts.h
+++ b/test/unit/lwipopts.h
@@ -72,6 +72,9 @@
/* MIB2 stats are required to check IPv4 reassembly results */
#define MIB2_STATS 1
+/* netif tests want to test this, so enable: */
+#define LWIP_NETIF_EXT_STATUS_CALLBACK 1
+
/* Check lwip_stats.mem.illegal instead of asserting */
#define LWIP_MEM_ILLEGAL_FREE(msg) /* to nothing */