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