1 // Copyright (c) Microsoft Corporation. All rights reserved.
2 // Licensed under the MIT license.
3 
4 #include "seal/util/common.h"
5 #include "seal/util/uintcore.h"
6 #include <cstdint>
7 #include <cstring>
8 #include "gtest/gtest.h"
9 
10 using namespace seal::util;
11 using namespace std;
12 
13 namespace sealtest
14 {
15     namespace util
16     {
TEST(StringToUInt64,IsHexCharTest)17         TEST(StringToUInt64, IsHexCharTest)
18         {
19             ASSERT_TRUE(is_hex_char('0'));
20             ASSERT_TRUE(is_hex_char('1'));
21             ASSERT_TRUE(is_hex_char('2'));
22             ASSERT_TRUE(is_hex_char('3'));
23             ASSERT_TRUE(is_hex_char('4'));
24             ASSERT_TRUE(is_hex_char('5'));
25             ASSERT_TRUE(is_hex_char('6'));
26             ASSERT_TRUE(is_hex_char('7'));
27             ASSERT_TRUE(is_hex_char('8'));
28             ASSERT_TRUE(is_hex_char('9'));
29             ASSERT_TRUE(is_hex_char('A'));
30             ASSERT_TRUE(is_hex_char('B'));
31             ASSERT_TRUE(is_hex_char('C'));
32             ASSERT_TRUE(is_hex_char('D'));
33             ASSERT_TRUE(is_hex_char('E'));
34             ASSERT_TRUE(is_hex_char('F'));
35             ASSERT_TRUE(is_hex_char('a'));
36             ASSERT_TRUE(is_hex_char('b'));
37             ASSERT_TRUE(is_hex_char('c'));
38             ASSERT_TRUE(is_hex_char('d'));
39             ASSERT_TRUE(is_hex_char('e'));
40             ASSERT_TRUE(is_hex_char('f'));
41 
42             ASSERT_FALSE(is_hex_char('/'));
43             ASSERT_FALSE(is_hex_char(' '));
44             ASSERT_FALSE(is_hex_char('+'));
45             ASSERT_FALSE(is_hex_char('\\'));
46             ASSERT_FALSE(is_hex_char('G'));
47             ASSERT_FALSE(is_hex_char('g'));
48             ASSERT_FALSE(is_hex_char('Z'));
49             ASSERT_FALSE(is_hex_char('Z'));
50         }
51 
TEST(StringToUInt64,HexToNibbleTest)52         TEST(StringToUInt64, HexToNibbleTest)
53         {
54             ASSERT_EQ(0, hex_to_nibble('0'));
55             ASSERT_EQ(1, hex_to_nibble('1'));
56             ASSERT_EQ(2, hex_to_nibble('2'));
57             ASSERT_EQ(3, hex_to_nibble('3'));
58             ASSERT_EQ(4, hex_to_nibble('4'));
59             ASSERT_EQ(5, hex_to_nibble('5'));
60             ASSERT_EQ(6, hex_to_nibble('6'));
61             ASSERT_EQ(7, hex_to_nibble('7'));
62             ASSERT_EQ(8, hex_to_nibble('8'));
63             ASSERT_EQ(9, hex_to_nibble('9'));
64             ASSERT_EQ(10, hex_to_nibble('A'));
65             ASSERT_EQ(11, hex_to_nibble('B'));
66             ASSERT_EQ(12, hex_to_nibble('C'));
67             ASSERT_EQ(13, hex_to_nibble('D'));
68             ASSERT_EQ(14, hex_to_nibble('E'));
69             ASSERT_EQ(15, hex_to_nibble('F'));
70             ASSERT_EQ(10, hex_to_nibble('a'));
71             ASSERT_EQ(11, hex_to_nibble('b'));
72             ASSERT_EQ(12, hex_to_nibble('c'));
73             ASSERT_EQ(13, hex_to_nibble('d'));
74             ASSERT_EQ(14, hex_to_nibble('e'));
75             ASSERT_EQ(15, hex_to_nibble('f'));
76         }
77 
TEST(StringToUInt64,GetHexStringBitCount)78         TEST(StringToUInt64, GetHexStringBitCount)
79         {
80             ASSERT_EQ(0, get_hex_string_bit_count(nullptr, 0));
81             ASSERT_EQ(0, get_hex_string_bit_count("0", 1));
82             ASSERT_EQ(0, get_hex_string_bit_count("000000000", 9));
83             ASSERT_EQ(1, get_hex_string_bit_count("1", 1));
84             ASSERT_EQ(1, get_hex_string_bit_count("00001", 5));
85             ASSERT_EQ(2, get_hex_string_bit_count("2", 1));
86             ASSERT_EQ(2, get_hex_string_bit_count("00002", 5));
87             ASSERT_EQ(2, get_hex_string_bit_count("3", 1));
88             ASSERT_EQ(2, get_hex_string_bit_count("0003", 4));
89             ASSERT_EQ(3, get_hex_string_bit_count("4", 1));
90             ASSERT_EQ(3, get_hex_string_bit_count("5", 1));
91             ASSERT_EQ(3, get_hex_string_bit_count("6", 1));
92             ASSERT_EQ(3, get_hex_string_bit_count("7", 1));
93             ASSERT_EQ(4, get_hex_string_bit_count("8", 1));
94             ASSERT_EQ(4, get_hex_string_bit_count("9", 1));
95             ASSERT_EQ(4, get_hex_string_bit_count("A", 1));
96             ASSERT_EQ(4, get_hex_string_bit_count("B", 1));
97             ASSERT_EQ(4, get_hex_string_bit_count("C", 1));
98             ASSERT_EQ(4, get_hex_string_bit_count("D", 1));
99             ASSERT_EQ(4, get_hex_string_bit_count("E", 1));
100             ASSERT_EQ(4, get_hex_string_bit_count("F", 1));
101             ASSERT_EQ(5, get_hex_string_bit_count("10", 2));
102             ASSERT_EQ(5, get_hex_string_bit_count("00010", 5));
103             ASSERT_EQ(5, get_hex_string_bit_count("11", 2));
104             ASSERT_EQ(5, get_hex_string_bit_count("1F", 2));
105             ASSERT_EQ(6, get_hex_string_bit_count("20", 2));
106             ASSERT_EQ(6, get_hex_string_bit_count("2F", 2));
107             ASSERT_EQ(7, get_hex_string_bit_count("7F", 2));
108             ASSERT_EQ(7, get_hex_string_bit_count("0007F", 5));
109             ASSERT_EQ(8, get_hex_string_bit_count("80", 2));
110             ASSERT_EQ(8, get_hex_string_bit_count("FF", 2));
111             ASSERT_EQ(8, get_hex_string_bit_count("00FF", 4));
112             ASSERT_EQ(9, get_hex_string_bit_count("100", 3));
113             ASSERT_EQ(9, get_hex_string_bit_count("000100", 6));
114             ASSERT_EQ(22, get_hex_string_bit_count("200000", 6));
115             ASSERT_EQ(35, get_hex_string_bit_count("7FFF30001", 9));
116 
117             ASSERT_EQ(15, get_hex_string_bit_count("7FFF30001", 4));
118             ASSERT_EQ(3, get_hex_string_bit_count("7FFF30001", 1));
119             ASSERT_EQ(0, get_hex_string_bit_count("7FFF30001", 0));
120         }
121 
TEST(StringToUInt64,HexStringToUInt64)122         TEST(StringToUInt64, HexStringToUInt64)
123         {
124             uint64_t correct[3];
125             uint64_t parsed[3];
126 
127             correct[0] = 0;
128             correct[1] = 0;
129             correct[2] = 0;
130             parsed[0] = 0x123;
131             parsed[1] = 0x123;
132             parsed[2] = 0x123;
133             hex_string_to_uint("0", 1, 3, parsed);
134             ASSERT_EQ(0, memcmp(correct, parsed, 3 * sizeof(uint64_t)));
135             parsed[0] = 0x123;
136             parsed[1] = 0x123;
137             parsed[2] = 0x123;
138             hex_string_to_uint("0", 1, 1, parsed);
139             ASSERT_EQ(0, memcmp(correct, parsed, 1 * sizeof(uint64_t)));
140             parsed[0] = 0x123;
141             parsed[1] = 0x123;
142             parsed[2] = 0x123;
143             hex_string_to_uint(nullptr, 0, 3, parsed);
144             ASSERT_EQ(0, memcmp(correct, parsed, 3 * sizeof(uint64_t)));
145 
146             correct[0] = 1;
147             parsed[0] = 0x123;
148             parsed[1] = 0x123;
149             parsed[2] = 0x123;
150             hex_string_to_uint("1", 1, 3, parsed);
151             ASSERT_EQ(0, memcmp(correct, parsed, 3 * sizeof(uint64_t)));
152             parsed[0] = 0x123;
153             parsed[1] = 0x123;
154             parsed[2] = 0x123;
155             hex_string_to_uint("01", 2, 3, parsed);
156             ASSERT_EQ(0, memcmp(correct, parsed, 3 * sizeof(uint64_t)));
157             parsed[0] = 0x123;
158             parsed[1] = 0x123;
159             parsed[2] = 0x123;
160             hex_string_to_uint("001", 3, 1, parsed);
161             ASSERT_EQ(0, memcmp(correct, parsed, 1 * sizeof(uint64_t)));
162 
163             correct[0] = 0xF;
164             parsed[0] = 0x123;
165             parsed[1] = 0x123;
166             parsed[2] = 0x123;
167             hex_string_to_uint("F", 1, 3, parsed);
168             ASSERT_EQ(0, memcmp(correct, parsed, 3 * sizeof(uint64_t)));
169 
170             correct[0] = 0x10;
171             parsed[0] = 0x123;
172             parsed[1] = 0x123;
173             parsed[2] = 0x123;
174             hex_string_to_uint("10", 2, 3, parsed);
175             ASSERT_EQ(0, memcmp(correct, parsed, 3 * sizeof(uint64_t)));
176             parsed[0] = 0x123;
177             parsed[1] = 0x123;
178             parsed[2] = 0x123;
179             hex_string_to_uint("010", 3, 3, parsed);
180             ASSERT_EQ(0, memcmp(correct, parsed, 3 * sizeof(uint64_t)));
181 
182             correct[0] = 0x100;
183             parsed[0] = 0x123;
184             parsed[1] = 0x123;
185             parsed[2] = 0x123;
186             hex_string_to_uint("100", 3, 3, parsed);
187             ASSERT_EQ(0, memcmp(correct, parsed, 3 * sizeof(uint64_t)));
188 
189             correct[0] = 0x123;
190             parsed[0] = 0x123;
191             parsed[1] = 0x123;
192             parsed[2] = 0x123;
193             hex_string_to_uint("123", 3, 3, parsed);
194             ASSERT_EQ(0, memcmp(correct, parsed, 3 * sizeof(uint64_t)));
195             parsed[0] = 0x123;
196             parsed[1] = 0x123;
197             parsed[2] = 0x123;
198             hex_string_to_uint("00000123", 8, 3, parsed);
199             ASSERT_EQ(0, memcmp(correct, parsed, 3 * sizeof(uint64_t)));
200 
201             correct[0] = 0;
202             correct[1] = 1;
203             parsed[0] = 0x123;
204             parsed[1] = 0x123;
205             parsed[2] = 0x123;
206             hex_string_to_uint("10000000000000000", 17, 3, parsed);
207             ASSERT_EQ(0, memcmp(correct, parsed, 3 * sizeof(uint64_t)));
208 
209             correct[0] = 0x1123456789ABCDEF;
210             correct[1] = 0x1;
211             parsed[0] = 0x123;
212             parsed[1] = 0x123;
213             parsed[2] = 0x123;
214             hex_string_to_uint("11123456789ABCDEF", 17, 3, parsed);
215             ASSERT_EQ(0, memcmp(correct, parsed, 3 * sizeof(uint64_t)));
216             parsed[0] = 0x123;
217             parsed[1] = 0x123;
218             parsed[2] = 0x123;
219             hex_string_to_uint("000011123456789ABCDEF", 21, 3, parsed);
220             ASSERT_EQ(0, memcmp(correct, parsed, 3 * sizeof(uint64_t)));
221 
222             correct[0] = 0x3456789ABCDEF123;
223             correct[1] = 0x23456789ABCDEF12;
224             correct[2] = 0x123456789ABCDEF1;
225             parsed[0] = 0x123;
226             parsed[1] = 0x123;
227             parsed[2] = 0x123;
228             hex_string_to_uint("123456789ABCDEF123456789ABCDEF123456789ABCDEF123", 48, 3, parsed);
229             ASSERT_EQ(0, memcmp(correct, parsed, 3 * sizeof(uint64_t)));
230 
231             correct[0] = 0xFFFFFFFFFFFFFFFF;
232             correct[1] = 0xFFFFFFFFFFFFFFFF;
233             correct[2] = 0xFFFFFFFFFFFFFFFF;
234             parsed[0] = 0x123;
235             parsed[1] = 0x123;
236             parsed[2] = 0x123;
237             hex_string_to_uint("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", 48, 3, parsed);
238             ASSERT_EQ(0, memcmp(correct, parsed, 3 * sizeof(uint64_t)));
239 
240             correct[0] = 0x100;
241             correct[1] = 0;
242             correct[2] = 0;
243             parsed[0] = 0x123;
244             parsed[1] = 0x123;
245             parsed[2] = 0x123;
246             hex_string_to_uint("100", 3, 3, parsed);
247             ASSERT_EQ(0, memcmp(correct, parsed, 3 * sizeof(uint64_t)));
248 
249             correct[0] = 0x10;
250             parsed[0] = 0x123;
251             parsed[1] = 0x123;
252             parsed[2] = 0x123;
253             hex_string_to_uint("100", 2, 3, parsed);
254             ASSERT_EQ(0, memcmp(correct, parsed, 3 * sizeof(uint64_t)));
255 
256             correct[0] = 0x1;
257             parsed[0] = 0x123;
258             parsed[1] = 0x123;
259             parsed[2] = 0x123;
260             hex_string_to_uint("100", 1, 3, parsed);
261             ASSERT_EQ(0, memcmp(correct, parsed, 3 * sizeof(uint64_t)));
262 
263             correct[0] = 0;
264             parsed[0] = 0x123;
265             parsed[1] = 0x123;
266             parsed[2] = 0x123;
267             hex_string_to_uint("100", 0, 3, parsed);
268             ASSERT_EQ(0, memcmp(correct, parsed, 3 * sizeof(uint64_t)));
269         }
270     } // namespace util
271 } // namespace sealtest
272