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