tests.c revision 295367
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
27void
28tests(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