Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1411)

Unified Diff: content/browser/service_worker/service_worker_write_to_cache_job_unittest.cc

Issue 660253004: [ServiceWorker] Add unittests for ServiceWorkerWriteToCacheJob. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: incorporated michaeln's comment Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/browser/service_worker/service_worker_storage.h ('k') | content/content_tests.gypi » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/browser/service_worker/service_worker_write_to_cache_job_unittest.cc
diff --git a/content/browser/service_worker/service_worker_write_to_cache_job_unittest.cc b/content/browser/service_worker/service_worker_write_to_cache_job_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..7ec1f15b78fc2891365b62b68c3de823e2bc5716
--- /dev/null
+++ b/content/browser/service_worker/service_worker_write_to_cache_job_unittest.cc
@@ -0,0 +1,300 @@
+// 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 "base/run_loop.h"
+#include "content/browser/fileapi/mock_url_request_delegate.h"
+#include "content/browser/service_worker/embedded_worker_test_helper.h"
+#include "content/browser/service_worker/service_worker_context_core.h"
+#include "content/browser/service_worker/service_worker_context_request_handler.h"
+#include "content/browser/service_worker/service_worker_provider_host.h"
+#include "content/browser/service_worker/service_worker_registration.h"
+#include "content/browser/service_worker/service_worker_utils.h"
+#include "content/common/resource_request_body.h"
+#include "content/public/test/mock_resource_context.h"
+#include "content/public/test/test_browser_thread_bundle.h"
+#include "net/base/load_flags.h"
+#include "net/http/http_response_headers.h"
+#include "net/url_request/url_request_context.h"
+#include "net/url_request/url_request_job_factory_impl.h"
+#include "net/url_request/url_request_test_job.h"
+#include "net/url_request/url_request_test_util.h"
+#include "storage/browser/blob/blob_storage_context.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace content {
+
+namespace {
+
+int kMockRenderProcessId = 1224;
+int kMockProviderId = 1;
+const char kHeaders[] =
+ "HTTP/1.1 200 OK\0"
+ "Content-Type: text/javascript\0"
+ "Expires: Thu, 1 Jan 2100 20:00:00 GMT\0"
+ "\0";
+const char kScriptCode[] = "// no script code\n";
+
+void EmptyCallback() {
+}
+
+net::URLRequestJob* CreateNormalURLRequestJob(
+ net::URLRequest* request,
+ net::NetworkDelegate* network_delegate) {
+ return new net::URLRequestTestJob(request,
+ network_delegate,
+ std::string(kHeaders, arraysize(kHeaders)),
+ kScriptCode,
+ true);
+}
+
+net::URLRequestJob* CreateInvalidMimeTypeJob(
+ net::URLRequest* request,
+ net::NetworkDelegate* network_delegate) {
+ const char kPlainTextHeaders[] =
+ "HTTP/1.1 200 OK\0"
+ "Content-Type: text/plain\0"
+ "Expires: Thu, 1 Jan 2100 20:00:00 GMT\0"
+ "\0";
+ return new net::URLRequestTestJob(
+ request,
+ network_delegate,
+ std::string(kPlainTextHeaders, arraysize(kPlainTextHeaders)),
+ kScriptCode,
+ true);
+}
+
+class SSLCertificateErrorJob : public net::URLRequestTestJob {
+ public:
+ SSLCertificateErrorJob(net::URLRequest* request,
+ net::NetworkDelegate* network_delegate,
+ const std::string& response_headers,
+ const std::string& response_data,
+ bool auto_advance)
+ : net::URLRequestTestJob(request,
+ network_delegate,
+ response_headers,
+ response_data,
+ auto_advance),
+ weak_factory_(this) {}
+ virtual void Start() override {
+ base::MessageLoop::current()->PostTask(
+ FROM_HERE,
+ base::Bind(&SSLCertificateErrorJob::NotifyError,
+ weak_factory_.GetWeakPtr()));
+ }
+ void NotifyError() {
+ net::SSLInfo info;
+ info.cert_status = net::CERT_STATUS_DATE_INVALID;
+ NotifySSLCertificateError(info, true);
+ }
+
+ protected:
+ ~SSLCertificateErrorJob() override {}
+ base::WeakPtrFactory<SSLCertificateErrorJob> weak_factory_;
+};
+
+net::URLRequestJob* CreateSSLCertificateErrorJob(
+ net::URLRequest* request,
+ net::NetworkDelegate* network_delegate) {
+ return new SSLCertificateErrorJob(request,
+ network_delegate,
+ std::string(kHeaders, arraysize(kHeaders)),
+ kScriptCode,
+ true);
+}
+
+class CertStatusErrorJob : public net::URLRequestTestJob {
+ public:
+ CertStatusErrorJob(net::URLRequest* request,
+ net::NetworkDelegate* network_delegate,
+ const std::string& response_headers,
+ const std::string& response_data,
+ bool auto_advance)
+ : net::URLRequestTestJob(request,
+ network_delegate,
+ response_headers,
+ response_data,
+ auto_advance) {}
+ virtual void GetResponseInfo(net::HttpResponseInfo* info) override {
+ URLRequestTestJob::GetResponseInfo(info);
+ info->ssl_info.cert_status = net::CERT_STATUS_DATE_INVALID;
+ }
+
+ protected:
+ ~CertStatusErrorJob() override {}
+};
+
+net::URLRequestJob* CreateCertStatusErrorJob(
+ net::URLRequest* request,
+ net::NetworkDelegate* network_delegate) {
+ return new CertStatusErrorJob(request,
+ network_delegate,
+ std::string(kHeaders, arraysize(kHeaders)),
+ kScriptCode,
+ true);
+}
+
+class MockHttpProtocolHandler
+ : public net::URLRequestJobFactory::ProtocolHandler {
+ public:
+ typedef base::Callback<
+ net::URLRequestJob*(net::URLRequest*, net::NetworkDelegate*)> JobCallback;
+
+ MockHttpProtocolHandler(ResourceContext* resource_context)
+ : resource_context_(resource_context) {}
+ ~MockHttpProtocolHandler() override {}
+
+ virtual net::URLRequestJob* MaybeCreateJob(
+ net::URLRequest* request,
+ net::NetworkDelegate* network_delegate) const override {
+ ServiceWorkerRequestHandler* handler =
+ ServiceWorkerRequestHandler::GetHandler(request);
+ if (handler) {
+ return handler->MaybeCreateJob(
+ request, network_delegate, resource_context_);
+ }
+ return create_job_callback_.Run(request, network_delegate);
+ }
+ void SetCreateJobCallback(const JobCallback& callback) {
+ create_job_callback_ = callback;
+ }
+
+ private:
+ ResourceContext* resource_context_;
+ JobCallback create_job_callback_;
+};
+}
+
+class ServiceWorkerWriteToCacheJobTest : public testing::Test {
+ public:
+ ServiceWorkerWriteToCacheJobTest()
+ : browser_thread_bundle_(TestBrowserThreadBundle::IO_MAINLOOP),
+ mock_protocol_handler_(NULL) {}
+ ~ServiceWorkerWriteToCacheJobTest() override {}
+
+ virtual void SetUp() override {
+ helper_.reset(new EmbeddedWorkerTestHelper(kMockRenderProcessId));
+
+ // A new unstored registration/version.
+ scope_ = GURL("https://host/scope/");
+ script_url_ = GURL("https://host/script.js");
+ registration_ =
+ new ServiceWorkerRegistration(scope_, 1L, context()->AsWeakPtr());
+ version_ = new ServiceWorkerVersion(
+ registration_.get(), script_url_, 1L, context()->AsWeakPtr());
+
+ // An empty host.
+ scoped_ptr<ServiceWorkerProviderHost> host(new ServiceWorkerProviderHost(
+ kMockRenderProcessId, kMockProviderId, context()->AsWeakPtr(), NULL));
+ provider_host_ = host->AsWeakPtr();
+ context()->AddProviderHost(host.Pass());
+ provider_host_->running_hosted_version_ = version_;
+
+ context()->storage()->LazyInitialize(base::Bind(&EmptyCallback));
+ base::RunLoop().RunUntilIdle();
+
+ url_request_context_.reset(new net::URLRequestContext);
+ mock_protocol_handler_ = new MockHttpProtocolHandler(&resource_context_);
+ url_request_job_factory_.reset(new net::URLRequestJobFactoryImpl);
+ url_request_job_factory_->SetProtocolHandler("https",
+ mock_protocol_handler_);
+ url_request_context_->set_job_factory(url_request_job_factory_.get());
+
+ request_ = url_request_context_->CreateRequest(
+ script_url_, net::DEFAULT_PRIORITY, &url_request_delegate_, NULL);
+ ServiceWorkerRequestHandler::InitializeHandler(
+ request_.get(),
+ context_wrapper(),
+ &blob_storage_context_,
+ kMockRenderProcessId,
+ kMockProviderId,
+ false,
+ FETCH_REQUEST_MODE_NO_CORS,
+ FETCH_CREDENTIALS_MODE_OMIT,
+ RESOURCE_TYPE_SERVICE_WORKER,
+ REQUEST_CONTEXT_TYPE_SERVICE_WORKER,
+ REQUEST_CONTEXT_FRAME_TYPE_NONE,
+ scoped_refptr<ResourceRequestBody>());
+ }
+
+ virtual void TearDown() override {
+ request_.reset();
+ url_request_context_.reset();
+ url_request_job_factory_.reset();
+ mock_protocol_handler_ = NULL;
+ version_ = NULL;
+ registration_ = NULL;
+ helper_.reset();
+ // URLRequestJobs may post clean-up tasks on destruction.
+ base::RunLoop().RunUntilIdle();
+ }
+
+ ServiceWorkerContextCore* context() const { return helper_->context(); }
+ ServiceWorkerContextWrapper* context_wrapper() const {
+ return helper_->context_wrapper();
+ }
+
+ protected:
+ TestBrowserThreadBundle browser_thread_bundle_;
+ scoped_ptr<EmbeddedWorkerTestHelper> helper_;
+ scoped_refptr<ServiceWorkerRegistration> registration_;
+ scoped_refptr<ServiceWorkerVersion> version_;
+ base::WeakPtr<ServiceWorkerProviderHost> provider_host_;
+ scoped_ptr<net::URLRequestContext> url_request_context_;
+ scoped_ptr<net::URLRequestJobFactoryImpl> url_request_job_factory_;
+ scoped_ptr<net::URLRequest> request_;
+ MockHttpProtocolHandler* mock_protocol_handler_;
+
+ storage::BlobStorageContext blob_storage_context_;
+ content::MockResourceContext resource_context_;
+
+ MockURLRequestDelegate url_request_delegate_;
+ GURL scope_;
+ GURL script_url_;
+};
+
+TEST_F(ServiceWorkerWriteToCacheJobTest, Normal) {
+ mock_protocol_handler_->SetCreateJobCallback(
+ base::Bind(&CreateNormalURLRequestJob));
+ request_->Start();
+ base::RunLoop().RunUntilIdle();
+ EXPECT_EQ(net::URLRequestStatus::SUCCESS, request_->status().status());
+ EXPECT_NE(kInvalidServiceWorkerResponseId,
+ version_->script_cache_map()->LookupResourceId(script_url_));
+}
+
+TEST_F(ServiceWorkerWriteToCacheJobTest, InvalidMimeType) {
+ mock_protocol_handler_->SetCreateJobCallback(
+ base::Bind(&CreateInvalidMimeTypeJob));
+ request_->Start();
+ base::RunLoop().RunUntilIdle();
+ EXPECT_EQ(net::URLRequestStatus::FAILED, request_->status().status());
+ EXPECT_EQ(net::ERR_INSECURE_RESPONSE, request_->status().error());
+ EXPECT_EQ(kInvalidServiceWorkerResponseId,
+ version_->script_cache_map()->LookupResourceId(script_url_));
+}
+
+TEST_F(ServiceWorkerWriteToCacheJobTest, SSLCertificateError) {
+ mock_protocol_handler_->SetCreateJobCallback(
+ base::Bind(&CreateSSLCertificateErrorJob));
+ request_->Start();
+ base::RunLoop().RunUntilIdle();
+ EXPECT_EQ(net::URLRequestStatus::FAILED, request_->status().status());
+ EXPECT_EQ(net::ERR_INSECURE_RESPONSE, request_->status().error());
+ EXPECT_EQ(kInvalidServiceWorkerResponseId,
+ version_->script_cache_map()->LookupResourceId(script_url_));
+}
+
+TEST_F(ServiceWorkerWriteToCacheJobTest, CertStatusError) {
+ mock_protocol_handler_->SetCreateJobCallback(
+ base::Bind(&CreateCertStatusErrorJob));
+ request_->Start();
+ base::RunLoop().RunUntilIdle();
+ EXPECT_EQ(net::URLRequestStatus::FAILED, request_->status().status());
+ EXPECT_EQ(net::ERR_INSECURE_RESPONSE, request_->status().error());
+ EXPECT_EQ(kInvalidServiceWorkerResponseId,
+ version_->script_cache_map()->LookupResourceId(script_url_));
+}
+
+} // namespace content
« no previous file with comments | « content/browser/service_worker/service_worker_storage.h ('k') | content/content_tests.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698