1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
/*
* SPDX-License-Identifier: BSD-2-Clause
*
* Author: Ivan Orlov <[email protected]>
*/
#include <sbi/sbi_bitmap.h>
#include <sbi/sbi_unit_test.h>
#define DATA_SIZE sizeof(data_zero)
#define DATA_BIT_SIZE (DATA_SIZE * 8)
static unsigned long data_a[] = { 0xDEADBEEF, 0x00BAB10C, 0x1BADB002, 0xABADBABE };
static unsigned long data_b[] = { 0xC00010FF, 0x00BAB10C, 0xBAAAAAAD, 0xBADDCAFE };
static unsigned long data_zero[] = { 0, 0, 0, 0 };
static void bitmap_and_test(struct sbiunit_test_case *test)
{
unsigned long res[DATA_SIZE];
unsigned long a_and_b[] = { data_a[0] & data_b[0], data_a[1] & data_b[1],
data_a[2] & data_b[2], data_a[3] & data_b[3] };
__bitmap_and(res, data_a, data_b, DATA_BIT_SIZE);
SBIUNIT_EXPECT_MEMEQ(test, res, a_and_b, DATA_SIZE);
/* a & a = a */
__bitmap_and(res, data_a, data_a, DATA_BIT_SIZE);
SBIUNIT_ASSERT_MEMEQ(test, res, data_a, DATA_SIZE);
/* a & 0 = 0 */
__bitmap_and(res, data_a, data_zero, DATA_BIT_SIZE);
SBIUNIT_EXPECT_MEMEQ(test, res, data_zero, DATA_SIZE);
/* 0 & 0 = 0 */
__bitmap_and(res, data_zero, data_zero, DATA_BIT_SIZE);
SBIUNIT_EXPECT_MEMEQ(test, res, data_zero, DATA_SIZE);
sbi_memcpy(res, data_zero, DATA_SIZE);
/* Cover zero 'bits' argument */
__bitmap_and(res, data_a, data_b, 0);
SBIUNIT_EXPECT_MEMEQ(test, res, data_zero, DATA_SIZE);
}
static void bitmap_or_test(struct sbiunit_test_case *test)
{
unsigned long res[DATA_SIZE];
unsigned long a_or_b[] = { data_a[0] | data_b[0], data_a[1] | data_b[1],
data_a[2] | data_b[2], data_a[3] | data_b[3] };
__bitmap_or(res, data_a, data_b, DATA_BIT_SIZE);
SBIUNIT_EXPECT_MEMEQ(test, res, a_or_b, DATA_SIZE);
/* a | a = a */
__bitmap_or(res, data_a, data_a, DATA_BIT_SIZE);
SBIUNIT_EXPECT_MEMEQ(test, res, data_a, DATA_SIZE);
/* a | 0 = a */
__bitmap_or(res, data_a, data_zero, DATA_BIT_SIZE);
SBIUNIT_EXPECT_MEMEQ(test, res, data_a, DATA_SIZE);
/* 0 | 0 = 0 */
__bitmap_or(res, data_zero, data_zero, DATA_BIT_SIZE);
SBIUNIT_EXPECT_MEMEQ(test, res, data_zero, DATA_SIZE);
sbi_memcpy(res, data_zero, DATA_SIZE);
__bitmap_or(res, data_a, data_b, 0);
SBIUNIT_EXPECT_MEMEQ(test, res, data_zero, DATA_SIZE);
}
static void bitmap_xor_test(struct sbiunit_test_case *test)
{
unsigned long res[DATA_SIZE];
unsigned long a_xor_b[] = { data_a[0] ^ data_b[0], data_a[1] ^ data_b[1],
data_a[2] ^ data_b[2], data_a[3] ^ data_b[3] };
__bitmap_xor(res, data_a, data_b, DATA_BIT_SIZE);
SBIUNIT_EXPECT_MEMEQ(test, res, a_xor_b, DATA_SIZE);
/* a ^ 0 = a */
__bitmap_xor(res, data_a, data_zero, DATA_BIT_SIZE);
SBIUNIT_EXPECT_MEMEQ(test, res, data_a, DATA_SIZE);
/* a ^ a = 0 */
__bitmap_xor(res, data_a, data_a, DATA_BIT_SIZE);
SBIUNIT_EXPECT_MEMEQ(test, res, data_zero, DATA_SIZE);
/* 0 ^ 0 = 0 */
__bitmap_xor(res, data_zero, data_zero, DATA_BIT_SIZE);
SBIUNIT_EXPECT_MEMEQ(test, res, data_zero, DATA_SIZE);
sbi_memcpy(res, data_zero, DATA_SIZE);
__bitmap_xor(res, data_a, data_b, 0);
SBIUNIT_EXPECT_MEMEQ(test, res, data_zero, DATA_SIZE);
}
static void bitmap_empty_test(struct sbiunit_test_case *test)
{
unsigned long res[DATA_SIZE];
/* All zeros = empty */
SBIUNIT_EXPECT_EQ(test, bitmap_empty(data_zero, DATA_BIT_SIZE), true);
/* Non-zero data = not empty */
SBIUNIT_EXPECT_EQ(test, bitmap_empty(data_a, DATA_BIT_SIZE), false);
SBIUNIT_EXPECT_EQ(test, bitmap_empty(data_b, DATA_BIT_SIZE), false);
/* bitmap_zero creates empty bitmap */
bitmap_zero(res, DATA_BIT_SIZE);
SBIUNIT_EXPECT_EQ(test, bitmap_empty(res, DATA_BIT_SIZE), true);
/* bitmap_fill creates non-empty bitmap */
bitmap_fill(res, DATA_BIT_SIZE);
SBIUNIT_EXPECT_EQ(test, bitmap_empty(res, DATA_BIT_SIZE), false);
/* Single bit set = not empty */
bitmap_zero(res, DATA_BIT_SIZE);
bitmap_set(res, 0, 1);
SBIUNIT_EXPECT_EQ(test, bitmap_empty(res, DATA_BIT_SIZE), false);
/* Zero nbits = empty */
SBIUNIT_EXPECT_EQ(test, bitmap_empty(data_a, 0), true);
}
static struct sbiunit_test_case bitmap_test_cases[] = {
SBIUNIT_TEST_CASE(bitmap_and_test),
SBIUNIT_TEST_CASE(bitmap_or_test),
SBIUNIT_TEST_CASE(bitmap_xor_test),
SBIUNIT_TEST_CASE(bitmap_empty_test),
SBIUNIT_END_CASE,
};
SBIUNIT_TEST_SUITE(bitmap_test_suite, bitmap_test_cases);
|