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