| 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..f1397d2262f0f4327d19a5ad382cb33d19ea73e5 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,12 @@
|
|
|
| #include "content/browser/service_worker/service_worker_disk_cache_migrator.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"
|
| @@ -51,29 +54,61 @@ 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());
|
| + base::FilePath GetOldDiskCachePath() {
|
| + return user_data_directory_.path().AppendASCII("SrcCache");
|
| + }
|
| + base::FilePath GetDiskCachePath() {
|
| + return user_data_directory_.path().AppendASCII("DestCache");
|
| + }
|
| +
|
| + scoped_ptr<ServiceWorkerDiskCache> CreateSrcDiskCache() {
|
| +#if defined(OS_ANDROID)
|
| + // Android has already used the Simple backend.
|
| + scoped_ptr<ServiceWorkerDiskCache> src(
|
| + ServiceWorkerDiskCache::CreateWithSimpleBackend());
|
| +#else
|
| + scoped_ptr<ServiceWorkerDiskCache> src(
|
| + ServiceWorkerDiskCache::CreateWithBlockFileBackend());
|
| +#endif // defined(OS_ANDROID)
|
| +
|
| + net::TestCompletionCallback cb;
|
| + src->InitWithDiskBackend(
|
| + GetOldDiskCachePath(), kMaxDiskCacheSize, false /* force */,
|
| + base::ThreadTaskRunnerHandle::Get(), cb.callback());
|
| + EXPECT_EQ(net::OK, cb.WaitForResult());
|
| + return src.Pass();
|
| + }
|
| +
|
| + scoped_ptr<ServiceWorkerDiskCache> CreateDestDiskCache() {
|
| + scoped_ptr<ServiceWorkerDiskCache> dest(
|
| + ServiceWorkerDiskCache::CreateWithSimpleBackend());
|
| + net::TestCompletionCallback cb;
|
| + dest->InitWithDiskBackend(
|
| + GetDiskCachePath(), kMaxDiskCacheSize, false /* force */,
|
| + base::ThreadTaskRunnerHandle::Get(), cb.callback());
|
| + EXPECT_EQ(net::OK, cb.WaitForResult());
|
| + return dest.Pass();
|
| + }
|
|
|
| - migrator_.reset(
|
| - new ServiceWorkerDiskCacheMigrator(src_.get(), dest_.get()));
|
| + scoped_ptr<ServiceWorkerDiskCacheMigrator> CreateMigrator() {
|
| + return make_scoped_ptr(new ServiceWorkerDiskCacheMigrator(
|
| + GetOldDiskCachePath(), GetDiskCachePath(), kMaxDiskCacheSize,
|
| + base::ThreadTaskRunnerHandle::Get()));
|
| }
|
|
|
| bool WriteResponse(ServiceWorkerDiskCache* disk_cache,
|
| @@ -159,29 +194,18 @@ 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);
|
| - }
|
| -
|
| - 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 +218,84 @@ 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()));
|
| + src.reset();
|
|
|
| - Migrate();
|
| + // Start the migrator.
|
| + base::RunLoop run_loop;
|
| + scoped_ptr<ServiceWorkerDiskCacheMigrator> migrator(CreateMigrator());
|
| + migrator->Start(base::Bind(&OnDiskCacheMigrated, run_loop.QuitClosure()));
|
| + run_loop.Run();
|
|
|
| // Verify the migrated contents in the dest diskcache.
|
| + scoped_ptr<ServiceWorkerDiskCache> dest(CreateDestDiskCache());
|
| 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());
|
| + ASSERT_EQ(0, GetEntryCount(src.get()));
|
| + src.reset();
|
| +
|
| + // Start the migrator.
|
| + base::RunLoop run_loop;
|
| + scoped_ptr<ServiceWorkerDiskCacheMigrator> migrator(CreateMigrator());
|
| + migrator->Start(base::Bind(&OnDiskCacheMigrated, run_loop.QuitClosure()));
|
| + run_loop.Run();
|
| +
|
| + scoped_ptr<ServiceWorkerDiskCache> dest(CreateDestDiskCache());
|
| + ASSERT_EQ(0, GetEntryCount(dest.get()));
|
| +}
|
| +
|
| +// Tests that the migrator properly removes existing resources in the dest
|
| +// diskcache before starting the migration.
|
| +TEST_F(ServiceWorkerDiskCacheMigratorTest, RemoveExistingResourcesFromDest) {
|
| + std::vector<ResponseData> responses1;
|
| + responses1.push_back(ResponseData(1, "HTTP/1.1 200 OK\0\0", "Hello", ""));
|
| + responses1.push_back(ResponseData(3, "HTTP/1.1 200 OK\0\0", "World", ""));
|
| +
|
| + std::vector<ResponseData> responses2;
|
| + responses2.push_back(ResponseData(10, "HTTP/1.1 200 OK\0\0", "Hello", ""));
|
| + responses2.push_back(ResponseData(11, "HTTP/1.1 200 OK\0\0", "Service", ""));
|
| + responses2.push_back(ResponseData(12, "HTTP/1.1 200 OK\0\0", "", "Worker"));
|
| +
|
| + // Populate initial resources in the src diskcache.
|
| + scoped_ptr<ServiceWorkerDiskCache> src(CreateSrcDiskCache());
|
| + for (const ResponseData& response : responses1) {
|
| + ASSERT_TRUE(WriteResponse(src.get(), response));
|
| + VerifyResponse(src.get(), response);
|
| + }
|
| + ASSERT_EQ(static_cast<int>(responses1.size()), GetEntryCount(src.get()));
|
| + src.reset();
|
| +
|
| + // Populate different resources in the dest diskcache in order to simulate
|
| + // a previous partial migration.
|
| + scoped_ptr<ServiceWorkerDiskCache> dest(CreateDestDiskCache());
|
| + for (const ResponseData& response : responses2) {
|
| + ASSERT_TRUE(WriteResponse(dest.get(), response));
|
| + VerifyResponse(dest.get(), response);
|
| + }
|
| + ASSERT_EQ(static_cast<int>(responses2.size()), GetEntryCount(dest.get()));
|
| + dest.reset();
|
| +
|
| + // Start the migrator.
|
| + base::RunLoop run_loop;
|
| + scoped_ptr<ServiceWorkerDiskCacheMigrator> migrator(CreateMigrator());
|
| + migrator->Start(base::Bind(&OnDiskCacheMigrated, run_loop.QuitClosure()));
|
| + run_loop.Run();
|
| +
|
| + // Verify that only newly migrated resources exist in the dest diskcache.
|
| + dest = CreateDestDiskCache();
|
| + for (const ResponseData& response : responses1)
|
| + VerifyResponse(dest.get(), response);
|
| + EXPECT_EQ(static_cast<int>(responses1.size()), GetEntryCount(dest.get()));
|
| }
|
|
|
| TEST_F(ServiceWorkerDiskCacheMigratorTest, ThrottleInflightTasks) {
|
| @@ -220,22 +304,29 @@ 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()));
|
| + src.reset();
|
| +
|
| + scoped_ptr<ServiceWorkerDiskCacheMigrator> migrator(CreateMigrator());
|
|
|
| // 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.
|
| + scoped_ptr<ServiceWorkerDiskCache> dest(CreateDestDiskCache());
|
| 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()));
|
| }
|
|
|
| } // namespace content
|
|
|