Chromium Code Reviews| Index: content/browser/service_worker/service_worker_disk_cache_migrator_unittest.cc |
| diff --git a/content/browser/service_worker/service_worker_disk_cache_migrator_unittest.cc b/content/browser/service_worker/service_worker_disk_cache_migrator_unittest.cc |
| index 7f3f030a3430331453efd75734da7ff18e4ee052..9003162c40d08066e764259d4b16085c92be2c5f 100644 |
| --- a/content/browser/service_worker/service_worker_disk_cache_migrator_unittest.cc |
| +++ b/content/browser/service_worker/service_worker_disk_cache_migrator_unittest.cc |
| @@ -4,9 +4,13 @@ |
| #include "content/browser/service_worker/service_worker_disk_cache_migrator.h" |
| +#include "base/barrier_closure.h" |
| +#include "base/files/file_util.h" |
| #include "base/files/scoped_temp_dir.h" |
| #include "base/run_loop.h" |
| #include "base/thread_task_runner_handle.h" |
| +#include "content/browser/service_worker/service_worker_context_core.h" |
| +#include "content/browser/service_worker/service_worker_storage.h" |
| #include "content/public/test/test_browser_thread_bundle.h" |
| #include "net/base/io_buffer.h" |
| #include "net/base/net_errors.h" |
| @@ -42,6 +46,15 @@ void OnDiskCacheMigrated(const base::Closure& callback, |
| callback.Run(); |
| } |
| +void OnRegistrationFound( |
| + const base::Closure& barrier_closure, |
| + ServiceWorkerStatusCode status, |
| + const scoped_refptr<ServiceWorkerRegistration>& registration) { |
| + ASSERT_EQ(SERVICE_WORKER_ERROR_NOT_FOUND, status); |
| + ASSERT_FALSE(registration); |
|
falken
2015/06/08 09:05:54
It's a bit unexpected to assert these in a functio
nhiroki
2015/06/08 09:29:21
These asserts were used when I tested the patchset
|
| + barrier_closure.Run(); |
| +} |
| + |
| } // namespace |
| class ServiceWorkerDiskCacheMigratorTest : public testing::Test { |
| @@ -51,29 +64,41 @@ class ServiceWorkerDiskCacheMigratorTest : public testing::Test { |
| void SetUp() override { |
| ASSERT_TRUE(user_data_directory_.CreateUniqueTempDir()); |
| - const base::FilePath kSrcDiskCachePath = |
| - user_data_directory_.path().AppendASCII("SrcCache"); |
| - const base::FilePath kDestDiskCachePath = |
| - user_data_directory_.path().AppendASCII("DestCache"); |
| + scoped_ptr<ServiceWorkerDatabaseTaskManager> database_task_manager( |
| + new MockServiceWorkerDatabaseTaskManager( |
| + base::ThreadTaskRunnerHandle::Get())); |
| + |
| + context_.reset(new ServiceWorkerContextCore( |
| + user_data_directory_.path(), database_task_manager.Pass(), |
| + base::ThreadTaskRunnerHandle::Get(), nullptr, nullptr, nullptr, |
| + nullptr)); |
| + } |
| - // Initialize the src BlockFile diskcache. |
| - src_ = ServiceWorkerDiskCache::CreateWithBlockFileBackend(); |
| - net::TestCompletionCallback cb1; |
| - src_->InitWithDiskBackend( |
| - kSrcDiskCachePath, kMaxDiskCacheSize, false /* force */, |
| - base::ThreadTaskRunnerHandle::Get(), cb1.callback()); |
| - ASSERT_EQ(net::OK, cb1.WaitForResult()); |
| + void TearDown() override { |
| + context_.reset(); |
| + base::RunLoop().RunUntilIdle(); |
| + } |
| - // Initialize the dest Simple diskcache. |
| - dest_ = ServiceWorkerDiskCache::CreateWithSimpleBackend(); |
| - net::TestCompletionCallback cb2; |
| - dest_->InitWithDiskBackend( |
| - kDestDiskCachePath, kMaxDiskCacheSize, false /* force */, |
| - base::ThreadTaskRunnerHandle::Get(), cb2.callback()); |
| - ASSERT_EQ(net::OK, cb2.WaitForResult()); |
| + scoped_ptr<ServiceWorkerDiskCache> CreateSrcDiskCache() { |
| + scoped_ptr<ServiceWorkerDiskCache> src( |
| + ServiceWorkerDiskCache::CreateWithBlockFileBackend()); |
| + net::TestCompletionCallback cb; |
| + src->InitWithDiskBackend( |
| + storage()->GetOldDiskCachePath(), kMaxDiskCacheSize, false /* force */, |
| + base::ThreadTaskRunnerHandle::Get(), cb.callback()); |
| + EXPECT_EQ(net::OK, cb.WaitForResult()); |
| + return src.Pass(); |
| + } |
| - migrator_.reset( |
| - new ServiceWorkerDiskCacheMigrator(src_.get(), dest_.get())); |
| + scoped_ptr<ServiceWorkerDiskCache> CreateDestDiskCache() { |
| + scoped_ptr<ServiceWorkerDiskCache> dest( |
| + ServiceWorkerDiskCache::CreateWithSimpleBackend()); |
| + net::TestCompletionCallback cb; |
| + dest->InitWithDiskBackend( |
| + storage()->GetDiskCachePath(), kMaxDiskCacheSize, false /* force */, |
| + base::ThreadTaskRunnerHandle::Get(), cb.callback()); |
| + EXPECT_EQ(net::OK, cb.WaitForResult()); |
| + return dest.Pass(); |
| } |
| bool WriteResponse(ServiceWorkerDiskCache* disk_cache, |
| @@ -159,29 +184,20 @@ class ServiceWorkerDiskCacheMigratorTest : public testing::Test { |
| EXPECT_EQ(0, memcmp(expected.body.data(), body_buffer->data(), rv)); |
| } |
| - void Migrate() { |
| - base::RunLoop run_loop; |
| - migrator_->Start(base::Bind(&OnDiskCacheMigrated, run_loop.QuitClosure())); |
| - run_loop.Run(); |
| - } |
| - |
| int32 GetEntryCount(ServiceWorkerDiskCache* disk_cache) { |
| return disk_cache->disk_cache()->GetEntryCount(); |
| } |
| - void SetMaxNumberOfInflightTasks(size_t max_number) { |
| - migrator_->set_max_number_of_inflight_tasks(max_number); |
| - } |
| + ServiceWorkerStorage* storage() { return context_->storage(); } |
| - protected: |
| + private: |
| TestBrowserThreadBundle browser_thread_bundle_; |
| base::ScopedTempDir user_data_directory_; |
| - scoped_ptr<ServiceWorkerDiskCache> src_; |
| - scoped_ptr<ServiceWorkerDiskCache> dest_; |
| - scoped_ptr<ServiceWorkerDiskCacheMigrator> migrator_; |
| + |
| + scoped_ptr<ServiceWorkerContextCore> context_; |
| }; |
| -TEST_F(ServiceWorkerDiskCacheMigratorTest, Basic) { |
| +TEST_F(ServiceWorkerDiskCacheMigratorTest, MigrateDiskCache) { |
| std::vector<ResponseData> responses; |
| responses.push_back(ResponseData(1, "HTTP/1.1 200 OK\0\0", "Hello", "")); |
| responses.push_back(ResponseData(2, "HTTP/1.1 200 OK\0\0", "Service", "")); |
| @@ -194,24 +210,44 @@ TEST_F(ServiceWorkerDiskCacheMigratorTest, Basic) { |
| 20, "HTTP/1.1 200 OK\0\0", std::string(256, 'a'), std::string(128, 'b'))); |
| // Populate initial data in the src diskcache. |
| + scoped_ptr<ServiceWorkerDiskCache> src(CreateSrcDiskCache()); |
| for (const ResponseData& response : responses) { |
| - ASSERT_TRUE(WriteResponse(src_.get(), response)); |
| - VerifyResponse(src_.get(), response); |
| + ASSERT_TRUE(WriteResponse(src.get(), response)); |
| + VerifyResponse(src.get(), response); |
| } |
| - ASSERT_EQ(static_cast<int>(responses.size()), GetEntryCount(src_.get())); |
| + ASSERT_EQ(static_cast<int>(responses.size()), GetEntryCount(src.get())); |
| - Migrate(); |
| + scoped_ptr<ServiceWorkerDiskCache> dest(CreateDestDiskCache()); |
| + |
| + // Start the migrator. |
| + base::RunLoop run_loop; |
| + scoped_ptr<ServiceWorkerDiskCacheMigrator> migrator( |
| + new ServiceWorkerDiskCacheMigrator(src.get(), dest.get())); |
| + migrator->Start(base::Bind(&OnDiskCacheMigrated, run_loop.QuitClosure())); |
| + run_loop.Run(); |
| // Verify the migrated contents in the dest diskcache. |
| for (const ResponseData& response : responses) |
| - VerifyResponse(dest_.get(), response); |
| - EXPECT_EQ(static_cast<int>(responses.size()), GetEntryCount(dest_.get())); |
| + VerifyResponse(dest.get(), response); |
| + EXPECT_EQ(static_cast<int>(responses.size()), GetEntryCount(dest.get())); |
| } |
| TEST_F(ServiceWorkerDiskCacheMigratorTest, MigrateEmptyDiskCache) { |
| - ASSERT_EQ(0, GetEntryCount(src_.get())); |
| - Migrate(); |
| - EXPECT_EQ(0, GetEntryCount(dest_.get())); |
| + scoped_ptr<ServiceWorkerDiskCache> src(CreateSrcDiskCache()); |
| + scoped_ptr<ServiceWorkerDiskCache> dest(CreateDestDiskCache()); |
| + |
| + ASSERT_EQ(0, GetEntryCount(src.get())); |
| + ASSERT_EQ(0, GetEntryCount(dest.get())); |
| + |
| + // Start the migrator. |
| + base::RunLoop run_loop; |
| + scoped_ptr<ServiceWorkerDiskCacheMigrator> migrator( |
| + new ServiceWorkerDiskCacheMigrator(src.get(), dest.get())); |
| + migrator->Start(base::Bind(&OnDiskCacheMigrated, run_loop.QuitClosure())); |
| + run_loop.Run(); |
| + |
| + ASSERT_EQ(0, GetEntryCount(src.get())); |
| + ASSERT_EQ(0, GetEntryCount(dest.get())); |
| } |
| TEST_F(ServiceWorkerDiskCacheMigratorTest, ThrottleInflightTasks) { |
| @@ -220,22 +256,93 @@ TEST_F(ServiceWorkerDiskCacheMigratorTest, ThrottleInflightTasks) { |
| responses.push_back(ResponseData(i, "HTTP/1.1 200 OK\0\0", "foo", "bar")); |
| // Populate initial data in the src diskcache. |
| + scoped_ptr<ServiceWorkerDiskCache> src(CreateSrcDiskCache()); |
| for (const ResponseData& response : responses) { |
| - ASSERT_TRUE(WriteResponse(src_.get(), response)); |
| - VerifyResponse(src_.get(), response); |
| + ASSERT_TRUE(WriteResponse(src.get(), response)); |
| + VerifyResponse(src.get(), response); |
| } |
| - ASSERT_EQ(static_cast<int>(responses.size()), GetEntryCount(src_.get())); |
| + ASSERT_EQ(static_cast<int>(responses.size()), GetEntryCount(src.get())); |
| + |
| + scoped_ptr<ServiceWorkerDiskCache> dest(CreateDestDiskCache()); |
| + scoped_ptr<ServiceWorkerDiskCacheMigrator> migrator( |
| + new ServiceWorkerDiskCacheMigrator(src.get(), dest.get())); |
| // Tighten the max number of inflight tasks. |
| - SetMaxNumberOfInflightTasks(2); |
| + migrator->set_max_number_of_inflight_tasks(2); |
| // Migration should hit the limit, but should successfully complete. |
| - Migrate(); |
| + base::RunLoop run_loop; |
| + migrator->Start(base::Bind(&OnDiskCacheMigrated, run_loop.QuitClosure())); |
| + run_loop.Run(); |
| + |
| + // Verify the migrated contents in the dest diskcache. |
| + for (const ResponseData& response : responses) |
| + VerifyResponse(dest.get(), response); |
| + EXPECT_EQ(static_cast<int>(responses.size()), GetEntryCount(dest.get())); |
| +} |
| + |
| +TEST_F(ServiceWorkerDiskCacheMigratorTest, MigrateOnDiskCacheAccess) { |
| + std::vector<ResponseData> responses; |
| + responses.push_back(ResponseData(1, "HTTP/1.1 200 OK\0\0", "Hello", "")); |
| + responses.push_back(ResponseData(2, "HTTP/1.1 200 OK\0\0", "Service", "")); |
| + responses.push_back(ResponseData(5, "HTTP/1.1 200 OK\0\0", "Worker", "")); |
| + responses.push_back(ResponseData(3, "HTTP/1.1 200 OK\0\0", "World", "meta")); |
| + |
| + // Populate initial data in the src diskcache. |
| + scoped_ptr<ServiceWorkerDiskCache> src(CreateSrcDiskCache()); |
| + for (const ResponseData& response : responses) { |
| + ASSERT_TRUE(WriteResponse(src.get(), response)); |
| + VerifyResponse(src.get(), response); |
| + } |
| + ASSERT_EQ(static_cast<int>(responses.size()), GetEntryCount(src.get())); |
| + ASSERT_TRUE(base::DirectoryExists(storage()->GetOldDiskCachePath())); |
| + src.reset(); |
| + |
| + base::RunLoop run_loop; |
| + storage()->LazyInitialize(run_loop.QuitClosure()); |
| + run_loop.Run(); |
| + |
| + // DiskCache access should start the migration. |
| + ASSERT_TRUE(storage()->needs_disk_cache_migration_); |
| + ServiceWorkerDiskCache* dest = storage()->disk_cache(); |
| // Verify the migrated contents in the dest diskcache. |
| for (const ResponseData& response : responses) |
| - VerifyResponse(dest_.get(), response); |
| - EXPECT_EQ(static_cast<int>(responses.size()), GetEntryCount(dest_.get())); |
| + VerifyResponse(dest, response); |
| + EXPECT_EQ(static_cast<int>(responses.size()), GetEntryCount(dest)); |
| + |
| + // The src DiskCache should be deleted after the migration. |
| + EXPECT_FALSE(base::DirectoryExists(storage()->GetOldDiskCachePath())); |
| +} |
| + |
| +TEST_F(ServiceWorkerDiskCacheMigratorTest, NotMigrateOnDatabaseAccess) { |
| + std::vector<ResponseData> responses; |
| + responses.push_back(ResponseData(1, "HTTP/1.1 200 OK\0\0", "Hello", "")); |
| + responses.push_back(ResponseData(2, "HTTP/1.1 200 OK\0\0", "Service", "")); |
| + responses.push_back(ResponseData(5, "HTTP/1.1 200 OK\0\0", "Worker", "")); |
| + responses.push_back(ResponseData(3, "HTTP/1.1 200 OK\0\0", "World", "meta")); |
| + |
| + // Populate initial data in the src diskcache. |
| + scoped_ptr<ServiceWorkerDiskCache> src(CreateSrcDiskCache()); |
| + for (const ResponseData& response : responses) { |
| + ASSERT_TRUE(WriteResponse(src.get(), response)); |
| + VerifyResponse(src.get(), response); |
| + } |
| + ASSERT_EQ(static_cast<int>(responses.size()), GetEntryCount(src.get())); |
| + ASSERT_TRUE(base::DirectoryExists(storage()->GetOldDiskCachePath())); |
| + |
| + // Database access should not start the migration. |
| + base::RunLoop run_loop; |
| + storage()->FindRegistrationForDocument( |
| + GURL("http://example.com/"), |
| + base::Bind(&OnRegistrationFound, run_loop.QuitClosure())); |
| + run_loop.Run(); |
| + |
| + // Verify that the migration didn't happen. |
| + scoped_ptr<ServiceWorkerDiskCache> dest(CreateDestDiskCache()); |
| + EXPECT_EQ(static_cast<int>(responses.size()), GetEntryCount(src.get())); |
| + EXPECT_EQ(0, GetEntryCount(dest.get())); |
| + EXPECT_TRUE(base::DirectoryExists(storage()->GetOldDiskCachePath())); |
| } |
| } // namespace content |