From a99b580c75278d306d2d1eb0b6893e83388ec513 Mon Sep 17 00:00:00 2001 From: Maximilian Brune Date: Sat, 16 Sep 2023 19:56:45 +0200 Subject: treewide: Move list.h to commonlib It is needed in order to move device_tree.c into commonlib in a subsequent commit. Signed-off-by: Maximilian Brune Change-Id: I16eb7b743fb1d36301f0eda563a62364e7a9cfec Reviewed-on: https://review.coreboot.org/c/coreboot/+/77968 Reviewed-by: Julius Werner Tested-by: build bot (Jenkins) --- tests/commonlib/Makefile.mk | 4 ++ tests/commonlib/list-test.c | 149 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 153 insertions(+) create mode 100644 tests/commonlib/list-test.c (limited to 'tests/commonlib') diff --git a/tests/commonlib/Makefile.mk b/tests/commonlib/Makefile.mk index 6df1db8fc5..55c3ddd702 100644 --- a/tests/commonlib/Makefile.mk +++ b/tests/commonlib/Makefile.mk @@ -2,9 +2,13 @@ subdirs-y += bsd +tests-y += list-test tests-y += rational-test tests-y += region-test +list-test-srcs += tests/commonlib/list-test.c +list-test-srcs += src/commonlib/list.c + rational-test-srcs += tests/commonlib/rational-test.c rational-test-srcs += src/commonlib/rational.c diff --git a/tests/commonlib/list-test.c b/tests/commonlib/list-test.c new file mode 100644 index 0000000000..4ca48a468f --- /dev/null +++ b/tests/commonlib/list-test.c @@ -0,0 +1,149 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include +#include +#include +#include + +struct test_container { + int value; + + struct list_node list_node; +}; + +void test_list_insert_after(void **state) +{ + int i = 0; + struct list_node root = { .prev = NULL, .next = NULL }; + struct test_container *c1 = (struct test_container *)malloc(sizeof(*c1)); + struct test_container *c2 = (struct test_container *)malloc(sizeof(*c2)); + struct test_container *c3 = (struct test_container *)malloc(sizeof(*c2)); + struct test_container *ptr; + const int values[] = { 5, 10, 13 }; /* Random values */ + + memset(c1, 0, sizeof(*c1)); + memset(c2, 0, sizeof(*c2)); + memset(c2, 0, sizeof(*c3)); + + c1->value = values[0]; + c2->value = values[1]; + c3->value = values[2]; + + list_insert_after(&c1->list_node, &root); + list_insert_after(&c2->list_node, &c1->list_node); + list_insert_after(&c3->list_node, &c2->list_node); + + list_for_each(ptr, root, list_node) { + assert_int_equal(values[i], ptr->value); + i++; + } + + assert_int_equal(3, i); + + free(c3); + free(c2); + free(c1); +} + +void test_list_insert_before(void **state) +{ + int i = 0; + struct list_node root = { .prev = NULL, .next = NULL }; + struct test_container *c1 = (struct test_container *)malloc(sizeof(*c1)); + struct test_container *c2 = (struct test_container *)malloc(sizeof(*c2)); + struct test_container *c3 = (struct test_container *)malloc(sizeof(*c2)); + struct test_container *ptr; + const int values[] = { 19, 71, 991 }; /* Random values */ + + memset(c1, 0, sizeof(*c1)); + memset(c2, 0, sizeof(*c2)); + memset(c2, 0, sizeof(*c3)); + + c1->value = values[0]; + c2->value = values[1]; + c3->value = values[2]; + + list_insert_after(&c3->list_node, &root); + list_insert_before(&c2->list_node, &c3->list_node); + list_insert_before(&c1->list_node, &c2->list_node); + + + list_for_each(ptr, root, list_node) { + assert_int_equal(values[i], ptr->value); + i++; + } + + assert_int_equal(3, i); + + free(c3); + free(c2); + free(c1); +} + +void test_list_remove(void **state) +{ + struct list_node root = { .prev = NULL, .next = NULL }; + struct test_container *c1 = (struct test_container *)malloc(sizeof(*c1)); + struct test_container *c2 = (struct test_container *)malloc(sizeof(*c2)); + struct test_container *ptr; + int len; + + list_insert_after(&c1->list_node, &root); + list_insert_after(&c2->list_node, &c1->list_node); + + len = 0; + list_for_each(ptr, root, list_node) { + len++; + } + assert_int_equal(2, len); + + list_remove(&c1->list_node); + + len = 0; + list_for_each(ptr, root, list_node) { + len++; + } + assert_int_equal(1, len); + + list_remove(&c2->list_node); + len = 0; + list_for_each(ptr, root, list_node) { + len++; + } + assert_int_equal(0, len); + + free(c2); + free(c1); +} + +void test_list_append(void **state) +{ + size_t idx; + struct test_container *node; + struct list_node root = {}; + struct test_container nodes[] = { + {1}, {2}, {3} + }; + + for (idx = 0; idx < ARRAY_SIZE(nodes); ++idx) + list_append(&nodes[idx].list_node, &root); + + idx = 0; + list_for_each(node, root, list_node) { + assert_ptr_equal(node, &nodes[idx]); + idx++; + } +} + +int main(void) +{ + const struct CMUnitTest tests[] = { + cmocka_unit_test(test_list_insert_after), + cmocka_unit_test(test_list_insert_before), + cmocka_unit_test(test_list_remove), + cmocka_unit_test(test_list_append), + }; + + + return cb_run_group_tests(tests, NULL, NULL); +} -- cgit v1.2.3