1981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans#include "test/jemalloc_test.h"
2981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans
3981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans/* Number of ring entries, in [2..26]. */
4981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans#define	NENTRIES 9
5981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans
6981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evanstypedef struct list_s list_t;
7981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evanstypedef ql_head(list_t) list_head_t;
8981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans
9981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evansstruct list_s {
10981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	ql_elm(list_t) link;
11981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	char id;
12981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans};
13981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans
14981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evansstatic void
15981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evanstest_empty_list(list_head_t *head)
16981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans{
17981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	list_t *t;
18981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	unsigned i;
19981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans
20981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	assert_ptr_null(ql_first(head), "Unexpected element for empty list");
21981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	assert_ptr_null(ql_last(head, link),
22981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	    "Unexpected element for empty list");
23981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans
24981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	i = 0;
25981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	ql_foreach(t, head, link) {
26981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans		i++;
27981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	}
28981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	assert_u_eq(i, 0, "Unexpected element for empty list");
29981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans
30981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	i = 0;
31981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	ql_reverse_foreach(t, head, link) {
32981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans		i++;
33981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	}
34981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	assert_u_eq(i, 0, "Unexpected element for empty list");
35981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans}
36981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans
37981bb499d92fee940d5be79cec3abdd3de3891b8Jason EvansTEST_BEGIN(test_ql_empty)
38981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans{
39981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	list_head_t head;
40981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans
41981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	ql_new(&head);
42981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	test_empty_list(&head);
43981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans}
44981bb499d92fee940d5be79cec3abdd3de3891b8Jason EvansTEST_END
45981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans
46981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evansstatic void
47981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evansinit_entries(list_t *entries, unsigned nentries)
48981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans{
49981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	unsigned i;
50981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans
51981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	for (i = 0; i < nentries; i++) {
52981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans		entries[i].id = 'a' + i;
53981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans		ql_elm_new(&entries[i], link);
54981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	}
55981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans}
56981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans
57981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evansstatic void
58981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evanstest_entries_list(list_head_t *head, list_t *entries, unsigned nentries)
59981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans{
60981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	list_t *t;
61981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	unsigned i;
62981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans
63981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	assert_c_eq(ql_first(head)->id, entries[0].id, "Element id mismatch");
64981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	assert_c_eq(ql_last(head, link)->id, entries[nentries-1].id,
65981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	    "Element id mismatch");
66981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans
67981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	i = 0;
68981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	ql_foreach(t, head, link) {
69981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans		assert_c_eq(t->id, entries[i].id, "Element id mismatch");
70981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans		i++;
71981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	}
72981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans
73981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	i = 0;
74981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	ql_reverse_foreach(t, head, link) {
75981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans		assert_c_eq(t->id, entries[nentries-i-1].id,
76981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans		    "Element id mismatch");
77981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans		i++;
78981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	}
79981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans
80981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	for (i = 0; i < nentries-1; i++) {
81981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans		t = ql_next(head, &entries[i], link);
82981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans		assert_c_eq(t->id, entries[i+1].id, "Element id mismatch");
83981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	}
84981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	assert_ptr_null(ql_next(head, &entries[nentries-1], link),
85981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	    "Unexpected element");
86981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans
87981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	assert_ptr_null(ql_prev(head, &entries[0], link), "Unexpected element");
88981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	for (i = 1; i < nentries; i++) {
89981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans		t = ql_prev(head, &entries[i], link);
90981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans		assert_c_eq(t->id, entries[i-1].id, "Element id mismatch");
91981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	}
92981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans}
93981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans
94981bb499d92fee940d5be79cec3abdd3de3891b8Jason EvansTEST_BEGIN(test_ql_tail_insert)
95981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans{
96981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	list_head_t head;
97981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	list_t entries[NENTRIES];
98981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	unsigned i;
99981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans
100981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	ql_new(&head);
101981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	init_entries(entries, sizeof(entries)/sizeof(list_t));
102981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	for (i = 0; i < NENTRIES; i++)
103981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans		ql_tail_insert(&head, &entries[i], link);
104981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans
105981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	test_entries_list(&head, entries, NENTRIES);
106981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans}
107981bb499d92fee940d5be79cec3abdd3de3891b8Jason EvansTEST_END
108981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans
109981bb499d92fee940d5be79cec3abdd3de3891b8Jason EvansTEST_BEGIN(test_ql_tail_remove)
110981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans{
111981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	list_head_t head;
112981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	list_t entries[NENTRIES];
113981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	unsigned i;
114981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans
115981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	ql_new(&head);
116981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	init_entries(entries, sizeof(entries)/sizeof(list_t));
117981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	for (i = 0; i < NENTRIES; i++)
118981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans		ql_tail_insert(&head, &entries[i], link);
119981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans
120981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	for (i = 0; i < NENTRIES; i++) {
121981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans		test_entries_list(&head, entries, NENTRIES-i);
122981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans		ql_tail_remove(&head, list_t, link);
123981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	}
124981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	test_empty_list(&head);
125981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans}
126981bb499d92fee940d5be79cec3abdd3de3891b8Jason EvansTEST_END
127981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans
128981bb499d92fee940d5be79cec3abdd3de3891b8Jason EvansTEST_BEGIN(test_ql_head_insert)
129981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans{
130981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	list_head_t head;
131981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	list_t entries[NENTRIES];
132981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	unsigned i;
133981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans
134981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	ql_new(&head);
135981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	init_entries(entries, sizeof(entries)/sizeof(list_t));
136981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	for (i = 0; i < NENTRIES; i++)
137981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans		ql_head_insert(&head, &entries[NENTRIES-i-1], link);
138981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans
139981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	test_entries_list(&head, entries, NENTRIES);
140981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans}
141981bb499d92fee940d5be79cec3abdd3de3891b8Jason EvansTEST_END
142981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans
143981bb499d92fee940d5be79cec3abdd3de3891b8Jason EvansTEST_BEGIN(test_ql_head_remove)
144981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans{
145981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	list_head_t head;
146981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	list_t entries[NENTRIES];
147981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	unsigned i;
148981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans
149981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	ql_new(&head);
150981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	init_entries(entries, sizeof(entries)/sizeof(list_t));
151981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	for (i = 0; i < NENTRIES; i++)
152981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans		ql_head_insert(&head, &entries[NENTRIES-i-1], link);
153981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans
154981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	for (i = 0; i < NENTRIES; i++) {
155981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans		test_entries_list(&head, &entries[i], NENTRIES-i);
156981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans		ql_head_remove(&head, list_t, link);
157981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	}
158981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	test_empty_list(&head);
159981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans}
160981bb499d92fee940d5be79cec3abdd3de3891b8Jason EvansTEST_END
161981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans
162981bb499d92fee940d5be79cec3abdd3de3891b8Jason EvansTEST_BEGIN(test_ql_insert)
163981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans{
164981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	list_head_t head;
165981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	list_t entries[8];
166981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	list_t *a, *b, *c, *d, *e, *f, *g, *h;
167981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans
168981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	ql_new(&head);
169981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	init_entries(entries, sizeof(entries)/sizeof(list_t));
170981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	a = &entries[0];
171981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	b = &entries[1];
172981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	c = &entries[2];
173981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	d = &entries[3];
174981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	e = &entries[4];
175981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	f = &entries[5];
176981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	g = &entries[6];
177981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	h = &entries[7];
178981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans
179981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	/*
180981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	 * ql_remove(), ql_before_insert(), and ql_after_insert() are used
181981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	 * internally by other macros that are already tested, so there's no
182981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	 * need to test them completely.  However, insertion/deletion from the
183981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	 * middle of lists is not otherwise tested; do so here.
184981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	 */
185981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	ql_tail_insert(&head, f, link);
186981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	ql_before_insert(&head, f, b, link);
187981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	ql_before_insert(&head, f, c, link);
188981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	ql_after_insert(f, h, link);
189981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	ql_after_insert(f, g, link);
190981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	ql_before_insert(&head, b, a, link);
191981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	ql_after_insert(c, d, link);
192981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	ql_before_insert(&head, f, e, link);
193981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans
194981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	test_entries_list(&head, entries, sizeof(entries)/sizeof(list_t));
195981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans}
196981bb499d92fee940d5be79cec3abdd3de3891b8Jason EvansTEST_END
197981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans
198981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evansint
199981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evansmain(void)
200981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans{
201981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans
202981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	return (test(
203981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	    test_ql_empty,
204981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	    test_ql_tail_insert,
205981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	    test_ql_tail_remove,
206981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	    test_ql_head_insert,
207981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	    test_ql_head_remove,
208981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans	    test_ql_insert));
209981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans}
210