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