diff --git a/tests/unittests/tests-rpl_srh/Makefile b/tests/unittests/tests-gnrc_rpl_srh/Makefile similarity index 100% rename from tests/unittests/tests-rpl_srh/Makefile rename to tests/unittests/tests-gnrc_rpl_srh/Makefile diff --git a/tests/unittests/tests-rpl_srh/Makefile.include b/tests/unittests/tests-gnrc_rpl_srh/Makefile.include similarity index 100% rename from tests/unittests/tests-rpl_srh/Makefile.include rename to tests/unittests/tests-gnrc_rpl_srh/Makefile.include diff --git a/tests/unittests/tests-gnrc_rpl_srh/tests-gnrc_rpl_srh.c b/tests/unittests/tests-gnrc_rpl_srh/tests-gnrc_rpl_srh.c new file mode 100644 index 0000000000000000000000000000000000000000..91690a14515d982a30fbabc9ba2a1d45c2e89b98 --- /dev/null +++ b/tests/unittests/tests-gnrc_rpl_srh/tests-gnrc_rpl_srh.c @@ -0,0 +1,202 @@ +/* + * Copyright (C) 2016 Cenk Gündoğan <mail@cgundogan.de> + * Copyright (C) 2018 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 Cenk Gündoğan <mail@cgundogan.de> + * @author Martine Lenders <m.lenders@fu-berlin.de> + */ +#include <stdlib.h> +#include <string.h> +#include "embUnit.h" + +#include "net/ipv6/addr.h" +#include "net/ipv6/ext.h" +#include "net/ipv6/hdr.h" +#include "net/gnrc/rpl/srh.h" +#include "net/gnrc/ipv6/ext/rh.h" + +#include "unittests-constants.h" +#include "tests-gnrc_rpl_srh.h" + +#define IPV6_DST {{ 0x20, 0x01, 0xab, 0xcd, \ + 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x01 }} +#define IPV6_ADDR1 {{ 0x20, 0x01, 0xab, 0xcd, \ + 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x02 }} +#define IPV6_ADDR2 {{ 0x20, 0x01, 0xab, 0xcd, \ + 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x03 }} +#define IPV6_MCAST_ADDR {{ 0xff, 0x05, 0xab, 0xcd, \ + 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x03 }} + +#define IPV6_ADDR1_ELIDED { 0x00, 0x00, 0x02 } +#define IPV6_ADDR2_ELIDED { 0x00, 0x00, 0x03 } +#define IPV6_ELIDED_PREFIX (13) + +#define SRH_SEG_LEFT (2) +#define MAX_BUF_SIZE ((sizeof(gnrc_rpl_srh_t) + 2) + sizeof(ipv6_addr_t)) + +static ipv6_hdr_t hdr; +static uint8_t buf[MAX_BUF_SIZE]; + +static void set_up(void) +{ + memset(&hdr, 0, sizeof(hdr)); + memset(buf, 0, sizeof(buf)); +} + +static inline void _init_hdrs(gnrc_rpl_srh_t **srh, uint8_t **vec, + const ipv6_addr_t *dst) +{ + *srh = (gnrc_rpl_srh_t *)buf; + *vec = (uint8_t *)(*srh + 1); + memcpy(&hdr.dst, dst, sizeof(hdr.dst)); +} + +static void test_rpl_srh_dst_multicast(void) +{ + static const ipv6_addr_t a1 = IPV6_ADDR1, a2 = IPV6_ADDR2; + static const ipv6_addr_t mcast = IPV6_MCAST_ADDR; + gnrc_rpl_srh_t *srh; + uint8_t *vec; + int res; + + _init_hdrs(&srh, &vec, &mcast); + srh->len = (2 * sizeof(ipv6_addr_t)) / 8; + srh->seg_left = SRH_SEG_LEFT; + memcpy(vec, &a1, sizeof(a1)); + memcpy(vec + sizeof(a1), &a2, sizeof(a2)); + + res = gnrc_rpl_srh_process(&hdr, srh); + TEST_ASSERT_EQUAL_INT(res, GNRC_IPV6_EXT_RH_ERROR); +} + +static void test_rpl_srh_route_multicast(void) +{ + static const ipv6_addr_t a1 = IPV6_ADDR1; + static const ipv6_addr_t mcast = IPV6_MCAST_ADDR; + static const ipv6_addr_t dst = IPV6_DST; + gnrc_rpl_srh_t *srh; + uint8_t *vec; + int res; + + _init_hdrs(&srh, &vec, &dst); + srh->len = (2 * sizeof(ipv6_addr_t)) / 8; + srh->seg_left = SRH_SEG_LEFT; + memcpy(vec, &mcast, sizeof(mcast)); + memcpy(vec + sizeof(mcast), &a1, sizeof(a1)); + + res = gnrc_rpl_srh_process(&hdr, srh); + TEST_ASSERT_EQUAL_INT(res, GNRC_IPV6_EXT_RH_ERROR); +} + +static void test_rpl_srh_too_many_seg_left(void) +{ + static const ipv6_addr_t a1 = IPV6_ADDR1; + static const ipv6_addr_t dst = IPV6_DST; + gnrc_rpl_srh_t *srh; + uint8_t *vec; + int res; + + _init_hdrs(&srh, &vec, &dst); + srh->len = sizeof(ipv6_addr_t) / 8; + srh->seg_left = SRH_SEG_LEFT; + memcpy(vec, &a1, sizeof(a1)); + + res = gnrc_rpl_srh_process(&hdr, srh); + TEST_ASSERT_EQUAL_INT(res, GNRC_IPV6_EXT_RH_ERROR); +} + +static void test_rpl_srh_nexthop_no_prefix_elided(void) +{ + static const ipv6_addr_t a1 = IPV6_ADDR1, a2 = IPV6_ADDR2, dst = IPV6_DST; + static const ipv6_addr_t expected1 = IPV6_ADDR1, expected2 = IPV6_ADDR2; + gnrc_rpl_srh_t *srh; + uint8_t *vec; + int res; + + _init_hdrs(&srh, &vec, &dst); + srh->len = (2 * sizeof(ipv6_addr_t)) / 8; + srh->seg_left = SRH_SEG_LEFT; + memcpy(vec, &a1, sizeof(a1)); + memcpy(vec + sizeof(a1), &a2, sizeof(a2)); + + /* first hop */ + res = gnrc_rpl_srh_process(&hdr, srh); + TEST_ASSERT_EQUAL_INT(res, GNRC_IPV6_EXT_RH_FORWARDED); + TEST_ASSERT_EQUAL_INT(SRH_SEG_LEFT - 1, srh->seg_left); + TEST_ASSERT(ipv6_addr_equal(&hdr.dst, &expected1)); + + /* second hop */ + res = gnrc_rpl_srh_process(&hdr, srh); + TEST_ASSERT_EQUAL_INT(res, GNRC_IPV6_EXT_RH_FORWARDED); + TEST_ASSERT_EQUAL_INT(SRH_SEG_LEFT - 2, srh->seg_left); + TEST_ASSERT(ipv6_addr_equal(&hdr.dst, &expected2)); +} + +static void test_rpl_srh_nexthop_prefix_elided(void) +{ + static const ipv6_addr_t dst = IPV6_DST; + static const ipv6_addr_t expected1 = IPV6_ADDR1, expected2 = IPV6_ADDR2; + gnrc_rpl_srh_t *srh; + uint8_t *vec; + int res; + static const uint8_t a1[3] = IPV6_ADDR1_ELIDED; + static const uint8_t a2[3] = IPV6_ADDR2_ELIDED; + + _init_hdrs(&srh, &vec, &dst); + srh->len = (sizeof(a1) + sizeof(a2) + 2) / 8; + srh->seg_left = SRH_SEG_LEFT; + srh->compr = (IPV6_ELIDED_PREFIX << 4) | IPV6_ELIDED_PREFIX; + srh->pad_resv = 2 << 4; + memcpy(vec, &a1, sizeof(a1)); + memcpy(vec + sizeof(a1), &a2, sizeof(a2)); + + /* first hop */ + res = gnrc_rpl_srh_process(&hdr, srh); + TEST_ASSERT_EQUAL_INT(res, GNRC_IPV6_EXT_RH_FORWARDED); + TEST_ASSERT_EQUAL_INT(SRH_SEG_LEFT - 1, srh->seg_left); + TEST_ASSERT(ipv6_addr_equal(&hdr.dst, &expected1)); + + /* second hop */ + res = gnrc_rpl_srh_process(&hdr, srh); + TEST_ASSERT_EQUAL_INT(res, GNRC_IPV6_EXT_RH_FORWARDED); + TEST_ASSERT_EQUAL_INT(SRH_SEG_LEFT - 2, srh->seg_left); + TEST_ASSERT(ipv6_addr_equal(&hdr.dst, &expected2)); +} + +static Test *tests_rpl_srh_tests(void) +{ + EMB_UNIT_TESTFIXTURES(fixtures) { + new_TestFixture(test_rpl_srh_dst_multicast), + new_TestFixture(test_rpl_srh_route_multicast), + new_TestFixture(test_rpl_srh_too_many_seg_left), + new_TestFixture(test_rpl_srh_nexthop_no_prefix_elided), + new_TestFixture(test_rpl_srh_nexthop_prefix_elided), + }; + + EMB_UNIT_TESTCALLER(rpl_srh_tests, set_up, NULL, fixtures); + + return (Test *)&rpl_srh_tests; +} + +void tests_gnrc_rpl_srh(void) +{ + TESTS_RUN(tests_rpl_srh_tests()); +} +/** @} */ diff --git a/tests/unittests/tests-rpl_srh/tests-rpl_srh.h b/tests/unittests/tests-gnrc_rpl_srh/tests-gnrc_rpl_srh.h similarity index 82% rename from tests/unittests/tests-rpl_srh/tests-rpl_srh.h rename to tests/unittests/tests-gnrc_rpl_srh/tests-gnrc_rpl_srh.h index 45d44ccb3cd85d064ac60ee2ec0969d0803c0242..50e3725e9123a6b539f28eadfd11741de02fa207 100644 --- a/tests/unittests/tests-rpl_srh/tests-rpl_srh.h +++ b/tests/unittests/tests-gnrc_rpl_srh/tests-gnrc_rpl_srh.h @@ -15,8 +15,8 @@ * * @author Cenk Gündoğan <mail@cgundogan.de> */ -#ifndef TESTS_RPL_SRH_H -#define TESTS_RPL_SRH_H +#ifndef TESTS_GNRC_RPL_SRH_H +#define TESTS_GNRC_RPL_SRH_H #include "embUnit.h" @@ -27,11 +27,11 @@ extern "C" { /** * @brief The entry point of this test suite. */ -void tests_rpl_srh(void); +void tests_gnrc_rpl_srh(void); #ifdef __cplusplus } #endif -#endif /* TESTS_RPL_SRH_H */ +#endif /* TESTS_GNRC_RPL_SRH_H */ /** @} */ diff --git a/tests/unittests/tests-rpl_srh/tests-rpl_srh.c b/tests/unittests/tests-rpl_srh/tests-rpl_srh.c deleted file mode 100644 index 8c7f1a2986530c70d6a1357a7c95fd177d2d2cb0..0000000000000000000000000000000000000000 --- a/tests/unittests/tests-rpl_srh/tests-rpl_srh.c +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright (C) 2016 Cenk Gündoğan <mail@cgundogan.de> - * - * 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 - */ -#include <stdlib.h> -#include <string.h> -#include "embUnit.h" - -#include "net/ipv6/addr.h" -#include "net/ipv6/ext.h" -#include "net/ipv6/hdr.h" -#include "net/gnrc/rpl/srh.h" -#include "net/gnrc/ipv6/ext/rh.h" - -#include "unittests-constants.h" -#include "tests-rpl_srh.h" - -#define IPV6_DST {{ 0x20, 0x01, 0xab, 0xcd, \ - 0x00, 0x00, 0x00, 0x00, \ - 0x00, 0x00, 0x00, 0x00, \ - 0x00, 0x00, 0x00, 0x01 }} -#define IPV6_ADDR1 {{ 0x20, 0x01, 0xab, 0xcd, \ - 0x00, 0x00, 0x00, 0x00, \ - 0x00, 0x00, 0x00, 0x00, \ - 0x00, 0x00, 0x00, 0x02 }} -#define IPV6_ADDR2 {{ 0x20, 0x01, 0xab, 0xcd, \ - 0x00, 0x00, 0x00, 0x00, \ - 0x00, 0x00, 0x00, 0x00, \ - 0x00, 0x00, 0x00, 0x03 }} - -#define IPV6_ADDR1_ELIDED { 0x00, 0x00, 0x02 } -#define IPV6_ADDR2_ELIDED { 0x00, 0x00, 0x03 } -#define IPV6_ELIDED_PREFIX (13) - -#define SRH_SEG_LEFT (2) - -static void test_rpl_srh_nexthop_no_prefix_elided(void) -{ - ipv6_hdr_t hdr; - uint8_t buf[sizeof(gnrc_rpl_srh_t) + 2 * sizeof(ipv6_addr_t)] = { 0 }; - int res; - gnrc_rpl_srh_t *srh = (gnrc_rpl_srh_t *) buf; - uint8_t *vec = (uint8_t *) (srh + 1); - ipv6_addr_t a1 = IPV6_ADDR1, a2 = IPV6_ADDR2, dst = IPV6_DST, - expected1 = IPV6_ADDR1, expected2 = IPV6_ADDR2; - - hdr.dst = dst; - - srh->len = (2 * sizeof(ipv6_addr_t)) / 8; - srh->seg_left = SRH_SEG_LEFT; - memcpy(vec, &a1, sizeof(a1)); - memcpy(vec + sizeof(a1), &a2, sizeof(a2)); - - /* first hop */ - res = gnrc_rpl_srh_process(&hdr, srh); - TEST_ASSERT_EQUAL_INT(res, GNRC_IPV6_EXT_RH_FORWARDED); - TEST_ASSERT_EQUAL_INT(SRH_SEG_LEFT - 1, srh->seg_left); - TEST_ASSERT(ipv6_addr_equal(&hdr.dst, &expected1)); - - /* second hop */ - res = gnrc_rpl_srh_process(&hdr, srh); - TEST_ASSERT_EQUAL_INT(res, GNRC_IPV6_EXT_RH_FORWARDED); - TEST_ASSERT_EQUAL_INT(SRH_SEG_LEFT - 2, srh->seg_left); - TEST_ASSERT(ipv6_addr_equal(&hdr.dst, &expected2)); -} - -static void test_rpl_srh_nexthop_prefix_elided(void) -{ - ipv6_hdr_t hdr; - uint8_t a1[3] = IPV6_ADDR1_ELIDED; - uint8_t a2[3] = IPV6_ADDR2_ELIDED; - uint8_t buf[sizeof(gnrc_rpl_srh_t) + sizeof(a1) + sizeof(a2)] = { 0 }; - int res; - gnrc_rpl_srh_t *srh = (gnrc_rpl_srh_t *) buf; - uint8_t *vec = (uint8_t *) (srh + 1); - ipv6_addr_t dst = IPV6_DST, expected1 = IPV6_ADDR1, expected2 = IPV6_ADDR2; - - hdr.dst = dst; - - srh->len = (sizeof(a1) + sizeof(a2) + 2) / 8; - srh->seg_left = SRH_SEG_LEFT; - srh->compr = (IPV6_ELIDED_PREFIX << 4) | IPV6_ELIDED_PREFIX; - srh->pad_resv = 2 << 4; - memcpy(vec, &a1, sizeof(a1)); - memcpy(vec + sizeof(a1), &a2, sizeof(a2)); - - /* first hop */ - res = gnrc_rpl_srh_process(&hdr, srh); - TEST_ASSERT_EQUAL_INT(res, GNRC_IPV6_EXT_RH_FORWARDED); - TEST_ASSERT_EQUAL_INT(SRH_SEG_LEFT - 1, srh->seg_left); - TEST_ASSERT(ipv6_addr_equal(&hdr.dst, &expected1)); - - /* second hop */ - res = gnrc_rpl_srh_process(&hdr, srh); - TEST_ASSERT_EQUAL_INT(res, GNRC_IPV6_EXT_RH_FORWARDED); - TEST_ASSERT_EQUAL_INT(SRH_SEG_LEFT - 2, srh->seg_left); - TEST_ASSERT(ipv6_addr_equal(&hdr.dst, &expected2)); -} - -Test *tests_rpl_srh_tests(void) -{ - EMB_UNIT_TESTFIXTURES(fixtures) { - new_TestFixture(test_rpl_srh_nexthop_no_prefix_elided), - new_TestFixture(test_rpl_srh_nexthop_prefix_elided), - }; - - EMB_UNIT_TESTCALLER(rpl_srh_tests, NULL, NULL, fixtures); - - return (Test *)&rpl_srh_tests; -} - -void tests_rpl_srh(void) -{ - TESTS_RUN(tests_rpl_srh_tests()); -} -/** @} */