Porting PicoTCP WIP
This commit is contained in:
229
kernel/picotcp/test/unit/modunit_pico_protocol.c
Normal file
229
kernel/picotcp/test/unit/modunit_pico_protocol.c
Normal file
@ -0,0 +1,229 @@
|
||||
#include "pico_protocol.h"
|
||||
#include "pico_tree.h"
|
||||
#include "stack/pico_protocol.c"
|
||||
#include "check.h"
|
||||
|
||||
Suite *pico_suite(void);
|
||||
|
||||
volatile pico_err_t pico_err = 0;
|
||||
|
||||
static int protocol_passby = 0;
|
||||
|
||||
static struct pico_frame f = {
|
||||
.next = NULL
|
||||
};
|
||||
|
||||
static struct pico_queue q = {
|
||||
0
|
||||
};
|
||||
|
||||
static struct pico_tree_node NODE_IN = {
|
||||
0
|
||||
};
|
||||
static struct pico_tree_node NODE_OUT = {
|
||||
0
|
||||
};
|
||||
|
||||
#define KEY_IN 0x0D01
|
||||
#define KEY_OUT 0x0D00
|
||||
|
||||
|
||||
START_TEST(tc_pico_proto_cmp)
|
||||
{
|
||||
struct pico_protocol a = {
|
||||
.hash = 0
|
||||
};
|
||||
struct pico_protocol b = {
|
||||
.hash = 1
|
||||
};
|
||||
fail_if(pico_proto_cmp(&a, &b) >= 0);
|
||||
a.hash = 1;
|
||||
fail_if(pico_proto_cmp(&a, &b) != 0);
|
||||
a.hash = 2;
|
||||
fail_if(pico_proto_cmp(&a, &b) <= 0);
|
||||
}
|
||||
END_TEST
|
||||
|
||||
static int modunit_proto_loop_cb_in(struct pico_protocol *self, struct pico_frame *p)
|
||||
{
|
||||
if (!p)
|
||||
protocol_passby = -1; /* Error! */
|
||||
|
||||
if (!self)
|
||||
protocol_passby = -1; /* Error! */
|
||||
|
||||
if (protocol_passby != 0) /* Ensure that we are called only once. */
|
||||
protocol_passby = -1;
|
||||
|
||||
protocol_passby = KEY_IN;
|
||||
|
||||
return 1; /* One frame processed! */
|
||||
}
|
||||
|
||||
static int modunit_proto_loop_cb_out(struct pico_protocol *self, struct pico_frame *p)
|
||||
{
|
||||
if (!p)
|
||||
protocol_passby = -1; /* Error! */
|
||||
|
||||
if (!self)
|
||||
protocol_passby = -1; /* Error! */
|
||||
|
||||
if (protocol_passby != 0) /* Ensure that we are called only once. */
|
||||
protocol_passby = -1;
|
||||
|
||||
protocol_passby = KEY_OUT;
|
||||
|
||||
return 1; /* One frame processed! */
|
||||
}
|
||||
|
||||
START_TEST(tc_proto_loop_in)
|
||||
{
|
||||
struct pico_protocol p = {
|
||||
.process_in = modunit_proto_loop_cb_in, .q_in = &q
|
||||
};
|
||||
protocol_passby = 0;
|
||||
pico_enqueue(p.q_in, &f);
|
||||
fail_if(proto_loop_in(&p, 1) != 0);
|
||||
fail_if(protocol_passby != KEY_IN);
|
||||
|
||||
/* Try to dequeue from empty queue, get same loop_score */
|
||||
protocol_passby = 0;
|
||||
fail_if(proto_loop_in(&p, 1) != 1);
|
||||
fail_if(protocol_passby != 0);
|
||||
}
|
||||
END_TEST
|
||||
|
||||
|
||||
START_TEST(tc_proto_loop_out)
|
||||
{
|
||||
struct pico_protocol p = {
|
||||
.process_out = modunit_proto_loop_cb_out, .q_out = &q
|
||||
};
|
||||
protocol_passby = 0;
|
||||
pico_enqueue(p.q_out, &f);
|
||||
fail_if(proto_loop_out(&p, 1) != 0);
|
||||
fail_if(protocol_passby != KEY_OUT);
|
||||
|
||||
/* Try to dequeue from empty queue, get same loop_score */
|
||||
protocol_passby = 0;
|
||||
fail_if(proto_loop_out(&p, 1) != 1);
|
||||
fail_if(protocol_passby != 0);
|
||||
}
|
||||
END_TEST
|
||||
|
||||
START_TEST(tc_proto_loop)
|
||||
{
|
||||
struct pico_protocol p = {
|
||||
.process_in = modunit_proto_loop_cb_in,
|
||||
.process_out = modunit_proto_loop_cb_out,
|
||||
.q_in = &q,
|
||||
.q_out = &q
|
||||
};
|
||||
protocol_passby = 0;
|
||||
pico_enqueue(p.q_in, &f);
|
||||
fail_if(proto_loop(&p, 1, PICO_LOOP_DIR_IN) != 0);
|
||||
fail_if(protocol_passby != KEY_IN);
|
||||
|
||||
protocol_passby = 0;
|
||||
pico_enqueue(p.q_out, &f);
|
||||
fail_if(proto_loop(&p, 1, PICO_LOOP_DIR_OUT) != 0);
|
||||
fail_if(protocol_passby != KEY_OUT);
|
||||
|
||||
}
|
||||
END_TEST
|
||||
|
||||
START_TEST(tc_pico_tree_node)
|
||||
{
|
||||
struct pico_proto_rr rr = {
|
||||
0
|
||||
};
|
||||
rr.node_in = &NODE_IN;
|
||||
rr.node_out = &NODE_OUT;
|
||||
fail_unless(roundrobin_init(&rr, PICO_LOOP_DIR_IN) == &NODE_IN);
|
||||
fail_unless(roundrobin_init(&rr, PICO_LOOP_DIR_OUT) == &NODE_OUT);
|
||||
}
|
||||
END_TEST
|
||||
|
||||
START_TEST(tc_roundrobin_end)
|
||||
{
|
||||
struct pico_proto_rr rr;
|
||||
roundrobin_end(&rr, PICO_LOOP_DIR_IN, &NODE_IN);
|
||||
fail_if(rr.node_in != &NODE_IN);
|
||||
roundrobin_end(&rr, PICO_LOOP_DIR_OUT, &NODE_OUT);
|
||||
fail_if(rr.node_out != &NODE_OUT);
|
||||
}
|
||||
END_TEST
|
||||
|
||||
START_TEST(tc_pico_protocol_generic_loop)
|
||||
{
|
||||
struct pico_proto_rr rr = {
|
||||
0
|
||||
};
|
||||
int ret = 0;
|
||||
|
||||
rr.node_in = &NODE_IN;
|
||||
rr.node_out = &NODE_OUT;
|
||||
ret = pico_protocol_generic_loop(&rr, 0, PICO_LOOP_DIR_IN);
|
||||
|
||||
fail_if(ret != 0);
|
||||
|
||||
pico_protocols_loop(0);
|
||||
}
|
||||
END_TEST
|
||||
|
||||
|
||||
START_TEST(tc_proto_layer_rr_reset)
|
||||
{
|
||||
struct pico_proto_rr rr;
|
||||
rr.node_in = &NODE_IN;
|
||||
rr.node_out = &NODE_OUT;
|
||||
proto_layer_rr_reset(&rr);
|
||||
fail_if(rr.node_in != NULL);
|
||||
fail_if(rr.node_out != NULL);
|
||||
}
|
||||
END_TEST
|
||||
|
||||
|
||||
Suite *pico_suite(void)
|
||||
{
|
||||
Suite *s = suite_create("pico_protocol.c");
|
||||
|
||||
TCase *TCase_pico_proto_cmp = tcase_create("Unit test for pico_proto_cmp");
|
||||
TCase *TCase_proto_loop_in = tcase_create("Unit test for proto_loop_in");
|
||||
TCase *TCase_proto_loop_out = tcase_create("Unit test for proto_loop_out");
|
||||
TCase *TCase_proto_loop = tcase_create("Unit test for proto_loop");
|
||||
TCase *TCase_pico_tree_node = tcase_create("Unit test for pico_tree_node");
|
||||
TCase *TCase_roundrobin_end = tcase_create("Unit test for roundrobin_end");
|
||||
TCase *TCase_pico_protocol_generic_loop = tcase_create("Unit test for pico_protocol_generic_loop");
|
||||
TCase *TCase_proto_layer_rr_reset = tcase_create("Unit test for proto_layer_rr_reset");
|
||||
|
||||
|
||||
tcase_add_test(TCase_pico_proto_cmp, tc_pico_proto_cmp);
|
||||
suite_add_tcase(s, TCase_pico_proto_cmp);
|
||||
tcase_add_test(TCase_proto_loop_in, tc_proto_loop_in);
|
||||
suite_add_tcase(s, TCase_proto_loop_in);
|
||||
tcase_add_test(TCase_proto_loop_out, tc_proto_loop_out);
|
||||
suite_add_tcase(s, TCase_proto_loop_out);
|
||||
tcase_add_test(TCase_proto_loop, tc_proto_loop);
|
||||
suite_add_tcase(s, TCase_proto_loop);
|
||||
tcase_add_test(TCase_pico_tree_node, tc_pico_tree_node);
|
||||
suite_add_tcase(s, TCase_pico_tree_node);
|
||||
tcase_add_test(TCase_roundrobin_end, tc_roundrobin_end);
|
||||
suite_add_tcase(s, TCase_roundrobin_end);
|
||||
tcase_add_test(TCase_pico_protocol_generic_loop, tc_pico_protocol_generic_loop);
|
||||
suite_add_tcase(s, TCase_pico_protocol_generic_loop);
|
||||
tcase_add_test(TCase_proto_layer_rr_reset, tc_proto_layer_rr_reset);
|
||||
suite_add_tcase(s, TCase_proto_layer_rr_reset);
|
||||
return s;
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
int fails;
|
||||
Suite *s = pico_suite();
|
||||
SRunner *sr = srunner_create(s);
|
||||
srunner_run_all(sr, CK_NORMAL);
|
||||
fails = srunner_ntests_failed(sr);
|
||||
srunner_free(sr);
|
||||
return fails;
|
||||
}
|
||||
Reference in New Issue
Block a user