blob: d2c6aec90ec34f41a1719a4df173b83e492ffcd0 [file] [log] [blame]
/*
* Copyright The Transfer List Library Contributors
*
* SPDX-License-Identifier: MIT OR GPL-2.0-or-later
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "test.h"
#include "transfer_list.h"
#include "unity.h"
void *buffer = NULL;
void test_init()
{
struct transfer_list_header *tl = buffer;
/* Attempt to init TL with 0 size */
TEST_ASSERT_NULL(transfer_list_init(tl, 0));
TEST_ASSERT(transfer_list_check_header(tl) == TL_OPS_NON);
/* Init TL with an invalid memory address */
TEST_ASSERT_NULL(transfer_list_init((void *)1, TL_SIZE));
TEST_ASSERT(transfer_list_check_header(tl) == TL_OPS_NON);
/* Valid memory address and large enough TL */
TEST_ASSERT(transfer_list_init(tl, TL_SIZE));
TEST_ASSERT(transfer_list_check_header(tl) == TL_OPS_ALL);
TEST_ASSERT_NULL(transfer_list_next(tl, NULL));
}
void test_init_alignment()
{
struct transfer_list_header *tl = buffer;
memset(tl, 0, TL_SIZE);
TEST_ASSERT_NULL(transfer_list_init((void *)tl + 0xff, TL_SIZE));
TEST_ASSERT(transfer_list_check_header(tl) == TL_OPS_NON);
}
void test_relocate()
{
struct transfer_list_header *tl, *new_tl;
struct transfer_list_entry *te;
void *new_buf = malloc(TL_SIZE * 2);
unsigned int test_tag = 0x1;
int test_payload = 0xdeadbeef;
tl = buffer;
memset(tl, 0, TL_SIZE);
TEST_ASSERT(transfer_list_check_header(tl) == TL_OPS_NON);
tl = transfer_list_init(tl, TL_SIZE / 2);
// Add TE's until we run out of space
while ((te = transfer_list_add(tl, test_tag, tl->max_size / 8,
&test_payload))) {
TEST_ASSERT(te = transfer_list_find(tl, test_tag++));
TEST_ASSERT(*(int *)transfer_list_entry_data(te) ==
test_payload++);
}
// Relocate the TL and make sure all the information we put in is still there.
TEST_ASSERT(
new_tl = transfer_list_relocate(tl, new_buf, tl->max_size * 2));
TEST_ASSERT(transfer_list_check_header(new_tl) == TL_OPS_ALL);
unsigned int i = test_tag;
while ((te = transfer_list_find(tl, --i))) {
int *data = transfer_list_entry_data(te);
TEST_ASSERT_NOT_NULL(data);
TEST_ASSERT(*data == --test_payload);
}
// Add the last TE we failed to add into the relocated TL.
TEST_ASSERT(te = transfer_list_add(new_tl, test_tag, TL_SIZE / 8,
&test_payload));
TEST_ASSERT(*(int *)transfer_list_find(new_tl, test_tag) =
++test_payload);
}
void test_bad_reloc()
{
struct transfer_list_header *tl = transfer_list_init(buffer, TL_SIZE);
void *new_buf = malloc(TL_SIZE);
/* Relocate to invalid memory address. */
TEST_ASSERT_NULL(transfer_list_relocate(tl, 0, tl->max_size));
/*
* Try relocate to area with insufficent memory, check at the end that we
* still have a valid TL in the original location.
*/
TEST_ASSERT_NULL(transfer_list_relocate(tl, new_buf, 0));
TEST_ASSERT(transfer_list_check_header(tl) == TL_OPS_ALL);
}
void setUp(void)
{
buffer = malloc(TL_MAX_SIZE);
}
void tearDown(void)
{
free(buffer);
buffer = NULL;
}
int main(void)
{
UNITY_BEGIN();
RUN_TEST(test_bad_reloc);
RUN_TEST(test_init_alignment);
RUN_TEST(test_init);
RUN_TEST(test_relocate);
return UNITY_END();
}