Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(58)

Side by Side Diff: url/origin_unittest.cc

Issue 2714813003: Add an identity component for unique/opaque url::Origins.
Patch Set: Switch to base::UnguessableToken, add to SecurityOrigin. No conversions yet. Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « url/origin.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <stddef.h> 5 #include <stddef.h>
6 #include <stdint.h> 6 #include <stdint.h>
7 7
8 #include <map>
9
8 #include "base/logging.h" 10 #include "base/logging.h"
9 #include "base/macros.h" 11 #include "base/macros.h"
10 #include "testing/gtest/include/gtest/gtest.h" 12 #include "testing/gtest/include/gtest/gtest.h"
11 #include "url/gurl.h" 13 #include "url/gurl.h"
12 #include "url/origin.h" 14 #include "url/origin.h"
13 15
14 namespace { 16 namespace {
15 17
16 void ExpectParsedUrlsEqual(const GURL& a, const GURL& b) { 18 void ExpectParsedUrlsEqual(const GURL& a, const GURL& b) {
17 EXPECT_EQ(a, b); 19 EXPECT_EQ(a, b);
(...skipping 16 matching lines...) Expand all
34 EXPECT_EQ(a_parsed.ref.begin, b_parsed.ref.begin); 36 EXPECT_EQ(a_parsed.ref.begin, b_parsed.ref.begin);
35 EXPECT_EQ(a_parsed.ref.len, b_parsed.ref.len); 37 EXPECT_EQ(a_parsed.ref.len, b_parsed.ref.len);
36 } 38 }
37 39
38 TEST(OriginTest, UniqueOriginComparison) { 40 TEST(OriginTest, UniqueOriginComparison) {
39 url::Origin unique_origin; 41 url::Origin unique_origin;
40 EXPECT_EQ("", unique_origin.scheme()); 42 EXPECT_EQ("", unique_origin.scheme());
41 EXPECT_EQ("", unique_origin.host()); 43 EXPECT_EQ("", unique_origin.host());
42 EXPECT_EQ(0, unique_origin.port()); 44 EXPECT_EQ(0, unique_origin.port());
43 EXPECT_TRUE(unique_origin.unique()); 45 EXPECT_TRUE(unique_origin.unique());
44 EXPECT_FALSE(unique_origin.IsSameOriginWith(unique_origin)); 46 EXPECT_TRUE(unique_origin.IsSameOriginWith(unique_origin));
45 47
46 const char* const urls[] = {"data:text/html,Hello!", 48 const char* const urls[] = {"data:text/html,Hello!",
47 "javascript:alert(1)", 49 "javascript:alert(1)",
48 "file://example.com:443/etc/passwd", 50 "file://example.com:443/etc/passwd",
49 "yay", 51 "yay",
50 "http::///invalid.example.com/"}; 52 "http::///invalid.example.com/"};
51 53
52 for (auto* test_url : urls) { 54 for (auto* test_url : urls) {
53 SCOPED_TRACE(test_url); 55 SCOPED_TRACE(test_url);
54 GURL url(test_url); 56 GURL url(test_url);
55 url::Origin origin(url); 57 url::Origin origin(url);
58 url::Origin origin_copy(origin);
56 EXPECT_EQ("", origin.scheme()); 59 EXPECT_EQ("", origin.scheme());
57 EXPECT_EQ("", origin.host()); 60 EXPECT_EQ("", origin.host());
58 EXPECT_EQ(0, origin.port()); 61 EXPECT_EQ(0, origin.port());
59 EXPECT_TRUE(origin.unique()); 62 EXPECT_TRUE(origin.unique());
60 EXPECT_FALSE(origin.IsSameOriginWith(origin)); 63 EXPECT_TRUE(origin.IsSameOriginWith(origin));
61 EXPECT_FALSE(unique_origin.IsSameOriginWith(origin)); 64 EXPECT_FALSE(unique_origin.IsSameOriginWith(origin));
62 EXPECT_FALSE(origin.IsSameOriginWith(unique_origin)); 65 EXPECT_FALSE(origin.IsSameOriginWith(unique_origin));
63 66
64 ExpectParsedUrlsEqual(GURL(origin.Serialize()), origin.GetURL()); 67 ExpectParsedUrlsEqual(GURL(origin.Serialize()), origin.GetURL());
68
69 // A unique origin should always be same origin to itself…
70 EXPECT_TRUE(origin.IsSameOriginWith(origin_copy));
71
72 // …but it shouldn't be same origin if it's created again.
73 url::Origin origin2(url);
74 EXPECT_FALSE(origin.IsSameOriginWith(origin2));
75 EXPECT_FALSE(origin2.IsSameOriginWith(origin));
65 } 76 }
66 } 77 }
67 78
68 TEST(OriginTest, ConstructFromTuple) { 79 TEST(OriginTest, ConstructFromTuple) {
69 struct TestCases { 80 struct TestCases {
70 const char* const scheme; 81 const char* const scheme;
71 const char* const host; 82 const char* const host;
72 const uint16_t port; 83 const uint16_t port;
73 const char* const suborigin; 84 const char* const suborigin;
74 } cases[] = { 85 } cases[] = {
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after
314 EXPECT_TRUE(origin2.IsSamePhysicalOriginWith(origin2)); 325 EXPECT_TRUE(origin2.IsSamePhysicalOriginWith(origin2));
315 EXPECT_EQ(test_case.is_same_physical_origin, 326 EXPECT_EQ(test_case.is_same_physical_origin,
316 origin1.IsSamePhysicalOriginWith(origin2)); 327 origin1.IsSamePhysicalOriginWith(origin2));
317 EXPECT_EQ(test_case.is_same_physical_origin, 328 EXPECT_EQ(test_case.is_same_physical_origin,
318 origin2.IsSamePhysicalOriginWith(origin1)); 329 origin2.IsSamePhysicalOriginWith(origin1));
319 } 330 }
320 } 331 }
321 332
322 TEST(OriginTest, Comparison) { 333 TEST(OriginTest, Comparison) {
323 // These URLs are arranged in increasing order: 334 // These URLs are arranged in increasing order:
324 const char* const urls[] = { 335 url::Origin origins[] = {
325 "data:uniqueness", 336 url::Origin(GURL("data:uniqueness")), url::Origin(GURL("http://a:80")),
326 "http://a:80", 337 url::Origin(GURL("http://b:80")), url::Origin(GURL("https://a:80")),
327 "http://b:80", 338 url::Origin(GURL("https://b:80")), url::Origin(GURL("http://a:81")),
328 "https://a:80", 339 url::Origin(GURL("http://b:81")), url::Origin(GURL("https://a:81")),
329 "https://b:80", 340 url::Origin(GURL("https://b:81")),
330 "http://a:81",
331 "http://b:81",
332 "https://a:81",
333 "https://b:81",
334 }; 341 };
335 342
336 for (size_t i = 0; i < arraysize(urls); i++) { 343 for (size_t i = 0; i < arraysize(origins); i++) {
337 GURL current_url(urls[i]); 344 for (size_t j = i; j < arraysize(origins); j++) {
338 url::Origin current(current_url); 345 EXPECT_EQ(i < j, origins[i] < origins[j]) << i << " < " << j;
339 for (size_t j = i; j < arraysize(urls); j++) { 346 EXPECT_EQ(j < i, origins[j] < origins[i]) << j << " < " << i;
340 GURL compare_url(urls[j]);
341 url::Origin to_compare(compare_url);
342 EXPECT_EQ(i < j, current < to_compare) << i << " < " << j;
343 EXPECT_EQ(j < i, to_compare < current) << j << " < " << i;
344 } 347 }
345 } 348 }
346 } 349 }
347 350
348 TEST(OriginTest, UnsafelyCreate) { 351 TEST(OriginTest, UnsafelyCreate) {
349 struct TestCase { 352 struct TestCase {
350 const char* scheme; 353 const char* scheme;
351 const char* host; 354 const char* host;
352 uint16_t port; 355 uint16_t port;
353 } cases[] = { 356 } cases[] = {
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
398 401
399 for (const auto& test : cases) { 402 for (const auto& test : cases) {
400 SCOPED_TRACE(testing::Message() << test.scheme << "://" << test.host << ":" 403 SCOPED_TRACE(testing::Message() << test.scheme << "://" << test.host << ":"
401 << test.port); 404 << test.port);
402 url::Origin origin = url::Origin::UnsafelyCreateOriginWithoutNormalization( 405 url::Origin origin = url::Origin::UnsafelyCreateOriginWithoutNormalization(
403 test.scheme, test.host, test.port); 406 test.scheme, test.host, test.port);
404 EXPECT_EQ("", origin.scheme()); 407 EXPECT_EQ("", origin.scheme());
405 EXPECT_EQ("", origin.host()); 408 EXPECT_EQ("", origin.host());
406 EXPECT_EQ(0, origin.port()); 409 EXPECT_EQ(0, origin.port());
407 EXPECT_TRUE(origin.unique()); 410 EXPECT_TRUE(origin.unique());
408 EXPECT_FALSE(origin.IsSameOriginWith(origin));
409 411
410 ExpectParsedUrlsEqual(GURL(origin.Serialize()), origin.GetURL()); 412 ExpectParsedUrlsEqual(GURL(origin.Serialize()), origin.GetURL());
413
414 // A unique origin should always be same origin to itself…
415 EXPECT_TRUE(origin.IsSameOriginWith(origin));
416
417 // …but it shouldn't be same origin if it's created again.
418 url::Origin origin2 = url::Origin::UnsafelyCreateOriginWithoutNormalization(
419 test.scheme, test.host, test.port);
420 EXPECT_FALSE(origin.IsSameOriginWith(origin2));
421 EXPECT_FALSE(origin2.IsSameOriginWith(origin));
411 } 422 }
412 } 423 }
413 424
414 TEST(OriginTest, UnsafelyCreateUniqueViaEmbeddedNulls) { 425 TEST(OriginTest, UnsafelyCreateUniqueViaEmbeddedNulls) {
415 struct TestCases { 426 struct TestCases {
416 const char* scheme; 427 const char* scheme;
417 size_t scheme_length; 428 size_t scheme_length;
418 const char* host; 429 const char* host;
419 size_t host_length; 430 size_t host_length;
420 uint16_t port; 431 uint16_t port;
421 } cases[] = {{"http\0more", 9, "example.com", 11, 80}, 432 } cases[] = {{"http\0more", 9, "example.com", 11, 80},
422 {"http\0", 5, "example.com", 11, 80}, 433 {"http\0", 5, "example.com", 11, 80},
423 {"\0http", 5, "example.com", 11, 80}, 434 {"\0http", 5, "example.com", 11, 80},
424 {"http", 4, "example.com\0not-example.com", 27, 80}, 435 {"http", 4, "example.com\0not-example.com", 27, 80},
425 {"http", 4, "example.com\0", 12, 80}, 436 {"http", 4, "example.com\0", 12, 80},
426 {"http", 4, "\0example.com", 12, 80}}; 437 {"http", 4, "\0example.com", 12, 80}};
427 438
428 for (const auto& test : cases) { 439 for (const auto& test : cases) {
429 SCOPED_TRACE(testing::Message() << test.scheme << "://" << test.host << ":" 440 SCOPED_TRACE(testing::Message() << test.scheme << "://" << test.host << ":"
430 << test.port); 441 << test.port);
431 url::Origin origin = url::Origin::UnsafelyCreateOriginWithoutNormalization( 442 url::Origin origin = url::Origin::UnsafelyCreateOriginWithoutNormalization(
432 std::string(test.scheme, test.scheme_length), 443 std::string(test.scheme, test.scheme_length),
433 std::string(test.host, test.host_length), test.port); 444 std::string(test.host, test.host_length), test.port);
434 EXPECT_EQ("", origin.scheme()); 445 EXPECT_EQ("", origin.scheme());
435 EXPECT_EQ("", origin.host()); 446 EXPECT_EQ("", origin.host());
436 EXPECT_EQ(0, origin.port()); 447 EXPECT_EQ(0, origin.port());
437 EXPECT_TRUE(origin.unique()); 448 EXPECT_TRUE(origin.unique());
438 EXPECT_FALSE(origin.IsSameOriginWith(origin));
439 449
440 ExpectParsedUrlsEqual(GURL(origin.Serialize()), origin.GetURL()); 450 ExpectParsedUrlsEqual(GURL(origin.Serialize()), origin.GetURL());
451
452 // A unique origin should always be same origin to itself…
453 EXPECT_TRUE(origin.IsSameOriginWith(origin));
454
455 // …but it shouldn't be same origin if it's created again.
456 url::Origin origin2 = url::Origin::UnsafelyCreateOriginWithoutNormalization(
457 std::string(test.scheme, test.scheme_length),
458 std::string(test.host, test.host_length), test.port);
459 EXPECT_FALSE(origin.IsSameOriginWith(origin2));
460 EXPECT_FALSE(origin2.IsSameOriginWith(origin));
441 } 461 }
442 } 462 }
443 463
444 TEST(OriginTest, DomainIs) { 464 TEST(OriginTest, DomainIs) {
445 const struct { 465 const struct {
446 const char* url; 466 const char* url;
447 const char* lower_ascii_domain; 467 const char* lower_ascii_domain;
448 bool expected_domain_is; 468 bool expected_domain_is;
449 } kTestCases[] = { 469 } kTestCases[] = {
450 {"http://google.com/foo", "google.com", true}, 470 {"http://google.com/foo", "google.com", true},
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
491 // If the URL is invalid, DomainIs returns false. 511 // If the URL is invalid, DomainIs returns false.
492 GURL invalid_url("google.com"); 512 GURL invalid_url("google.com");
493 ASSERT_FALSE(invalid_url.is_valid()); 513 ASSERT_FALSE(invalid_url.is_valid());
494 EXPECT_FALSE(url::Origin(invalid_url).DomainIs("google.com")); 514 EXPECT_FALSE(url::Origin(invalid_url).DomainIs("google.com"));
495 515
496 // Unique origins. 516 // Unique origins.
497 EXPECT_FALSE(url::Origin().DomainIs("")); 517 EXPECT_FALSE(url::Origin().DomainIs(""));
498 EXPECT_FALSE(url::Origin().DomainIs("com")); 518 EXPECT_FALSE(url::Origin().DomainIs("com"));
499 } 519 }
500 520
521 TEST(OriginTest, UniqueOriginsInSet) {
522 std::set<url::Origin> origins;
523 EXPECT_TRUE(origins.empty());
524
525 url::Origin origin1;
526 origins.insert(origin1);
527 EXPECT_EQ(1u, origins.size());
528 EXPECT_TRUE(origins.find(origin1) != origins.end());
529
530 url::Origin origin2;
531 origins.insert(origin2);
532 EXPECT_EQ(2u, origins.size());
533 EXPECT_TRUE(origins.find(origin2) != origins.end());
534
535 {
536 auto result = origins.insert(origin1);
537 EXPECT_FALSE(result.second);
538 EXPECT_TRUE(origin1.IsSameOriginWith(*result.first));
539 }
540
541 {
542 auto result = origins.insert(origin2);
543 EXPECT_FALSE(result.second);
544 EXPECT_TRUE(origin2.IsSameOriginWith(*result.first));
545 }
546
547 EXPECT_EQ(2u, origins.size());
548 }
549
501 } // namespace url 550 } // namespace url
OLDNEW
« no previous file with comments | « url/origin.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698