iofbirddaemon / lib / bitops_test.c @ 9b0a0ba9
History  View  Annotate  Download (2.4 KB)
1 
/*


2 
* BIRD Library  Generic Bit Operations Tests

3 
*

4 
* (c) 2015 CZ.NIC z.s.p.o.

5 
*

6 
* Can be freely distributed and used under the terms of the GNU GPL.

7 
*/

8  
9 
#include "test/birdtest.h" 
10 
#include "test/btutils.h" /* naive_pow() */ 
11  
12 
#include "lib/bitops.h" 
13  
14 
#define MAX_NUM 1000 
15 
#define CHECK_BIT(var,pos) ((var) & (u32)(1<<(pos))) 
16  
17 
static int 
18 
t_mkmask(void)

19 
{ 
20 
int i;

21 
u32 compute, expect; 
22  
23 
bt_assert(u32_mkmask(0) == 0x00000000); 
24 
for (i = 1; i <= 32; i++) 
25 
{ 
26 
compute = u32_mkmask(i); 
27 
expect = (u32) (0xffffffff << (32i)); 
28 
bt_assert_msg(compute == expect, "u32_mkmask(%d) = 0x%08X, expected 0x%08X", i, compute, expect);

29 
} 
30  
31 
return BT_SUCCESS;

32 
} 
33  
34 
static int 
35 
u32_masklen_expected(u32 mask) 
36 
{ 
37 
int j, expect = 0; 
38  
39 
int valid = 0; 
40 
for (j = 0; j <= 32; j++) 
41 
if (mask == (j ? (0xffffffff << (32j)) : 0)) /* Shifting 32bit value by 32 bits is undefined behavior */ 
42 
valid = 1;

43  
44 
if (!valid && mask != 0) 
45 
expect = 255;

46 
else

47 
for (j = 0; j <= 31; j++) 
48 
if (CHECK_BIT(mask, (31j))) 
49 
expect = j+1;

50 
else

51 
break;

52 
return expect;

53 
} 
54  
55 
static void 
56 
check_mask(u32 mask) 
57 
{ 
58 
int expected, masklen;

59  
60 
expected = u32_masklen_expected(mask); 
61 
masklen = u32_masklen(mask); 
62 
int ok = (expected == masklen);

63 
bt_debug("u32_masklen(Ox%08x) = %d, expected %d %s\n", mask, masklen, expected, ok ? "OK" : "FAIL!"); 
64 
bt_assert(ok); 
65 
} 
66  
67 
static int 
68 
t_masklen(void)

69 
{ 
70 
u32 i; 
71  
72 
check_mask(0x82828282);

73 
check_mask(0x00000000);

74  
75 
for (i = 0; i <= 32; i++) 
76 
check_mask(((u32) (i ? (0xffffffff << (32i)) : 0)) & 0xffffffff); /* Shifting 32bit value by 32 bits is undefined behavior */ 
77  
78 
for (i = 0; i <= MAX_NUM; i++) 
79 
check_mask(bt_random()); 
80  
81 
return BT_SUCCESS;

82 
} 
83  
84 
static void 
85 
check_log2(u32 n) 
86 
{ 
87 
u32 log = u32_log2(n); 
88 
u32 low = bt_naive_pow(2, log);

89 
u32 high = bt_naive_pow(2, log+1); 
90  
91 
bt_assert_msg(n >= low && n < high, 
92 
"u32_log2(%u) = %u, %u should be in the range <%u, %u)",

93 
n, log, n, low, high); 
94 
} 
95  
96 
static int 
97 
t_log2(void)

98 
{ 
99 
u32 i; 
100  
101 
for (i = 0; i < 31; i++) 
102 
bt_assert(u32_log2(bt_naive_pow(2, i+1)) == i+1); 
103  
104 
for (i = 1; i < MAX_NUM; i++) 
105 
check_log2(i); 
106  
107 
for (i = 1; i < MAX_NUM; i++) 
108 
check_log2(((u32) bt_random()) % 0x0fffffff);

109  
110 
return BT_SUCCESS;

111 
} 
112  
113 
int

114 
main(int argc, char *argv[]) 
115 
{ 
116 
bt_init(argc, argv); 
117  
118 
bt_test_suite(t_mkmask, "u32_mkmask()");

119 
bt_test_suite(t_masklen, "u32_masklen()");

120 
bt_test_suite(t_log2, "u32_log2()");

121  
122 
return bt_exit_value();

123 
} 