| Index: content/browser/service_worker/service_worker_cache_unittest.cc
|
| diff --git a/content/browser/service_worker/service_worker_cache_unittest.cc b/content/browser/service_worker/service_worker_cache_unittest.cc
|
| deleted file mode 100644
|
| index 64bf0d776916ac80a5e7d506ab932f6d9eb72408..0000000000000000000000000000000000000000
|
| --- a/content/browser/service_worker/service_worker_cache_unittest.cc
|
| +++ /dev/null
|
| @@ -1,836 +0,0 @@
|
| -// Copyright 2014 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "content/browser/service_worker/service_worker_cache.h"
|
| -
|
| -#include "base/files/file_path.h"
|
| -#include "base/files/scoped_temp_dir.h"
|
| -#include "base/message_loop/message_loop_proxy.h"
|
| -#include "base/run_loop.h"
|
| -#include "content/browser/fileapi/chrome_blob_storage_context.h"
|
| -#include "content/browser/fileapi/mock_url_request_delegate.h"
|
| -#include "content/browser/quota/mock_quota_manager_proxy.h"
|
| -#include "content/common/service_worker/service_worker_types.h"
|
| -#include "content/public/browser/browser_thread.h"
|
| -#include "content/public/common/referrer.h"
|
| -#include "content/public/test/test_browser_context.h"
|
| -#include "content/public/test/test_browser_thread_bundle.h"
|
| -#include "net/url_request/url_request_context.h"
|
| -#include "net/url_request/url_request_context_getter.h"
|
| -#include "net/url_request/url_request_job_factory_impl.h"
|
| -#include "storage/browser/blob/blob_data_builder.h"
|
| -#include "storage/browser/blob/blob_data_handle.h"
|
| -#include "storage/browser/blob/blob_data_snapshot.h"
|
| -#include "storage/browser/blob/blob_storage_context.h"
|
| -#include "storage/browser/blob/blob_url_request_job_factory.h"
|
| -#include "storage/browser/quota/quota_manager_proxy.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -namespace content {
|
| -
|
| -namespace {
|
| -const char kTestData[] = "Hello World";
|
| -
|
| -// Returns a BlobProtocolHandler that uses |blob_storage_context|. Caller owns
|
| -// the memory.
|
| -storage::BlobProtocolHandler* CreateMockBlobProtocolHandler(
|
| - storage::BlobStorageContext* blob_storage_context) {
|
| - // The FileSystemContext and MessageLoopProxy are not actually used but a
|
| - // MessageLoopProxy is needed to avoid a DCHECK in BlobURLRequestJob ctor.
|
| - return new storage::BlobProtocolHandler(
|
| - blob_storage_context, NULL, base::MessageLoopProxy::current().get());
|
| -}
|
| -
|
| -// A disk_cache::Backend wrapper that can delay operations.
|
| -class DelayableBackend : public disk_cache::Backend {
|
| - public:
|
| - DelayableBackend(scoped_ptr<disk_cache::Backend> backend)
|
| - : backend_(backend.Pass()), delay_open_(false) {}
|
| -
|
| - // disk_cache::Backend overrides
|
| - net::CacheType GetCacheType() const override {
|
| - return backend_->GetCacheType();
|
| - }
|
| - int32 GetEntryCount() const override { return backend_->GetEntryCount(); }
|
| - int OpenEntry(const std::string& key,
|
| - disk_cache::Entry** entry,
|
| - const CompletionCallback& callback) override {
|
| - if (delay_open_) {
|
| - open_entry_callback_ =
|
| - base::Bind(&DelayableBackend::OpenEntryDelayedImpl,
|
| - base::Unretained(this), key, entry, callback);
|
| - return net::ERR_IO_PENDING;
|
| - }
|
| -
|
| - return backend_->OpenEntry(key, entry, callback);
|
| - }
|
| - int CreateEntry(const std::string& key,
|
| - disk_cache::Entry** entry,
|
| - const CompletionCallback& callback) override {
|
| - return backend_->CreateEntry(key, entry, callback);
|
| - }
|
| - int DoomEntry(const std::string& key,
|
| - const CompletionCallback& callback) override {
|
| - return backend_->DoomEntry(key, callback);
|
| - }
|
| - int DoomAllEntries(const CompletionCallback& callback) override {
|
| - return backend_->DoomAllEntries(callback);
|
| - }
|
| - int DoomEntriesBetween(base::Time initial_time,
|
| - base::Time end_time,
|
| - const CompletionCallback& callback) override {
|
| - return backend_->DoomEntriesBetween(initial_time, end_time, callback);
|
| - }
|
| - int DoomEntriesSince(base::Time initial_time,
|
| - const CompletionCallback& callback) override {
|
| - return backend_->DoomEntriesSince(initial_time, callback);
|
| - }
|
| - scoped_ptr<Iterator> CreateIterator() override {
|
| - return backend_->CreateIterator();
|
| - }
|
| - void GetStats(
|
| - std::vector<std::pair<std::string, std::string>>* stats) override {
|
| - return backend_->GetStats(stats);
|
| - }
|
| - void OnExternalCacheHit(const std::string& key) override {
|
| - return backend_->OnExternalCacheHit(key);
|
| - }
|
| -
|
| - // Call to continue a delayed open.
|
| - void OpenEntryContinue() {
|
| - EXPECT_FALSE(open_entry_callback_.is_null());
|
| - open_entry_callback_.Run();
|
| - }
|
| -
|
| - void set_delay_open(bool value) { delay_open_ = value; }
|
| -
|
| - private:
|
| - void OpenEntryDelayedImpl(const std::string& key,
|
| - disk_cache::Entry** entry,
|
| - const CompletionCallback& callback) {
|
| - int rv = backend_->OpenEntry(key, entry, callback);
|
| - if (rv != net::ERR_IO_PENDING)
|
| - callback.Run(rv);
|
| - }
|
| -
|
| - scoped_ptr<disk_cache::Backend> backend_;
|
| - bool delay_open_;
|
| - base::Closure open_entry_callback_;
|
| -};
|
| -
|
| -} // namespace
|
| -
|
| -// A ServiceWorkerCache that can optionally delay during backend creation.
|
| -class TestServiceWorkerCache : public ServiceWorkerCache {
|
| - public:
|
| - TestServiceWorkerCache(
|
| - const GURL& origin,
|
| - const base::FilePath& path,
|
| - net::URLRequestContext* request_context,
|
| - const scoped_refptr<storage::QuotaManagerProxy>& quota_manager_proxy,
|
| - base::WeakPtr<storage::BlobStorageContext> blob_context)
|
| - : ServiceWorkerCache(origin,
|
| - path,
|
| - request_context,
|
| - quota_manager_proxy,
|
| - blob_context),
|
| - delay_backend_creation_(false) {}
|
| -
|
| - void CreateBackend(const ErrorCallback& callback) override {
|
| - backend_creation_callback_ = callback;
|
| - if (delay_backend_creation_)
|
| - return;
|
| - ContinueCreateBackend();
|
| - }
|
| -
|
| - void ContinueCreateBackend() {
|
| - ServiceWorkerCache::CreateBackend(backend_creation_callback_);
|
| - }
|
| -
|
| - void set_delay_backend_creation(bool delay) {
|
| - delay_backend_creation_ = delay;
|
| - }
|
| -
|
| - // Swap the existing backend with a delayable one. The backend must have been
|
| - // created before calling this.
|
| - DelayableBackend* UseDelayableBackend() {
|
| - EXPECT_TRUE(backend_);
|
| - DelayableBackend* delayable_backend = new DelayableBackend(backend_.Pass());
|
| - backend_.reset(delayable_backend);
|
| - return delayable_backend;
|
| - }
|
| -
|
| - private:
|
| - ~TestServiceWorkerCache() override {}
|
| -
|
| - bool delay_backend_creation_;
|
| - ErrorCallback backend_creation_callback_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(TestServiceWorkerCache);
|
| -};
|
| -
|
| -class ServiceWorkerCacheTest : public testing::Test {
|
| - public:
|
| - ServiceWorkerCacheTest()
|
| - : browser_thread_bundle_(TestBrowserThreadBundle::IO_MAINLOOP),
|
| - callback_error_(ServiceWorkerCache::ERROR_TYPE_OK),
|
| - callback_closed_(false) {}
|
| -
|
| - void SetUp() override {
|
| - ChromeBlobStorageContext* blob_storage_context =
|
| - ChromeBlobStorageContext::GetFor(&browser_context_);
|
| - // Wait for chrome_blob_storage_context to finish initializing.
|
| - base::RunLoop().RunUntilIdle();
|
| - blob_storage_context_ = blob_storage_context->context();
|
| -
|
| - quota_manager_proxy_ = new MockQuotaManagerProxy(
|
| - nullptr, base::MessageLoopProxy::current().get());
|
| -
|
| - url_request_job_factory_.reset(new net::URLRequestJobFactoryImpl);
|
| - url_request_job_factory_->SetProtocolHandler(
|
| - "blob", CreateMockBlobProtocolHandler(blob_storage_context->context()));
|
| -
|
| - net::URLRequestContext* url_request_context =
|
| - browser_context_.GetRequestContext()->GetURLRequestContext();
|
| -
|
| - url_request_context->set_job_factory(url_request_job_factory_.get());
|
| -
|
| - CreateRequests(blob_storage_context);
|
| -
|
| - if (!MemoryOnly())
|
| - ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
|
| - base::FilePath path = MemoryOnly() ? base::FilePath() : temp_dir_.path();
|
| -
|
| - cache_ = make_scoped_refptr(new TestServiceWorkerCache(
|
| - GURL("http://example.com"), path, url_request_context,
|
| - quota_manager_proxy_, blob_storage_context->context()->AsWeakPtr()));
|
| - }
|
| -
|
| - void TearDown() override {
|
| - quota_manager_proxy_->SimulateQuotaManagerDestroyed();
|
| - base::RunLoop().RunUntilIdle();
|
| - }
|
| -
|
| - void CreateRequests(ChromeBlobStorageContext* blob_storage_context) {
|
| - ServiceWorkerHeaderMap headers;
|
| - headers.insert(std::make_pair("a", "a"));
|
| - headers.insert(std::make_pair("b", "b"));
|
| - body_request_ =
|
| - ServiceWorkerFetchRequest(GURL("http://example.com/body.html"), "GET",
|
| - headers, Referrer(), false);
|
| - no_body_request_ =
|
| - ServiceWorkerFetchRequest(GURL("http://example.com/no_body.html"),
|
| - "GET",
|
| - headers,
|
| - Referrer(),
|
| - false);
|
| -
|
| - std::string expected_response;
|
| - for (int i = 0; i < 100; ++i)
|
| - expected_blob_data_ += kTestData;
|
| -
|
| - scoped_ptr<storage::BlobDataBuilder> blob_data(
|
| - new storage::BlobDataBuilder("blob-id:myblob"));
|
| - blob_data->AppendData(expected_blob_data_);
|
| -
|
| - blob_handle_ =
|
| - blob_storage_context->context()->AddFinishedBlob(blob_data.get());
|
| -
|
| - body_response_ =
|
| - ServiceWorkerResponse(GURL("http://example.com/body.html"),
|
| - 200,
|
| - "OK",
|
| - blink::WebServiceWorkerResponseTypeDefault,
|
| - headers,
|
| - blob_handle_->uuid(),
|
| - expected_blob_data_.size(),
|
| - GURL());
|
| -
|
| - no_body_response_ =
|
| - ServiceWorkerResponse(GURL("http://example.com/no_body.html"),
|
| - 200,
|
| - "OK",
|
| - blink::WebServiceWorkerResponseTypeDefault,
|
| - headers,
|
| - "",
|
| - 0,
|
| - GURL());
|
| - }
|
| -
|
| - scoped_ptr<ServiceWorkerFetchRequest> CopyFetchRequest(
|
| - const ServiceWorkerFetchRequest& request) {
|
| - return make_scoped_ptr(new ServiceWorkerFetchRequest(request.url,
|
| - request.method,
|
| - request.headers,
|
| - request.referrer,
|
| - request.is_reload));
|
| - }
|
| -
|
| - scoped_ptr<ServiceWorkerResponse> CopyFetchResponse(
|
| - const ServiceWorkerResponse& response) {
|
| - scoped_ptr<ServiceWorkerResponse> sw_response(
|
| - new ServiceWorkerResponse(response.url,
|
| - response.status_code,
|
| - response.status_text,
|
| - response.response_type,
|
| - response.headers,
|
| - response.blob_uuid,
|
| - response.blob_size,
|
| - response.stream_url));
|
| - return sw_response.Pass();
|
| - }
|
| -
|
| - bool Put(const ServiceWorkerFetchRequest& request,
|
| - const ServiceWorkerResponse& response) {
|
| - scoped_ptr<base::RunLoop> loop(new base::RunLoop());
|
| -
|
| - cache_->Put(CopyFetchRequest(request),
|
| - CopyFetchResponse(response),
|
| - base::Bind(&ServiceWorkerCacheTest::ResponseAndErrorCallback,
|
| - base::Unretained(this),
|
| - base::Unretained(loop.get())));
|
| - // TODO(jkarlin): These functions should use base::RunLoop().RunUntilIdle()
|
| - // once the cache uses a passed in MessageLoopProxy instead of the CACHE
|
| - // thread.
|
| - loop->Run();
|
| -
|
| - return callback_error_ == ServiceWorkerCache::ERROR_TYPE_OK;
|
| - }
|
| -
|
| - bool Match(const ServiceWorkerFetchRequest& request) {
|
| - scoped_ptr<base::RunLoop> loop(new base::RunLoop());
|
| -
|
| - cache_->Match(CopyFetchRequest(request),
|
| - base::Bind(&ServiceWorkerCacheTest::ResponseAndErrorCallback,
|
| - base::Unretained(this),
|
| - base::Unretained(loop.get())));
|
| - loop->Run();
|
| -
|
| - return callback_error_ == ServiceWorkerCache::ERROR_TYPE_OK;
|
| - }
|
| -
|
| - bool Delete(const ServiceWorkerFetchRequest& request) {
|
| - scoped_ptr<base::RunLoop> loop(new base::RunLoop());
|
| -
|
| - cache_->Delete(CopyFetchRequest(request),
|
| - base::Bind(&ServiceWorkerCacheTest::ErrorTypeCallback,
|
| - base::Unretained(this),
|
| - base::Unretained(loop.get())));
|
| - loop->Run();
|
| -
|
| - return callback_error_ == ServiceWorkerCache::ERROR_TYPE_OK;
|
| - }
|
| -
|
| - bool Keys() {
|
| - scoped_ptr<base::RunLoop> loop(new base::RunLoop());
|
| -
|
| - cache_->Keys(base::Bind(&ServiceWorkerCacheTest::RequestsCallback,
|
| - base::Unretained(this),
|
| - base::Unretained(loop.get())));
|
| - loop->Run();
|
| -
|
| - return callback_error_ == ServiceWorkerCache::ERROR_TYPE_OK;
|
| - }
|
| -
|
| - bool Close() {
|
| - scoped_ptr<base::RunLoop> loop(new base::RunLoop());
|
| -
|
| - cache_->Close(base::Bind(&ServiceWorkerCacheTest::CloseCallback,
|
| - base::Unretained(this),
|
| - base::Unretained(loop.get())));
|
| - loop->Run();
|
| - return callback_closed_;
|
| - }
|
| -
|
| - void RequestsCallback(base::RunLoop* run_loop,
|
| - ServiceWorkerCache::ErrorType error,
|
| - scoped_ptr<ServiceWorkerCache::Requests> requests) {
|
| - callback_error_ = error;
|
| - callback_strings_.clear();
|
| - if (requests) {
|
| - for (size_t i = 0u; i < requests->size(); ++i)
|
| - callback_strings_.push_back(requests->at(i).url.spec());
|
| - }
|
| - if (run_loop)
|
| - run_loop->Quit();
|
| - }
|
| -
|
| - void ErrorTypeCallback(base::RunLoop* run_loop,
|
| - ServiceWorkerCache::ErrorType error) {
|
| - callback_error_ = error;
|
| - if (run_loop)
|
| - run_loop->Quit();
|
| - }
|
| -
|
| - void ResponseAndErrorCallback(
|
| - base::RunLoop* run_loop,
|
| - ServiceWorkerCache::ErrorType error,
|
| - scoped_ptr<ServiceWorkerResponse> response,
|
| - scoped_ptr<storage::BlobDataHandle> body_handle) {
|
| - callback_error_ = error;
|
| - callback_response_ = response.Pass();
|
| - callback_response_data_.reset();
|
| - if (error == ServiceWorkerCache::ERROR_TYPE_OK &&
|
| - !callback_response_->blob_uuid.empty()) {
|
| - callback_response_data_ = body_handle.Pass();
|
| - }
|
| -
|
| - if (run_loop)
|
| - run_loop->Quit();
|
| - }
|
| -
|
| - void CloseCallback(base::RunLoop* run_loop) {
|
| - EXPECT_FALSE(callback_closed_);
|
| - callback_closed_ = true;
|
| - if (run_loop)
|
| - run_loop->Quit();
|
| - }
|
| -
|
| - void CopyBody(storage::BlobDataHandle* blob_handle, std::string* output) {
|
| - scoped_ptr<storage::BlobDataSnapshot> data = blob_handle->CreateSnapshot();
|
| - const auto& items = data->items();
|
| - for (const auto& item : items) {
|
| - output->append(item->bytes(), item->length());
|
| - }
|
| - }
|
| -
|
| - bool VerifyKeys(const std::vector<std::string>& expected_keys) {
|
| - if (expected_keys.size() != callback_strings_.size())
|
| - return false;
|
| -
|
| - std::set<std::string> found_set;
|
| - for (int i = 0, max = callback_strings_.size(); i < max; ++i)
|
| - found_set.insert(callback_strings_[i]);
|
| -
|
| - for (int i = 0, max = expected_keys.size(); i < max; ++i) {
|
| - if (found_set.find(expected_keys[i]) == found_set.end())
|
| - return false;
|
| - }
|
| - return true;
|
| - }
|
| -
|
| - bool TestResponseType(blink::WebServiceWorkerResponseType response_type) {
|
| - body_response_.response_type = response_type;
|
| - EXPECT_TRUE(Put(body_request_, body_response_));
|
| - EXPECT_TRUE(Match(body_request_));
|
| - EXPECT_TRUE(Delete(body_request_));
|
| - return response_type == callback_response_->response_type;
|
| - }
|
| -
|
| - void VerifyAllOpsFail() {
|
| - EXPECT_FALSE(Put(no_body_request_, no_body_response_));
|
| - EXPECT_FALSE(Match(no_body_request_));
|
| - EXPECT_FALSE(Delete(body_request_));
|
| - EXPECT_FALSE(Keys());
|
| - }
|
| -
|
| - virtual bool MemoryOnly() { return false; }
|
| -
|
| - protected:
|
| - TestBrowserContext browser_context_;
|
| - TestBrowserThreadBundle browser_thread_bundle_;
|
| - scoped_ptr<net::URLRequestJobFactoryImpl> url_request_job_factory_;
|
| - scoped_refptr<MockQuotaManagerProxy> quota_manager_proxy_;
|
| - storage::BlobStorageContext* blob_storage_context_;
|
| -
|
| - base::ScopedTempDir temp_dir_;
|
| - scoped_refptr<TestServiceWorkerCache> cache_;
|
| -
|
| - ServiceWorkerFetchRequest body_request_;
|
| - ServiceWorkerResponse body_response_;
|
| - ServiceWorkerFetchRequest no_body_request_;
|
| - ServiceWorkerResponse no_body_response_;
|
| - scoped_ptr<storage::BlobDataHandle> blob_handle_;
|
| - std::string expected_blob_data_;
|
| -
|
| - ServiceWorkerCache::ErrorType callback_error_;
|
| - scoped_ptr<ServiceWorkerResponse> callback_response_;
|
| - scoped_ptr<storage::BlobDataHandle> callback_response_data_;
|
| - std::vector<std::string> callback_strings_;
|
| - bool callback_closed_;
|
| -};
|
| -
|
| -class ServiceWorkerCacheTestP : public ServiceWorkerCacheTest,
|
| - public testing::WithParamInterface<bool> {
|
| - bool MemoryOnly() override { return !GetParam(); }
|
| -};
|
| -
|
| -class ServiceWorkerCacheMemoryOnlyTest
|
| - : public ServiceWorkerCacheTest,
|
| - public testing::WithParamInterface<bool> {
|
| - bool MemoryOnly() override { return true; }
|
| -};
|
| -
|
| -TEST_P(ServiceWorkerCacheTestP, PutNoBody) {
|
| - EXPECT_TRUE(Put(no_body_request_, no_body_response_));
|
| - EXPECT_TRUE(callback_response_);
|
| - EXPECT_STREQ(no_body_response_.url.spec().c_str(),
|
| - callback_response_->url.spec().c_str());
|
| - EXPECT_FALSE(callback_response_data_);
|
| - EXPECT_STREQ("", callback_response_->blob_uuid.c_str());
|
| - EXPECT_EQ(0u, callback_response_->blob_size);
|
| -}
|
| -
|
| -TEST_P(ServiceWorkerCacheTestP, PutBody) {
|
| - EXPECT_TRUE(Put(body_request_, body_response_));
|
| - EXPECT_TRUE(callback_response_);
|
| - EXPECT_STREQ(body_response_.url.spec().c_str(),
|
| - callback_response_->url.spec().c_str());
|
| - EXPECT_TRUE(callback_response_data_);
|
| - EXPECT_STRNE("", callback_response_->blob_uuid.c_str());
|
| - EXPECT_EQ(expected_blob_data_.size(), callback_response_->blob_size);
|
| -
|
| - std::string response_body;
|
| - CopyBody(callback_response_data_.get(), &response_body);
|
| - EXPECT_STREQ(expected_blob_data_.c_str(), response_body.c_str());
|
| -}
|
| -
|
| -TEST_P(ServiceWorkerCacheTestP, ResponseURLDiffersFromRequestURL) {
|
| - no_body_response_.url = GURL("http://example.com/foobar");
|
| - EXPECT_STRNE("http://example.com/foobar",
|
| - no_body_request_.url.spec().c_str());
|
| - EXPECT_TRUE(Put(no_body_request_, no_body_response_));
|
| - EXPECT_TRUE(Match(no_body_request_));
|
| - EXPECT_STREQ("http://example.com/foobar",
|
| - callback_response_->url.spec().c_str());
|
| -}
|
| -
|
| -TEST_P(ServiceWorkerCacheTestP, ResponseURLEmpty) {
|
| - no_body_response_.url = GURL();
|
| - EXPECT_STRNE("", no_body_request_.url.spec().c_str());
|
| - EXPECT_TRUE(Put(no_body_request_, no_body_response_));
|
| - EXPECT_TRUE(Match(no_body_request_));
|
| - EXPECT_STREQ("", callback_response_->url.spec().c_str());
|
| -}
|
| -
|
| -TEST_F(ServiceWorkerCacheTest, PutBodyDropBlobRef) {
|
| - scoped_ptr<base::RunLoop> loop(new base::RunLoop());
|
| - cache_->Put(CopyFetchRequest(body_request_),
|
| - CopyFetchResponse(body_response_),
|
| - base::Bind(&ServiceWorkerCacheTestP::ResponseAndErrorCallback,
|
| - base::Unretained(this),
|
| - base::Unretained(loop.get())));
|
| - // The handle should be held by the cache now so the deref here should be
|
| - // okay.
|
| - blob_handle_.reset();
|
| - loop->Run();
|
| -
|
| - EXPECT_EQ(ServiceWorkerCache::ERROR_TYPE_OK, callback_error_);
|
| -}
|
| -
|
| -TEST_P(ServiceWorkerCacheTestP, PutReplace) {
|
| - EXPECT_TRUE(Put(body_request_, no_body_response_));
|
| - EXPECT_TRUE(Match(body_request_));
|
| - EXPECT_FALSE(callback_response_data_);
|
| -
|
| - EXPECT_TRUE(Put(body_request_, body_response_));
|
| - EXPECT_TRUE(Match(body_request_));
|
| - EXPECT_TRUE(callback_response_data_);
|
| -
|
| - EXPECT_TRUE(Put(body_request_, no_body_response_));
|
| - EXPECT_TRUE(Match(body_request_));
|
| - EXPECT_FALSE(callback_response_data_);
|
| -}
|
| -
|
| -TEST_P(ServiceWorkerCacheTestP, MatchNoBody) {
|
| - EXPECT_TRUE(Put(no_body_request_, no_body_response_));
|
| - EXPECT_TRUE(Match(no_body_request_));
|
| - EXPECT_EQ(200, callback_response_->status_code);
|
| - EXPECT_STREQ("OK", callback_response_->status_text.c_str());
|
| - EXPECT_STREQ("http://example.com/no_body.html",
|
| - callback_response_->url.spec().c_str());
|
| - EXPECT_STREQ("", callback_response_->blob_uuid.c_str());
|
| - EXPECT_EQ(0u, callback_response_->blob_size);
|
| -}
|
| -
|
| -TEST_P(ServiceWorkerCacheTestP, MatchBody) {
|
| - EXPECT_TRUE(Put(body_request_, body_response_));
|
| - EXPECT_TRUE(Match(body_request_));
|
| - EXPECT_EQ(200, callback_response_->status_code);
|
| - EXPECT_STREQ("OK", callback_response_->status_text.c_str());
|
| - EXPECT_STREQ("http://example.com/body.html",
|
| - callback_response_->url.spec().c_str());
|
| - EXPECT_STRNE("", callback_response_->blob_uuid.c_str());
|
| - EXPECT_EQ(expected_blob_data_.size(), callback_response_->blob_size);
|
| -
|
| - std::string response_body;
|
| - CopyBody(callback_response_data_.get(), &response_body);
|
| - EXPECT_STREQ(expected_blob_data_.c_str(), response_body.c_str());
|
| -}
|
| -
|
| -TEST_P(ServiceWorkerCacheTestP, Vary) {
|
| - body_request_.headers["vary_foo"] = "foo";
|
| - body_response_.headers["vary"] = "vary_foo";
|
| - EXPECT_TRUE(Put(body_request_, body_response_));
|
| - EXPECT_TRUE(Match(body_request_));
|
| -
|
| - body_request_.headers["vary_foo"] = "bar";
|
| - EXPECT_FALSE(Match(body_request_));
|
| -
|
| - body_request_.headers.erase("vary_foo");
|
| - EXPECT_FALSE(Match(body_request_));
|
| -}
|
| -
|
| -TEST_P(ServiceWorkerCacheTestP, EmptyVary) {
|
| - body_response_.headers["vary"] = "";
|
| - EXPECT_TRUE(Put(body_request_, body_response_));
|
| - EXPECT_TRUE(Match(body_request_));
|
| -
|
| - body_request_.headers["zoo"] = "zoo";
|
| - EXPECT_TRUE(Match(body_request_));
|
| -}
|
| -
|
| -TEST_P(ServiceWorkerCacheTestP, NoVaryButDiffHeaders) {
|
| - EXPECT_TRUE(Put(body_request_, body_response_));
|
| - EXPECT_TRUE(Match(body_request_));
|
| -
|
| - body_request_.headers["zoo"] = "zoo";
|
| - EXPECT_TRUE(Match(body_request_));
|
| -}
|
| -
|
| -TEST_P(ServiceWorkerCacheTestP, VaryMultiple) {
|
| - body_request_.headers["vary_foo"] = "foo";
|
| - body_request_.headers["vary_bar"] = "bar";
|
| - body_response_.headers["vary"] = " vary_foo , vary_bar";
|
| - EXPECT_TRUE(Put(body_request_, body_response_));
|
| - EXPECT_TRUE(Match(body_request_));
|
| -
|
| - body_request_.headers["vary_bar"] = "foo";
|
| - EXPECT_FALSE(Match(body_request_));
|
| -
|
| - body_request_.headers.erase("vary_bar");
|
| - EXPECT_FALSE(Match(body_request_));
|
| -}
|
| -
|
| -TEST_P(ServiceWorkerCacheTestP, VaryNewHeader) {
|
| - body_request_.headers["vary_foo"] = "foo";
|
| - body_response_.headers["vary"] = " vary_foo, vary_bar";
|
| - EXPECT_TRUE(Put(body_request_, body_response_));
|
| - EXPECT_TRUE(Match(body_request_));
|
| -
|
| - body_request_.headers["vary_bar"] = "bar";
|
| - EXPECT_FALSE(Match(body_request_));
|
| -}
|
| -
|
| -TEST_P(ServiceWorkerCacheTestP, VaryStar) {
|
| - body_response_.headers["vary"] = "*";
|
| - EXPECT_TRUE(Put(body_request_, body_response_));
|
| - EXPECT_FALSE(Match(body_request_));
|
| -}
|
| -
|
| -TEST_P(ServiceWorkerCacheTestP, EmptyKeys) {
|
| - EXPECT_TRUE(Keys());
|
| - EXPECT_EQ(0u, callback_strings_.size());
|
| -}
|
| -
|
| -TEST_P(ServiceWorkerCacheTestP, TwoKeys) {
|
| - EXPECT_TRUE(Put(no_body_request_, no_body_response_));
|
| - EXPECT_TRUE(Put(body_request_, body_response_));
|
| - EXPECT_TRUE(Keys());
|
| - EXPECT_EQ(2u, callback_strings_.size());
|
| - std::vector<std::string> expected_keys;
|
| - expected_keys.push_back(no_body_request_.url.spec());
|
| - expected_keys.push_back(body_request_.url.spec());
|
| - EXPECT_TRUE(VerifyKeys(expected_keys));
|
| -}
|
| -
|
| -TEST_P(ServiceWorkerCacheTestP, TwoKeysThenOne) {
|
| - EXPECT_TRUE(Put(no_body_request_, no_body_response_));
|
| - EXPECT_TRUE(Put(body_request_, body_response_));
|
| - EXPECT_TRUE(Keys());
|
| - EXPECT_EQ(2u, callback_strings_.size());
|
| - std::vector<std::string> expected_keys;
|
| - expected_keys.push_back(no_body_request_.url.spec());
|
| - expected_keys.push_back(body_request_.url.spec());
|
| - EXPECT_TRUE(VerifyKeys(expected_keys));
|
| -
|
| - EXPECT_TRUE(Delete(body_request_));
|
| - EXPECT_TRUE(Keys());
|
| - EXPECT_EQ(1u, callback_strings_.size());
|
| - std::vector<std::string> expected_key;
|
| - expected_key.push_back(no_body_request_.url.spec());
|
| - EXPECT_TRUE(VerifyKeys(expected_key));
|
| -}
|
| -
|
| -TEST_P(ServiceWorkerCacheTestP, DeleteNoBody) {
|
| - EXPECT_TRUE(Put(no_body_request_, no_body_response_));
|
| - EXPECT_TRUE(Match(no_body_request_));
|
| - EXPECT_TRUE(Delete(no_body_request_));
|
| - EXPECT_FALSE(Match(no_body_request_));
|
| - EXPECT_FALSE(Delete(no_body_request_));
|
| - EXPECT_TRUE(Put(no_body_request_, no_body_response_));
|
| - EXPECT_TRUE(Match(no_body_request_));
|
| - EXPECT_TRUE(Delete(no_body_request_));
|
| -}
|
| -
|
| -TEST_P(ServiceWorkerCacheTestP, DeleteBody) {
|
| - EXPECT_TRUE(Put(body_request_, body_response_));
|
| - EXPECT_TRUE(Match(body_request_));
|
| - EXPECT_TRUE(Delete(body_request_));
|
| - EXPECT_FALSE(Match(body_request_));
|
| - EXPECT_FALSE(Delete(body_request_));
|
| - EXPECT_TRUE(Put(body_request_, body_response_));
|
| - EXPECT_TRUE(Match(body_request_));
|
| - EXPECT_TRUE(Delete(body_request_));
|
| -}
|
| -
|
| -TEST_P(ServiceWorkerCacheTestP, QuickStressNoBody) {
|
| - for (int i = 0; i < 100; ++i) {
|
| - EXPECT_FALSE(Match(no_body_request_));
|
| - EXPECT_TRUE(Put(no_body_request_, no_body_response_));
|
| - EXPECT_TRUE(Match(no_body_request_));
|
| - EXPECT_TRUE(Delete(no_body_request_));
|
| - }
|
| -}
|
| -
|
| -TEST_P(ServiceWorkerCacheTestP, QuickStressBody) {
|
| - for (int i = 0; i < 100; ++i) {
|
| - ASSERT_FALSE(Match(body_request_));
|
| - ASSERT_TRUE(Put(body_request_, body_response_));
|
| - ASSERT_TRUE(Match(body_request_));
|
| - ASSERT_TRUE(Delete(body_request_));
|
| - }
|
| -}
|
| -
|
| -TEST_P(ServiceWorkerCacheTestP, PutResponseType) {
|
| - EXPECT_TRUE(TestResponseType(blink::WebServiceWorkerResponseTypeBasic));
|
| - EXPECT_TRUE(TestResponseType(blink::WebServiceWorkerResponseTypeCORS));
|
| - EXPECT_TRUE(TestResponseType(blink::WebServiceWorkerResponseTypeDefault));
|
| - EXPECT_TRUE(TestResponseType(blink::WebServiceWorkerResponseTypeError));
|
| - EXPECT_TRUE(TestResponseType(blink::WebServiceWorkerResponseTypeOpaque));
|
| -}
|
| -
|
| -TEST_F(ServiceWorkerCacheTest, CaselessServiceWorkerResponseHeaders) {
|
| - // ServiceWorkerCache depends on ServiceWorkerResponse having caseless
|
| - // headers so that it can quickly lookup vary headers.
|
| - ServiceWorkerResponse response(GURL("http://www.example.com"),
|
| - 200,
|
| - "OK",
|
| - blink::WebServiceWorkerResponseTypeDefault,
|
| - ServiceWorkerHeaderMap(),
|
| - "",
|
| - 0,
|
| - GURL());
|
| - response.headers["content-type"] = "foo";
|
| - response.headers["Content-Type"] = "bar";
|
| - EXPECT_EQ("bar", response.headers["content-type"]);
|
| -}
|
| -
|
| -TEST_F(ServiceWorkerCacheTest, CaselessServiceWorkerFetchRequestHeaders) {
|
| - // ServiceWorkerCache depends on ServiceWorkerFetchRequest having caseless
|
| - // headers so that it can quickly lookup vary headers.
|
| - ServiceWorkerFetchRequest request(GURL("http://www.example.com"),
|
| - "GET",
|
| - ServiceWorkerHeaderMap(),
|
| - Referrer(),
|
| - false);
|
| - request.headers["content-type"] = "foo";
|
| - request.headers["Content-Type"] = "bar";
|
| - EXPECT_EQ("bar", request.headers["content-type"]);
|
| -}
|
| -
|
| -TEST_P(ServiceWorkerCacheTestP, QuotaManagerModified) {
|
| - EXPECT_EQ(0, quota_manager_proxy_->notify_storage_modified_count());
|
| -
|
| - EXPECT_TRUE(Put(no_body_request_, no_body_response_));
|
| - EXPECT_EQ(1, quota_manager_proxy_->notify_storage_modified_count());
|
| - EXPECT_LT(0, quota_manager_proxy_->last_notified_delta());
|
| - int64 sum_delta = quota_manager_proxy_->last_notified_delta();
|
| -
|
| - EXPECT_TRUE(Put(body_request_, body_response_));
|
| - EXPECT_EQ(2, quota_manager_proxy_->notify_storage_modified_count());
|
| - EXPECT_LT(sum_delta, quota_manager_proxy_->last_notified_delta());
|
| - sum_delta += quota_manager_proxy_->last_notified_delta();
|
| -
|
| - EXPECT_TRUE(Delete(body_request_));
|
| - EXPECT_EQ(3, quota_manager_proxy_->notify_storage_modified_count());
|
| - sum_delta += quota_manager_proxy_->last_notified_delta();
|
| -
|
| - EXPECT_TRUE(Delete(no_body_request_));
|
| - EXPECT_EQ(4, quota_manager_proxy_->notify_storage_modified_count());
|
| - sum_delta += quota_manager_proxy_->last_notified_delta();
|
| -
|
| - EXPECT_EQ(0, sum_delta);
|
| -}
|
| -
|
| -TEST_F(ServiceWorkerCacheMemoryOnlyTest, MemoryBackedSize) {
|
| - EXPECT_EQ(0, cache_->MemoryBackedSize());
|
| - EXPECT_TRUE(Put(no_body_request_, no_body_response_));
|
| - EXPECT_LT(0, cache_->MemoryBackedSize());
|
| - int64 no_body_size = cache_->MemoryBackedSize();
|
| -
|
| - EXPECT_TRUE(Delete(no_body_request_));
|
| - EXPECT_EQ(0, cache_->MemoryBackedSize());
|
| -
|
| - EXPECT_TRUE(Put(body_request_, body_response_));
|
| - EXPECT_LT(no_body_size, cache_->MemoryBackedSize());
|
| -
|
| - EXPECT_TRUE(Delete(body_request_));
|
| - EXPECT_EQ(0, cache_->MemoryBackedSize());
|
| -}
|
| -
|
| -TEST_F(ServiceWorkerCacheTest, MemoryBackedSizePersistent) {
|
| - EXPECT_EQ(0, cache_->MemoryBackedSize());
|
| - EXPECT_TRUE(Put(no_body_request_, no_body_response_));
|
| - EXPECT_EQ(0, cache_->MemoryBackedSize());
|
| -}
|
| -
|
| -TEST_P(ServiceWorkerCacheTestP, OpsFailOnClosedBackendNeverCreated) {
|
| - cache_->set_delay_backend_creation(
|
| - true); // Will hang the test if a backend is created.
|
| - EXPECT_TRUE(Close());
|
| - VerifyAllOpsFail();
|
| -}
|
| -
|
| -TEST_P(ServiceWorkerCacheTestP, OpsFailOnClosedBackend) {
|
| - // Create the backend and put something in it.
|
| - EXPECT_TRUE(Put(body_request_, body_response_));
|
| - EXPECT_TRUE(Close());
|
| - VerifyAllOpsFail();
|
| -}
|
| -
|
| -TEST_P(ServiceWorkerCacheTestP, VerifySerialScheduling) {
|
| - // Start two operations, the first one is delayed but the second isn't. The
|
| - // second should wait for the first.
|
| - EXPECT_TRUE(Keys()); // Opens the backend.
|
| - DelayableBackend* delayable_backend = cache_->UseDelayableBackend();
|
| - delayable_backend->set_delay_open(true);
|
| -
|
| - scoped_ptr<ServiceWorkerResponse> response1 =
|
| - CopyFetchResponse(body_response_);
|
| - response1->status_code = 1;
|
| -
|
| - scoped_ptr<base::RunLoop> close_loop1(new base::RunLoop());
|
| - cache_->Put(CopyFetchRequest(body_request_), response1.Pass(),
|
| - base::Bind(&ServiceWorkerCacheTest::ResponseAndErrorCallback,
|
| - base::Unretained(this), close_loop1.get()));
|
| -
|
| - // Blocks on opening the cache entry.
|
| - base::RunLoop().RunUntilIdle();
|
| -
|
| - delayable_backend->set_delay_open(false);
|
| - scoped_ptr<ServiceWorkerResponse> response2 =
|
| - CopyFetchResponse(body_response_);
|
| - response2->status_code = 2;
|
| - scoped_ptr<base::RunLoop> close_loop2(new base::RunLoop());
|
| - cache_->Put(CopyFetchRequest(body_request_), response2.Pass(),
|
| - base::Bind(&ServiceWorkerCacheTest::ResponseAndErrorCallback,
|
| - base::Unretained(this), close_loop2.get()));
|
| -
|
| - // The second put operation should wait for the first to complete.
|
| - base::RunLoop().RunUntilIdle();
|
| - EXPECT_FALSE(callback_response_);
|
| -
|
| - delayable_backend->OpenEntryContinue();
|
| - close_loop1->Run();
|
| - EXPECT_EQ(1, callback_response_->status_code);
|
| - close_loop2->Run();
|
| - EXPECT_EQ(2, callback_response_->status_code);
|
| -}
|
| -
|
| -INSTANTIATE_TEST_CASE_P(ServiceWorkerCacheTest,
|
| - ServiceWorkerCacheTestP,
|
| - ::testing::Values(false, true));
|
| -
|
| -} // namespace content
|
|
|