mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2025-01-18 12:52:44 +01:00
tests: add tests for gnrc_netif2
This commit is contained in:
parent
0b80c7ed17
commit
77d977032c
37
tests/gnrc_netif2/Makefile
Normal file
37
tests/gnrc_netif2/Makefile
Normal file
@ -0,0 +1,37 @@
|
||||
# name of your application
|
||||
APPLICATION = gnrc_ipv6_nib
|
||||
include ../Makefile.tests_common
|
||||
|
||||
BOARD_INSUFFICIENT_MEMORY := airfy-beacon b-l072z-lrwan1 calliope-mini \
|
||||
cc2650-launchpad cc2650stk chronos maple-mini \
|
||||
microbit msb-430 msb-430h nrf51dongle nrf6310 \
|
||||
nucleo-f030 nucleo-f070 nucleo-f072 nucleo-f103 \
|
||||
nucleo-f302 nucleo-f334 nucleo-l053 nucleo-l073 \
|
||||
nucleo32-f031 nucleo32-f042 nucleo32-f303 \
|
||||
nucleo32-l031 opencm904 pca10000 pca10005 \
|
||||
spark-core stm32f0discovery telosb wsn430-v1_3b \
|
||||
wsn430-v1_4 yunjia-nrf51822 z1 \
|
||||
|
||||
USEMODULE += embunit
|
||||
USEMODULE += gnrc_netif2
|
||||
USEMODULE += gnrc_pktdump
|
||||
USEMODULE += gnrc_sixlowpan
|
||||
USEMODULE += gnrc_sixlowpan_iphc
|
||||
USEMODULE += gnrc_ipv6
|
||||
USEMODULE += netdev_eth
|
||||
USEMODULE += netdev_test
|
||||
USEMODULE += od
|
||||
|
||||
CFLAGS += -DDEVELHELP
|
||||
CFLAGS += -DGNRC_NETIF_NUMOF=4
|
||||
CFLAGS += -DGNRC_NETIF2_ADDRS_NUMOF=16
|
||||
CFLAGS += -DGNRC_NETIF2_GROUPS_NUMOF=8
|
||||
CFLAGS += -DLOG_LEVEL=LOG_NONE
|
||||
CFLAGS += -DTEST_SUITES
|
||||
|
||||
include $(RIOTBASE)/Makefile.include
|
||||
|
||||
test:
|
||||
# `testrunner` calls `make term` recursively, results in duplicated `TERMFLAGS`.
|
||||
# So clears `TERMFLAGS` before run.
|
||||
TERMFLAGS= tests/01-run.py
|
163
tests/gnrc_netif2/common.c
Normal file
163
tests/gnrc_netif2/common.c
Normal file
@ -0,0 +1,163 @@
|
||||
/*
|
||||
* Copyright (C) 2017 Freie Universität Berlin
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @{
|
||||
*
|
||||
* @file
|
||||
* @author Martine Lenders <m.lenders@fu-berlin.de>
|
||||
*/
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "common.h"
|
||||
#include "net/ethernet.h"
|
||||
#include "net/gnrc/netreg.h"
|
||||
#include "net/gnrc/pktdump.h"
|
||||
#include "net/ipv6.h"
|
||||
#include "net/netdev_test.h"
|
||||
#include "od.h"
|
||||
|
||||
static netdev_test_t _devs[GNRC_NETIF_NUMOF];
|
||||
|
||||
netdev_t *ethernet_dev = (netdev_t *)&_devs[0];
|
||||
netdev_t *devs[DEFAULT_DEVS_NUMOF];
|
||||
|
||||
#define MSG_QUEUE_SIZE (8)
|
||||
|
||||
static gnrc_netreg_entry_t dumper_undef, dumper_ipv6;
|
||||
static msg_t _main_msg_queue[MSG_QUEUE_SIZE];
|
||||
static uint8_t tmp_buffer[ETHERNET_DATA_LEN];
|
||||
static size_t tmp_buffer_bytes = 0;
|
||||
|
||||
static int _dump_send_packet(netdev_t *netdev, const struct iovec *vector,
|
||||
int count)
|
||||
{
|
||||
int res;
|
||||
|
||||
tmp_buffer_bytes = 0;
|
||||
|
||||
printf("Sending data from ");
|
||||
if (netdev == ethernet_dev) {
|
||||
printf("Ethernet ");
|
||||
}
|
||||
else {
|
||||
printf("unknown ");
|
||||
}
|
||||
puts("device:");
|
||||
for (int i = 0; i < count; i++) {
|
||||
if ((tmp_buffer_bytes + vector[i].iov_len) > ETHERNET_DATA_LEN) {
|
||||
return -ENOBUFS;
|
||||
}
|
||||
memcpy(&tmp_buffer[tmp_buffer_bytes], vector[i].iov_base,
|
||||
vector[i].iov_len);
|
||||
tmp_buffer_bytes += vector[i].iov_len;
|
||||
}
|
||||
od_hex_dump(tmp_buffer, tmp_buffer_bytes, OD_WIDTH_DEFAULT);
|
||||
res = (int)tmp_buffer_bytes;
|
||||
return res;
|
||||
}
|
||||
|
||||
void _test_trigger_recv(gnrc_netif2_t *netif, const uint8_t *data,
|
||||
size_t data_len)
|
||||
{
|
||||
netdev_t *dev = netif->dev;
|
||||
|
||||
assert(data_len <= ETHERNET_DATA_LEN);
|
||||
if ((data != NULL) || (data_len > 0)) {
|
||||
tmp_buffer_bytes = data_len;
|
||||
memcpy(tmp_buffer, data, data_len);
|
||||
}
|
||||
else {
|
||||
tmp_buffer_bytes = 0;
|
||||
}
|
||||
assert(dev->event_callback);
|
||||
dev->event_callback(dev, NETDEV_EVENT_ISR);
|
||||
}
|
||||
|
||||
static int _netdev_recv(netdev_t *dev, char *buf, int len, void *info)
|
||||
{
|
||||
int res;
|
||||
|
||||
(void)dev;
|
||||
(void)info;
|
||||
res = (int)tmp_buffer_bytes;
|
||||
if (buf == NULL) {
|
||||
if (len > 0) {
|
||||
tmp_buffer_bytes = 0;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
if (((unsigned)len) < tmp_buffer_bytes) {
|
||||
return -ENOBUFS;
|
||||
}
|
||||
memcpy(buf, tmp_buffer, tmp_buffer_bytes);
|
||||
return res;
|
||||
}
|
||||
|
||||
static void _netdev_isr(netdev_t *dev)
|
||||
{
|
||||
assert(dev->event_callback);
|
||||
dev->event_callback(dev, NETDEV_EVENT_RX_COMPLETE);
|
||||
}
|
||||
|
||||
static int _get_netdev_device_type(netdev_t *netdev, void *value, size_t max_len)
|
||||
{
|
||||
netdev_test_t *dev = (netdev_test_t *)netdev;
|
||||
assert(max_len == sizeof(uint16_t));
|
||||
if (dev->state == 0x0) {
|
||||
*((uint16_t *)value) = NETDEV_TYPE_ETHERNET;
|
||||
}
|
||||
else {
|
||||
*((uint16_t *)value) = NETDEV_TYPE_UNKNOWN;
|
||||
}
|
||||
return sizeof(uint16_t);
|
||||
}
|
||||
static int _get_netdev_max_packet_size(netdev_t *netdev, void *value, size_t max_len)
|
||||
{
|
||||
netdev_test_t *dev = (netdev_test_t *)netdev;
|
||||
assert(max_len == sizeof(uint16_t));
|
||||
if (dev->state == 0x0) {
|
||||
*((uint16_t *)value) = ETHERNET_DATA_LEN;
|
||||
}
|
||||
else {
|
||||
*((uint16_t *)value) = IPV6_MIN_MTU;
|
||||
}
|
||||
return sizeof(uint16_t);
|
||||
}
|
||||
|
||||
|
||||
void _tests_init(void)
|
||||
{
|
||||
msg_init_queue(_main_msg_queue, MSG_QUEUE_SIZE);
|
||||
netdev_test_setup((netdev_test_t *)ethernet_dev, 0);
|
||||
netdev_test_set_send_cb((netdev_test_t *)ethernet_dev, _dump_send_packet);
|
||||
netdev_test_set_recv_cb((netdev_test_t *)ethernet_dev, _netdev_recv);
|
||||
netdev_test_set_isr_cb((netdev_test_t *)ethernet_dev, _netdev_isr);
|
||||
netdev_test_set_get_cb((netdev_test_t *)ethernet_dev, NETOPT_DEVICE_TYPE,
|
||||
_get_netdev_device_type);
|
||||
netdev_test_set_get_cb((netdev_test_t *)ethernet_dev, NETOPT_MAX_PACKET_SIZE,
|
||||
_get_netdev_max_packet_size);
|
||||
for (intptr_t i = SPECIAL_DEVS; i < GNRC_NETIF_NUMOF; i++) {
|
||||
devs[i - SPECIAL_DEVS] = (netdev_t *)&_devs[i];
|
||||
netdev_test_setup(&_devs[i], (void *)i);
|
||||
netdev_test_set_get_cb(&_devs[i], NETOPT_DEVICE_TYPE,
|
||||
_get_netdev_device_type);
|
||||
netdev_test_set_get_cb(&_devs[i], NETOPT_MAX_PACKET_SIZE,
|
||||
_get_netdev_max_packet_size);
|
||||
}
|
||||
gnrc_netreg_entry_init_pid(&dumper_undef, GNRC_NETREG_DEMUX_CTX_ALL,
|
||||
gnrc_pktdump_pid);
|
||||
gnrc_netreg_entry_init_pid(&dumper_ipv6, GNRC_NETREG_DEMUX_CTX_ALL,
|
||||
gnrc_pktdump_pid);
|
||||
gnrc_netreg_register(GNRC_NETTYPE_UNDEF, &dumper_undef);
|
||||
gnrc_netreg_register(GNRC_NETTYPE_IPV6, &dumper_ipv6);
|
||||
}
|
||||
|
||||
/** @} */
|
88
tests/gnrc_netif2/common.h
Normal file
88
tests/gnrc_netif2/common.h
Normal file
@ -0,0 +1,88 @@
|
||||
/*
|
||||
* Copyright (C) 2017 Freie Universität Berlin
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @defgroup tests_gnrc_ipv6_nib Common header for GNRC's NIB tests
|
||||
* @ingroup tests
|
||||
* @brief Common definitions for GNRC's NIB tests
|
||||
* @{
|
||||
*
|
||||
* @file
|
||||
*
|
||||
* @author Martine Lenders <m.lenders@fu-berlin.de>
|
||||
*/
|
||||
#ifndef COMMON_H
|
||||
#define COMMON_H
|
||||
|
||||
|
||||
#include "net/gnrc/netif2.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define SPECIAL_DEVS (1)
|
||||
#define DEFAULT_DEVS_NUMOF (GNRC_NETIF_NUMOF - SPECIAL_DEVS)
|
||||
|
||||
#define GP1 (0x20U)
|
||||
#define GP2 (0x01U)
|
||||
#define GP3 (0x0dU)
|
||||
#define GP4 (0xb8U)
|
||||
#define GP5 (0x00U)
|
||||
#define GP6 (0x00U)
|
||||
#define GP7 (0x5aU)
|
||||
#define GP8 (0x1aU)
|
||||
|
||||
#define LP1 (0xfeU)
|
||||
#define LP2 (0x80U)
|
||||
#define LP3 (0x00U)
|
||||
#define LP4 (0x00U)
|
||||
#define LP5 (0x00U)
|
||||
#define LP6 (0x00U)
|
||||
#define LP7 (0x00U)
|
||||
#define LP8 (0x00U)
|
||||
|
||||
#define LA1 (0x3eU)
|
||||
#define LA2 (0xe6U)
|
||||
#define LA3 (0xb5U)
|
||||
#define LA4 (0x0fU)
|
||||
#define LA5 (0x19U)
|
||||
#define LA6 (0x22U)
|
||||
#define LA7 (0xfdU)
|
||||
#define LA8 (0x0aU)
|
||||
|
||||
#define ETHERNET_SRC { LA1, LA2, LA3, LA6, LA7, LA8 }
|
||||
#define ETHERNET_IPV6_LL { LP1, LP2, LP3, LP4, LP5, LP6, LP7, LP8, \
|
||||
LA1 ^ 0x2, LA2, LA3, 0xff, 0xfe, LA6, LA7, LA8 }
|
||||
#define ETHERNET_IPV6_G { GP1, GP2, GP3, GP4, GP5, GP6, GP7, GP8, \
|
||||
LA1 ^ 0x2, LA2, LA3, 0xff, 0xfe, LA6, LA7, LA8 }
|
||||
#define NETIF0_SRC { LA1, LA2 + 1, LA3, LA4, LA5, LA6, LA7, LA8 }
|
||||
#define NETIF0_IPV6_LL { LP1, LP2, LP3, LP4, LP5, LP6, LP7, LP8, \
|
||||
LA1 ^ 0x2, LA2 + 1, LA3, LA4, LA5, LA6, LA7, LA8 }
|
||||
#define NETIF0_IPV6_G { GP1, GP2, GP3, GP4, GP5, GP6, GP7, GP8, \
|
||||
LA1 ^ 0x2, LA2 + 1, LA3, LA4, LA5, LA6, LA7, LA8 }
|
||||
#define GLOBAL_PFX18 { GP1, GP2, GP3 ^ 0x3f, GP4, GP5, GP6, GP7, GP8, \
|
||||
LA1 ^ 0x2, LA2, LA3, LA4, LA5, LA6, LA7, LA8 }
|
||||
#define GLOBAL_PFX23 { GP1, GP2, GP3 ^ 0x1, GP4, GP5, GP6, GP7, GP8, \
|
||||
LA1 ^ 0x2, LA2, LA3, LA4, LA5, LA6, LA7, LA8 }
|
||||
#define GLOBAL_PFX64 { GP1, GP2, GP3, GP4, GP5, GP6, GP7, GP8, \
|
||||
LA1 ^ 0x82, LA2, LA3, LA4, LA5, LA6, LA7, LA8 }
|
||||
|
||||
extern netdev_t *ethernet_dev;
|
||||
extern netdev_t *devs[DEFAULT_DEVS_NUMOF];
|
||||
|
||||
void _tests_init(void);
|
||||
void _test_trigger_recv(gnrc_netif2_t *netif, const uint8_t *data,
|
||||
size_t data_len);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* COMMON_H */
|
||||
/** @} */
|
1038
tests/gnrc_netif2/main.c
Normal file
1038
tests/gnrc_netif2/main.c
Normal file
File diff suppressed because it is too large
Load Diff
82
tests/gnrc_netif2/tests/01-run.py
Executable file
82
tests/gnrc_netif2/tests/01-run.py
Executable file
@ -0,0 +1,82 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
# Copyright (C) 2016 Kaspar Schleiser <kaspar@schleiser.de>
|
||||
# Copyright (C) 2016 Takuo Yonezawa <Yonezawa-T2@mail.dnp.co.jp>
|
||||
#
|
||||
# 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 os
|
||||
import sys
|
||||
|
||||
sys.path.append(os.path.join(os.environ['RIOTBASE'], 'dist/tools/testrunner'))
|
||||
import testrunner
|
||||
|
||||
def testfunc(child):
|
||||
# embUnit tests
|
||||
child.expect(r"OK \(\d+ tests\)")
|
||||
# output cross-checked hex data with WireShark -> "Import from Hex Dump..."
|
||||
# test_netapi_send__raw_unicast_ethernet_packet
|
||||
child.expect("Sending data from Ethernet device:")
|
||||
child.expect("00000000 3E E6 B5 0F 19 23 3E E6 B5 22 FD 0A " +
|
||||
"FF FF 41 42")
|
||||
child.expect("00000010 43 44 45 46 47 00")
|
||||
# test_netapi_send__raw_broadcast_ethernet_packet
|
||||
child.expect("Sending data from Ethernet device:")
|
||||
child.expect("00000000 FF FF FF FF FF FF 3E E6 B5 22 FD 0A " +
|
||||
"FF FF 41 42")
|
||||
child.expect("00000010 43 44 45 46 47 00")
|
||||
# test_netapi_send__ipv6_unicast_ethernet_packet
|
||||
child.expect("Sending data from Ethernet device:")
|
||||
child.expect("00000000 3E E6 B5 0F 19 23 3E E6 B5 22 FD 0A 86 DD 60 00")
|
||||
child.expect("00000010 00 00 00 08 3B 40 FE 80 00 00 00 00 00 00 3C E6")
|
||||
child.expect("00000020 B5 FF FE 22 FD 0A FE 80 00 00 00 00 00 00 3C E6")
|
||||
child.expect("00000030 B5 FF FE 0F 19 23 41 42 43 44 45 46 47 00")
|
||||
# test_netapi_send__ipv6_multicast_ethernet_packet
|
||||
child.expect("Sending data from Ethernet device:")
|
||||
child.expect("00000000 33 33 00 00 00 01 3E E6 B5 22 FD 0A 86 DD 60 00")
|
||||
child.expect("00000010 00 00 00 08 3B 40 FE 80 00 00 00 00 00 00 3C E6")
|
||||
child.expect("00000020 B5 FF FE 22 FD 0A FF 02 00 00 00 00 00 00 00 00")
|
||||
child.expect("00000030 00 00 00 00 00 01 41 42 43 44 45 46 47 00")
|
||||
# test_netapi_recv__empty_ethernet_payload
|
||||
child.expect("pktdump dumping Ethernet packet with empty payload")
|
||||
child.expect("PKTDUMP: data received:")
|
||||
child.expect(r"~~ SNIP 0 - size: 0 byte, type: NETTYPE_UNDEF \(0\)")
|
||||
child.expect(r"00000000~~ SNIP 1 - size: 20 byte, type: NETTYPE_NETIF \(-1\)")
|
||||
child.expect(r"if_pid: \d+ rssi: 0 lqi: 0")
|
||||
child.expect("flags: 0x0")
|
||||
child.expect("src_l2addr: 3e:e6:b5:22:fd:0b")
|
||||
child.expect("dst_l2addr: 3e:e6:b5:22:fd:0a")
|
||||
child.expect("~~ PKT - 2 snips, total size: 20 byte")
|
||||
# test_netapi_recv__raw_ethernet_payload
|
||||
child.expect("pktdump dumping Ethernet packet with payload 12 34 45 56")
|
||||
child.expect("PKTDUMP: data received:")
|
||||
child.expect(r"~~ SNIP 0 - size: 4 byte, type: NETTYPE_UNDEF \(0\)")
|
||||
child.expect("00000000 12 34 45 56")
|
||||
child.expect(r"~~ SNIP 1 - size: 20 byte, type: NETTYPE_NETIF \(-1\)")
|
||||
child.expect(r"if_pid: \d+ rssi: 0 lqi: 0")
|
||||
child.expect("flags: 0x0")
|
||||
child.expect("src_l2addr: 3e:e6:b5:22:fd:0b")
|
||||
child.expect("dst_l2addr: 3e:e6:b5:22:fd:0a")
|
||||
child.expect("~~ PKT - 2 snips, total size: 24 byte")
|
||||
# test_netapi_recv__ipv6_ethernet_payload
|
||||
child.expect("pktdump dumping IPv6 over Ethernet packet with payload 01")
|
||||
child.expect("PKTDUMP: data received:")
|
||||
# payload not dumped because not parsed yet, but header looks okay, so let's
|
||||
# assume the payload is as well
|
||||
child.expect(r"~~ SNIP 0 - size: 41 byte, type: NETTYPE_IPV6 \(2\)")
|
||||
child.expect(r"traffic class: 0x00 \(ECN: 0x0, DSCP: 0x00\)")
|
||||
child.expect("flow label: 0x00000")
|
||||
child.expect("length: 1 next header: 59 hop limit: 64")
|
||||
child.expect("source address: fe80::3fe6:b5ff:fe22:fd0a")
|
||||
child.expect("destination address: fe80::3fe6:b5ff:fe22:fd0b")
|
||||
child.expect(r"~~ SNIP 1 - size: 20 byte, type: NETTYPE_NETIF \(-1\)")
|
||||
child.expect(r"if_pid: \d+ rssi: 0 lqi: 0")
|
||||
child.expect("flags: 0x0")
|
||||
child.expect("src_l2addr: 3e:e6:b5:22:fd:0b")
|
||||
child.expect("dst_l2addr: 3e:e6:b5:22:fd:0a")
|
||||
child.expect("~~ PKT - 2 snips, total size: 61 byte")
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(testrunner.run(testfunc, timeout=1, traceback=True))
|
Loading…
Reference in New Issue
Block a user