| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/service_worker/service_worker_cache.h" | 5 #include "content/browser/service_worker/service_worker_cache.h" |
| 6 | 6 |
| 7 #include "base/files/file_path.h" | 7 #include "base/files/file_path.h" |
| 8 #include "base/files/scoped_temp_dir.h" | 8 #include "base/files/scoped_temp_dir.h" |
| 9 #include "base/message_loop/message_loop_proxy.h" | 9 #include "base/message_loop/message_loop_proxy.h" |
| 10 #include "base/run_loop.h" | 10 #include "base/run_loop.h" |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 104 | 104 |
| 105 blob_handle_ = | 105 blob_handle_ = |
| 106 blob_storage_context->context()->AddFinishedBlob(blob_data.get()); | 106 blob_storage_context->context()->AddFinishedBlob(blob_data.get()); |
| 107 | 107 |
| 108 body_response_ = | 108 body_response_ = |
| 109 ServiceWorkerResponse(GURL("http://example.com/body.html"), | 109 ServiceWorkerResponse(GURL("http://example.com/body.html"), |
| 110 200, | 110 200, |
| 111 "OK", | 111 "OK", |
| 112 blink::WebServiceWorkerResponseTypeDefault, | 112 blink::WebServiceWorkerResponseTypeDefault, |
| 113 headers, | 113 headers, |
| 114 blob_handle_->uuid()); | 114 blob_handle_->uuid(), |
| 115 expected_blob_data_.size()); |
| 115 | 116 |
| 116 no_body_response_ = | 117 no_body_response_ = |
| 117 ServiceWorkerResponse(GURL("http://example.com/no_body.html"), | 118 ServiceWorkerResponse(GURL("http://example.com/no_body.html"), |
| 118 200, | 119 200, |
| 119 "OK", | 120 "OK", |
| 120 blink::WebServiceWorkerResponseTypeDefault, | 121 blink::WebServiceWorkerResponseTypeDefault, |
| 121 headers, | 122 headers, |
| 122 ""); | 123 "", |
| 124 0); |
| 123 } | 125 } |
| 124 | 126 |
| 125 scoped_ptr<ServiceWorkerFetchRequest> CopyFetchRequest( | 127 scoped_ptr<ServiceWorkerFetchRequest> CopyFetchRequest( |
| 126 const ServiceWorkerFetchRequest& request) { | 128 const ServiceWorkerFetchRequest& request) { |
| 127 return make_scoped_ptr(new ServiceWorkerFetchRequest(request.url, | 129 return make_scoped_ptr(new ServiceWorkerFetchRequest(request.url, |
| 128 request.method, | 130 request.method, |
| 129 request.headers, | 131 request.headers, |
| 130 request.referrer, | 132 request.referrer, |
| 131 request.is_reload)); | 133 request.is_reload)); |
| 132 } | 134 } |
| 133 | 135 |
| 134 scoped_ptr<ServiceWorkerResponse> CopyFetchResponse( | 136 scoped_ptr<ServiceWorkerResponse> CopyFetchResponse( |
| 135 const ServiceWorkerResponse& response) { | 137 const ServiceWorkerResponse& response) { |
| 136 scoped_ptr<ServiceWorkerResponse> sw_response( | 138 scoped_ptr<ServiceWorkerResponse> sw_response( |
| 137 new ServiceWorkerResponse(response.url, | 139 new ServiceWorkerResponse(response.url, |
| 138 response.status_code, | 140 response.status_code, |
| 139 response.status_text, | 141 response.status_text, |
| 140 response.response_type, | 142 response.response_type, |
| 141 response.headers, | 143 response.headers, |
| 142 response.blob_uuid)); | 144 response.blob_uuid, |
| 145 response.blob_size)); |
| 143 return sw_response.Pass(); | 146 return sw_response.Pass(); |
| 144 } | 147 } |
| 145 | 148 |
| 146 bool Put(const ServiceWorkerFetchRequest& request, | 149 bool Put(const ServiceWorkerFetchRequest& request, |
| 147 const ServiceWorkerResponse& response) { | 150 const ServiceWorkerResponse& response) { |
| 148 scoped_ptr<base::RunLoop> loop(new base::RunLoop()); | 151 scoped_ptr<base::RunLoop> loop(new base::RunLoop()); |
| 149 | 152 |
| 150 cache_->Put(CopyFetchRequest(request), | 153 cache_->Put(CopyFetchRequest(request), |
| 151 CopyFetchResponse(response), | 154 CopyFetchResponse(response), |
| 152 base::Bind(&ServiceWorkerCacheTest::ResponseAndErrorCallback, | 155 base::Bind(&ServiceWorkerCacheTest::ResponseAndErrorCallback, |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 285 public testing::WithParamInterface<bool> { | 288 public testing::WithParamInterface<bool> { |
| 286 virtual bool MemoryOnly() OVERRIDE { return !GetParam(); } | 289 virtual bool MemoryOnly() OVERRIDE { return !GetParam(); } |
| 287 }; | 290 }; |
| 288 | 291 |
| 289 TEST_P(ServiceWorkerCacheTestP, PutNoBody) { | 292 TEST_P(ServiceWorkerCacheTestP, PutNoBody) { |
| 290 EXPECT_TRUE(Put(no_body_request_, no_body_response_)); | 293 EXPECT_TRUE(Put(no_body_request_, no_body_response_)); |
| 291 EXPECT_TRUE(callback_response_); | 294 EXPECT_TRUE(callback_response_); |
| 292 EXPECT_STREQ(no_body_response_.url.spec().c_str(), | 295 EXPECT_STREQ(no_body_response_.url.spec().c_str(), |
| 293 callback_response_->url.spec().c_str()); | 296 callback_response_->url.spec().c_str()); |
| 294 EXPECT_FALSE(callback_response_data_); | 297 EXPECT_FALSE(callback_response_data_); |
| 298 EXPECT_STREQ("", callback_response_->blob_uuid.c_str()); |
| 299 EXPECT_EQ(0u, callback_response_->blob_size); |
| 295 } | 300 } |
| 296 | 301 |
| 297 TEST_P(ServiceWorkerCacheTestP, PutBody) { | 302 TEST_P(ServiceWorkerCacheTestP, PutBody) { |
| 298 EXPECT_TRUE(Put(body_request_, body_response_)); | 303 EXPECT_TRUE(Put(body_request_, body_response_)); |
| 299 EXPECT_TRUE(callback_response_); | 304 EXPECT_TRUE(callback_response_); |
| 300 EXPECT_STREQ(body_response_.url.spec().c_str(), | 305 EXPECT_STREQ(body_response_.url.spec().c_str(), |
| 301 callback_response_->url.spec().c_str()); | 306 callback_response_->url.spec().c_str()); |
| 302 EXPECT_TRUE(callback_response_data_); | 307 EXPECT_TRUE(callback_response_data_); |
| 308 EXPECT_STRNE("", callback_response_->blob_uuid.c_str()); |
| 309 EXPECT_EQ(expected_blob_data_.size(), callback_response_->blob_size); |
| 310 |
| 303 std::string response_body; | 311 std::string response_body; |
| 304 CopyBody(callback_response_data_.get(), &response_body); | 312 CopyBody(callback_response_data_.get(), &response_body); |
| 305 EXPECT_STREQ(expected_blob_data_.c_str(), response_body.c_str()); | 313 EXPECT_STREQ(expected_blob_data_.c_str(), response_body.c_str()); |
| 306 } | 314 } |
| 307 | 315 |
| 308 TEST_F(ServiceWorkerCacheTest, PutBodyDropBlobRef) { | 316 TEST_F(ServiceWorkerCacheTest, PutBodyDropBlobRef) { |
| 309 scoped_ptr<base::RunLoop> loop(new base::RunLoop()); | 317 scoped_ptr<base::RunLoop> loop(new base::RunLoop()); |
| 310 cache_->Put(CopyFetchRequest(body_request_), | 318 cache_->Put(CopyFetchRequest(body_request_), |
| 311 CopyFetchResponse(body_response_), | 319 CopyFetchResponse(body_response_), |
| 312 base::Bind(&ServiceWorkerCacheTestP::ResponseAndErrorCallback, | 320 base::Bind(&ServiceWorkerCacheTestP::ResponseAndErrorCallback, |
| 313 base::Unretained(this), | 321 base::Unretained(this), |
| 314 base::Unretained(loop.get()))); | 322 base::Unretained(loop.get()))); |
| 315 // The handle should be held by the cache now so the deref here should be | 323 // The handle should be held by the cache now so the deref here should be |
| 316 // okay. | 324 // okay. |
| 317 blob_handle_.reset(); | 325 blob_handle_.reset(); |
| 318 loop->Run(); | 326 loop->Run(); |
| 319 | 327 |
| 320 EXPECT_EQ(ServiceWorkerCache::ErrorTypeOK, callback_error_); | 328 EXPECT_EQ(ServiceWorkerCache::ErrorTypeOK, callback_error_); |
| 321 } | 329 } |
| 322 | 330 |
| 323 TEST_P(ServiceWorkerCacheTestP, MatchNoBody) { | 331 TEST_P(ServiceWorkerCacheTestP, MatchNoBody) { |
| 324 EXPECT_TRUE(Put(no_body_request_, no_body_response_)); | 332 EXPECT_TRUE(Put(no_body_request_, no_body_response_)); |
| 325 EXPECT_TRUE(Match(no_body_request_)); | 333 EXPECT_TRUE(Match(no_body_request_)); |
| 326 EXPECT_EQ(200, callback_response_->status_code); | 334 EXPECT_EQ(200, callback_response_->status_code); |
| 327 EXPECT_STREQ("OK", callback_response_->status_text.c_str()); | 335 EXPECT_STREQ("OK", callback_response_->status_text.c_str()); |
| 328 EXPECT_STREQ("http://example.com/no_body.html", | 336 EXPECT_STREQ("http://example.com/no_body.html", |
| 329 callback_response_->url.spec().c_str()); | 337 callback_response_->url.spec().c_str()); |
| 338 EXPECT_STREQ("", callback_response_->blob_uuid.c_str()); |
| 339 EXPECT_EQ(0u, callback_response_->blob_size); |
| 330 } | 340 } |
| 331 | 341 |
| 332 TEST_P(ServiceWorkerCacheTestP, MatchBody) { | 342 TEST_P(ServiceWorkerCacheTestP, MatchBody) { |
| 333 EXPECT_TRUE(Put(body_request_, body_response_)); | 343 EXPECT_TRUE(Put(body_request_, body_response_)); |
| 334 EXPECT_TRUE(Match(body_request_)); | 344 EXPECT_TRUE(Match(body_request_)); |
| 335 EXPECT_EQ(200, callback_response_->status_code); | 345 EXPECT_EQ(200, callback_response_->status_code); |
| 336 EXPECT_STREQ("OK", callback_response_->status_text.c_str()); | 346 EXPECT_STREQ("OK", callback_response_->status_text.c_str()); |
| 337 EXPECT_STREQ("http://example.com/body.html", | 347 EXPECT_STREQ("http://example.com/body.html", |
| 338 callback_response_->url.spec().c_str()); | 348 callback_response_->url.spec().c_str()); |
| 349 EXPECT_STRNE("", callback_response_->blob_uuid.c_str()); |
| 350 EXPECT_EQ(expected_blob_data_.size(), callback_response_->blob_size); |
| 351 |
| 339 std::string response_body; | 352 std::string response_body; |
| 340 CopyBody(callback_response_data_.get(), &response_body); | 353 CopyBody(callback_response_data_.get(), &response_body); |
| 341 EXPECT_STREQ(expected_blob_data_.c_str(), response_body.c_str()); | 354 EXPECT_STREQ(expected_blob_data_.c_str(), response_body.c_str()); |
| 342 } | 355 } |
| 343 | 356 |
| 344 TEST_P(ServiceWorkerCacheTestP, Vary) { | 357 TEST_P(ServiceWorkerCacheTestP, Vary) { |
| 345 body_request_.headers["vary_foo"] = "foo"; | 358 body_request_.headers["vary_foo"] = "foo"; |
| 346 body_response_.headers["vary"] = "vary_foo"; | 359 body_response_.headers["vary"] = "vary_foo"; |
| 347 EXPECT_TRUE(Put(body_request_, body_response_)); | 360 EXPECT_TRUE(Put(body_request_, body_response_)); |
| 348 EXPECT_TRUE(Match(body_request_)); | 361 EXPECT_TRUE(Match(body_request_)); |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 490 #endif // OS_WIN | 503 #endif // OS_WIN |
| 491 | 504 |
| 492 TEST_F(ServiceWorkerCacheTest, CaselessServiceWorkerResponseHeaders) { | 505 TEST_F(ServiceWorkerCacheTest, CaselessServiceWorkerResponseHeaders) { |
| 493 // ServiceWorkerCache depends on ServiceWorkerResponse having caseless | 506 // ServiceWorkerCache depends on ServiceWorkerResponse having caseless |
| 494 // headers so that it can quickly lookup vary headers. | 507 // headers so that it can quickly lookup vary headers. |
| 495 ServiceWorkerResponse response(GURL("http://www.example.com"), | 508 ServiceWorkerResponse response(GURL("http://www.example.com"), |
| 496 200, | 509 200, |
| 497 "OK", | 510 "OK", |
| 498 blink::WebServiceWorkerResponseTypeDefault, | 511 blink::WebServiceWorkerResponseTypeDefault, |
| 499 ServiceWorkerHeaderMap(), | 512 ServiceWorkerHeaderMap(), |
| 500 ""); | 513 "", |
| 514 0); |
| 501 response.headers["content-type"] = "foo"; | 515 response.headers["content-type"] = "foo"; |
| 502 response.headers["Content-Type"] = "bar"; | 516 response.headers["Content-Type"] = "bar"; |
| 503 EXPECT_EQ("bar", response.headers["content-type"]); | 517 EXPECT_EQ("bar", response.headers["content-type"]); |
| 504 } | 518 } |
| 505 | 519 |
| 506 TEST_F(ServiceWorkerCacheTest, CaselessServiceWorkerFetchRequestHeaders) { | 520 TEST_F(ServiceWorkerCacheTest, CaselessServiceWorkerFetchRequestHeaders) { |
| 507 // ServiceWorkerCache depends on ServiceWorkerFetchRequest having caseless | 521 // ServiceWorkerCache depends on ServiceWorkerFetchRequest having caseless |
| 508 // headers so that it can quickly lookup vary headers. | 522 // headers so that it can quickly lookup vary headers. |
| 509 ServiceWorkerFetchRequest request(GURL("http://www.example.com"), | 523 ServiceWorkerFetchRequest request(GURL("http://www.example.com"), |
| 510 "GET", | 524 "GET", |
| 511 ServiceWorkerHeaderMap(), | 525 ServiceWorkerHeaderMap(), |
| 512 GURL(""), | 526 GURL(""), |
| 513 false); | 527 false); |
| 514 request.headers["content-type"] = "foo"; | 528 request.headers["content-type"] = "foo"; |
| 515 request.headers["Content-Type"] = "bar"; | 529 request.headers["Content-Type"] = "bar"; |
| 516 EXPECT_EQ("bar", request.headers["content-type"]); | 530 EXPECT_EQ("bar", request.headers["content-type"]); |
| 517 } | 531 } |
| 518 | 532 |
| 519 INSTANTIATE_TEST_CASE_P(ServiceWorkerCacheTest, | 533 INSTANTIATE_TEST_CASE_P(ServiceWorkerCacheTest, |
| 520 ServiceWorkerCacheTestP, | 534 ServiceWorkerCacheTestP, |
| 521 ::testing::Values(false, true)); | 535 ::testing::Values(false, true)); |
| 522 | 536 |
| 523 } // namespace content | 537 } // namespace content |
| OLD | NEW |