1 /*
2  * Arm SCP/MCP Software
3  * Copyright (c) 2015-2021, Arm Limited and Contributors. All rights reserved.
4  *
5  * SPDX-License-Identifier: BSD-3-Clause
6  */
7 
8 #include <fwk_assert.h>
9 #include <fwk_list.h>
10 #include <fwk_macros.h>
11 #include <fwk_test.h>
12 
13 #include <stddef.h>
14 #include <string.h>
15 
16 static struct fwk_slist slist;
17 static struct fwk_dlist dlist;
18 
19 static struct fwk_slist_node snodes[2];
20 static struct fwk_dlist_node dnodes[2];
21 
test_case_setup(void)22 static void test_case_setup(void)
23 {
24     fwk_list_init(&slist);
25     fwk_list_init(&dlist);
26 
27     /* Remove node links before each test case */
28     memset(snodes, 0, sizeof(snodes));
29     memset(dnodes, 0, sizeof(dnodes));
30 }
31 
test_slist_push_head_from_empty(void)32 static void test_slist_push_head_from_empty(void)
33 {
34     fwk_list_push_head(&slist, &snodes[0]);
35 
36     assert(slist.head == &snodes[0]);
37     assert(slist.tail == &snodes[0]);
38 
39     assert(snodes[0].next == (struct fwk_slist_node *)&slist);
40 }
41 
test_dlist_push_head_from_empty(void)42 static void test_dlist_push_head_from_empty(void)
43 {
44     fwk_list_push_head(&dlist, &dnodes[0]);
45 
46     assert(dlist.head == &dnodes[0]);
47     assert(dlist.tail == &dnodes[0]);
48 
49     assert(dnodes[0].next == (struct fwk_dlist_node *)&dlist);
50     assert(dnodes[0].prev == (struct fwk_dlist_node *)&dlist);
51 }
52 
test_slist_push_back_from_empty(void)53 static void test_slist_push_back_from_empty(void)
54 {
55     fwk_list_push_tail(&slist, &snodes[0]);
56 
57     assert(slist.head == &snodes[0]);
58     assert(slist.tail == &snodes[0]);
59 
60     assert(snodes[0].next == (struct fwk_slist_node *)&slist);
61 }
62 
test_dlist_push_back_from_empty(void)63 static void test_dlist_push_back_from_empty(void)
64 {
65     fwk_list_push_tail(&dlist, &dnodes[0]);
66 
67     assert(dlist.head == &dnodes[0]);
68     assert(dlist.tail == &dnodes[0]);
69 
70     assert(dnodes[0].next == (struct fwk_dlist_node *)&dlist);
71     assert(dnodes[0].prev == (struct fwk_dlist_node *)&dlist);
72 }
73 
test_slist_push_head(void)74 static void test_slist_push_head(void)
75 {
76     fwk_list_push_head(&slist, &snodes[0]);
77     fwk_list_push_head(&slist, &snodes[1]);
78 
79     assert(slist.head == &snodes[1]);
80     assert(slist.tail == &snodes[0]);
81 
82     assert(snodes[0].next == (struct fwk_slist_node *)&slist);
83     assert(snodes[1].next == &snodes[0]);
84 }
85 
test_dlist_push_head(void)86 static void test_dlist_push_head(void)
87 {
88     fwk_list_push_head(&dlist, &dnodes[0]);
89     fwk_list_push_head(&dlist, &dnodes[1]);
90 
91     assert(dlist.head == &dnodes[1]);
92     assert(dlist.tail == &dnodes[0]);
93 
94     assert(dnodes[0].next == (struct fwk_dlist_node *)&dlist);
95     assert(dnodes[0].prev == &dnodes[1]);
96 
97     assert(dnodes[1].next == &dnodes[0]);
98     assert(dnodes[1].prev == (struct fwk_dlist_node *)&dlist);
99 }
100 
test_slist_push_back(void)101 static void test_slist_push_back(void)
102 {
103     fwk_list_push_tail(&slist, &snodes[0]);
104     fwk_list_push_tail(&slist, &snodes[1]);
105 
106     assert(slist.head == &snodes[0]);
107     assert(slist.tail == &snodes[1]);
108 
109     assert(snodes[0].next == &snodes[1]);
110     assert(snodes[1].next == (struct fwk_slist_node *)&slist);
111 }
112 
test_dlist_push_back(void)113 static void test_dlist_push_back(void)
114 {
115     fwk_list_push_tail(&dlist, &dnodes[0]);
116     fwk_list_push_tail(&dlist, &dnodes[1]);
117 
118     assert(dlist.head == &dnodes[0]);
119     assert(dlist.tail == &dnodes[1]);
120 
121     assert(dnodes[0].next == &dnodes[1]);
122     assert(dnodes[0].prev == (struct fwk_dlist_node *)&dlist);
123 
124     assert(dnodes[1].next == (struct fwk_dlist_node *)&dlist);
125     assert(dnodes[1].prev == &dnodes[0]);
126 }
127 
128 static const struct fwk_test_case_desc test_case_table[] = {
129     FWK_TEST_CASE(test_slist_push_head_from_empty),
130     FWK_TEST_CASE(test_dlist_push_head_from_empty),
131     FWK_TEST_CASE(test_slist_push_back_from_empty),
132     FWK_TEST_CASE(test_dlist_push_back_from_empty),
133     FWK_TEST_CASE(test_slist_push_head),
134     FWK_TEST_CASE(test_dlist_push_head),
135     FWK_TEST_CASE(test_slist_push_back),
136     FWK_TEST_CASE(test_dlist_push_back),
137 };
138 
139 struct fwk_test_suite_desc test_suite = {
140     .name = "fwk_list_push",
141     .test_case_setup = test_case_setup,
142     .test_case_count = FWK_ARRAY_SIZE(test_case_table),
143     .test_case_table = test_case_table,
144 };
145