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 by not |
| 1799 // adding it. |
| 1800 std::vector<Resource> resources; |
| 1801 resources.push_back(CreateResource(2, URL(origin, "/resource2"), 2016)); |
| 1802 |
| 1803 ASSERT_EQ(ServiceWorkerDatabase::STATUS_OK, |
| 1804 database->WriteRegistration(data, resources, &deleted_version, |
| 1805 &newly_purgeable_resources)); |
| 1806 |
| 1807 // The database should detect lack of the main resource (i.e. "/resource1"). |
| 1808 RegistrationData data_out; |
| 1809 std::vector<Resource> resources_out; |
| 1810 EXPECT_EQ(ServiceWorkerDatabase::STATUS_ERROR_CORRUPTED, |
| 1811 database->ReadRegistration(data.registration_id, origin, &data_out, |
| 1812 &resources_out)); |
| 1813 EXPECT_TRUE(resources_out.empty()); |
| 1814 } |
| 1815 |
1783 } // namespace content | 1816 } // namespace content |
OLD | NEW |