| 
									
										
										
										
											2022-09-02 12:44:02 +08:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Copyright 2022 The OpenSSL Project Authors. All Rights Reserved. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Licensed under the Apache License 2.0 (the "License").  You may not use | 
					
						
							|  |  |  |  * this file except in compliance with the License.  You can obtain a copy | 
					
						
							|  |  |  |  * in the file LICENSE in the source distribution or at | 
					
						
							|  |  |  |  * https://www.openssl.org/source/license.html
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <stdio.h>
 | 
					
						
							|  |  |  | #include <string.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <openssl/opensslconf.h>
 | 
					
						
							|  |  |  | #include <openssl/err.h>
 | 
					
						
							|  |  |  | #include <openssl/crypto.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "internal/list.h"
 | 
					
						
							|  |  |  | #include "internal/nelem.h"
 | 
					
						
							|  |  |  | #include "testutil.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct testl_st TESTL; | 
					
						
							|  |  |  | struct testl_st { | 
					
						
							|  |  |  |     int n; | 
					
						
							|  |  |  |     OSSL_LIST_MEMBER(fizz, TESTL); | 
					
						
							|  |  |  |     OSSL_LIST_MEMBER(buzz, TESTL); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | DEFINE_LIST_OF(fizz, TESTL); | 
					
						
							|  |  |  | DEFINE_LIST_OF(buzz, TESTL); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int test_fizzbuzz(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     OSSL_LIST(fizz) a; | 
					
						
							|  |  |  |     OSSL_LIST(buzz) b; | 
					
						
							|  |  |  |     TESTL elem[20]; | 
					
						
							|  |  |  |     const int nelem = OSSL_NELEM(elem); | 
					
						
							|  |  |  |     int i, na = 0, nb = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ossl_list_fizz_init(&a); | 
					
						
							|  |  |  |     ossl_list_buzz_init(&b); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-14 07:30:47 +08:00
										 |  |  |     if (!TEST_true(ossl_list_fizz_is_empty(&a))) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-02 12:44:02 +08:00
										 |  |  |     for (i = 1; i < nelem; i++) { | 
					
						
							| 
									
										
										
										
											2022-10-19 13:00:52 +08:00
										 |  |  |         ossl_list_fizz_init_elem(elem + i); | 
					
						
							|  |  |  |         ossl_list_buzz_init_elem(elem + i); | 
					
						
							| 
									
										
										
										
											2022-09-02 12:44:02 +08:00
										 |  |  |         elem[i].n = i; | 
					
						
							|  |  |  |         if (i % 3 == 0) { | 
					
						
							|  |  |  |             ossl_list_fizz_insert_tail(&a, elem + i); | 
					
						
							|  |  |  |             na++; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         if (i % 5 == 0) { | 
					
						
							|  |  |  |             ossl_list_buzz_insert_head(&b, elem + i); | 
					
						
							|  |  |  |             nb++; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-14 07:30:47 +08:00
										 |  |  |     if (!TEST_false(ossl_list_fizz_is_empty(&a)) | 
					
						
							|  |  |  |             || !TEST_size_t_eq(ossl_list_fizz_num(&a), na) | 
					
						
							| 
									
										
										
										
											2022-09-02 12:44:02 +08:00
										 |  |  |             || !TEST_size_t_eq(ossl_list_buzz_num(&b), nb) | 
					
						
							| 
									
										
										
										
											2022-09-06 09:41:35 +08:00
										 |  |  |             || !TEST_ptr(ossl_list_fizz_head(&a)) | 
					
						
							|  |  |  |             || !TEST_ptr(ossl_list_fizz_tail(&a)) | 
					
						
							|  |  |  |             || !TEST_ptr(ossl_list_buzz_head(&b)) | 
					
						
							|  |  |  |             || !TEST_ptr(ossl_list_buzz_tail(&b)) | 
					
						
							| 
									
										
										
										
											2022-09-02 12:44:02 +08:00
										 |  |  |             || !TEST_int_eq(ossl_list_fizz_head(&a)->n, 3) | 
					
						
							|  |  |  |             || !TEST_int_eq(ossl_list_fizz_tail(&a)->n, na * 3) | 
					
						
							|  |  |  |             || !TEST_int_eq(ossl_list_buzz_head(&b)->n, nb * 5) | 
					
						
							|  |  |  |             || !TEST_int_eq(ossl_list_buzz_tail(&b)->n, 5)) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  |     ossl_list_fizz_remove(&a, ossl_list_fizz_head(&a)); | 
					
						
							|  |  |  |     ossl_list_buzz_remove(&b, ossl_list_buzz_tail(&b)); | 
					
						
							|  |  |  |     if (!TEST_size_t_eq(ossl_list_fizz_num(&a), --na) | 
					
						
							|  |  |  |             || !TEST_size_t_eq(ossl_list_buzz_num(&b), --nb) | 
					
						
							| 
									
										
										
										
											2022-09-06 09:41:35 +08:00
										 |  |  |             || !TEST_ptr(ossl_list_fizz_head(&a)) | 
					
						
							|  |  |  |             || !TEST_ptr(ossl_list_buzz_tail(&b)) | 
					
						
							| 
									
										
										
										
											2022-09-02 12:44:02 +08:00
										 |  |  |             || !TEST_int_eq(ossl_list_fizz_head(&a)->n, 6) | 
					
						
							|  |  |  |             || !TEST_int_eq(ossl_list_buzz_tail(&b)->n, 10) | 
					
						
							| 
									
										
										
										
											2022-09-06 09:41:35 +08:00
										 |  |  |             || !TEST_ptr(ossl_list_fizz_next(ossl_list_fizz_head(&a))) | 
					
						
							|  |  |  |             || !TEST_ptr(ossl_list_fizz_prev(ossl_list_fizz_tail(&a))) | 
					
						
							| 
									
										
										
										
											2022-09-02 12:44:02 +08:00
										 |  |  |             || !TEST_int_eq(ossl_list_fizz_next(ossl_list_fizz_head(&a))->n, 9) | 
					
						
							|  |  |  |             || !TEST_int_eq(ossl_list_fizz_prev(ossl_list_fizz_tail(&a))->n, 15)) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  |     return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct int_st INTL; | 
					
						
							|  |  |  | struct int_st { | 
					
						
							|  |  |  |     int n; | 
					
						
							|  |  |  |     OSSL_LIST_MEMBER(int, INTL); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | DEFINE_LIST_OF(int, INTL); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int test_insert(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     INTL *c, *d; | 
					
						
							|  |  |  |     OSSL_LIST(int) l; | 
					
						
							|  |  |  |     INTL elem[20]; | 
					
						
							|  |  |  |     size_t i; | 
					
						
							|  |  |  |     int n = 1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ossl_list_int_init(&l); | 
					
						
							| 
									
										
										
										
											2022-10-19 13:00:52 +08:00
										 |  |  |     for (i = 0; i < OSSL_NELEM(elem); i++) { | 
					
						
							|  |  |  |         ossl_list_int_init_elem(elem + i); | 
					
						
							|  |  |  |         elem[i].n = i; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-09-02 12:44:02 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /* Check various insert options - head, tail, middle */ | 
					
						
							|  |  |  |     ossl_list_int_insert_head(&l, elem + 3);                /* 3 */ | 
					
						
							|  |  |  |     ossl_list_int_insert_tail(&l, elem + 6);                /* 3 6 */ | 
					
						
							|  |  |  |     ossl_list_int_insert_before(&l, elem + 6, elem + 5);    /* 3 5 6 */ | 
					
						
							|  |  |  |     ossl_list_int_insert_before(&l, elem + 3, elem + 1);    /* 1 3 5 6 */ | 
					
						
							|  |  |  |     ossl_list_int_insert_after(&l, elem + 1, elem + 2);     /* 1 2 3 5 6 */ | 
					
						
							|  |  |  |     ossl_list_int_insert_after(&l, elem + 6, elem + 7);     /* 1 2 3 5 6 7 */ | 
					
						
							|  |  |  |     ossl_list_int_insert_after(&l, elem + 3, elem + 4);     /* 1 2 3 4 5 6 7 */ | 
					
						
							|  |  |  |     if (!TEST_size_t_eq(ossl_list_int_num(&l), 7)) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  |     c = ossl_list_int_head(&l); | 
					
						
							|  |  |  |     d = ossl_list_int_tail(&l); | 
					
						
							|  |  |  |     while (c != NULL && d != NULL) { | 
					
						
							|  |  |  |         if (!TEST_int_eq(c->n, n) || !TEST_int_eq(d->n, 8 - n)) | 
					
						
							|  |  |  |             return 0; | 
					
						
							|  |  |  |         c = ossl_list_int_next(c); | 
					
						
							|  |  |  |         d = ossl_list_int_prev(d); | 
					
						
							|  |  |  |         n++; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if (!TEST_ptr_null(c) || !TEST_ptr_null(d)) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Check removing head, tail and middle */ | 
					
						
							|  |  |  |     ossl_list_int_remove(&l, elem + 1);                     /* 2 3 4 5 6 7 */ | 
					
						
							|  |  |  |     ossl_list_int_remove(&l, elem + 6);                     /* 2 3 4 5 7 */ | 
					
						
							|  |  |  |     ossl_list_int_remove(&l, elem + 7);                     /* 2 3 4 5 */ | 
					
						
							|  |  |  |     n = 2; | 
					
						
							|  |  |  |     c = ossl_list_int_head(&l); | 
					
						
							|  |  |  |     d = ossl_list_int_tail(&l); | 
					
						
							|  |  |  |     while (c != NULL && d != NULL) { | 
					
						
							|  |  |  |         if (!TEST_int_eq(c->n, n) || !TEST_int_eq(d->n, 7 - n)) | 
					
						
							|  |  |  |             return 0; | 
					
						
							|  |  |  |         c = ossl_list_int_next(c); | 
					
						
							|  |  |  |         d = ossl_list_int_prev(d); | 
					
						
							|  |  |  |         n++; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if (!TEST_ptr_null(c) || !TEST_ptr_null(d)) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Check removing the head of a two element list works */ | 
					
						
							|  |  |  |     ossl_list_int_remove(&l, elem + 2);                     /* 3 4 5 */ | 
					
						
							|  |  |  |     ossl_list_int_remove(&l, elem + 4);                     /* 3 5 */ | 
					
						
							|  |  |  |     ossl_list_int_remove(&l, elem + 3);                     /* 5 */ | 
					
						
							| 
									
										
										
										
											2022-09-06 09:41:35 +08:00
										 |  |  |     if (!TEST_ptr(ossl_list_int_head(&l)) | 
					
						
							|  |  |  |             || !TEST_ptr(ossl_list_int_tail(&l)) | 
					
						
							|  |  |  |             || !TEST_int_eq(ossl_list_int_head(&l)->n, 5) | 
					
						
							| 
									
										
										
										
											2022-09-02 12:44:02 +08:00
										 |  |  |             || !TEST_int_eq(ossl_list_int_tail(&l)->n, 5)) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Check removing the tail of a two element list works */ | 
					
						
							|  |  |  |     ossl_list_int_insert_head(&l, elem);                    /* 0 5 */ | 
					
						
							|  |  |  |     ossl_list_int_remove(&l, elem + 5);                     /* 0 */ | 
					
						
							| 
									
										
										
										
											2022-09-06 09:41:35 +08:00
										 |  |  |     if (!TEST_ptr(ossl_list_int_head(&l)) | 
					
						
							|  |  |  |             || !TEST_ptr(ossl_list_int_tail(&l)) | 
					
						
							|  |  |  |             || !TEST_int_eq(ossl_list_int_head(&l)->n, 0) | 
					
						
							| 
									
										
										
										
											2022-09-02 12:44:02 +08:00
										 |  |  |             || !TEST_int_eq(ossl_list_int_tail(&l)->n, 0)) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Check removing the only element works */ | 
					
						
							|  |  |  |     ossl_list_int_remove(&l, elem); | 
					
						
							|  |  |  |     if (!TEST_ptr_null(ossl_list_int_head(&l)) | 
					
						
							|  |  |  |             || !TEST_ptr_null(ossl_list_int_tail(&l))) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  |     return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int setup_tests(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     ADD_TEST(test_fizzbuzz); | 
					
						
							|  |  |  |     ADD_TEST(test_insert); | 
					
						
							|  |  |  |     return 1; | 
					
						
							|  |  |  | } |