ud3tn/test/unit/test_node.c
Felix Walter 17aec0f909 test/unit: Free used heap-allocated data
Closes: #104

Signed-off-by: Felix Walter <felix.walter@d3tn.com>
2026-03-18 09:57:10 +01:00

245 lines
7.8 KiB
C

// SPDX-License-Identifier: BSD-3-Clause OR Apache-2.0
#include "routing/compat/node.h"
#include "platform/hal_time.h"
#include "testud3tn_unity.h"
#include <stdlib.h>
#include <string.h>
TEST_GROUP(node);
static struct endpoint_list *some_eids1;
static struct endpoint_list *some_eids2;
static struct node *node1;
static struct contact_list *some_ct1;
static struct contact_list *some_ct2;
static struct contact *createct(uint64_t from, uint64_t to, uint16_t bitrate,
struct node *node)
{
struct contact *c = contact_create(NULL);
c->from_ms = from;
c->to_ms = to;
c->bitrate_bytes_per_s = bitrate;
c->node = node;
recalculate_contact_capacity(c);
return c;
}
TEST_SETUP(node)
{
/* eids */
char *e1;
char *e2;
char *e3;
char *e4;
e1 = strdup("testeid1");
e2 = strdup("testeid2");
e3 = strdup("testeid2");
e4 = strdup("testeid3");
some_eids1 = malloc(sizeof(struct endpoint_list));
some_eids1->eid = e1;
some_eids1->next = malloc(sizeof(struct endpoint_list));
some_eids1->next->eid = e2;
some_eids1->next->next = NULL;
some_eids1 = endpoint_list_strip_and_sort(some_eids1);
some_eids2 = malloc(sizeof(struct endpoint_list));
some_eids2->eid = e3;
some_eids2->next = malloc(sizeof(struct endpoint_list));
some_eids2->next->eid = e4;
some_eids2->next->next = NULL;
some_eids2 = endpoint_list_strip_and_sort(some_eids2);
/* node */
node1 = node_create("ipn:1.0");
/* contacts */
some_ct1 = malloc(sizeof(struct contact_list));
some_ct1->data = createct(1000, 3000, 300, node1);
some_ct1->next = malloc(sizeof(struct contact_list));
some_ct1->next->data = createct(16000000, 16001000, 500, node1);
some_ct1->next->next = NULL;
some_ct2 = malloc(sizeof(struct contact_list));
some_ct2->data = createct(16000000, 16001000, 600, node1);
some_ct2->next = NULL;
}
TEST_TEAR_DOWN(node)
{
while (some_eids1 != NULL)
some_eids1 = endpoint_list_free(some_eids1);
while (some_eids2 != NULL)
some_eids2 = endpoint_list_free(some_eids2);
free_node(node1);
while (some_ct1 != NULL)
some_ct1 = contact_list_free(some_ct1);
while (some_ct2 != NULL)
some_ct2 = contact_list_free(some_ct2);
}
TEST(node, contact)
{
/* capacity */
TEST_ASSERT_EQUAL_UINT32(500,
some_ct1->next->data->total_capacity_bytes);
TEST_ASSERT_EQUAL_INT32(500,
some_ct1->next->data->remaining_capacity_p0);
/* re-calculation accuracy */
recalculate_contact_capacity(some_ct1->next->data);
recalculate_contact_capacity(some_ct1->next->data);
TEST_ASSERT_EQUAL_UINT32(500,
some_ct1->next->data->total_capacity_bytes);
TEST_ASSERT_EQUAL_INT32(500,
some_ct1->next->data->remaining_capacity_p0);
/* remaining cap */
TEST_ASSERT_EQUAL_INT32(600,
contact_get_remaining_capacity_bytes(some_ct1->data, 0, 0));
TEST_ASSERT_EQUAL_INT32(300,
contact_get_remaining_capacity_bytes(some_ct1->data, 0, 2000));
TEST_ASSERT_EQUAL_INT32(0,
contact_get_remaining_capacity_bytes(some_ct1->data, 0, 3000));
}
static void assert_in_eidlist(char *eid, struct endpoint_list *l)
{
int r = 0;
while (l != NULL) {
if (strcmp(l->eid, eid) == 0)
r = 1;
l = l->next;
}
TEST_ASSERT_TRUE(r);
}
TEST(node, endpoint_list_union)
{
some_eids1 = endpoint_list_union(some_eids1, some_eids2);
some_eids2 = NULL;
TEST_ASSERT_NOT_NULL(some_eids1);
TEST_ASSERT_NOT_NULL(some_eids1->next);
TEST_ASSERT_NOT_NULL(some_eids1->next->next);
assert_in_eidlist("testeid3", some_eids1);
assert_in_eidlist("testeid1", some_eids1);
assert_in_eidlist("testeid2", some_eids1);
TEST_ASSERT_NULL(some_eids1->next->next->next);
}
TEST(node, endpoint_list_difference)
{
some_eids1 = endpoint_list_difference(some_eids1, some_eids2, 1);
some_eids2 = NULL;
TEST_ASSERT_NOT_NULL(some_eids1);
TEST_ASSERT_NULL(some_eids1->next);
TEST_ASSERT_EQUAL_STRING("testeid1", some_eids1->eid);
}
TEST(node, contact_list_union)
{
struct contact_list *mod = NULL;
some_ct1 = contact_list_union(some_ct1, some_ct2, &mod);
some_ct2 = NULL;
TEST_ASSERT_NOT_NULL(some_ct1);
TEST_ASSERT_NOT_NULL(some_ct1->next);
TEST_ASSERT_NULL(some_ct1->next->next);
TEST_ASSERT_EQUAL_UINT64(1000, some_ct1->data->from_ms);
TEST_ASSERT_EQUAL_UINT64(3000, some_ct1->data->to_ms);
TEST_ASSERT_EQUAL_UINT16(300, some_ct1->data->bitrate_bytes_per_s);
TEST_ASSERT_EQUAL_UINT32(600, some_ct1->data->total_capacity_bytes);
TEST_ASSERT_EQUAL_INT32(
600, some_ct1->data->remaining_capacity_p0);
TEST_ASSERT_EQUAL_HEX64(16000000, some_ct1->next->data->from_ms);
TEST_ASSERT_EQUAL_HEX64(16001000, some_ct1->next->data->to_ms);
TEST_ASSERT_EQUAL_UINT16(600,
some_ct1->next->data->bitrate_bytes_per_s);
TEST_ASSERT_EQUAL_UINT32(600,
some_ct1->next->data->total_capacity_bytes);
TEST_ASSERT_EQUAL_INT32(600,
some_ct1->next->data->remaining_capacity_p0);
TEST_ASSERT_NOT_NULL(mod);
TEST_ASSERT_NULL(mod->next);
TEST_ASSERT_EQUAL_PTR(some_ct1->next->data, mod->data);
free(mod); /* data is freed by tear_down */
}
TEST(node, contact_list_difference)
{
struct contact_list *mod = NULL;
struct contact_list *del = NULL;
some_ct1 = contact_list_difference(some_ct1, some_ct2, &mod, &del);
TEST_ASSERT_NOT_NULL(some_ct1);
TEST_ASSERT_NULL(some_ct1->next);
TEST_ASSERT_EQUAL_UINT64(1000, some_ct1->data->from_ms);
TEST_ASSERT_EQUAL_UINT64(3000, some_ct1->data->to_ms);
TEST_ASSERT_EQUAL_UINT16(300, some_ct1->data->bitrate_bytes_per_s);
TEST_ASSERT_EQUAL_UINT32(600, some_ct1->data->total_capacity_bytes);
TEST_ASSERT_EQUAL_INT32(600, some_ct1->data->remaining_capacity_p0);
TEST_ASSERT_NULL(mod);
TEST_ASSERT_NOT_NULL(del);
TEST_ASSERT_NULL(del->next);
TEST_ASSERT_EQUAL_HEX64(16000000, del->data->from_ms);
TEST_ASSERT_EQUAL_HEX64(16001000, del->data->to_ms);
TEST_ASSERT_EQUAL_UINT16(500, del->data->bitrate_bytes_per_s);
TEST_ASSERT_EQUAL_UINT32(500, del->data->total_capacity_bytes);
TEST_ASSERT_EQUAL_INT32(500, del->data->remaining_capacity_p0);
del = contact_list_free(del);
TEST_ASSERT_NULL(del);
}
TEST(node, add_contact_to_ordered_list)
{
struct contact *c1 = createct(100, 500, 1, node1);
struct contact *c2 = createct(200, 600, 1, node1);
struct contact *c3 = createct(300, 400, 1, node1);
struct contact_list *l = NULL;
TEST_ASSERT_TRUE(add_contact_to_ordered_list(&l, c1, 0));
TEST_ASSERT_TRUE(add_contact_to_ordered_list(&l, c2, 0));
TEST_ASSERT_TRUE(add_contact_to_ordered_list(&l, c3, 0));
TEST_ASSERT_FALSE(add_contact_to_ordered_list(&l, c3, 0));
TEST_ASSERT_NOT_NULL(l);
TEST_ASSERT_NOT_NULL(l->next);
TEST_ASSERT_NOT_NULL(l->next->next);
TEST_ASSERT_NULL(l->next->next->next);
TEST_ASSERT_EQUAL_PTR(c3, l->data);
TEST_ASSERT_EQUAL_PTR(c1, l->next->data);
TEST_ASSERT_EQUAL_PTR(c2, l->next->next->data);
TEST_ASSERT_TRUE(remove_contact_from_list(&l, c1));
TEST_ASSERT_TRUE(remove_contact_from_list(&l, c2));
TEST_ASSERT_FALSE(remove_contact_from_list(&l, c2));
TEST_ASSERT_TRUE(remove_contact_from_list(&l, c3));
TEST_ASSERT_NULL(l);
TEST_ASSERT_TRUE(add_contact_to_ordered_list(&l, c2, 1));
TEST_ASSERT_TRUE(add_contact_to_ordered_list(&l, c1, 1));
TEST_ASSERT_TRUE(add_contact_to_ordered_list(&l, c3, 1));
TEST_ASSERT_FALSE(add_contact_to_ordered_list(&l, c2, 1));
TEST_ASSERT_NOT_NULL(l);
TEST_ASSERT_NOT_NULL(l->next);
TEST_ASSERT_NOT_NULL(l->next->next);
TEST_ASSERT_NULL(l->next->next->next);
TEST_ASSERT_EQUAL_PTR(c1, l->data);
TEST_ASSERT_EQUAL_PTR(c2, l->next->data);
TEST_ASSERT_EQUAL_PTR(c3, l->next->next->data);
TEST_ASSERT_TRUE(remove_contact_from_list(&l, c1));
TEST_ASSERT_TRUE(remove_contact_from_list(&l, c2));
TEST_ASSERT_FALSE(remove_contact_from_list(&l, c2));
TEST_ASSERT_TRUE(remove_contact_from_list(&l, c3));
TEST_ASSERT_NULL(l);
free_contact(c1);
free_contact(c2);
free_contact(c3);
}
TEST_GROUP_RUNNER(node)
{
RUN_TEST_CASE(node, contact);
RUN_TEST_CASE(node, endpoint_list_difference);
RUN_TEST_CASE(node, endpoint_list_union);
RUN_TEST_CASE(node, contact_list_union);
RUN_TEST_CASE(node, contact_list_difference);
RUN_TEST_CASE(node, add_contact_to_ordered_list);
}