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