Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "content/browser/service_worker/service_worker_database.h" | 5 #include "content/browser/service_worker/service_worker_database.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <string> | 10 #include <string> |
| (...skipping 601 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 612 VerifyRegistrationData(data4, registrations[3]); | 612 VerifyRegistrationData(data4, registrations[3]); |
| 613 } | 613 } |
| 614 | 614 |
| 615 TEST(ServiceWorkerDatabaseTest, Registration_Basic) { | 615 TEST(ServiceWorkerDatabaseTest, Registration_Basic) { |
| 616 std::unique_ptr<ServiceWorkerDatabase> database(CreateDatabaseInMemory()); | 616 std::unique_ptr<ServiceWorkerDatabase> database(CreateDatabaseInMemory()); |
| 617 | 617 |
| 618 GURL origin("http://example.com"); | 618 GURL origin("http://example.com"); |
| 619 RegistrationData data; | 619 RegistrationData data; |
| 620 data.registration_id = 100; | 620 data.registration_id = 100; |
| 621 data.scope = URL(origin, "/foo"); | 621 data.scope = URL(origin, "/foo"); |
| 622 data.script = URL(origin, "/script.js"); | 622 data.script = URL(origin, "/resource1"); |
| 623 data.version_id = 200; | 623 data.version_id = 200; |
| 624 data.resources_total_size_bytes = 10939 + 200; | 624 data.resources_total_size_bytes = 10939 + 200; |
| 625 data.foreign_fetch_scopes.push_back(URL(origin, "/foo/bar")); | 625 data.foreign_fetch_scopes.push_back(URL(origin, "/foo/bar")); |
| 626 | 626 |
| 627 std::vector<Resource> resources; | 627 std::vector<Resource> resources; |
| 628 resources.push_back(CreateResource(1, URL(origin, "/resource1"), 10939)); | 628 resources.push_back(CreateResource(1, URL(origin, "/resource1"), 10939)); |
| 629 resources.push_back(CreateResource(2, URL(origin, "/resource2"), 200)); | 629 resources.push_back(CreateResource(2, URL(origin, "/resource2"), 200)); |
| 630 | 630 |
| 631 // Write a resource to the uncommitted list to make sure that writing | 631 // Write a resource to the uncommitted list to make sure that writing |
| 632 // registration removes resource ids associated with the registration from | 632 // registration removes resource ids associated with the registration from |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 699 EXPECT_TRUE(base::ContainsKey(purgeable_ids_out, resources[1].resource_id)); | 699 EXPECT_TRUE(base::ContainsKey(purgeable_ids_out, resources[1].resource_id)); |
| 700 } | 700 } |
| 701 | 701 |
| 702 TEST(ServiceWorkerDatabaseTest, DeleteNonExistentRegistration) { | 702 TEST(ServiceWorkerDatabaseTest, DeleteNonExistentRegistration) { |
| 703 std::unique_ptr<ServiceWorkerDatabase> database(CreateDatabaseInMemory()); | 703 std::unique_ptr<ServiceWorkerDatabase> database(CreateDatabaseInMemory()); |
| 704 | 704 |
| 705 GURL origin("http://example.com"); | 705 GURL origin("http://example.com"); |
| 706 RegistrationData data; | 706 RegistrationData data; |
| 707 data.registration_id = 100; | 707 data.registration_id = 100; |
| 708 data.scope = URL(origin, "/foo"); | 708 data.scope = URL(origin, "/foo"); |
| 709 data.script = URL(origin, "/script.js"); | 709 data.script = URL(origin, "/resource1"); |
| 710 data.version_id = 200; | 710 data.version_id = 200; |
| 711 data.resources_total_size_bytes = 19 + 29129; | 711 data.resources_total_size_bytes = 19 + 29129; |
| 712 | 712 |
| 713 std::vector<Resource> resources; | 713 std::vector<Resource> resources; |
| 714 resources.push_back(CreateResource(1, URL(origin, "/resource1"), 19)); | 714 resources.push_back(CreateResource(1, URL(origin, "/resource1"), 19)); |
| 715 resources.push_back(CreateResource(2, URL(origin, "/resource2"), 29129)); | 715 resources.push_back(CreateResource(2, URL(origin, "/resource2"), 29129)); |
| 716 | 716 |
| 717 const int64_t kNonExistentRegistrationId = 999; | 717 const int64_t kNonExistentRegistrationId = 999; |
| 718 const int64_t kArbitraryVersionId = 222; // Used as a dummy initial value | 718 const int64_t kArbitraryVersionId = 222; // Used as a dummy initial value |
| 719 | 719 |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 749 EXPECT_TRUE(newly_purgeable_resources.empty()); | 749 EXPECT_TRUE(newly_purgeable_resources.empty()); |
| 750 } | 750 } |
| 751 | 751 |
| 752 TEST(ServiceWorkerDatabaseTest, Registration_Overwrite) { | 752 TEST(ServiceWorkerDatabaseTest, Registration_Overwrite) { |
| 753 std::unique_ptr<ServiceWorkerDatabase> database(CreateDatabaseInMemory()); | 753 std::unique_ptr<ServiceWorkerDatabase> database(CreateDatabaseInMemory()); |
| 754 | 754 |
| 755 GURL origin("http://example.com"); | 755 GURL origin("http://example.com"); |
| 756 RegistrationData data; | 756 RegistrationData data; |
| 757 data.registration_id = 100; | 757 data.registration_id = 100; |
| 758 data.scope = URL(origin, "/foo"); | 758 data.scope = URL(origin, "/foo"); |
| 759 data.script = URL(origin, "/script.js"); | 759 data.script = URL(origin, "/resource1"); |
| 760 data.version_id = 200; | 760 data.version_id = 200; |
| 761 data.resources_total_size_bytes = 10 + 11; | 761 data.resources_total_size_bytes = 10 + 11; |
| 762 data.foreign_fetch_scopes.push_back(URL(origin, "/foo")); | 762 data.foreign_fetch_scopes.push_back(URL(origin, "/foo")); |
| 763 data.foreign_fetch_origins.push_back( | 763 data.foreign_fetch_origins.push_back( |
| 764 url::Origin(GURL("https://chromium.org"))); | 764 url::Origin(GURL("https://chromium.org"))); |
| 765 | 765 |
| 766 std::vector<Resource> resources1; | 766 std::vector<Resource> resources1; |
| 767 resources1.push_back(CreateResource(1, URL(origin, "/resource1"), 10)); | 767 resources1.push_back(CreateResource(1, URL(origin, "/resource1"), 10)); |
| 768 resources1.push_back(CreateResource(2, URL(origin, "/resource2"), 11)); | 768 resources1.push_back(CreateResource(2, URL(origin, "/resource2"), 11)); |
| 769 | 769 |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 781 // Make sure that the registration and resource records are stored. | 781 // Make sure that the registration and resource records are stored. |
| 782 RegistrationData data_out; | 782 RegistrationData data_out; |
| 783 std::vector<Resource> resources_out; | 783 std::vector<Resource> resources_out; |
| 784 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, database->ReadRegistration( | 784 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, database->ReadRegistration( |
| 785 data.registration_id, origin, &data_out, &resources_out)); | 785 data.registration_id, origin, &data_out, &resources_out)); |
| 786 VerifyRegistrationData(data, data_out); | 786 VerifyRegistrationData(data, data_out); |
| 787 VerifyResourceRecords(resources1, resources_out); | 787 VerifyResourceRecords(resources1, resources_out); |
| 788 | 788 |
| 789 // Update the registration. | 789 // Update the registration. |
| 790 RegistrationData updated_data = data; | 790 RegistrationData updated_data = data; |
| 791 updated_data.script = URL(origin, "/resource3"); | |
| 791 updated_data.version_id = data.version_id + 1; | 792 updated_data.version_id = data.version_id + 1; |
| 792 updated_data.resources_total_size_bytes = 12 + 13; | 793 updated_data.resources_total_size_bytes = 12 + 13; |
| 793 updated_data.foreign_fetch_scopes.clear(); | 794 updated_data.foreign_fetch_scopes.clear(); |
| 794 updated_data.foreign_fetch_origins.push_back( | 795 updated_data.foreign_fetch_origins.push_back( |
| 795 url::Origin(GURL("https://example.com"))); | 796 url::Origin(GURL("https://example.com"))); |
| 796 std::vector<Resource> resources2; | 797 std::vector<Resource> resources2; |
| 797 resources2.push_back(CreateResource(3, URL(origin, "/resource3"), 12)); | 798 resources2.push_back(CreateResource(3, URL(origin, "/resource3"), 12)); |
| 798 resources2.push_back(CreateResource(4, URL(origin, "/resource4"), 13)); | 799 resources2.push_back(CreateResource(4, URL(origin, "/resource4"), 13)); |
| 799 | 800 |
| 800 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, | 801 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 827 std::unique_ptr<ServiceWorkerDatabase> database(CreateDatabaseInMemory()); | 828 std::unique_ptr<ServiceWorkerDatabase> database(CreateDatabaseInMemory()); |
| 828 GURL origin("http://example.com"); | 829 GURL origin("http://example.com"); |
| 829 | 830 |
| 830 ServiceWorkerDatabase::RegistrationData deleted_version; | 831 ServiceWorkerDatabase::RegistrationData deleted_version; |
| 831 std::vector<int64_t> newly_purgeable_resources; | 832 std::vector<int64_t> newly_purgeable_resources; |
| 832 | 833 |
| 833 // Add registration1. | 834 // Add registration1. |
| 834 RegistrationData data1; | 835 RegistrationData data1; |
| 835 data1.registration_id = 100; | 836 data1.registration_id = 100; |
| 836 data1.scope = URL(origin, "/foo"); | 837 data1.scope = URL(origin, "/foo"); |
| 837 data1.script = URL(origin, "/script1.js"); | 838 data1.script = URL(origin, "/resource1"); |
| 838 data1.version_id = 200; | 839 data1.version_id = 200; |
| 839 data1.resources_total_size_bytes = 1451 + 15234; | 840 data1.resources_total_size_bytes = 1451 + 15234; |
| 840 | 841 |
| 841 std::vector<Resource> resources1; | 842 std::vector<Resource> resources1; |
| 842 resources1.push_back(CreateResource(1, URL(origin, "/resource1"), 1451)); | 843 resources1.push_back(CreateResource(1, URL(origin, "/resource1"), 1451)); |
| 843 resources1.push_back(CreateResource(2, URL(origin, "/resource2"), 15234)); | 844 resources1.push_back(CreateResource(2, URL(origin, "/resource2"), 15234)); |
| 844 EXPECT_EQ( | 845 EXPECT_EQ( |
| 845 ServiceWorkerDatabase::STATUS_OK, | 846 ServiceWorkerDatabase::STATUS_OK, |
| 846 database->WriteRegistration( | 847 database->WriteRegistration( |
| 847 data1, resources1, &deleted_version, &newly_purgeable_resources)); | 848 data1, resources1, &deleted_version, &newly_purgeable_resources)); |
| 848 | 849 |
| 849 // Add registration2. | 850 // Add registration2. |
| 850 RegistrationData data2; | 851 RegistrationData data2; |
| 851 data2.registration_id = 101; | 852 data2.registration_id = 101; |
| 852 data2.scope = URL(origin, "/bar"); | 853 data2.scope = URL(origin, "/bar"); |
| 853 data2.script = URL(origin, "/script2.js"); | 854 data2.script = URL(origin, "/resource3"); |
| 854 data2.version_id = 201; | 855 data2.version_id = 201; |
| 855 data2.resources_total_size_bytes = 5 + 6; | 856 data2.resources_total_size_bytes = 5 + 6; |
| 856 | 857 |
| 857 std::vector<Resource> resources2; | 858 std::vector<Resource> resources2; |
| 858 resources2.push_back(CreateResource(3, URL(origin, "/resource3"), 5)); | 859 resources2.push_back(CreateResource(3, URL(origin, "/resource3"), 5)); |
| 859 resources2.push_back(CreateResource(4, URL(origin, "/resource4"), 6)); | 860 resources2.push_back(CreateResource(4, URL(origin, "/resource4"), 6)); |
| 860 EXPECT_EQ( | 861 EXPECT_EQ( |
| 861 ServiceWorkerDatabase::STATUS_OK, | 862 ServiceWorkerDatabase::STATUS_OK, |
| 862 database->WriteRegistration( | 863 database->WriteRegistration( |
| 863 data2, resources2, &deleted_version, &newly_purgeable_resources)); | 864 data2, resources2, &deleted_version, &newly_purgeable_resources)); |
| (...skipping 616 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1480 std::vector<int64_t> newly_purgeable_resources; | 1481 std::vector<int64_t> newly_purgeable_resources; |
| 1481 | 1482 |
| 1482 // Data associated with |origin1| will be removed. | 1483 // Data associated with |origin1| will be removed. |
| 1483 GURL origin1("http://example.com"); | 1484 GURL origin1("http://example.com"); |
| 1484 GURL origin2("http://example.org"); | 1485 GURL origin2("http://example.org"); |
| 1485 | 1486 |
| 1486 // |origin1| has two registrations (registration1 and registration2). | 1487 // |origin1| has two registrations (registration1 and registration2). |
| 1487 RegistrationData data1; | 1488 RegistrationData data1; |
| 1488 data1.registration_id = 10; | 1489 data1.registration_id = 10; |
| 1489 data1.scope = URL(origin1, "/foo"); | 1490 data1.scope = URL(origin1, "/foo"); |
| 1490 data1.script = URL(origin1, "/script1.js"); | 1491 data1.script = URL(origin1, "/resource1"); |
| 1491 data1.version_id = 100; | 1492 data1.version_id = 100; |
| 1492 data1.resources_total_size_bytes = 2013 + 512; | 1493 data1.resources_total_size_bytes = 2013 + 512; |
| 1493 data1.foreign_fetch_scopes.push_back(URL(origin1, "/foo/ff")); | 1494 data1.foreign_fetch_scopes.push_back(URL(origin1, "/foo/ff")); |
| 1494 | 1495 |
| 1495 std::vector<Resource> resources1; | 1496 std::vector<Resource> resources1; |
| 1496 resources1.push_back(CreateResource(1, URL(origin1, "/resource1"), 2013)); | 1497 resources1.push_back(CreateResource(1, URL(origin1, "/resource1"), 2013)); |
| 1497 resources1.push_back(CreateResource(2, URL(origin1, "/resource2"), 512)); | 1498 resources1.push_back(CreateResource(2, URL(origin1, "/resource2"), 512)); |
| 1498 ASSERT_EQ( | 1499 ASSERT_EQ( |
| 1499 ServiceWorkerDatabase::STATUS_OK, | 1500 ServiceWorkerDatabase::STATUS_OK, |
| 1500 database->WriteRegistration( | 1501 database->WriteRegistration( |
| 1501 data1, resources1, &deleted_version, &newly_purgeable_resources)); | 1502 data1, resources1, &deleted_version, &newly_purgeable_resources)); |
| 1502 ASSERT_EQ(ServiceWorkerDatabase::STATUS_OK, | 1503 ASSERT_EQ(ServiceWorkerDatabase::STATUS_OK, |
| 1503 database->WriteUserData(data1.registration_id, origin1, | 1504 database->WriteUserData(data1.registration_id, origin1, |
| 1504 {{"key1", "data1"}})); | 1505 {{"key1", "data1"}})); |
| 1505 ASSERT_EQ(ServiceWorkerDatabase::STATUS_OK, | 1506 ASSERT_EQ(ServiceWorkerDatabase::STATUS_OK, |
| 1506 database->WriteUserData(data1.registration_id, origin1, | 1507 database->WriteUserData(data1.registration_id, origin1, |
| 1507 {{"key2", "data2"}})); | 1508 {{"key2", "data2"}})); |
| 1508 | 1509 |
| 1509 RegistrationData data2; | 1510 RegistrationData data2; |
| 1510 data2.registration_id = 11; | 1511 data2.registration_id = 11; |
| 1511 data2.scope = URL(origin1, "/bar"); | 1512 data2.scope = URL(origin1, "/bar"); |
| 1512 data2.script = URL(origin1, "/script2.js"); | 1513 data2.script = URL(origin1, "/resource3"); |
| 1513 data2.version_id = 101; | 1514 data2.version_id = 101; |
| 1514 data2.resources_total_size_bytes = 4 + 5; | 1515 data2.resources_total_size_bytes = 4 + 5; |
| 1515 | 1516 |
| 1516 std::vector<Resource> resources2; | 1517 std::vector<Resource> resources2; |
| 1517 resources2.push_back(CreateResource(3, URL(origin1, "/resource3"), 4)); | 1518 resources2.push_back(CreateResource(3, URL(origin1, "/resource3"), 4)); |
| 1518 resources2.push_back(CreateResource(4, URL(origin1, "/resource4"), 5)); | 1519 resources2.push_back(CreateResource(4, URL(origin1, "/resource4"), 5)); |
| 1519 ASSERT_EQ( | 1520 ASSERT_EQ( |
| 1520 ServiceWorkerDatabase::STATUS_OK, | 1521 ServiceWorkerDatabase::STATUS_OK, |
| 1521 database->WriteRegistration( | 1522 database->WriteRegistration( |
| 1522 data2, resources2, &deleted_version, &newly_purgeable_resources)); | 1523 data2, resources2, &deleted_version, &newly_purgeable_resources)); |
| 1523 ASSERT_EQ(ServiceWorkerDatabase::STATUS_OK, | 1524 ASSERT_EQ(ServiceWorkerDatabase::STATUS_OK, |
| 1524 database->WriteUserData(data2.registration_id, origin1, | 1525 database->WriteUserData(data2.registration_id, origin1, |
| 1525 {{"key3", "data3"}})); | 1526 {{"key3", "data3"}})); |
| 1526 ASSERT_EQ(ServiceWorkerDatabase::STATUS_OK, | 1527 ASSERT_EQ(ServiceWorkerDatabase::STATUS_OK, |
| 1527 database->WriteUserData(data2.registration_id, origin1, | 1528 database->WriteUserData(data2.registration_id, origin1, |
| 1528 {{"key4", "data4"}})); | 1529 {{"key4", "data4"}})); |
| 1529 | 1530 |
| 1530 // |origin2| has one registration (registration3). | 1531 // |origin2| has one registration (registration3). |
| 1531 RegistrationData data3; | 1532 RegistrationData data3; |
| 1532 data3.registration_id = 12; | 1533 data3.registration_id = 12; |
| 1533 data3.scope = URL(origin2, "/hoge"); | 1534 data3.scope = URL(origin2, "/hoge"); |
| 1534 data3.script = URL(origin2, "/script3.js"); | 1535 data3.script = URL(origin2, "/resource5"); |
| 1535 data3.version_id = 102; | 1536 data3.version_id = 102; |
| 1536 data3.resources_total_size_bytes = 6 + 7; | 1537 data3.resources_total_size_bytes = 6 + 7; |
| 1537 data3.foreign_fetch_scopes.push_back(URL(origin2, "/hoge/ff")); | 1538 data3.foreign_fetch_scopes.push_back(URL(origin2, "/hoge/ff")); |
| 1538 | 1539 |
| 1539 std::vector<Resource> resources3; | 1540 std::vector<Resource> resources3; |
| 1540 resources3.push_back(CreateResource(5, URL(origin2, "/resource5"), 6)); | 1541 resources3.push_back(CreateResource(5, URL(origin2, "/resource5"), 6)); |
| 1541 resources3.push_back(CreateResource(6, URL(origin2, "/resource6"), 7)); | 1542 resources3.push_back(CreateResource(6, URL(origin2, "/resource6"), 7)); |
| 1542 ASSERT_EQ( | 1543 ASSERT_EQ( |
| 1543 ServiceWorkerDatabase::STATUS_OK, | 1544 ServiceWorkerDatabase::STATUS_OK, |
| 1544 database->WriteRegistration( | 1545 database->WriteRegistration( |
| (...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1773 database->WriteRegistration(updated_data1, updated_resources1, | 1774 database->WriteRegistration(updated_data1, updated_resources1, |
| 1774 &deleted_version, | 1775 &deleted_version, |
| 1775 &newly_purgeable_resources)); | 1776 &newly_purgeable_resources)); |
| 1776 | 1777 |
| 1777 origins.clear(); | 1778 origins.clear(); |
| 1778 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, | 1779 EXPECT_EQ(ServiceWorkerDatabase::STATUS_OK, |
| 1779 database->GetOriginsWithForeignFetchRegistrations(&origins)); | 1780 database->GetOriginsWithForeignFetchRegistrations(&origins)); |
| 1780 EXPECT_EQ(0U, origins.size()); | 1781 EXPECT_EQ(0U, origins.size()); |
| 1781 } | 1782 } |
| 1782 | 1783 |
| 1784 TEST(ServiceWorkerDatabaseTest, Corruption_NoMainResource) { | |
| 1785 std::unique_ptr<ServiceWorkerDatabase> database(CreateDatabaseInMemory()); | |
| 1786 ServiceWorkerDatabase::RegistrationData deleted_version; | |
| 1787 std::vector<int64_t> newly_purgeable_resources; | |
| 1788 | |
| 1789 GURL origin("http://example.com"); | |
| 1790 | |
| 1791 RegistrationData data; | |
| 1792 data.registration_id = 10; | |
| 1793 data.scope = URL(origin, "/foo"); | |
| 1794 data.script = URL(origin, "/resource1"); | |
| 1795 data.version_id = 100; | |
| 1796 data.resources_total_size_bytes = 2016; | |
| 1797 | |
| 1798 // Simulate that "/resource1" wasn't correctly written in the database. | |
| 1799 std::vector<Resource> resources; | |
| 1800 resources.push_back(CreateResource(2, URL(origin, "/resource1"), 2016)); | |
|
falken
2016/10/05 01:35:59
How does this simulate failure? Should it be "/res
nhiroki
2016/10/05 02:11:48
Oops! This is wrong and must be "resource2". Fixed
| |
| 1801 | |
| 1802 ASSERT_EQ(ServiceWorkerDatabase::STATUS_OK, | |
| 1803 database->WriteRegistration(data, resources, &deleted_version, | |
| 1804 &newly_purgeable_resources)); | |
| 1805 | |
| 1806 // The database should detect lack of the main resource (i.e. "/resource1"). | |
| 1807 RegistrationData data_out; | |
| 1808 std::vector<Resource> resources_out; | |
| 1809 EXPECT_EQ(ServiceWorkerDatabase::STATUS_ERROR_CORRUPTED, | |
| 1810 database->ReadRegistration(data.registration_id, origin, &data_out, | |
| 1811 &resources_out)); | |
| 1812 EXPECT_TRUE(resources_out.empty()); | |
| 1813 } | |
| 1814 | |
| 1783 } // namespace content | 1815 } // namespace content |
| OLD | NEW |