Chromium Code Reviews| Index: content/browser/service_worker/service_worker_database_unittest.cc |
| diff --git a/content/browser/service_worker/service_worker_database_unittest.cc b/content/browser/service_worker/service_worker_database_unittest.cc |
| index f5fca2d100bf8e8dc3d8309e11ceaa4b60bb6216..61c511eaf76fd85770917c377153bf04a4cb012c 100644 |
| --- a/content/browser/service_worker/service_worker_database_unittest.cc |
| +++ b/content/browser/service_worker/service_worker_database_unittest.cc |
| @@ -5,6 +5,8 @@ |
| #include "content/browser/service_worker/service_worker_database.h" |
| #include "base/files/scoped_temp_dir.h" |
| +#include "base/stl_util.h" |
| +#include "content/browser/service_worker/service_worker_database.pb.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| namespace content { |
| @@ -28,6 +30,18 @@ ServiceWorkerDatabase* CreateDatabaseInMemory() { |
| return new ServiceWorkerDatabase(base::FilePath()); |
| } |
| +void VerifyRegistrationData( |
| + const ServiceWorkerDatabase::RegistrationData& expected, |
| + const ServiceWorkerDatabase::RegistrationData& actual) { |
| + EXPECT_EQ(expected.registration_id, actual.registration_id); |
| + EXPECT_EQ(expected.scope, actual.scope); |
| + EXPECT_EQ(expected.script, actual.script); |
| + EXPECT_EQ(expected.version_id, actual.version_id); |
| + EXPECT_EQ(expected.is_active, actual.is_active); |
| + EXPECT_EQ(expected.has_fetch_handler, actual.has_fetch_handler); |
| + EXPECT_EQ(expected.last_update_check, actual.last_update_check); |
| +} |
| + |
| } // namespace |
| TEST(ServiceWorkerDatabaseTest, OpenDatabase) { |
| @@ -59,7 +73,10 @@ TEST(ServiceWorkerDatabaseTest, OpenDatabase_InMemory) { |
| } |
| TEST(ServiceWorkerDatabaseTest, GetNextAvailableIds) { |
| - scoped_ptr<ServiceWorkerDatabase> database(CreateDatabaseInMemory()); |
| + base::ScopedTempDir database_dir; |
| + ASSERT_TRUE(database_dir.CreateUniqueTempDir()); |
| + scoped_ptr<ServiceWorkerDatabase> database( |
| + CreateDatabase(database_dir.path())); |
| AvailableIds ids; |
| // Should be false because the database hasn't been opened. |
| @@ -73,7 +90,181 @@ TEST(ServiceWorkerDatabaseTest, GetNextAvailableIds) { |
| EXPECT_EQ(0, ids.ver_id); |
| EXPECT_EQ(0, ids.res_id); |
| - // TODO(nhiroki): Test GetNextAvailableIds() after update these ids. |
| + // Writing a registration bumps the next available ids. |
| + std::vector<ServiceWorkerDatabase::ResourceRecord> resources; |
| + ServiceWorkerDatabase::RegistrationData data1; |
| + data1.registration_id = 100; |
| + data1.scope = GURL("http://example.com/foo"); |
| + data1.script = GURL("http://example.com/script1.js"); |
| + data1.version_id = 200; |
| + ASSERT_TRUE(database->WriteRegistration(data1, resources)); |
| + |
| + EXPECT_TRUE(database->GetNextAvailableIds( |
| + &ids.reg_id, &ids.ver_id, &ids.res_id)); |
| + EXPECT_EQ(101, ids.reg_id); |
| + EXPECT_EQ(201, ids.ver_id); |
| + EXPECT_EQ(0, ids.res_id); |
| + |
| + // Writing a registration whose ids are lower than the stored ones should not |
| + // bump the next available ids. |
| + ServiceWorkerDatabase::RegistrationData data2; |
| + data2.registration_id = 10; |
| + data2.scope = GURL("http://example.com/bar"); |
| + data2.script = GURL("http://example.com/script2.js"); |
| + data2.version_id = 20; |
| + ASSERT_TRUE(database->WriteRegistration(data2, resources)); |
| + |
| + // Close and reopen the database to verify the stored values. |
| + database.reset(CreateDatabase(database_dir.path())); |
| + |
| + EXPECT_TRUE(database->GetNextAvailableIds( |
| + &ids.reg_id, &ids.ver_id, &ids.res_id)); |
| + EXPECT_EQ(101, ids.reg_id); |
| + EXPECT_EQ(201, ids.ver_id); |
| + EXPECT_EQ(0, ids.res_id); |
| +} |
| + |
| +TEST(ServiceWorkerDatabaseTest, GetOriginsWithRegistrations) { |
| + scoped_ptr<ServiceWorkerDatabase> database(CreateDatabaseInMemory()); |
| + |
| + std::set<GURL> origins; |
| + EXPECT_FALSE(database->GetOriginsWithRegistrations(&origins)); |
| + EXPECT_TRUE(origins.empty()); |
| + |
| + std::vector<ServiceWorkerDatabase::ResourceRecord> resources; |
| + |
| + ServiceWorkerDatabase::RegistrationData data1; |
| + data1.registration_id = 123; |
| + data1.scope = GURL("http://example.com/foo"); |
| + data1.script = GURL("http://example.com/script1.js"); |
| + data1.version_id = 456; |
| + GURL origin1 = data1.script.GetOrigin(); |
| + ASSERT_TRUE(database->WriteRegistration(data1, resources)); |
| + |
| + ServiceWorkerDatabase::RegistrationData data2; |
| + data2.registration_id = 234; |
| + data2.scope = GURL("https://www.example.com/bar"); |
| + data2.script = GURL("https://www.example.com/script2.js"); |
| + data2.version_id = 567; |
| + GURL origin2 = data2.script.GetOrigin(); |
| + ASSERT_TRUE(database->WriteRegistration(data2, resources)); |
| + |
| + ServiceWorkerDatabase::RegistrationData data3; |
| + data3.registration_id = 345; |
| + data3.scope = GURL("https://example.org/hoge"); |
| + data3.script = GURL("https://example.org/script3.js"); |
| + data3.version_id = 678; |
| + GURL origin3 = data3.script.GetOrigin(); |
| + ASSERT_TRUE(database->WriteRegistration(data3, resources)); |
| + |
| + // Same origin with |data3|. |
| + ServiceWorkerDatabase::RegistrationData data4; |
| + data4.registration_id = 456; |
| + data4.scope = GURL("https://example.org/fuga"); |
| + data4.script = GURL("https://example.org/script4.js"); |
| + data4.version_id = 789; |
| + GURL origin4 = data4.script.GetOrigin(); |
| + ASSERT_EQ(origin3, origin4); |
| + ASSERT_TRUE(database->WriteRegistration(data4, resources)); |
| + |
| + origins.clear(); |
| + EXPECT_TRUE(database->GetOriginsWithRegistrations(&origins)); |
| + EXPECT_EQ(3U, origins.size()); |
| + EXPECT_TRUE(ContainsKey(origins, origin1)); |
| + EXPECT_TRUE(ContainsKey(origins, origin2)); |
| + EXPECT_TRUE(ContainsKey(origins, origin3)); |
| + |
| + // |origin4| has another registration, so should not remove it from the |
|
michaeln
2014/04/26 00:29:02
nit: this confused me i thought origin4 would be a
nhiroki
2014/04/28 04:15:59
Done.
|
| + // unique origin list. |
| + ASSERT_TRUE(database->DeleteRegistration(data4.registration_id, origin4)); |
| + |
| + origins.clear(); |
| + EXPECT_TRUE(database->GetOriginsWithRegistrations(&origins)); |
| + EXPECT_EQ(3U, origins.size()); |
| + EXPECT_TRUE(ContainsKey(origins, origin1)); |
| + EXPECT_TRUE(ContainsKey(origins, origin2)); |
| + EXPECT_TRUE(ContainsKey(origins, origin3)); |
| + |
| + // |origin3| should be removed from the unique origin list. |
| + ASSERT_TRUE(database->DeleteRegistration(data3.registration_id, origin3)); |
| + |
| + origins.clear(); |
| + EXPECT_TRUE(database->GetOriginsWithRegistrations(&origins)); |
| + EXPECT_EQ(2U, origins.size()); |
| + EXPECT_TRUE(ContainsKey(origins, origin1)); |
| + EXPECT_TRUE(ContainsKey(origins, origin2)); |
| +} |
| + |
| +TEST(ServiceWorkerDatabaseTest, GetRegistrationsForOrigin) { |
| + scoped_ptr<ServiceWorkerDatabase> database(CreateDatabaseInMemory()); |
| + |
| + GURL origin("https://example.org"); |
| + std::vector<ServiceWorkerDatabase::RegistrationData> registrations; |
| + EXPECT_FALSE(database->GetRegistrationsForOrigin(origin, ®istrations)); |
| + |
| + std::vector<ServiceWorkerDatabase::ResourceRecord> resources; |
| + |
| + ServiceWorkerDatabase::RegistrationData data1; |
| + data1.registration_id = 100; |
| + data1.scope = GURL("http://example.com/foo"); |
| + data1.script = GURL("http://example.com/script1.js"); |
| + data1.version_id = 1000; |
| + ASSERT_TRUE(database->WriteRegistration(data1, resources)); |
| + |
| + ServiceWorkerDatabase::RegistrationData data2; |
| + data2.registration_id = 200; |
| + data2.scope = GURL("https://www.example.com/bar"); |
| + data2.script = GURL("https://www.example.com/script2.js"); |
| + data2.version_id = 2000; |
| + ASSERT_TRUE(database->WriteRegistration(data2, resources)); |
| + |
| + ServiceWorkerDatabase::RegistrationData data3; |
| + data3.registration_id = 300; |
| + data3.scope = GURL("https://example.org/hoge"); |
| + data3.script = GURL("https://example.org/script3.js"); |
| + data3.version_id = 3000; |
| + ASSERT_TRUE(database->WriteRegistration(data3, resources)); |
| + |
| + // Same origin with |data3|. |
| + ServiceWorkerDatabase::RegistrationData data4; |
| + data4.registration_id = 400; |
| + data4.scope = GURL("https://example.org/fuga"); |
| + data4.script = GURL("https://example.org/script4.js"); |
| + data4.version_id = 4000; |
| + ASSERT_TRUE(database->WriteRegistration(data4, resources)); |
| + |
| + EXPECT_TRUE(database->GetRegistrationsForOrigin(origin, ®istrations)); |
| + EXPECT_EQ(2U, registrations.size()); |
| + VerifyRegistrationData(data3, registrations[0]); |
| + VerifyRegistrationData(data4, registrations[1]); |
| +} |
| + |
| +TEST(ServiceWorkerDatabaseTest, Registration) { |
| + scoped_ptr<ServiceWorkerDatabase> database(CreateDatabaseInMemory()); |
| + |
| + ServiceWorkerDatabase::RegistrationData data; |
| + data.registration_id = 100; |
| + data.scope = GURL("http://example.com/foo"); |
| + data.script = GURL("http://example.com/script.js"); |
| + data.version_id = 200; |
| + GURL origin = data.scope.GetOrigin(); |
| + |
| + // TODO(nhiroki): Test ResourceRecord manipulation. |
| + std::vector<ServiceWorkerDatabase::ResourceRecord> resources; |
| + |
| + EXPECT_TRUE(database->WriteRegistration(data, resources)); |
| + |
| + ServiceWorkerDatabase::RegistrationData data_out; |
| + std::vector<ServiceWorkerDatabase::ResourceRecord> resources_out; |
| + EXPECT_TRUE(database->ReadRegistration( |
| + data.registration_id, origin, &data_out, &resources_out)); |
| + VerifyRegistrationData(data, data_out); |
| + |
| + EXPECT_TRUE(database->DeleteRegistration(data.registration_id, |
| + data.scope.GetOrigin())); |
| + |
| + EXPECT_FALSE(database->ReadRegistration( |
| + data.registration_id, origin, &data_out, &resources_out)); |
| } |
| } // namespace content |