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