Chromium Code Reviews| 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 |
| index 18115d9b8aa24b82b95b028b1dc49c1ed2ab22a0..cc7d549362998d8d1edf369dde7ecb01c21f3a9f 100644 |
| --- 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 |
| @@ -60,14 +60,45 @@ net::URLRequestJob* CreateNormalURLRequestJob( |
| true); |
| } |
| -net::URLRequestJob* CreateResponseJob(const std::string& response_data, |
| - net::URLRequest* request, |
| - net::NetworkDelegate* network_delegate) { |
| +net::URLRequestJob* CreateCachedResponseJob( |
| + const std::string& response_data, |
| + net::URLRequest* request, |
| + net::NetworkDelegate* network_delegate) { |
| return new net::URLRequestTestJob(request, network_delegate, |
| std::string(kHeaders, arraysize(kHeaders)), |
| response_data, true); |
| } |
| +class NetworkResponseJob : public net::URLRequestTestJob { |
| + public: |
| + NetworkResponseJob(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) {} |
| + void GetResponseInfo(net::HttpResponseInfo* info) override { |
| + URLRequestTestJob::GetResponseInfo(info); |
| + info->network_accessed = true; |
| + } |
| + |
| + protected: |
| + ~NetworkResponseJob() override {} |
| +}; |
| + |
| +net::URLRequestJob* CreateNetworkResponseJob( |
| + const std::string& response_data, |
| + net::URLRequest* request, |
| + net::NetworkDelegate* network_delegate) { |
| + return new NetworkResponseJob(request, network_delegate, |
| + std::string(kHeaders, arraysize(kHeaders)), |
| + response_data, true); |
| +} |
| + |
| net::URLRequestJob* CreateInvalidMimeTypeJob( |
| net::URLRequest* request, |
| net::NetworkDelegate* network_delegate) { |
| @@ -84,6 +115,15 @@ net::URLRequestJob* CreateInvalidMimeTypeJob( |
| true); |
| } |
| +net::URLRequestJob* CreateErrorReponseJob( |
| + net::URLRequest* request, |
| + net::NetworkDelegate* network_delegate) { |
| + const char kErrorHeaders[] = "HTTP/1.1 404 Not Found\0\0"; |
| + return new net::URLRequestTestJob( |
| + request, network_delegate, |
| + std::string(kErrorHeaders, arraysize(kErrorHeaders)), kScriptCode, true); |
| +} |
| + |
| class SSLCertificateErrorJob : public net::URLRequestTestJob { |
| public: |
| SSLCertificateErrorJob(net::URLRequest* request, |
| @@ -333,7 +373,7 @@ class ServiceWorkerWriteToCacheJobTest : public testing::Test { |
| int CreateIncumbent(const std::string& response) { |
| mock_protocol_handler_->SetCreateJobCallback( |
| - base::Bind(&CreateResponseJob, response)); |
| + base::Bind(&CreateNetworkResponseJob, response)); |
| request_->Start(); |
| base::RunLoop().RunUntilIdle(); |
| EXPECT_EQ(net::URLRequestStatus::SUCCESS, request_->status().status()); |
| @@ -360,7 +400,9 @@ class ServiceWorkerWriteToCacheJobTest : public testing::Test { |
| // Performs the net request for an update of |registration_|'s incumbent |
| // to the script |response|. Returns the new version. |
| scoped_refptr<ServiceWorkerVersion> UpdateScript( |
| - const std::string& response) { |
| + const std::string& response, |
| + bool status_success = true, |
| + bool network_accessed = true) { |
|
nhiroki
2015/09/09 08:27:48
nit: Passing multiple booleans could be error-pron
jungkees
2015/09/09 13:13:37
Agreed. I did it with the passing a callback optio
|
| int render_process_id = NextRenderProcessId(); |
| int provider_id = NextProviderId(); |
| scoped_refptr<ServiceWorkerVersion> new_version = |
| @@ -369,8 +411,20 @@ class ServiceWorkerWriteToCacheJobTest : public testing::Test { |
| CreateHostForVersion(render_process_id, provider_id, new_version); |
| SetUpScriptRequest(render_process_id, provider_id); |
| - mock_protocol_handler_->SetCreateJobCallback( |
| - base::Bind(&CreateResponseJob, response)); |
| + if (status_success) { |
| + // Whether the script load request accessed the network or was served from |
| + // HTTPCache. |
| + if (network_accessed) { |
| + mock_protocol_handler_->SetCreateJobCallback( |
| + base::Bind(&CreateNetworkResponseJob, response)); |
| + } else { |
| + mock_protocol_handler_->SetCreateJobCallback( |
| + base::Bind(&CreateCachedResponseJob, response)); |
| + } |
| + } else { |
| + mock_protocol_handler_->SetCreateJobCallback( |
| + base::Bind(&CreateErrorReponseJob)); |
| + } |
| request_->Start(); |
| base::RunLoop().RunUntilIdle(); |
| return new_version; |
| @@ -573,4 +627,35 @@ TEST_F(ServiceWorkerWriteToCacheJobTest, Update_EmptyScript) { |
| EXPECT_EQ(kInvalidServiceWorkerResponseId, GetResourceId(version.get())); |
| } |
| +TEST_F(ServiceWorkerWriteToCacheJobTest, Update_BumpLastUpdateCheckTime) { |
| + std::string response = GenerateLongResponse(); |
| + CreateIncumbent(response); |
| + |
| + // Script was served from HTTPCache. |
| + base::Time current = base::Time::Now(); |
| + registration_->set_last_update_check(current); |
| + scoped_refptr<ServiceWorkerVersion> version = UpdateScript( |
| + response, true /* status_success */, false /* network_accessed */); |
| + EXPECT_EQ(current, registration_->last_update_check()); |
| + |
| + // Same script but the request accessed the network. |
| + version = UpdateScript(response); |
| + EXPECT_LT(current, registration_->last_update_check()); |
| + |
| + // Changed the first byte and the request accessed the network. |
| + response[0] = 'x'; |
| + current = base::Time::Now(); |
| + registration_->set_last_update_check(current); |
| + version = UpdateScript(response); |
| + VerifyResource(GetResourceId(version.get()), response); |
| + registration_->SetWaitingVersion(version); |
| + EXPECT_LT(current, registration_->last_update_check()); |
| + |
| + // The request accessed the network but received a non-2xx error. |
| + current = base::Time::Now(); |
| + registration_->set_last_update_check(current); |
| + version = UpdateScript(response, false /* status_success */); |
| + EXPECT_EQ(current, registration_->last_update_check()); |
| +} |
| + |
| } // namespace content |