Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "content/browser/service_worker/service_worker_disk_cache_migrator.h" | |
| 6 | |
| 7 #include "base/files/scoped_temp_dir.h" | |
| 8 #include "base/run_loop.h" | |
| 9 #include "base/thread_task_runner_handle.h" | |
| 10 #include "content/public/test/test_browser_thread_bundle.h" | |
| 11 #include "net/base/io_buffer.h" | |
| 12 #include "net/base/net_errors.h" | |
| 13 #include "net/base/test_completion_callback.h" | |
| 14 #include "net/http/http_response_headers.h" | |
| 15 #include "testing/gtest/include/gtest/gtest.h" | |
| 16 | |
| 17 namespace content { | |
| 18 | |
| 19 namespace { | |
| 20 | |
| 21 const int kMaxDiskCacheSize = 250 * 1024 * 1024; | |
| 22 | |
| 23 struct ResponseData { | |
| 24 int64 resource_id; | |
| 25 std::string headers; | |
| 26 std::string body; | |
| 27 std::string metadata; | |
| 28 | |
| 29 ResponseData(int64 resource_id, | |
| 30 const std::string& headers, | |
| 31 const std::string& body, | |
| 32 const std::string& metadata) | |
| 33 : resource_id(resource_id), | |
| 34 headers(headers), | |
| 35 body(body), | |
| 36 metadata(metadata) {} | |
| 37 }; | |
| 38 | |
| 39 void OnDiskCacheMigrated(const base::Closure& callback, | |
| 40 ServiceWorkerStatusCode status) { | |
| 41 EXPECT_EQ(SERVICE_WORKER_OK, status); | |
| 42 callback.Run(); | |
| 43 } | |
| 44 | |
| 45 } // namespace | |
| 46 | |
| 47 class ServiceWorkerDiskCacheMigratorTest : public testing::Test { | |
|
michaeln
2015/05/27 23:09:23
Might have been because simple cache iterators are
nhiroki
2015/05/28 00:21:09
Good to know. Oh... only reading (no writing) coul
| |
| 48 public: | |
| 49 ServiceWorkerDiskCacheMigratorTest() | |
| 50 : browser_thread_bundle_(TestBrowserThreadBundle::IO_MAINLOOP) {} | |
| 51 | |
| 52 void SetUp() override { | |
| 53 ASSERT_TRUE(user_data_directory_.CreateUniqueTempDir()); | |
| 54 const base::FilePath kSrcDiskCachePath = | |
| 55 user_data_directory_.path().AppendASCII("SrcCache"); | |
| 56 const base::FilePath kDestDiskCachePath = | |
| 57 user_data_directory_.path().AppendASCII("DestCache"); | |
| 58 | |
| 59 // Initialize the src BlockFile diskcache. | |
| 60 src_ = ServiceWorkerDiskCache::CreateWithBlockFileBackend(); | |
| 61 net::TestCompletionCallback cb1; | |
| 62 src_->InitWithDiskBackend( | |
| 63 kSrcDiskCachePath, kMaxDiskCacheSize, false /* force */, | |
| 64 base::ThreadTaskRunnerHandle::Get(), cb1.callback()); | |
| 65 ASSERT_EQ(net::OK, cb1.WaitForResult()); | |
| 66 | |
| 67 // Initialize the dest Simple diskcache. | |
| 68 dest_ = ServiceWorkerDiskCache::CreateWithSimpleBackend(); | |
| 69 net::TestCompletionCallback cb2; | |
| 70 dest_->InitWithDiskBackend( | |
| 71 kDestDiskCachePath, kMaxDiskCacheSize, false /* force */, | |
| 72 base::ThreadTaskRunnerHandle::Get(), cb2.callback()); | |
| 73 ASSERT_EQ(net::OK, cb2.WaitForResult()); | |
| 74 } | |
| 75 | |
| 76 bool WriteResponse(ServiceWorkerDiskCache* disk_cache, | |
| 77 const ResponseData& response) { | |
| 78 scoped_ptr<ServiceWorkerResponseWriter> writer( | |
| 79 new ServiceWorkerResponseWriter(response.resource_id, disk_cache)); | |
| 80 | |
| 81 // Write the response info. | |
| 82 scoped_ptr<net::HttpResponseInfo> info(new net::HttpResponseInfo); | |
| 83 info->request_time = base::Time() + base::TimeDelta::FromSeconds(10); | |
| 84 info->response_time = info->request_time + base::TimeDelta::FromSeconds(10); | |
| 85 info->was_cached = false; | |
| 86 info->headers = new net::HttpResponseHeaders(response.headers); | |
| 87 scoped_refptr<HttpResponseInfoIOBuffer> info_buffer = | |
| 88 new HttpResponseInfoIOBuffer(info.release()); | |
| 89 net::TestCompletionCallback cb1; | |
| 90 writer->WriteInfo(info_buffer.get(), cb1.callback()); | |
| 91 int rv = cb1.WaitForResult(); | |
| 92 EXPECT_LT(0, rv); | |
| 93 if (rv < 0) | |
| 94 return false; | |
| 95 | |
| 96 // Write the response metadata. | |
| 97 scoped_ptr<ServiceWorkerResponseMetadataWriter> metadata_writer( | |
| 98 new ServiceWorkerResponseMetadataWriter(response.resource_id, | |
| 99 disk_cache)); | |
| 100 scoped_refptr<net::IOBuffer> metadata_buffer( | |
| 101 new net::WrappedIOBuffer(response.metadata.data())); | |
| 102 const int metadata_length = response.metadata.length(); | |
| 103 net::TestCompletionCallback cb2; | |
| 104 metadata_writer->WriteMetadata(metadata_buffer.get(), metadata_length, | |
| 105 cb2.callback()); | |
| 106 rv = cb2.WaitForResult(); | |
| 107 EXPECT_EQ(metadata_length, rv); | |
| 108 if (metadata_length != rv) | |
| 109 return false; | |
| 110 | |
| 111 // Write the response body. | |
| 112 scoped_refptr<net::IOBuffer> body_buffer( | |
| 113 new net::WrappedIOBuffer(response.body.data())); | |
| 114 const int body_length = response.body.length(); | |
| 115 net::TestCompletionCallback cb3; | |
| 116 writer->WriteData(body_buffer.get(), body_length, cb3.callback()); | |
| 117 rv = cb3.WaitForResult(); | |
| 118 EXPECT_EQ(body_length, rv); | |
| 119 if (body_length != rv) | |
| 120 return false; | |
| 121 | |
| 122 return true; | |
| 123 } | |
| 124 | |
| 125 void VerifyResponse(ServiceWorkerDiskCache* disk_cache, | |
| 126 const ResponseData& expected) { | |
| 127 scoped_ptr<ServiceWorkerResponseReader> reader( | |
| 128 new ServiceWorkerResponseReader(expected.resource_id, disk_cache)); | |
| 129 | |
| 130 // Verify the response info. | |
| 131 scoped_refptr<HttpResponseInfoIOBuffer> info_buffer = | |
| 132 new HttpResponseInfoIOBuffer; | |
| 133 net::TestCompletionCallback cb1; | |
| 134 reader->ReadInfo(info_buffer.get(), cb1.callback()); | |
| 135 int rv = cb1.WaitForResult(); | |
| 136 EXPECT_LT(0, rv); | |
| 137 EXPECT_EQ("OK", info_buffer->http_info->headers->GetStatusText()); | |
| 138 | |
| 139 // Verify the response metadata. | |
| 140 if (!expected.metadata.empty()) { | |
| 141 ASSERT_TRUE(info_buffer->http_info->metadata); | |
| 142 const int data_size = info_buffer->http_info->metadata->size(); | |
| 143 ASSERT_EQ(static_cast<int>(expected.metadata.length()), data_size); | |
| 144 EXPECT_EQ(0, memcmp(expected.metadata.data(), | |
| 145 info_buffer->http_info->metadata->data(), | |
| 146 expected.metadata.length())); | |
| 147 } | |
| 148 | |
| 149 // Verify the response body. | |
| 150 const int kBigEnough = 512; | |
| 151 scoped_refptr<net::IOBuffer> body_buffer = new net::IOBuffer(kBigEnough); | |
| 152 net::TestCompletionCallback cb2; | |
| 153 reader->ReadData(body_buffer.get(), kBigEnough, cb2.callback()); | |
| 154 rv = cb2.WaitForResult(); | |
| 155 ASSERT_EQ(static_cast<int>(expected.body.length()), rv); | |
| 156 EXPECT_EQ(0, memcmp(expected.body.data(), body_buffer->data(), rv)); | |
| 157 } | |
| 158 | |
| 159 int32 GetEntryCount(ServiceWorkerDiskCache* disk_cache) { | |
| 160 return disk_cache->disk_cache()->GetEntryCount(); | |
| 161 } | |
| 162 | |
| 163 protected: | |
| 164 TestBrowserThreadBundle browser_thread_bundle_; | |
| 165 base::ScopedTempDir user_data_directory_; | |
| 166 scoped_ptr<ServiceWorkerDiskCache> src_; | |
| 167 scoped_ptr<ServiceWorkerDiskCache> dest_; | |
| 168 }; | |
| 169 | |
| 170 TEST_F(ServiceWorkerDiskCacheMigratorTest, MigrateResponses_Basic) { | |
| 171 std::vector<ResponseData> responses; | |
| 172 responses.push_back(ResponseData(1, "HTTP/1.1 200 OK\0\0", "Hello", "")); | |
| 173 responses.push_back(ResponseData(2, "HTTP/1.1 200 OK\0\0", "Service", "")); | |
| 174 responses.push_back(ResponseData(5, "HTTP/1.1 200 OK\0\0", "Worker", "")); | |
| 175 responses.push_back(ResponseData(3, "HTTP/1.1 200 OK\0\0", "World", "meta")); | |
| 176 responses.push_back(ResponseData(10, "HTTP/1.1 200 OK\0\0", "", "meta")); | |
| 177 responses.push_back(ResponseData(11, "HTTP/1.1 200 OK\0\0", "body", "")); | |
| 178 responses.push_back(ResponseData(12, "HTTP/1.1 200 OK\0\0", "", "")); | |
| 179 | |
| 180 // Populate initial data in the src diskcache. | |
| 181 for (const ResponseData& response : responses) { | |
| 182 ASSERT_TRUE(WriteResponse(src_.get(), response)); | |
| 183 VerifyResponse(src_.get(), response); | |
| 184 } | |
| 185 ASSERT_EQ(static_cast<int>(responses.size()), GetEntryCount(src_.get())); | |
| 186 | |
| 187 // Migrate contents in the src diskcache to the dest diskcache. | |
| 188 base::RunLoop run_loop; | |
| 189 scoped_ptr<ServiceWorkerDiskCacheMigrator> migrator( | |
| 190 new ServiceWorkerDiskCacheMigrator(src_.get(), dest_.get())); | |
| 191 migrator->Start(base::Bind(&OnDiskCacheMigrated, run_loop.QuitClosure())); | |
| 192 run_loop.Run(); | |
| 193 | |
| 194 // Verify the migrated contents in the dest diskcache. | |
| 195 for (const ResponseData& response : responses) | |
| 196 VerifyResponse(dest_.get(), response); | |
| 197 EXPECT_EQ(static_cast<int>(responses.size()), GetEntryCount(dest_.get())); | |
| 198 } | |
| 199 | |
| 200 TEST_F(ServiceWorkerDiskCacheMigratorTest, MigrateResponses_EmptyDiskCache) { | |
| 201 base::RunLoop run_loop; | |
| 202 scoped_ptr<ServiceWorkerDiskCacheMigrator> migrator( | |
| 203 new ServiceWorkerDiskCacheMigrator(src_.get(), dest_.get())); | |
| 204 migrator->Start(base::Bind(&OnDiskCacheMigrated, run_loop.QuitClosure())); | |
| 205 run_loop.Run(); | |
| 206 } | |
| 207 | |
| 208 } // namespace content | |
| OLD | NEW |