OLD | NEW |
(Empty) | |
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "components/physical_web/eddystone/eddystone_encoder.h" |
| 6 |
| 7 #include <algorithm> |
| 8 #include <vector> |
| 9 |
| 10 #include "testing/gtest/include/gtest/gtest.h" |
| 11 |
| 12 using std::string; |
| 13 using std::vector; |
| 14 using std::equal; |
| 15 |
| 16 class EddystoneEncoderTest : public testing::Test { |
| 17 public: |
| 18 EddystoneEncoderTest() {} |
| 19 ~EddystoneEncoderTest() override {} |
| 20 |
| 21 void SetUp() override {} |
| 22 void TearDown() override {} |
| 23 |
| 24 bool ByteVectorEquals(const vector<uint8_t>& a, const vector<uint8_t>& b); |
| 25 }; |
| 26 |
| 27 bool EddystoneEncoderTest::ByteVectorEquals(const vector<uint8_t>& a, |
| 28 const vector<uint8_t>& b) { |
| 29 if (a.size() != b.size()) { |
| 30 return false; |
| 31 } |
| 32 return equal(a.begin(), a.end(), b.begin()); |
| 33 } |
| 34 |
| 35 TEST_F(EddystoneEncoderTest, NullVector) { |
| 36 string valid_url = "https://www.aurl.com/"; |
| 37 |
| 38 size_t expected_result = physical_web::kNullEncodedUrl; |
| 39 size_t actual_result; |
| 40 |
| 41 actual_result = physical_web::EncodeUrl(valid_url, NULL); |
| 42 |
| 43 EXPECT_TRUE(expected_result == actual_result); |
| 44 } |
| 45 |
| 46 TEST_F(EddystoneEncoderTest, EmptyUrl) { |
| 47 string empty_url = ""; |
| 48 |
| 49 size_t expected_result = physical_web::kEmptyUrl; |
| 50 size_t actual_result; |
| 51 vector<uint8_t> expected_vector; |
| 52 vector<uint8_t> actual_vector; |
| 53 |
| 54 actual_result = physical_web::EncodeUrl(empty_url, &actual_vector); |
| 55 |
| 56 EXPECT_TRUE(expected_result == actual_result); |
| 57 EXPECT_TRUE(ByteVectorEquals(expected_vector, actual_vector)); |
| 58 } |
| 59 |
| 60 TEST_F(EddystoneEncoderTest, testTotallyInvalidUrl) { |
| 61 string invalid_url = "InValidURL.duh"; |
| 62 |
| 63 size_t expected_result = physical_web::kInvalidUrl; |
| 64 size_t actual_result; |
| 65 vector<uint8_t> expected_vector; |
| 66 vector<uint8_t> actual_vector; |
| 67 |
| 68 actual_result = physical_web::EncodeUrl(invalid_url, &actual_vector); |
| 69 |
| 70 EXPECT_TRUE(expected_result == actual_result); |
| 71 EXPECT_TRUE(ByteVectorEquals(expected_vector, actual_vector)); |
| 72 } |
| 73 |
| 74 TEST_F(EddystoneEncoderTest, testAlmostvalidUrl) { |
| 75 string invalid_url = "https;//.com"; |
| 76 |
| 77 size_t expected_result = physical_web::kInvalidUrl; |
| 78 size_t actual_result; |
| 79 vector<uint8_t> expected_vector; |
| 80 vector<uint8_t> actual_vector; |
| 81 |
| 82 actual_result = physical_web::EncodeUrl(invalid_url, &actual_vector); |
| 83 |
| 84 EXPECT_TRUE(expected_result == actual_result); |
| 85 EXPECT_TRUE(ByteVectorEquals(expected_vector, actual_vector)); |
| 86 } |
| 87 |
| 88 TEST_F(EddystoneEncoderTest, testIPAddressUrl) { |
| 89 string invalid_url = "https://8.8.8.8/"; |
| 90 |
| 91 size_t expected_result = physical_web::kInvalidFormat; |
| 92 size_t actual_result; |
| 93 vector<uint8_t> expected_vector; |
| 94 vector<uint8_t> actual_vector; |
| 95 |
| 96 actual_result = physical_web::EncodeUrl(invalid_url, &actual_vector); |
| 97 |
| 98 EXPECT_TRUE(expected_result == actual_result); |
| 99 EXPECT_TRUE(ByteVectorEquals(expected_vector, actual_vector)); |
| 100 } |
| 101 |
| 102 TEST_F(EddystoneEncoderTest, testInvalidProtocol) { |
| 103 string invalid_url = "file://data/foo.com/it"; |
| 104 |
| 105 size_t expected_result = physical_web::kInvalidFormat; |
| 106 size_t actual_result; |
| 107 vector<uint8_t> expected_vector; |
| 108 vector<uint8_t> actual_vector; |
| 109 |
| 110 actual_result = physical_web::EncodeUrl(invalid_url, &actual_vector); |
| 111 |
| 112 EXPECT_TRUE(expected_result == actual_result); |
| 113 EXPECT_TRUE(ByteVectorEquals(expected_vector, actual_vector)); |
| 114 } |
| 115 |
| 116 TEST_F(EddystoneEncoderTest, testShortUrl) { |
| 117 string url = "http://a.com"; |
| 118 uint8_t expected_array[] = {0x02, // "http://" |
| 119 0x61, // "a" |
| 120 0x07}; // ".com" |
| 121 size_t expected_array_length = sizeof(expected_array) / sizeof(uint8_t); |
| 122 |
| 123 size_t expected_result = expected_array_length; |
| 124 size_t actual_result; |
| 125 |
| 126 vector<uint8_t> expected_vector(expected_array, |
| 127 expected_array + expected_array_length); |
| 128 vector<uint8_t> actual_vector; |
| 129 |
| 130 actual_result = physical_web::EncodeUrl(url, &actual_vector); |
| 131 |
| 132 EXPECT_TRUE(expected_result == actual_result); |
| 133 EXPECT_TRUE(ByteVectorEquals(expected_vector, actual_vector)); |
| 134 } |
| 135 |
| 136 TEST_F(EddystoneEncoderTest, testStandardUrl) { |
| 137 string url = "https://www.example.com/"; |
| 138 uint8_t expected_array[] = {0x01, // "https://www." |
| 139 0x65, 0x78, 0x61, 0x6d, |
| 140 0x70, 0x6c, 0x65, // "example" |
| 141 0x00}; // ".com/" |
| 142 size_t expected_array_length = sizeof(expected_array) / sizeof(uint8_t); |
| 143 |
| 144 size_t expected_result = expected_array_length; |
| 145 size_t actual_result; |
| 146 |
| 147 vector<uint8_t> expected_vector(expected_array, |
| 148 expected_array + expected_array_length); |
| 149 vector<uint8_t> actual_vector; |
| 150 |
| 151 actual_result = physical_web::EncodeUrl(url, &actual_vector); |
| 152 |
| 153 EXPECT_TRUE(expected_result == actual_result); |
| 154 EXPECT_TRUE(ByteVectorEquals(expected_vector, actual_vector)); |
| 155 } |
| 156 |
| 157 TEST_F(EddystoneEncoderTest, testStandardHttpUrl) { |
| 158 string url = "http://www.example.com/"; |
| 159 uint8_t expected_array[] = {0x00, // "http://www." |
| 160 0x65, 0x78, 0x61, 0x6d, |
| 161 0x70, 0x6c, 0x65, // "example" |
| 162 0x00}; // ".com/" |
| 163 size_t expected_array_length = sizeof(expected_array) / sizeof(uint8_t); |
| 164 |
| 165 size_t expected_result = expected_array_length; |
| 166 size_t actual_result; |
| 167 |
| 168 vector<uint8_t> expected_vector(expected_array, |
| 169 expected_array + expected_array_length); |
| 170 vector<uint8_t> actual_vector; |
| 171 |
| 172 actual_result = physical_web::EncodeUrl(url, &actual_vector); |
| 173 |
| 174 EXPECT_TRUE(expected_result == actual_result); |
| 175 EXPECT_TRUE(ByteVectorEquals(expected_vector, actual_vector)); |
| 176 } |
| 177 |
| 178 TEST_F(EddystoneEncoderTest, testStandardHttpUrlWithoutSuffixSlash) { |
| 179 string url = "http://www.example.com"; |
| 180 uint8_t expected_array[] = {0x00, // "http://www." |
| 181 0x65, 0x78, 0x61, 0x6d, |
| 182 0x70, 0x6c, 0x65, // "example" |
| 183 0x07}; // ".com" |
| 184 size_t expected_array_length = sizeof(expected_array) / sizeof(uint8_t); |
| 185 |
| 186 size_t expected_result = expected_array_length; |
| 187 size_t actual_result; |
| 188 |
| 189 vector<uint8_t> expected_vector(expected_array, |
| 190 expected_array + expected_array_length); |
| 191 vector<uint8_t> actual_vector; |
| 192 |
| 193 actual_result = physical_web::EncodeUrl(url, &actual_vector); |
| 194 |
| 195 EXPECT_TRUE(expected_result == actual_result); |
| 196 EXPECT_TRUE(ByteVectorEquals(expected_vector, actual_vector)); |
| 197 } |
| 198 |
| 199 TEST_F(EddystoneEncoderTest, testStandardInfoUrl) { |
| 200 string url = "https://www.example.info/"; |
| 201 uint8_t expected_array[] = {0x01, // "https://www." |
| 202 0x65, 0x78, 0x61, 0x6d, |
| 203 0x70, 0x6c, 0x65, // "example" |
| 204 0x04}; // ".info/" |
| 205 size_t expected_array_length = sizeof(expected_array) / sizeof(uint8_t); |
| 206 |
| 207 size_t expected_result = expected_array_length; |
| 208 size_t actual_result; |
| 209 |
| 210 vector<uint8_t> expected_vector(expected_array, |
| 211 expected_array + expected_array_length); |
| 212 vector<uint8_t> actual_vector; |
| 213 |
| 214 actual_result = physical_web::EncodeUrl(url, &actual_vector); |
| 215 |
| 216 EXPECT_TRUE(expected_result == actual_result); |
| 217 EXPECT_TRUE(ByteVectorEquals(expected_vector, actual_vector)); |
| 218 } |
| 219 |
| 220 TEST_F(EddystoneEncoderTest, testAllowsSubDomains) { |
| 221 string url = "https://www.example.cs.com/"; |
| 222 uint8_t expected_array[] = {0x01, // "https://www." |
| 223 0x65, 0x78, 0x61, 0x6d, |
| 224 0x70, 0x6c, 0x65, // "example" |
| 225 0x2e, 0x63, 0x73, // ".cs" |
| 226 0x00}; // ".com/" |
| 227 size_t expected_array_length = sizeof(expected_array) / sizeof(uint8_t); |
| 228 |
| 229 size_t expected_result = expected_array_length; |
| 230 size_t actual_result; |
| 231 |
| 232 vector<uint8_t> expected_vector(expected_array, |
| 233 expected_array + expected_array_length); |
| 234 vector<uint8_t> actual_vector; |
| 235 |
| 236 actual_result = physical_web::EncodeUrl(url, &actual_vector); |
| 237 |
| 238 EXPECT_TRUE(expected_result == actual_result); |
| 239 EXPECT_TRUE(ByteVectorEquals(expected_vector, actual_vector)); |
| 240 } |
| 241 |
| 242 TEST_F(EddystoneEncoderTest, testAllowsPaths) { |
| 243 string url = "https://www.example.cs.com/r"; |
| 244 uint8_t expected_array[] = {0x01, // "https://www." |
| 245 0x65, 0x78, 0x61, 0x6d, |
| 246 0x70, 0x6c, 0x65, // "example" |
| 247 0x2e, 0x63, 0x73, // ".cs" |
| 248 0x00, // ".com/" |
| 249 0x72}; // "r" |
| 250 size_t expected_array_length = sizeof(expected_array) / sizeof(uint8_t); |
| 251 |
| 252 size_t expected_result = expected_array_length; |
| 253 size_t actual_result; |
| 254 |
| 255 vector<uint8_t> expected_vector(expected_array, |
| 256 expected_array + expected_array_length); |
| 257 vector<uint8_t> actual_vector; |
| 258 |
| 259 actual_result = physical_web::EncodeUrl(url, &actual_vector); |
| 260 |
| 261 EXPECT_TRUE(expected_result == actual_result); |
| 262 EXPECT_TRUE(ByteVectorEquals(expected_vector, actual_vector)); |
| 263 } |
| 264 |
| 265 TEST_F(EddystoneEncoderTest, testAllowsMultiplePaths) { |
| 266 string url = "https://www.example.cs.com/r/red/it"; |
| 267 uint8_t expected_array[] = { |
| 268 0x01, // "https://www." |
| 269 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, // "example" |
| 270 0x2e, 0x63, 0x73, // ".cs" |
| 271 0x00, // ".com/" |
| 272 0x72, 0x2f, 0x72, 0x65, 0x64, 0x2f, 0x69, 0x74}; // "r/red/it" |
| 273 size_t expected_array_length = sizeof(expected_array) / sizeof(uint8_t); |
| 274 |
| 275 size_t expected_result = expected_array_length; |
| 276 size_t actual_result; |
| 277 |
| 278 vector<uint8_t> expected_vector(expected_array, |
| 279 expected_array + expected_array_length); |
| 280 vector<uint8_t> actual_vector; |
| 281 |
| 282 actual_result = physical_web::EncodeUrl(url, &actual_vector); |
| 283 |
| 284 EXPECT_TRUE(expected_result == actual_result); |
| 285 EXPECT_TRUE(ByteVectorEquals(expected_vector, actual_vector)); |
| 286 } |
| 287 |
| 288 TEST_F(EddystoneEncoderTest, testHiddenCompression1) { |
| 289 string url = "https://www.example.com/foo.com"; |
| 290 uint8_t expected_array[] = {0x01, // "https://www." |
| 291 0x65, 0x78, 0x61, 0x6d, |
| 292 0x70, 0x6c, 0x65, // "example" |
| 293 0x00, // ".com/" |
| 294 0x66, 0x6f, 0x6f, // "foo" |
| 295 0x07}; // ".com" |
| 296 size_t expected_array_length = sizeof(expected_array) / sizeof(uint8_t); |
| 297 |
| 298 size_t expected_result = expected_array_length; |
| 299 size_t actual_result; |
| 300 |
| 301 vector<uint8_t> expected_vector(expected_array, |
| 302 expected_array + expected_array_length); |
| 303 vector<uint8_t> actual_vector; |
| 304 |
| 305 actual_result = physical_web::EncodeUrl(url, &actual_vector); |
| 306 |
| 307 EXPECT_TRUE(expected_result == actual_result); |
| 308 EXPECT_TRUE(ByteVectorEquals(expected_vector, actual_vector)); |
| 309 } |
| 310 |
| 311 TEST_F(EddystoneEncoderTest, testHiddenCompression2) { |
| 312 string url = "https://www.example.com/foo.comma/"; |
| 313 uint8_t expected_array[] = {0x01, // "https://www." |
| 314 0x65, 0x78, 0x61, 0x6d, |
| 315 0x70, 0x6c, 0x65, // "example" |
| 316 0x00, // ".com/" |
| 317 0x66, 0x6f, 0x6f, // "foo" |
| 318 0x07, // ".com" |
| 319 0x6d, 0x61, 0x2f}; // "ma/" |
| 320 size_t expected_array_length = sizeof(expected_array) / sizeof(uint8_t); |
| 321 |
| 322 size_t expected_result = expected_array_length; |
| 323 size_t actual_result; |
| 324 |
| 325 vector<uint8_t> expected_vector(expected_array, |
| 326 expected_array + expected_array_length); |
| 327 vector<uint8_t> actual_vector; |
| 328 |
| 329 actual_result = physical_web::EncodeUrl(url, &actual_vector); |
| 330 |
| 331 EXPECT_TRUE(expected_result == actual_result); |
| 332 EXPECT_TRUE(ByteVectorEquals(expected_vector, actual_vector)); |
| 333 } |
| 334 |
| 335 TEST_F(EddystoneEncoderTest, testSharedCompression) { |
| 336 string url = "https://www.communities.com/"; |
| 337 uint8_t expected_array[] = {0x01, // "https://www." |
| 338 0x63, 0x6f, 0x6d, // "com" |
| 339 0x6d, 0x75, 0x6e, 0x69, |
| 340 0x74, 0x69, 0x65, 0x73, //"munities" |
| 341 0x00}; // ".com/" |
| 342 size_t expected_array_length = sizeof(expected_array) / sizeof(uint8_t); |
| 343 |
| 344 size_t expected_result = expected_array_length; |
| 345 size_t actual_result; |
| 346 |
| 347 vector<uint8_t> expected_vector(expected_array, |
| 348 expected_array + expected_array_length); |
| 349 vector<uint8_t> actual_vector; |
| 350 |
| 351 actual_result = physical_web::EncodeUrl(url, &actual_vector); |
| 352 |
| 353 EXPECT_TRUE(expected_result == actual_result); |
| 354 EXPECT_TRUE(ByteVectorEquals(expected_vector, actual_vector)); |
| 355 } |
| 356 |
| 357 TEST_F(EddystoneEncoderTest, testSpecCollision) { |
| 358 // decode(encode(".com/aURL.com")) == decode(encode("http://www.aURL.com")) |
| 359 // without url validation |
| 360 string invalid_url = ".com/aURL.com"; |
| 361 |
| 362 size_t invalid_expected_result = physical_web::kInvalidUrl; |
| 363 size_t invalid_actual_result; |
| 364 vector<uint8_t> invalid_expected_vector; |
| 365 vector<uint8_t> invalid_actual_vector; |
| 366 |
| 367 invalid_actual_result = |
| 368 physical_web::EncodeUrl(invalid_url, &invalid_actual_vector); |
| 369 |
| 370 EXPECT_TRUE(invalid_expected_result == invalid_actual_result); |
| 371 EXPECT_TRUE(ByteVectorEquals(invalid_expected_vector, invalid_actual_vector)); |
| 372 |
| 373 // Now for the valid Url. |
| 374 string valid_url = "http://www.aURL.com"; |
| 375 uint8_t valid_expected_array[] = {0x00, // "https://www." |
| 376 0x61, 0x55, 0x52, 0x4c, // "aUrl" |
| 377 0x07}; // ".com" |
| 378 size_t valid_expected_array_length = |
| 379 sizeof(valid_expected_array) / sizeof(uint8_t); |
| 380 |
| 381 size_t valid_expected_result = valid_expected_array_length; |
| 382 size_t valid_actual_result; |
| 383 |
| 384 vector<uint8_t> valid_expected_vector( |
| 385 valid_expected_array, valid_expected_array + valid_expected_array_length); |
| 386 vector<uint8_t> valid_actual_vector; |
| 387 |
| 388 valid_actual_result = |
| 389 physical_web::EncodeUrl(valid_url, &valid_actual_vector); |
| 390 |
| 391 EXPECT_TRUE(valid_expected_result == valid_actual_result); |
| 392 EXPECT_TRUE(ByteVectorEquals(valid_expected_vector, valid_actual_vector)); |
| 393 |
| 394 EXPECT_FALSE(ByteVectorEquals(invalid_actual_vector, valid_actual_vector)); |
| 395 } |
| 396 |
| 397 TEST_F(EddystoneEncoderTest, testComplexUrl) { |
| 398 string url = "http://user:pass@google.com:99/foo;bar?q=a#ref"; |
| 399 uint8_t expected_array[] = {0x02, // "http://" |
| 400 0x75, 0x73, 0x65, 0x72, 0x3a, // "user:" |
| 401 0x70, 0x61, 0x73, 0x73, 0x40, // "pass@" |
| 402 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, // "google" |
| 403 0x07, // ".com" |
| 404 0x3a, 0x39, 0x39, 0x2f, // ":99/" |
| 405 0x66, 0x6f, 0x6f, 0x3b, // "foo;" |
| 406 0x62, 0x61, 0x72, 0x3f, // "bar?" |
| 407 0x71, 0x3d, 0x61, 0x23, // "q=a#" |
| 408 0x72, 0x65, 0x66}; // "ref" |
| 409 size_t expected_array_length = sizeof(expected_array) / sizeof(uint8_t); |
| 410 |
| 411 size_t expected_result = expected_array_length; |
| 412 size_t actual_result; |
| 413 |
| 414 vector<uint8_t> expected_vector(expected_array, |
| 415 expected_array + expected_array_length); |
| 416 vector<uint8_t> actual_vector; |
| 417 |
| 418 actual_result = physical_web::EncodeUrl(url, &actual_vector); |
| 419 |
| 420 EXPECT_TRUE(expected_result == actual_result); |
| 421 EXPECT_TRUE(ByteVectorEquals(expected_vector, actual_vector)); |
| 422 } |
OLD | NEW |