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