xref: /freebsd/crypto/openssl/test/list_test.c (revision e7be843b4a162e68651d3911f0357ed464915629)
1*e7be843bSPierre Pronchery /*
2*e7be843bSPierre Pronchery  * Copyright 2022 The OpenSSL Project Authors. All Rights Reserved.
3*e7be843bSPierre Pronchery  *
4*e7be843bSPierre Pronchery  * Licensed under the Apache License 2.0 (the "License").  You may not use
5*e7be843bSPierre Pronchery  * this file except in compliance with the License.  You can obtain a copy
6*e7be843bSPierre Pronchery  * in the file LICENSE in the source distribution or at
7*e7be843bSPierre Pronchery  * https://www.openssl.org/source/license.html
8*e7be843bSPierre Pronchery  */
9*e7be843bSPierre Pronchery 
10*e7be843bSPierre Pronchery #include <stdio.h>
11*e7be843bSPierre Pronchery #include <string.h>
12*e7be843bSPierre Pronchery 
13*e7be843bSPierre Pronchery #include <openssl/opensslconf.h>
14*e7be843bSPierre Pronchery #include <openssl/err.h>
15*e7be843bSPierre Pronchery #include <openssl/crypto.h>
16*e7be843bSPierre Pronchery 
17*e7be843bSPierre Pronchery #include "internal/list.h"
18*e7be843bSPierre Pronchery #include "internal/nelem.h"
19*e7be843bSPierre Pronchery #include "testutil.h"
20*e7be843bSPierre Pronchery 
21*e7be843bSPierre Pronchery typedef struct testl_st TESTL;
22*e7be843bSPierre Pronchery struct testl_st {
23*e7be843bSPierre Pronchery     int n;
24*e7be843bSPierre Pronchery     OSSL_LIST_MEMBER(fizz, TESTL);
25*e7be843bSPierre Pronchery     OSSL_LIST_MEMBER(buzz, TESTL);
26*e7be843bSPierre Pronchery };
27*e7be843bSPierre Pronchery 
28*e7be843bSPierre Pronchery DEFINE_LIST_OF(fizz, TESTL);
29*e7be843bSPierre Pronchery DEFINE_LIST_OF(buzz, TESTL);
30*e7be843bSPierre Pronchery 
test_fizzbuzz(void)31*e7be843bSPierre Pronchery static int test_fizzbuzz(void)
32*e7be843bSPierre Pronchery {
33*e7be843bSPierre Pronchery     OSSL_LIST(fizz) a;
34*e7be843bSPierre Pronchery     OSSL_LIST(buzz) b;
35*e7be843bSPierre Pronchery     TESTL elem[20];
36*e7be843bSPierre Pronchery     const int nelem = OSSL_NELEM(elem);
37*e7be843bSPierre Pronchery     int i, na = 0, nb = 0;
38*e7be843bSPierre Pronchery 
39*e7be843bSPierre Pronchery     ossl_list_fizz_init(&a);
40*e7be843bSPierre Pronchery     ossl_list_buzz_init(&b);
41*e7be843bSPierre Pronchery 
42*e7be843bSPierre Pronchery     if (!TEST_true(ossl_list_fizz_is_empty(&a)))
43*e7be843bSPierre Pronchery         return 0;
44*e7be843bSPierre Pronchery 
45*e7be843bSPierre Pronchery     for (i = 1; i < nelem; i++) {
46*e7be843bSPierre Pronchery         ossl_list_fizz_init_elem(elem + i);
47*e7be843bSPierre Pronchery         ossl_list_buzz_init_elem(elem + i);
48*e7be843bSPierre Pronchery         elem[i].n = i;
49*e7be843bSPierre Pronchery         if (i % 3 == 0) {
50*e7be843bSPierre Pronchery             ossl_list_fizz_insert_tail(&a, elem + i);
51*e7be843bSPierre Pronchery             na++;
52*e7be843bSPierre Pronchery         }
53*e7be843bSPierre Pronchery         if (i % 5 == 0) {
54*e7be843bSPierre Pronchery             ossl_list_buzz_insert_head(&b, elem + i);
55*e7be843bSPierre Pronchery             nb++;
56*e7be843bSPierre Pronchery         }
57*e7be843bSPierre Pronchery     }
58*e7be843bSPierre Pronchery 
59*e7be843bSPierre Pronchery     if (!TEST_false(ossl_list_fizz_is_empty(&a))
60*e7be843bSPierre Pronchery             || !TEST_size_t_eq(ossl_list_fizz_num(&a), na)
61*e7be843bSPierre Pronchery             || !TEST_size_t_eq(ossl_list_buzz_num(&b), nb)
62*e7be843bSPierre Pronchery             || !TEST_ptr(ossl_list_fizz_head(&a))
63*e7be843bSPierre Pronchery             || !TEST_ptr(ossl_list_fizz_tail(&a))
64*e7be843bSPierre Pronchery             || !TEST_ptr(ossl_list_buzz_head(&b))
65*e7be843bSPierre Pronchery             || !TEST_ptr(ossl_list_buzz_tail(&b))
66*e7be843bSPierre Pronchery             || !TEST_int_eq(ossl_list_fizz_head(&a)->n, 3)
67*e7be843bSPierre Pronchery             || !TEST_int_eq(ossl_list_fizz_tail(&a)->n, na * 3)
68*e7be843bSPierre Pronchery             || !TEST_int_eq(ossl_list_buzz_head(&b)->n, nb * 5)
69*e7be843bSPierre Pronchery             || !TEST_int_eq(ossl_list_buzz_tail(&b)->n, 5))
70*e7be843bSPierre Pronchery         return 0;
71*e7be843bSPierre Pronchery     ossl_list_fizz_remove(&a, ossl_list_fizz_head(&a));
72*e7be843bSPierre Pronchery     ossl_list_buzz_remove(&b, ossl_list_buzz_tail(&b));
73*e7be843bSPierre Pronchery     if (!TEST_size_t_eq(ossl_list_fizz_num(&a), --na)
74*e7be843bSPierre Pronchery             || !TEST_size_t_eq(ossl_list_buzz_num(&b), --nb)
75*e7be843bSPierre Pronchery             || !TEST_ptr(ossl_list_fizz_head(&a))
76*e7be843bSPierre Pronchery             || !TEST_ptr(ossl_list_buzz_tail(&b))
77*e7be843bSPierre Pronchery             || !TEST_int_eq(ossl_list_fizz_head(&a)->n, 6)
78*e7be843bSPierre Pronchery             || !TEST_int_eq(ossl_list_buzz_tail(&b)->n, 10)
79*e7be843bSPierre Pronchery             || !TEST_ptr(ossl_list_fizz_next(ossl_list_fizz_head(&a)))
80*e7be843bSPierre Pronchery             || !TEST_ptr(ossl_list_fizz_prev(ossl_list_fizz_tail(&a)))
81*e7be843bSPierre Pronchery             || !TEST_int_eq(ossl_list_fizz_next(ossl_list_fizz_head(&a))->n, 9)
82*e7be843bSPierre Pronchery             || !TEST_int_eq(ossl_list_fizz_prev(ossl_list_fizz_tail(&a))->n, 15))
83*e7be843bSPierre Pronchery         return 0;
84*e7be843bSPierre Pronchery     return 1;
85*e7be843bSPierre Pronchery }
86*e7be843bSPierre Pronchery 
87*e7be843bSPierre Pronchery typedef struct int_st INTL;
88*e7be843bSPierre Pronchery struct int_st {
89*e7be843bSPierre Pronchery     int n;
90*e7be843bSPierre Pronchery     OSSL_LIST_MEMBER(int, INTL);
91*e7be843bSPierre Pronchery };
92*e7be843bSPierre Pronchery 
93*e7be843bSPierre Pronchery DEFINE_LIST_OF(int, INTL);
94*e7be843bSPierre Pronchery 
test_insert(void)95*e7be843bSPierre Pronchery static int test_insert(void)
96*e7be843bSPierre Pronchery {
97*e7be843bSPierre Pronchery     INTL *c, *d;
98*e7be843bSPierre Pronchery     OSSL_LIST(int) l;
99*e7be843bSPierre Pronchery     INTL elem[20];
100*e7be843bSPierre Pronchery     size_t i;
101*e7be843bSPierre Pronchery     int n = 1;
102*e7be843bSPierre Pronchery 
103*e7be843bSPierre Pronchery     ossl_list_int_init(&l);
104*e7be843bSPierre Pronchery     for (i = 0; i < OSSL_NELEM(elem); i++) {
105*e7be843bSPierre Pronchery         ossl_list_int_init_elem(elem + i);
106*e7be843bSPierre Pronchery         elem[i].n = i;
107*e7be843bSPierre Pronchery     }
108*e7be843bSPierre Pronchery 
109*e7be843bSPierre Pronchery     /* Check various insert options - head, tail, middle */
110*e7be843bSPierre Pronchery     ossl_list_int_insert_head(&l, elem + 3);                /* 3 */
111*e7be843bSPierre Pronchery     ossl_list_int_insert_tail(&l, elem + 6);                /* 3 6 */
112*e7be843bSPierre Pronchery     ossl_list_int_insert_before(&l, elem + 6, elem + 5);    /* 3 5 6 */
113*e7be843bSPierre Pronchery     ossl_list_int_insert_before(&l, elem + 3, elem + 1);    /* 1 3 5 6 */
114*e7be843bSPierre Pronchery     ossl_list_int_insert_after(&l, elem + 1, elem + 2);     /* 1 2 3 5 6 */
115*e7be843bSPierre Pronchery     ossl_list_int_insert_after(&l, elem + 6, elem + 7);     /* 1 2 3 5 6 7 */
116*e7be843bSPierre Pronchery     ossl_list_int_insert_after(&l, elem + 3, elem + 4);     /* 1 2 3 4 5 6 7 */
117*e7be843bSPierre Pronchery     if (!TEST_size_t_eq(ossl_list_int_num(&l), 7))
118*e7be843bSPierre Pronchery         return 0;
119*e7be843bSPierre Pronchery     c = ossl_list_int_head(&l);
120*e7be843bSPierre Pronchery     d = ossl_list_int_tail(&l);
121*e7be843bSPierre Pronchery     while (c != NULL && d != NULL) {
122*e7be843bSPierre Pronchery         if (!TEST_int_eq(c->n, n) || !TEST_int_eq(d->n, 8 - n))
123*e7be843bSPierre Pronchery             return 0;
124*e7be843bSPierre Pronchery         c = ossl_list_int_next(c);
125*e7be843bSPierre Pronchery         d = ossl_list_int_prev(d);
126*e7be843bSPierre Pronchery         n++;
127*e7be843bSPierre Pronchery     }
128*e7be843bSPierre Pronchery     if (!TEST_ptr_null(c) || !TEST_ptr_null(d))
129*e7be843bSPierre Pronchery         return 0;
130*e7be843bSPierre Pronchery 
131*e7be843bSPierre Pronchery     /* Check removing head, tail and middle */
132*e7be843bSPierre Pronchery     ossl_list_int_remove(&l, elem + 1);                     /* 2 3 4 5 6 7 */
133*e7be843bSPierre Pronchery     ossl_list_int_remove(&l, elem + 6);                     /* 2 3 4 5 7 */
134*e7be843bSPierre Pronchery     ossl_list_int_remove(&l, elem + 7);                     /* 2 3 4 5 */
135*e7be843bSPierre Pronchery     n = 2;
136*e7be843bSPierre Pronchery     c = ossl_list_int_head(&l);
137*e7be843bSPierre Pronchery     d = ossl_list_int_tail(&l);
138*e7be843bSPierre Pronchery     while (c != NULL && d != NULL) {
139*e7be843bSPierre Pronchery         if (!TEST_int_eq(c->n, n) || !TEST_int_eq(d->n, 7 - n))
140*e7be843bSPierre Pronchery             return 0;
141*e7be843bSPierre Pronchery         c = ossl_list_int_next(c);
142*e7be843bSPierre Pronchery         d = ossl_list_int_prev(d);
143*e7be843bSPierre Pronchery         n++;
144*e7be843bSPierre Pronchery     }
145*e7be843bSPierre Pronchery     if (!TEST_ptr_null(c) || !TEST_ptr_null(d))
146*e7be843bSPierre Pronchery         return 0;
147*e7be843bSPierre Pronchery 
148*e7be843bSPierre Pronchery     /* Check removing the head of a two element list works */
149*e7be843bSPierre Pronchery     ossl_list_int_remove(&l, elem + 2);                     /* 3 4 5 */
150*e7be843bSPierre Pronchery     ossl_list_int_remove(&l, elem + 4);                     /* 3 5 */
151*e7be843bSPierre Pronchery     ossl_list_int_remove(&l, elem + 3);                     /* 5 */
152*e7be843bSPierre Pronchery     if (!TEST_ptr(ossl_list_int_head(&l))
153*e7be843bSPierre Pronchery             || !TEST_ptr(ossl_list_int_tail(&l))
154*e7be843bSPierre Pronchery             || !TEST_int_eq(ossl_list_int_head(&l)->n, 5)
155*e7be843bSPierre Pronchery             || !TEST_int_eq(ossl_list_int_tail(&l)->n, 5))
156*e7be843bSPierre Pronchery         return 0;
157*e7be843bSPierre Pronchery 
158*e7be843bSPierre Pronchery     /* Check removing the tail of a two element list works */
159*e7be843bSPierre Pronchery     ossl_list_int_insert_head(&l, elem);                    /* 0 5 */
160*e7be843bSPierre Pronchery     ossl_list_int_remove(&l, elem + 5);                     /* 0 */
161*e7be843bSPierre Pronchery     if (!TEST_ptr(ossl_list_int_head(&l))
162*e7be843bSPierre Pronchery             || !TEST_ptr(ossl_list_int_tail(&l))
163*e7be843bSPierre Pronchery             || !TEST_int_eq(ossl_list_int_head(&l)->n, 0)
164*e7be843bSPierre Pronchery             || !TEST_int_eq(ossl_list_int_tail(&l)->n, 0))
165*e7be843bSPierre Pronchery         return 0;
166*e7be843bSPierre Pronchery 
167*e7be843bSPierre Pronchery     /* Check removing the only element works */
168*e7be843bSPierre Pronchery     ossl_list_int_remove(&l, elem);
169*e7be843bSPierre Pronchery     if (!TEST_ptr_null(ossl_list_int_head(&l))
170*e7be843bSPierre Pronchery             || !TEST_ptr_null(ossl_list_int_tail(&l)))
171*e7be843bSPierre Pronchery         return 0;
172*e7be843bSPierre Pronchery     return 1;
173*e7be843bSPierre Pronchery }
174*e7be843bSPierre Pronchery 
setup_tests(void)175*e7be843bSPierre Pronchery int setup_tests(void)
176*e7be843bSPierre Pronchery {
177*e7be843bSPierre Pronchery     ADD_TEST(test_fizzbuzz);
178*e7be843bSPierre Pronchery     ADD_TEST(test_insert);
179*e7be843bSPierre Pronchery     return 1;
180*e7be843bSPierre Pronchery }
181