xref: /openbsd-src/regress/usr.bin/ssh/unittests/bitmap/tests.c (revision a8c975d25b8973125837f3cd4c63b4a611f5c5f5)
1*a8c975d2Sderaadt /* 	$OpenBSD: tests.c,v 1.2 2021/12/14 21:25:27 deraadt Exp $ */
262b63b55Sdjm /*
362b63b55Sdjm  * Regress test for bitmap.h bitmap API
462b63b55Sdjm  *
562b63b55Sdjm  * Placed in the public domain
662b63b55Sdjm  */
762b63b55Sdjm 
862b63b55Sdjm #include <sys/types.h>
962b63b55Sdjm #include <stdio.h>
1062b63b55Sdjm #include <stdint.h>
1162b63b55Sdjm #include <stdlib.h>
1262b63b55Sdjm #include <string.h>
1362b63b55Sdjm 
1462b63b55Sdjm #include <openssl/bn.h>
1562b63b55Sdjm 
1662b63b55Sdjm #include "test_helper.h"
1762b63b55Sdjm 
1862b63b55Sdjm #include "bitmap.h"
1962b63b55Sdjm 
2062b63b55Sdjm #define NTESTS 131
2162b63b55Sdjm 
2262b63b55Sdjm void
tests(void)2362b63b55Sdjm tests(void)
2462b63b55Sdjm {
2562b63b55Sdjm 	struct bitmap *b;
2662b63b55Sdjm 	BIGNUM *bn;
2762b63b55Sdjm 	size_t len;
2862b63b55Sdjm 	int i, j, k, n;
2962b63b55Sdjm 	u_char bbuf[1024], bnbuf[1024];
3062b63b55Sdjm 	int r;
3162b63b55Sdjm 
3262b63b55Sdjm 	TEST_START("bitmap_new");
3362b63b55Sdjm 	b = bitmap_new();
3462b63b55Sdjm 	ASSERT_PTR_NE(b, NULL);
3562b63b55Sdjm 	bn = BN_new();
3662b63b55Sdjm 	ASSERT_PTR_NE(bn, NULL);
3762b63b55Sdjm 	TEST_DONE();
3862b63b55Sdjm 
3962b63b55Sdjm 	TEST_START("bitmap_set_bit / bitmap_test_bit");
4062b63b55Sdjm 	for (i = -1; i < NTESTS; i++) {
4162b63b55Sdjm 		for (j = -1; j < NTESTS; j++) {
4262b63b55Sdjm 			for (k = -1; k < NTESTS; k++) {
4362b63b55Sdjm 				bitmap_zero(b);
4462b63b55Sdjm 				BN_clear(bn);
4562b63b55Sdjm 
4662b63b55Sdjm 				test_subtest_info("set %d/%d/%d", i, j, k);
4762b63b55Sdjm 				/* Set bits */
4862b63b55Sdjm 				if (i >= 0) {
4962b63b55Sdjm 					ASSERT_INT_EQ(bitmap_set_bit(b, i), 0);
5062b63b55Sdjm 					ASSERT_INT_EQ(BN_set_bit(bn, i), 1);
5162b63b55Sdjm 				}
5262b63b55Sdjm 				if (j >= 0) {
5362b63b55Sdjm 					ASSERT_INT_EQ(bitmap_set_bit(b, j), 0);
5462b63b55Sdjm 					ASSERT_INT_EQ(BN_set_bit(bn, j), 1);
5562b63b55Sdjm 				}
5662b63b55Sdjm 				if (k >= 0) {
5762b63b55Sdjm 					ASSERT_INT_EQ(bitmap_set_bit(b, k), 0);
5862b63b55Sdjm 					ASSERT_INT_EQ(BN_set_bit(bn, k), 1);
5962b63b55Sdjm 				}
6062b63b55Sdjm 
6162b63b55Sdjm 				/* Check perfect match between bitmap and bn */
6262b63b55Sdjm 				test_subtest_info("match %d/%d/%d", i, j, k);
6362b63b55Sdjm 				for (n = 0; n < NTESTS; n++) {
6462b63b55Sdjm 					ASSERT_INT_EQ(BN_is_bit_set(bn, n),
6562b63b55Sdjm 					    bitmap_test_bit(b, n));
6662b63b55Sdjm 				}
6762b63b55Sdjm 
6862b63b55Sdjm 				/* Test length calculations */
6962b63b55Sdjm 				test_subtest_info("length %d/%d/%d", i, j, k);
7062b63b55Sdjm 				ASSERT_INT_EQ(BN_num_bits(bn),
7162b63b55Sdjm 				    (int)bitmap_nbits(b));
7262b63b55Sdjm 				ASSERT_INT_EQ(BN_num_bytes(bn),
7362b63b55Sdjm 				    (int)bitmap_nbytes(b));
7462b63b55Sdjm 
7562b63b55Sdjm 				/* Test serialisation */
7662b63b55Sdjm 				test_subtest_info("serialise %d/%d/%d",
7762b63b55Sdjm 				    i, j, k);
7862b63b55Sdjm 				len = bitmap_nbytes(b);
7962b63b55Sdjm 				memset(bbuf, 0xfc, sizeof(bbuf));
8062b63b55Sdjm 				ASSERT_INT_EQ(bitmap_to_string(b, bbuf,
8162b63b55Sdjm 				    sizeof(bbuf)), 0);
8262b63b55Sdjm 				for (n = len; n < (int)sizeof(bbuf); n++)
8362b63b55Sdjm 					ASSERT_U8_EQ(bbuf[n], 0xfc);
8462b63b55Sdjm 				r = BN_bn2bin(bn, bnbuf);
8562b63b55Sdjm 				ASSERT_INT_GE(r, 0);
8662b63b55Sdjm 				ASSERT_INT_EQ(r, (int)len);
8762b63b55Sdjm 				ASSERT_MEM_EQ(bbuf, bnbuf, len);
8862b63b55Sdjm 
8962b63b55Sdjm 				/* Test deserialisation */
9062b63b55Sdjm 				test_subtest_info("deserialise %d/%d/%d",
9162b63b55Sdjm 				    i, j, k);
9262b63b55Sdjm 				bitmap_zero(b);
9362b63b55Sdjm 				ASSERT_INT_EQ(bitmap_from_string(b, bnbuf,
9462b63b55Sdjm 				    len), 0);
9562b63b55Sdjm 				for (n = 0; n < NTESTS; n++) {
9662b63b55Sdjm 					ASSERT_INT_EQ(BN_is_bit_set(bn, n),
9762b63b55Sdjm 					    bitmap_test_bit(b, n));
9862b63b55Sdjm 				}
9962b63b55Sdjm 
10062b63b55Sdjm 				/* Test clearing bits */
10162b63b55Sdjm 				test_subtest_info("clear %d/%d/%d",
10262b63b55Sdjm 				    i, j, k);
10362b63b55Sdjm 				for (n = 0; n < NTESTS; n++) {
10462b63b55Sdjm 					ASSERT_INT_EQ(bitmap_set_bit(b, n), 0);
10562b63b55Sdjm 					ASSERT_INT_EQ(BN_set_bit(bn, n), 1);
10662b63b55Sdjm 				}
10762b63b55Sdjm 				if (i >= 0) {
10862b63b55Sdjm 					bitmap_clear_bit(b, i);
10962b63b55Sdjm 					BN_clear_bit(bn, i);
11062b63b55Sdjm 				}
11162b63b55Sdjm 				if (j >= 0) {
11262b63b55Sdjm 					bitmap_clear_bit(b, j);
11362b63b55Sdjm 					BN_clear_bit(bn, j);
11462b63b55Sdjm 				}
11562b63b55Sdjm 				if (k >= 0) {
11662b63b55Sdjm 					bitmap_clear_bit(b, k);
11762b63b55Sdjm 					BN_clear_bit(bn, k);
11862b63b55Sdjm 				}
11962b63b55Sdjm 				for (n = 0; n < NTESTS; n++) {
12062b63b55Sdjm 					ASSERT_INT_EQ(BN_is_bit_set(bn, n),
12162b63b55Sdjm 					    bitmap_test_bit(b, n));
12262b63b55Sdjm 				}
12362b63b55Sdjm 			}
12462b63b55Sdjm 		}
12562b63b55Sdjm 	}
12662b63b55Sdjm 	bitmap_free(b);
12762b63b55Sdjm 	BN_free(bn);
12862b63b55Sdjm 	TEST_DONE();
12962b63b55Sdjm }
13062b63b55Sdjm 
131