1 /* 	$OpenBSD: tests.c,v 1.2 2021/12/14 21:25:27 deraadt Exp $ */
2 /*
3  * Regress test for bitmap.h bitmap API
4  *
5  * Placed in the public domain
6  */
7 
8 #include <sys/types.h>
9 #include <stdio.h>
10 #include <stdint.h>
11 #include <stdlib.h>
12 #include <string.h>
13 
14 #include <openssl/bn.h>
15 
16 #include "test_helper.h"
17 
18 #include "bitmap.h"
19 
20 #define NTESTS 131
21 
22 void
23 tests(void)
24 {
25 	struct bitmap *b;
26 	BIGNUM *bn;
27 	size_t len;
28 	int i, j, k, n;
29 	u_char bbuf[1024], bnbuf[1024];
30 	int r;
31 
32 	TEST_START("bitmap_new");
33 	b = bitmap_new();
34 	ASSERT_PTR_NE(b, NULL);
35 	bn = BN_new();
36 	ASSERT_PTR_NE(bn, NULL);
37 	TEST_DONE();
38 
39 	TEST_START("bitmap_set_bit / bitmap_test_bit");
40 	for (i = -1; i < NTESTS; i++) {
41 		for (j = -1; j < NTESTS; j++) {
42 			for (k = -1; k < NTESTS; k++) {
43 				bitmap_zero(b);
44 				BN_clear(bn);
45 
46 				test_subtest_info("set %d/%d/%d", i, j, k);
47 				/* Set bits */
48 				if (i >= 0) {
49 					ASSERT_INT_EQ(bitmap_set_bit(b, i), 0);
50 					ASSERT_INT_EQ(BN_set_bit(bn, i), 1);
51 				}
52 				if (j >= 0) {
53 					ASSERT_INT_EQ(bitmap_set_bit(b, j), 0);
54 					ASSERT_INT_EQ(BN_set_bit(bn, j), 1);
55 				}
56 				if (k >= 0) {
57 					ASSERT_INT_EQ(bitmap_set_bit(b, k), 0);
58 					ASSERT_INT_EQ(BN_set_bit(bn, k), 1);
59 				}
60 
61 				/* Check perfect match between bitmap and bn */
62 				test_subtest_info("match %d/%d/%d", i, j, k);
63 				for (n = 0; n < NTESTS; n++) {
64 					ASSERT_INT_EQ(BN_is_bit_set(bn, n),
65 					    bitmap_test_bit(b, n));
66 				}
67 
68 				/* Test length calculations */
69 				test_subtest_info("length %d/%d/%d", i, j, k);
70 				ASSERT_INT_EQ(BN_num_bits(bn),
71 				    (int)bitmap_nbits(b));
72 				ASSERT_INT_EQ(BN_num_bytes(bn),
73 				    (int)bitmap_nbytes(b));
74 
75 				/* Test serialisation */
76 				test_subtest_info("serialise %d/%d/%d",
77 				    i, j, k);
78 				len = bitmap_nbytes(b);
79 				memset(bbuf, 0xfc, sizeof(bbuf));
80 				ASSERT_INT_EQ(bitmap_to_string(b, bbuf,
81 				    sizeof(bbuf)), 0);
82 				for (n = len; n < (int)sizeof(bbuf); n++)
83 					ASSERT_U8_EQ(bbuf[n], 0xfc);
84 				r = BN_bn2bin(bn, bnbuf);
85 				ASSERT_INT_GE(r, 0);
86 				ASSERT_INT_EQ(r, (int)len);
87 				ASSERT_MEM_EQ(bbuf, bnbuf, len);
88 
89 				/* Test deserialisation */
90 				test_subtest_info("deserialise %d/%d/%d",
91 				    i, j, k);
92 				bitmap_zero(b);
93 				ASSERT_INT_EQ(bitmap_from_string(b, bnbuf,
94 				    len), 0);
95 				for (n = 0; n < NTESTS; n++) {
96 					ASSERT_INT_EQ(BN_is_bit_set(bn, n),
97 					    bitmap_test_bit(b, n));
98 				}
99 
100 				/* Test clearing bits */
101 				test_subtest_info("clear %d/%d/%d",
102 				    i, j, k);
103 				for (n = 0; n < NTESTS; n++) {
104 					ASSERT_INT_EQ(bitmap_set_bit(b, n), 0);
105 					ASSERT_INT_EQ(BN_set_bit(bn, n), 1);
106 				}
107 				if (i >= 0) {
108 					bitmap_clear_bit(b, i);
109 					BN_clear_bit(bn, i);
110 				}
111 				if (j >= 0) {
112 					bitmap_clear_bit(b, j);
113 					BN_clear_bit(bn, j);
114 				}
115 				if (k >= 0) {
116 					bitmap_clear_bit(b, k);
117 					BN_clear_bit(bn, k);
118 				}
119 				for (n = 0; n < NTESTS; n++) {
120 					ASSERT_INT_EQ(BN_is_bit_set(bn, n),
121 					    bitmap_test_bit(b, n));
122 				}
123 			}
124 		}
125 	}
126 	bitmap_free(b);
127 	BN_free(bn);
128 	TEST_DONE();
129 }
130 
131