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