Annotation of embedaddon/sudo/common/regress/tailq/hltq_test.c, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (c) 2013 Todd C. Miller <Todd.Miller@courtesan.com>
3: *
4: * Permission to use, copy, modify, and distribute this software for any
5: * purpose with or without fee is hereby granted, provided that the above
6: * copyright notice and this permission notice appear in all copies.
7: *
8: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14: * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15: */
16:
17: #include <config.h>
18:
19: #include <sys/types.h>
20: #include <stdio.h>
21: #ifdef STDC_HEADERS
22: # include <stdlib.h>
23: # include <stddef.h>
24: #else
25: # ifdef HAVE_STDLIB_H
26: # include <stdlib.h>
27: # endif
28: #endif /* STDC_HEADERS */
29: #ifdef HAVE_STRING_H
30: # if defined(HAVE_MEMORY_H) && !defined(STDC_HEADERS)
31: # include <memory.h>
32: # endif
33: # include <string.h>
34: #endif /* HAVE_STRING_H */
35: #ifdef HAVE_STRINGS_H
36: # include <strings.h>
37: #endif /* HAVE_STRINGS_H */
38: #ifdef HAVE_STDBOOL_H
39: # include <stdbool.h>
40: #else
41: # include "compat/stdbool.h"
42: #endif
43:
44: #include "missing.h"
45: #include "fatal.h"
46: #include "queue.h"
47: #include "sudo_util.h"
48:
49: __dso_public int main(int argc, char *argv[]);
50:
51: /*
52: * Note: HLTQ_ENTRY is intentionally in the middle of the struct
53: * to catch bad assumptions in the PREV/NEXT macros.
54: */
55: struct test_data {
56: int a;
57: HLTQ_ENTRY(test_data) entries;
58: char b;
59: };
60:
61: TAILQ_HEAD(test_data_list, test_data);
62:
63: /*
64: * Simple tests for headless tail queue macros.
65: */
66: int
67: main(int argc, char *argv[])
68: {
69: struct test_data d1, d2, d3;
70: struct test_data *hltq;
71: struct test_data_list tq;
72: int errors = 0;
73: int ntests = 0;
74:
75: initprogname(argc > 0 ? argv[0] : "hltq_test");
76:
77: /*
78: * Initialize three data elements and concatenate them in order.
79: */
80: HLTQ_INIT(&d1, entries);
81: d1.a = 1;
82: d1.b = 'a';
83: if (HLTQ_FIRST(&d1) != &d1) {
84: warningx_nodebug("FAIL: HLTQ_FIRST(1 entry) doesn't return first element: got %p, expected %p", HLTQ_FIRST(&d1), &d1);
85: errors++;
86: }
87: ntests++;
88: if (HLTQ_LAST(&d1, test_data, entries) != &d1) {
89: warningx_nodebug("FAIL: HLTQ_LAST(1 entry) doesn't return first element: got %p, expected %p", HLTQ_LAST(&d1, test_data, entries), &d1);
90: errors++;
91: }
92: ntests++;
93: if (HLTQ_PREV(&d1, test_data, entries) != NULL) {
94: warningx_nodebug("FAIL: HLTQ_PREV(1 entry) doesn't return NULL: got %p", HLTQ_PREV(&d1, test_data, entries));
95: errors++;
96: }
97: ntests++;
98:
99: HLTQ_INIT(&d2, entries);
100: d2.a = 2;
101: d2.b = 'b';
102:
103: HLTQ_INIT(&d3, entries);
104: d3.a = 3;
105: d3.b = 'c';
106:
107: HLTQ_CONCAT(&d1, &d2, entries);
108: HLTQ_CONCAT(&d1, &d3, entries);
109: hltq = &d1;
110:
111: /*
112: * Verify that HLTQ_FIRST, HLTQ_LAST, HLTQ_NEXT, HLTQ_PREV
113: * work as expected.
114: */
115: if (HLTQ_FIRST(hltq) != &d1) {
116: warningx_nodebug("FAIL: HLTQ_FIRST(3 entries) doesn't return first element: got %p, expected %p", HLTQ_FIRST(hltq), &d1);
117: errors++;
118: }
119: ntests++;
120: if (HLTQ_LAST(hltq, test_data, entries) != &d3) {
121: warningx_nodebug("FAIL: HLTQ_LAST(3 entries) doesn't return third element: got %p, expected %p", HLTQ_LAST(hltq, test_data, entries), &d3);
122: errors++;
123: }
124: ntests++;
125:
126: if (HLTQ_NEXT(&d1, entries) != &d2) {
127: warningx_nodebug("FAIL: HLTQ_NEXT(&d1) doesn't return &d2: got %p, expected %p", HLTQ_NEXT(&d1, entries), &d2);
128: errors++;
129: }
130: ntests++;
131: if (HLTQ_NEXT(&d2, entries) != &d3) {
132: warningx_nodebug("FAIL: HLTQ_NEXT(&d2) doesn't return &d3: got %p, expected %p", HLTQ_NEXT(&d2, entries), &d3);
133: errors++;
134: }
135: ntests++;
136: if (HLTQ_NEXT(&d3, entries) != NULL) {
137: warningx_nodebug("FAIL: HLTQ_NEXT(&d3) doesn't return NULL: got %p", HLTQ_NEXT(&d3, entries));
138: errors++;
139: }
140: ntests++;
141:
142: if (HLTQ_PREV(&d1, test_data, entries) != NULL) {
143: warningx_nodebug("FAIL: HLTQ_PREV(&d1) doesn't return NULL: got %p", HLTQ_PREV(&d1, test_data, entries));
144: errors++;
145: }
146: ntests++;
147: if (HLTQ_PREV(&d2, test_data, entries) != &d1) {
148: warningx_nodebug("FAIL: HLTQ_PREV(&d2) doesn't return &d1: got %p, expected %p", HLTQ_PREV(&d2, test_data, entries), &d1);
149: errors++;
150: }
151: ntests++;
152: if (HLTQ_PREV(&d3, test_data, entries) != &d2) {
153: warningx_nodebug("FAIL: HLTQ_PREV(&d3) doesn't return &d2: got %p, expected %p", HLTQ_PREV(&d3, test_data, entries), &d2);
154: errors++;
155: }
156: ntests++;
157:
158: /* Test conversion to TAILQ. */
159: HLTQ_TO_TAILQ(&tq, hltq, entries);
160:
161: if (TAILQ_FIRST(&tq) != &d1) {
162: warningx_nodebug("FAIL: TAILQ_FIRST(&tq) doesn't return first element: got %p, expected %p", TAILQ_FIRST(&tq), &d1);
163: errors++;
164: }
165: ntests++;
166: if (TAILQ_LAST(&tq, test_data_list) != &d3) {
167: warningx_nodebug("FAIL: TAILQ_LAST(&tq) doesn't return third element: got %p, expected %p", TAILQ_LAST(&tq, test_data_list), &d3);
168: errors++;
169: }
170: ntests++;
171:
172: if (TAILQ_NEXT(&d1, entries) != &d2) {
173: warningx_nodebug("FAIL: TAILQ_NEXT(&d1) doesn't return &d2: got %p, expected %p", TAILQ_NEXT(&d1, entries), &d2);
174: errors++;
175: }
176: ntests++;
177: if (TAILQ_NEXT(&d2, entries) != &d3) {
178: warningx_nodebug("FAIL: TAILQ_NEXT(&d2) doesn't return &d3: got %p, expected %p", TAILQ_NEXT(&d2, entries), &d3);
179: errors++;
180: }
181: ntests++;
182: if (TAILQ_NEXT(&d3, entries) != NULL) {
183: warningx_nodebug("FAIL: TAILQ_NEXT(&d3) doesn't return NULL: got %p", TAILQ_NEXT(&d3, entries));
184: errors++;
185: }
186: ntests++;
187:
188: if (TAILQ_PREV(&d1, test_data_list, entries) != NULL) {
189: warningx_nodebug("FAIL: TAILQ_PREV(&d1) doesn't return NULL: got %p", TAILQ_PREV(&d1, test_data_list, entries));
190: errors++;
191: }
192: ntests++;
193: if (TAILQ_PREV(&d2, test_data_list, entries) != &d1) {
194: warningx_nodebug("FAIL: TAILQ_PREV(&d2) doesn't return &d1: got %p, expected %p", TAILQ_PREV(&d2, test_data_list, entries), &d1);
195: errors++;
196: }
197: ntests++;
198: if (TAILQ_PREV(&d3, test_data_list, entries) != &d2) {
199: warningx_nodebug("FAIL: TAILQ_PREV(&d3) doesn't return &d2: got %p, expected %p", TAILQ_PREV(&d3, test_data_list, entries), &d2);
200: errors++;
201: }
202: ntests++;
203:
204: printf("%s: %d tests run, %d errors, %d%% success rate\n", getprogname(),
205: ntests, errors, (ntests - errors) * 100 / ntests);
206:
207: exit(errors);
208: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>