nes-proj/tests/16-6tisch/code/test-sixtop.c
2017-09-13 14:38:06 +09:00

261 lines
6.5 KiB
C

/*
* Copyright (c) 2017, Yasuyuki Tanaka
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holder nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <stdio.h>
#include "contiki.h"
#include "contiki-net.h"
#include "contiki-lib.h"
#include "lib/assert.h"
#include "net/packetbuf.h"
#include "net/mac/tsch/sixtop/sixtop.h"
#include "net/mac/tsch/sixtop/sixtop-conf.h"
#include "unit-test/unit-test.h"
#include "common.h"
#if SIXTOP_MAX_SCHEDULING_FUNCTIONS != 2
#error SIXTOP_CONF_MAX_SCHEDULING_FUNCTIONS must be set with 2 for this test
#endif
#define TEST_SF1_SFID 0xf1
#define TEST_SF2_SFID 0xf2
#define TEST_SF3_SFID 0xf3
static uint8_t sf_init_vector;
static void test_sf1_init(void);
static void test_sf2_init(void);
static void test_sf3_init(void);
static void reset_sf_init_vector(void);
static const sixtop_sf_t test_sf1 = {
TEST_SF1_SFID,
0,
test_sf1_init,
NULL,
NULL
};
static const sixtop_sf_t test_sf2 = {
TEST_SF2_SFID,
0,
test_sf2_init,
NULL,
NULL
};
static const sixtop_sf_t test_sf3 = {
TEST_SF3_SFID,
0,
test_sf3_init,
NULL,
NULL
};
static void
test_sf1_init(void)
{
sf_init_vector |= TEST_SF1_SFID;
}
static void
test_sf2_init(void)
{
sf_init_vector |= TEST_SF2_SFID;
}
static void
test_sf3_init(void)
{
sf_init_vector |= TEST_SF3_SFID;
}
void
reset_sf_init_vector(void)
{
sf_init_vector = 0;
}
PROCESS(test_process, "6top module APIs test");
AUTOSTART_PROCESSES(&test_process);
UNIT_TEST_REGISTER(test_add_sf,
"sixtop_add_sf() should add a SF");
UNIT_TEST(test_add_sf)
{
UNIT_TEST_BEGIN();
/* confirm any of test_sf{1,2,3} is not added yet. */
UNIT_TEST_ASSERT(sixtop_find_sf(TEST_SF1_SFID) == NULL);
UNIT_TEST_ASSERT(sixtop_find_sf(TEST_SF2_SFID) == NULL);
/* add test_sf1 */
UNIT_TEST_ASSERT(sixtop_add_sf(&test_sf1) == 0);
UNIT_TEST_ASSERT(sixtop_find_sf(TEST_SF1_SFID) == &test_sf1);
/* add test_sf2 */
UNIT_TEST_ASSERT(sixtop_add_sf(&test_sf2) == 0);
UNIT_TEST_ASSERT(sixtop_find_sf(TEST_SF2_SFID) == &test_sf2);
/*
* add test_sf3; should fail because of lack of memory.
* SIXTOP_MAX_SCHEDULING_FUNCTIONS is set with two.
*/
UNIT_TEST_ASSERT(sixtop_add_sf(&test_sf3) == -1);
UNIT_TEST_ASSERT(sixtop_find_sf(TEST_SF3_SFID) == NULL);
UNIT_TEST_END();
}
UNIT_TEST_REGISTER(test_find_sf,
"sixtop_find_sf() should find a SF which has been added");
UNIT_TEST(test_find_sf)
{
UNIT_TEST_BEGIN();
/*
* See test_add_sf(); sixtop_find_sf() is tested together with sixtop_add_sf()
* in it.
*/
UNIT_TEST_END();
}
UNIT_TEST_REGISTER(test_init,
"sixtop_init() should remove all SFs in the 6top module");
UNIT_TEST(test_init)
{
UNIT_TEST_BEGIN();
/* set up a precondition where some SFs has been added */
if(sixtop_find_sf(TEST_SF1_SFID) == NULL) {
UNIT_TEST_ASSERT(sixtop_add_sf(&test_sf1) == 0);
UNIT_TEST_ASSERT(sixtop_find_sf(TEST_SF1_SFID) != NULL);
}
if(sixtop_find_sf(TEST_SF2_SFID) == NULL) {
UNIT_TEST_ASSERT(sixtop_add_sf(&test_sf2) == 0);
UNIT_TEST_ASSERT(sixtop_find_sf(TEST_SF2_SFID) != NULL);
}
/* call sixtop_init() which removes all the SFs in the module */
sixtop_init();
UNIT_TEST_ASSERT(sixtop_find_sf(TEST_SF1_SFID) == NULL);
UNIT_TEST_ASSERT(sixtop_find_sf(TEST_SF2_SFID) == NULL);
UNIT_TEST_END();
}
UNIT_TEST_REGISTER(test_output,
"test sixtop_output()");
UNIT_TEST(test_output)
{
linkaddr_t peer_addr;
uint8_t *p;
UNIT_TEST_BEGIN();
packetbuf_clear();
UNIT_TEST_ASSERT(packetbuf_hdralloc(1) > 0);
p = packetbuf_hdrptr();
p[0] = 0xca; // header
p = packetbuf_dataptr();
p[0] = 0xfe; // data
packetbuf_set_datalen(1);
sixtop_output(&peer_addr, NULL, NULL);
p = packetbuf_hdrptr();
/* Length */
UNIT_TEST_ASSERT(packetbuf_totlen() == 9);
/* Termination 1 IE */
UNIT_TEST_ASSERT(p[0] == 0x00);
UNIT_TEST_ASSERT(p[1] == 0x3f);
/* IETF IE */
UNIT_TEST_ASSERT(p[2] == 0x03);
UNIT_TEST_ASSERT(p[3] == 0xa8);
/* 6top IE Sub-ID */
UNIT_TEST_ASSERT(p[4] == 0xc9);
/* test data set above */
UNIT_TEST_ASSERT(p[5] == 0xca);
UNIT_TEST_ASSERT(p[6] == 0xfe);
/* Payload Termination IE */
UNIT_TEST_ASSERT(p[7] == 0x00);
UNIT_TEST_ASSERT(p[8] == 0xf8);
UNIT_TEST_END();
}
UNIT_TEST_REGISTER(test_init_sf,
"sixtop_init_sf() should invoke every SF->init()");
UNIT_TEST(test_init_sf)
{
UNIT_TEST_BEGIN();
/* remove all the SFs in the 6top module */
sixtop_init();
/* add test_sf1 */
UNIT_TEST_ASSERT(sixtop_add_sf(&test_sf1) == 0);
reset_sf_init_vector();
sixtop_init_sf();
UNIT_TEST_ASSERT(sf_init_vector == TEST_SF1_SFID);
/* add test_sf2 */
UNIT_TEST_ASSERT(sixtop_add_sf(&test_sf2) == 0);
reset_sf_init_vector();
sixtop_init_sf();
UNIT_TEST_ASSERT(sf_init_vector == (TEST_SF1_SFID | TEST_SF2_SFID));
UNIT_TEST_END();
}
PROCESS_THREAD(test_process, ev, data)
{
PROCESS_BEGIN();
printf("Run unit-test\n");
printf("---\n");
UNIT_TEST_RUN(test_add_sf);
UNIT_TEST_RUN(test_find_sf);
UNIT_TEST_RUN(test_init);
UNIT_TEST_RUN(test_init_sf);
UNIT_TEST_RUN(test_output);
printf("=check-me= DONE\n");
PROCESS_END();
}