1285031Sdes/* 	$OpenBSD: tests.c,v 1.1 2015/01/15 07:36:28 djm Exp $ */
2285031Sdes/*
3285031Sdes * Regress test for bitmap.h bitmap API
4285031Sdes *
5285031Sdes * Placed in the public domain
6285031Sdes */
7285031Sdes
8285031Sdes#include "includes.h"
9285031Sdes
10285031Sdes#include <sys/types.h>
11285031Sdes#include <sys/param.h>
12285031Sdes#include <stdio.h>
13285031Sdes#ifdef HAVE_STDINT_H
14285031Sdes#include <stdint.h>
15285031Sdes#endif
16285031Sdes#include <stdlib.h>
17285031Sdes#include <string.h>
18285031Sdes
19285031Sdes#include <openssl/bn.h>
20285031Sdes
21285031Sdes#include "../test_helper/test_helper.h"
22285031Sdes
23285031Sdes#include "bitmap.h"
24285031Sdes
25285031Sdes#define NTESTS 131
26285031Sdes
27285031Sdesvoid
28285031Sdestests(void)
29285031Sdes{
30285031Sdes	struct bitmap *b;
31285031Sdes	BIGNUM *bn;
32285031Sdes	size_t len;
33285031Sdes	int i, j, k, n;
34285031Sdes	u_char bbuf[1024], bnbuf[1024];
35285031Sdes	int r;
36285031Sdes
37285031Sdes	TEST_START("bitmap_new");
38285031Sdes	b = bitmap_new();
39285031Sdes	ASSERT_PTR_NE(b, NULL);
40285031Sdes	bn = BN_new();
41285031Sdes	ASSERT_PTR_NE(bn, NULL);
42285031Sdes	TEST_DONE();
43285031Sdes
44285031Sdes	TEST_START("bitmap_set_bit / bitmap_test_bit");
45285031Sdes	for (i = -1; i < NTESTS; i++) {
46285031Sdes		for (j = -1; j < NTESTS; j++) {
47285031Sdes			for (k = -1; k < NTESTS; k++) {
48285031Sdes				bitmap_zero(b);
49285031Sdes				BN_clear(bn);
50285031Sdes
51285031Sdes				test_subtest_info("set %d/%d/%d", i, j, k);
52285031Sdes				/* Set bits */
53285031Sdes				if (i >= 0) {
54285031Sdes					ASSERT_INT_EQ(bitmap_set_bit(b, i), 0);
55285031Sdes					ASSERT_INT_EQ(BN_set_bit(bn, i), 1);
56285031Sdes				}
57285031Sdes				if (j >= 0) {
58285031Sdes					ASSERT_INT_EQ(bitmap_set_bit(b, j), 0);
59285031Sdes					ASSERT_INT_EQ(BN_set_bit(bn, j), 1);
60285031Sdes				}
61285031Sdes				if (k >= 0) {
62285031Sdes					ASSERT_INT_EQ(bitmap_set_bit(b, k), 0);
63285031Sdes					ASSERT_INT_EQ(BN_set_bit(bn, k), 1);
64285031Sdes				}
65285031Sdes
66285031Sdes				/* Check perfect match between bitmap and bn */
67285031Sdes				test_subtest_info("match %d/%d/%d", i, j, k);
68285031Sdes				for (n = 0; n < NTESTS; n++) {
69285031Sdes					ASSERT_INT_EQ(BN_is_bit_set(bn, n),
70285031Sdes					    bitmap_test_bit(b, n));
71285031Sdes				}
72285031Sdes
73285031Sdes				/* Test length calculations */
74285031Sdes				test_subtest_info("length %d/%d/%d", i, j, k);
75285031Sdes				ASSERT_INT_EQ(BN_num_bits(bn),
76285031Sdes				    (int)bitmap_nbits(b));
77285031Sdes				ASSERT_INT_EQ(BN_num_bytes(bn),
78285031Sdes				    (int)bitmap_nbytes(b));
79285031Sdes
80285031Sdes				/* Test serialisation */
81285031Sdes				test_subtest_info("serialise %d/%d/%d",
82285031Sdes				    i, j, k);
83285031Sdes				len = bitmap_nbytes(b);
84285031Sdes				memset(bbuf, 0xfc, sizeof(bbuf));
85285031Sdes				ASSERT_INT_EQ(bitmap_to_string(b, bbuf,
86285031Sdes				    sizeof(bbuf)), 0);
87285031Sdes				for (n = len; n < (int)sizeof(bbuf); n++)
88285031Sdes					ASSERT_U8_EQ(bbuf[n], 0xfc);
89285031Sdes				r = BN_bn2bin(bn, bnbuf);
90285031Sdes				ASSERT_INT_GE(r, 0);
91285031Sdes				ASSERT_INT_EQ(r, (int)len);
92285031Sdes				ASSERT_MEM_EQ(bbuf, bnbuf, len);
93285031Sdes
94285031Sdes				/* Test deserialisation */
95285031Sdes				test_subtest_info("deserialise %d/%d/%d",
96285031Sdes				    i, j, k);
97285031Sdes				bitmap_zero(b);
98285031Sdes				ASSERT_INT_EQ(bitmap_from_string(b, bnbuf,
99285031Sdes				    len), 0);
100285031Sdes				for (n = 0; n < NTESTS; n++) {
101285031Sdes					ASSERT_INT_EQ(BN_is_bit_set(bn, n),
102285031Sdes					    bitmap_test_bit(b, n));
103285031Sdes				}
104285031Sdes
105285031Sdes				/* Test clearing bits */
106285031Sdes				test_subtest_info("clear %d/%d/%d",
107285031Sdes				    i, j, k);
108285031Sdes				for (n = 0; n < NTESTS; n++) {
109285031Sdes					ASSERT_INT_EQ(bitmap_set_bit(b, n), 0);
110285031Sdes					ASSERT_INT_EQ(BN_set_bit(bn, n), 1);
111285031Sdes				}
112285031Sdes				if (i >= 0) {
113285031Sdes					bitmap_clear_bit(b, i);
114285031Sdes					BN_clear_bit(bn, i);
115285031Sdes				}
116285031Sdes				if (j >= 0) {
117285031Sdes					bitmap_clear_bit(b, j);
118285031Sdes					BN_clear_bit(bn, j);
119285031Sdes				}
120285031Sdes				if (k >= 0) {
121285031Sdes					bitmap_clear_bit(b, k);
122285031Sdes					BN_clear_bit(bn, k);
123285031Sdes				}
124285031Sdes				for (n = 0; n < NTESTS; n++) {
125285031Sdes					ASSERT_INT_EQ(BN_is_bit_set(bn, n),
126285031Sdes					    bitmap_test_bit(b, n));
127285031Sdes				}
128285031Sdes			}
129285031Sdes		}
130285031Sdes	}
131285031Sdes	bitmap_free(b);
132285031Sdes	BN_free(bn);
133285031Sdes	TEST_DONE();
134285031Sdes}
135285031Sdes
136