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