| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 <stack> | 5 #include <stack> |
| 6 #include <string> | 6 #include <string> |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
| 11 #include "base/callback.h" | 11 #include "base/callback.h" |
| 12 #include "base/message_loop/message_loop.h" | 12 #include "base/message_loop/message_loop.h" |
| 13 #include "base/synchronization/waitable_event.h" | 13 #include "base/synchronization/waitable_event.h" |
| 14 #include "base/threading/thread.h" | 14 #include "base/threading/thread.h" |
| 15 #include "net/base/net_errors.h" | 15 #include "net/base/net_errors.h" |
| 16 #include "net/base/request_priority.h" |
| 16 #include "net/http/http_response_headers.h" | 17 #include "net/http/http_response_headers.h" |
| 17 #include "net/url_request/url_request.h" | 18 #include "net/url_request/url_request.h" |
| 18 #include "net/url_request/url_request_context.h" | 19 #include "net/url_request/url_request_context.h" |
| 19 #include "net/url_request/url_request_error_job.h" | 20 #include "net/url_request/url_request_error_job.h" |
| 20 #include "testing/gtest/include/gtest/gtest.h" | 21 #include "testing/gtest/include/gtest/gtest.h" |
| 21 #include "webkit/browser/appcache/appcache.h" | 22 #include "webkit/browser/appcache/appcache.h" |
| 22 #include "webkit/browser/appcache/appcache_backend_impl.h" | 23 #include "webkit/browser/appcache/appcache_backend_impl.h" |
| 23 #include "webkit/browser/appcache/appcache_request_handler.h" | 24 #include "webkit/browser/appcache/appcache_request_handler.h" |
| 24 #include "webkit/browser/appcache/appcache_url_request_job.h" | 25 #include "webkit/browser/appcache/appcache_url_request_job.h" |
| 25 #include "webkit/browser/appcache/mock_appcache_policy.h" | 26 #include "webkit/browser/appcache/mock_appcache_policy.h" |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 110 } | 111 } |
| 111 | 112 |
| 112 private: | 113 private: |
| 113 int response_code_; | 114 int response_code_; |
| 114 bool has_response_info_; | 115 bool has_response_info_; |
| 115 net::HttpResponseInfo response_info_; | 116 net::HttpResponseInfo response_info_; |
| 116 }; | 117 }; |
| 117 | 118 |
| 118 class MockURLRequest : public net::URLRequest { | 119 class MockURLRequest : public net::URLRequest { |
| 119 public: | 120 public: |
| 120 MockURLRequest( | 121 MockURLRequest(const GURL& url, net::URLRequestContext* context) |
| 121 const GURL& url, | 122 : net::URLRequest(url, net::DEFAULT_PRIORITY, NULL, context) {} |
| 122 net::URLRequestContext* context, | |
| 123 net::NetworkDelegate* network_delegate) : | |
| 124 net::URLRequest(url, NULL, context, network_delegate), | |
| 125 network_delegate_(network_delegate) { | |
| 126 } | |
| 127 | 123 |
| 128 void SimulateResponseCode(int http_response_code) { | 124 void SimulateResponseCode(int http_response_code) { |
| 129 mock_factory_job_ = new MockURLRequestJob( | 125 mock_factory_job_ = new MockURLRequestJob( |
| 130 this, network_delegate_, http_response_code); | 126 this, context()->network_delegate(), http_response_code); |
| 131 Start(); | 127 Start(); |
| 132 DCHECK(!mock_factory_job_); | 128 DCHECK(!mock_factory_job_); |
| 133 // All our simulation needs to satisfy are the following two DCHECKs | 129 // All our simulation needs to satisfy are the following two DCHECKs |
| 134 DCHECK(status().is_success()); | 130 DCHECK(status().is_success()); |
| 135 DCHECK_EQ(http_response_code, GetResponseCode()); | 131 DCHECK_EQ(http_response_code, GetResponseCode()); |
| 136 } | 132 } |
| 137 | 133 |
| 138 void SimulateResponseInfo(const net::HttpResponseInfo& info) { | 134 void SimulateResponseInfo(const net::HttpResponseInfo& info) { |
| 139 mock_factory_job_ = new MockURLRequestJob( | 135 mock_factory_job_ = |
| 140 this, network_delegate_, info); | 136 new MockURLRequestJob(this, context()->network_delegate(), info); |
| 141 set_delegate(&delegate_); // needed to get the info back out | 137 set_delegate(&delegate_); // needed to get the info back out |
| 142 Start(); | 138 Start(); |
| 143 DCHECK(!mock_factory_job_); | 139 DCHECK(!mock_factory_job_); |
| 144 } | 140 } |
| 145 | 141 |
| 146 MockURLRequestDelegate delegate_; | 142 MockURLRequestDelegate delegate_; |
| 147 | |
| 148 private: | |
| 149 net::NetworkDelegate* network_delegate_; | |
| 150 }; | 143 }; |
| 151 | 144 |
| 152 static net::URLRequestJob* MockHttpJobFactory( | 145 static net::URLRequestJob* MockHttpJobFactory( |
| 153 net::URLRequest* request, | 146 net::URLRequest* request, |
| 154 net::NetworkDelegate* network_delegate, | 147 net::NetworkDelegate* network_delegate, |
| 155 const std::string& scheme) { | 148 const std::string& scheme) { |
| 156 if (mock_factory_job_) { | 149 if (mock_factory_job_) { |
| 157 net::URLRequestJob* temp = mock_factory_job_; | 150 net::URLRequestJob* temp = mock_factory_job_; |
| 158 mock_factory_job_ = NULL; | 151 mock_factory_job_ = NULL; |
| 159 return temp; | 152 return temp; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 171 base::Thread::Options options(base::MessageLoop::TYPE_IO, 0); | 164 base::Thread::Options options(base::MessageLoop::TYPE_IO, 0); |
| 172 io_thread_->StartWithOptions(options); | 165 io_thread_->StartWithOptions(options); |
| 173 } | 166 } |
| 174 | 167 |
| 175 static void TearDownTestCase() { | 168 static void TearDownTestCase() { |
| 176 io_thread_.reset(NULL); | 169 io_thread_.reset(NULL); |
| 177 } | 170 } |
| 178 | 171 |
| 179 // Test harness -------------------------------------------------- | 172 // Test harness -------------------------------------------------- |
| 180 | 173 |
| 181 AppCacheRequestHandlerTest() | 174 AppCacheRequestHandlerTest() : host_(NULL), orig_http_factory_(NULL) {} |
| 182 : host_(NULL), empty_network_delegate_(NULL), orig_http_factory_(NULL) { | |
| 183 } | |
| 184 | 175 |
| 185 template <class Method> | 176 template <class Method> |
| 186 void RunTestOnIOThread(Method method) { | 177 void RunTestOnIOThread(Method method) { |
| 187 test_finished_event_ .reset(new base::WaitableEvent(false, false)); | 178 test_finished_event_ .reset(new base::WaitableEvent(false, false)); |
| 188 io_thread_->message_loop()->PostTask( | 179 io_thread_->message_loop()->PostTask( |
| 189 FROM_HERE, | 180 FROM_HERE, |
| 190 base::Bind(&AppCacheRequestHandlerTest::MethodWrapper<Method>, | 181 base::Bind(&AppCacheRequestHandlerTest::MethodWrapper<Method>, |
| 191 base::Unretained(this), method)); | 182 base::Unretained(this), method)); |
| 192 test_finished_event_->Wait(); | 183 test_finished_event_->Wait(); |
| 193 } | 184 } |
| 194 | 185 |
| 195 void SetUpTest() { | 186 void SetUpTest() { |
| 196 DCHECK(base::MessageLoop::current() == io_thread_->message_loop()); | 187 DCHECK(base::MessageLoop::current() == io_thread_->message_loop()); |
| 197 orig_http_factory_ = net::URLRequest::Deprecated::RegisterProtocolFactory( | 188 orig_http_factory_ = net::URLRequest::Deprecated::RegisterProtocolFactory( |
| 198 "http", MockHttpJobFactory); | 189 "http", MockHttpJobFactory); |
| 199 mock_service_.reset(new MockAppCacheService); | 190 mock_service_.reset(new MockAppCacheService); |
| 200 mock_service_->set_request_context(&empty_context_); | 191 mock_service_->set_request_context(&empty_context_); |
| 201 mock_policy_.reset(new MockAppCachePolicy); | 192 mock_policy_.reset(new MockAppCachePolicy); |
| 202 mock_service_->set_appcache_policy(mock_policy_.get()); | 193 mock_service_->set_appcache_policy(mock_policy_.get()); |
| 203 mock_frontend_.reset(new MockFrontend); | 194 mock_frontend_.reset(new MockFrontend); |
| 204 backend_impl_.reset(new AppCacheBackendImpl); | 195 backend_impl_.reset(new AppCacheBackendImpl); |
| 205 backend_impl_->Initialize(mock_service_.get(), mock_frontend_.get(), | 196 backend_impl_->Initialize(mock_service_.get(), mock_frontend_.get(), |
| 206 kMockProcessId); | 197 kMockProcessId); |
| 207 const int kHostId = 1; | 198 const int kHostId = 1; |
| 208 backend_impl_->RegisterHost(kHostId); | 199 backend_impl_->RegisterHost(kHostId); |
| 209 host_ = backend_impl_->GetHost(kHostId); | 200 host_ = backend_impl_->GetHost(kHostId); |
| 210 empty_network_delegate_ = NULL; | |
| 211 } | 201 } |
| 212 | 202 |
| 213 void TearDownTest() { | 203 void TearDownTest() { |
| 214 DCHECK(base::MessageLoop::current() == io_thread_->message_loop()); | 204 DCHECK(base::MessageLoop::current() == io_thread_->message_loop()); |
| 215 DCHECK(!mock_factory_job_); | 205 DCHECK(!mock_factory_job_); |
| 216 net::URLRequest::Deprecated::RegisterProtocolFactory( | 206 net::URLRequest::Deprecated::RegisterProtocolFactory( |
| 217 "http", orig_http_factory_); | 207 "http", orig_http_factory_); |
| 218 orig_http_factory_ = NULL; | 208 orig_http_factory_ = NULL; |
| 219 job_ = NULL; | 209 job_ = NULL; |
| 220 handler_.reset(); | 210 handler_.reset(); |
| 221 request_.reset(); | 211 request_.reset(); |
| 222 backend_impl_.reset(); | 212 backend_impl_.reset(); |
| 223 mock_frontend_.reset(); | 213 mock_frontend_.reset(); |
| 224 mock_service_.reset(); | 214 mock_service_.reset(); |
| 225 mock_policy_.reset(); | 215 mock_policy_.reset(); |
| 226 host_ = NULL; | 216 host_ = NULL; |
| 227 empty_network_delegate_ = NULL; | |
| 228 } | 217 } |
| 229 | 218 |
| 230 void TestFinished() { | 219 void TestFinished() { |
| 231 // We unwind the stack prior to finishing up to let stack | 220 // We unwind the stack prior to finishing up to let stack |
| 232 // based objects get deleted. | 221 // based objects get deleted. |
| 233 DCHECK(base::MessageLoop::current() == io_thread_->message_loop()); | 222 DCHECK(base::MessageLoop::current() == io_thread_->message_loop()); |
| 234 base::MessageLoop::current()->PostTask( | 223 base::MessageLoop::current()->PostTask( |
| 235 FROM_HERE, | 224 FROM_HERE, |
| 236 base::Bind(&AppCacheRequestHandlerTest::TestFinishedUnwound, | 225 base::Bind(&AppCacheRequestHandlerTest::TestFinishedUnwound, |
| 237 base::Unretained(this))); | 226 base::Unretained(this))); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 256 task_stack_.pop(); | 245 task_stack_.pop(); |
| 257 } | 246 } |
| 258 | 247 |
| 259 // MainResource_Miss -------------------------------------------------- | 248 // MainResource_Miss -------------------------------------------------- |
| 260 | 249 |
| 261 void MainResource_Miss() { | 250 void MainResource_Miss() { |
| 262 PushNextTask( | 251 PushNextTask( |
| 263 base::Bind(&AppCacheRequestHandlerTest::Verify_MainResource_Miss, | 252 base::Bind(&AppCacheRequestHandlerTest::Verify_MainResource_Miss, |
| 264 base::Unretained(this))); | 253 base::Unretained(this))); |
| 265 | 254 |
| 266 request_.reset(new MockURLRequest( | 255 request_.reset(new MockURLRequest(GURL("http://blah/"), &empty_context_)); |
| 267 GURL("http://blah/"), &empty_context_, empty_network_delegate_)); | |
| 268 handler_.reset(host_->CreateRequestHandler(request_.get(), | 256 handler_.reset(host_->CreateRequestHandler(request_.get(), |
| 269 ResourceType::MAIN_FRAME)); | 257 ResourceType::MAIN_FRAME)); |
| 270 EXPECT_TRUE(handler_.get()); | 258 EXPECT_TRUE(handler_.get()); |
| 271 | 259 |
| 272 job_ = handler_->MaybeLoadResource(request_.get(), empty_network_delegate_); | 260 job_ = handler_->MaybeLoadResource(request_.get(), |
| 261 request_->context()->network_delegate()); |
| 273 EXPECT_TRUE(job_.get()); | 262 EXPECT_TRUE(job_.get()); |
| 274 EXPECT_TRUE(job_->is_waiting()); | 263 EXPECT_TRUE(job_->is_waiting()); |
| 275 | 264 |
| 276 // We have to wait for completion of storage->FindResponseForMainRequest. | 265 // We have to wait for completion of storage->FindResponseForMainRequest. |
| 277 ScheduleNextTask(); | 266 ScheduleNextTask(); |
| 278 } | 267 } |
| 279 | 268 |
| 280 void Verify_MainResource_Miss() { | 269 void Verify_MainResource_Miss() { |
| 281 EXPECT_FALSE(job_->is_waiting()); | 270 EXPECT_FALSE(job_->is_waiting()); |
| 282 EXPECT_TRUE(job_->is_delivering_network_response()); | 271 EXPECT_TRUE(job_->is_delivering_network_response()); |
| 283 | 272 |
| 284 int64 cache_id = kNoCacheId; | 273 int64 cache_id = kNoCacheId; |
| 285 GURL manifest_url; | 274 GURL manifest_url; |
| 286 handler_->GetExtraResponseInfo(&cache_id, &manifest_url); | 275 handler_->GetExtraResponseInfo(&cache_id, &manifest_url); |
| 287 EXPECT_EQ(kNoCacheId, cache_id); | 276 EXPECT_EQ(kNoCacheId, cache_id); |
| 288 EXPECT_EQ(GURL(), manifest_url); | 277 EXPECT_EQ(GURL(), manifest_url); |
| 289 EXPECT_EQ(0, handler_->found_group_id_); | 278 EXPECT_EQ(0, handler_->found_group_id_); |
| 290 | 279 |
| 291 AppCacheURLRequestJob* fallback_job; | 280 AppCacheURLRequestJob* fallback_job; |
| 292 fallback_job = handler_->MaybeLoadFallbackForRedirect( | 281 fallback_job = handler_->MaybeLoadFallbackForRedirect( |
| 293 request_.get(), | 282 request_.get(), |
| 294 empty_network_delegate_, | 283 request_->context()->network_delegate(), |
| 295 GURL("http://blah/redirect")); | 284 GURL("http://blah/redirect")); |
| 296 EXPECT_FALSE(fallback_job); | 285 EXPECT_FALSE(fallback_job); |
| 297 fallback_job = handler_->MaybeLoadFallbackForResponse( | 286 fallback_job = handler_->MaybeLoadFallbackForResponse( |
| 298 request_.get(), empty_network_delegate_); | 287 request_.get(), request_->context()->network_delegate()); |
| 299 EXPECT_FALSE(fallback_job); | 288 EXPECT_FALSE(fallback_job); |
| 300 | 289 |
| 301 EXPECT_TRUE(host_->preferred_manifest_url().is_empty()); | 290 EXPECT_TRUE(host_->preferred_manifest_url().is_empty()); |
| 302 | 291 |
| 303 TestFinished(); | 292 TestFinished(); |
| 304 } | 293 } |
| 305 | 294 |
| 306 // MainResource_Hit -------------------------------------------------- | 295 // MainResource_Hit -------------------------------------------------- |
| 307 | 296 |
| 308 void MainResource_Hit() { | 297 void MainResource_Hit() { |
| 309 PushNextTask( | 298 PushNextTask( |
| 310 base::Bind(&AppCacheRequestHandlerTest::Verify_MainResource_Hit, | 299 base::Bind(&AppCacheRequestHandlerTest::Verify_MainResource_Hit, |
| 311 base::Unretained(this))); | 300 base::Unretained(this))); |
| 312 | 301 |
| 313 request_.reset(new MockURLRequest( | 302 request_.reset(new MockURLRequest(GURL("http://blah/"), &empty_context_)); |
| 314 GURL("http://blah/"), &empty_context_, empty_network_delegate_)); | |
| 315 handler_.reset(host_->CreateRequestHandler(request_.get(), | 303 handler_.reset(host_->CreateRequestHandler(request_.get(), |
| 316 ResourceType::MAIN_FRAME)); | 304 ResourceType::MAIN_FRAME)); |
| 317 EXPECT_TRUE(handler_.get()); | 305 EXPECT_TRUE(handler_.get()); |
| 318 | 306 |
| 319 mock_storage()->SimulateFindMainResource( | 307 mock_storage()->SimulateFindMainResource( |
| 320 AppCacheEntry(AppCacheEntry::EXPLICIT, 1), | 308 AppCacheEntry(AppCacheEntry::EXPLICIT, 1), |
| 321 GURL(), AppCacheEntry(), | 309 GURL(), AppCacheEntry(), |
| 322 1, 2, GURL("http://blah/manifest/")); | 310 1, 2, GURL("http://blah/manifest/")); |
| 323 | 311 |
| 324 job_ = handler_->MaybeLoadResource(request_.get(), empty_network_delegate_); | 312 job_ = handler_->MaybeLoadResource(request_.get(), |
| 313 request_->context()->network_delegate()); |
| 325 EXPECT_TRUE(job_.get()); | 314 EXPECT_TRUE(job_.get()); |
| 326 EXPECT_TRUE(job_->is_waiting()); | 315 EXPECT_TRUE(job_->is_waiting()); |
| 327 | 316 |
| 328 // We have to wait for completion of storage->FindResponseForMainRequest. | 317 // We have to wait for completion of storage->FindResponseForMainRequest. |
| 329 ScheduleNextTask(); | 318 ScheduleNextTask(); |
| 330 } | 319 } |
| 331 | 320 |
| 332 void Verify_MainResource_Hit() { | 321 void Verify_MainResource_Hit() { |
| 333 EXPECT_FALSE(job_->is_waiting()); | 322 EXPECT_FALSE(job_->is_waiting()); |
| 334 EXPECT_TRUE(job_->is_delivering_appcache_response()); | 323 EXPECT_TRUE(job_->is_delivering_appcache_response()); |
| 335 | 324 |
| 336 int64 cache_id = kNoCacheId; | 325 int64 cache_id = kNoCacheId; |
| 337 GURL manifest_url; | 326 GURL manifest_url; |
| 338 handler_->GetExtraResponseInfo(&cache_id, &manifest_url); | 327 handler_->GetExtraResponseInfo(&cache_id, &manifest_url); |
| 339 EXPECT_EQ(1, cache_id); | 328 EXPECT_EQ(1, cache_id); |
| 340 EXPECT_EQ(GURL("http://blah/manifest/"), manifest_url); | 329 EXPECT_EQ(GURL("http://blah/manifest/"), manifest_url); |
| 341 EXPECT_EQ(2, handler_->found_group_id_); | 330 EXPECT_EQ(2, handler_->found_group_id_); |
| 342 | 331 |
| 343 AppCacheURLRequestJob* fallback_job; | 332 AppCacheURLRequestJob* fallback_job; |
| 344 fallback_job = handler_->MaybeLoadFallbackForResponse( | 333 fallback_job = handler_->MaybeLoadFallbackForResponse( |
| 345 request_.get(), empty_network_delegate_); | 334 request_.get(), request_->context()->network_delegate()); |
| 346 EXPECT_FALSE(fallback_job); | 335 EXPECT_FALSE(fallback_job); |
| 347 | 336 |
| 348 EXPECT_EQ(GURL("http://blah/manifest/"), | 337 EXPECT_EQ(GURL("http://blah/manifest/"), |
| 349 host_->preferred_manifest_url()); | 338 host_->preferred_manifest_url()); |
| 350 | 339 |
| 351 TestFinished(); | 340 TestFinished(); |
| 352 } | 341 } |
| 353 | 342 |
| 354 // MainResource_Fallback -------------------------------------------------- | 343 // MainResource_Fallback -------------------------------------------------- |
| 355 | 344 |
| 356 void MainResource_Fallback() { | 345 void MainResource_Fallback() { |
| 357 PushNextTask( | 346 PushNextTask( |
| 358 base::Bind(&AppCacheRequestHandlerTest::Verify_MainResource_Fallback, | 347 base::Bind(&AppCacheRequestHandlerTest::Verify_MainResource_Fallback, |
| 359 base::Unretained(this))); | 348 base::Unretained(this))); |
| 360 | 349 |
| 361 request_.reset(new MockURLRequest( | 350 request_.reset(new MockURLRequest(GURL("http://blah/"), &empty_context_)); |
| 362 GURL("http://blah/"), &empty_context_, empty_network_delegate_)); | |
| 363 handler_.reset(host_->CreateRequestHandler(request_.get(), | 351 handler_.reset(host_->CreateRequestHandler(request_.get(), |
| 364 ResourceType::MAIN_FRAME)); | 352 ResourceType::MAIN_FRAME)); |
| 365 EXPECT_TRUE(handler_.get()); | 353 EXPECT_TRUE(handler_.get()); |
| 366 | 354 |
| 367 mock_storage()->SimulateFindMainResource( | 355 mock_storage()->SimulateFindMainResource( |
| 368 AppCacheEntry(), | 356 AppCacheEntry(), |
| 369 GURL("http://blah/fallbackurl"), | 357 GURL("http://blah/fallbackurl"), |
| 370 AppCacheEntry(AppCacheEntry::EXPLICIT, 1), | 358 AppCacheEntry(AppCacheEntry::EXPLICIT, 1), |
| 371 1, 2, GURL("http://blah/manifest/")); | 359 1, 2, GURL("http://blah/manifest/")); |
| 372 | 360 |
| 373 job_ = handler_->MaybeLoadResource(request_.get(), empty_network_delegate_); | 361 job_ = handler_->MaybeLoadResource(request_.get(), |
| 362 request_->context()->network_delegate()); |
| 374 EXPECT_TRUE(job_.get()); | 363 EXPECT_TRUE(job_.get()); |
| 375 EXPECT_TRUE(job_->is_waiting()); | 364 EXPECT_TRUE(job_->is_waiting()); |
| 376 | 365 |
| 377 // We have to wait for completion of storage->FindResponseForMainRequest. | 366 // We have to wait for completion of storage->FindResponseForMainRequest. |
| 378 ScheduleNextTask(); | 367 ScheduleNextTask(); |
| 379 } | 368 } |
| 380 | 369 |
| 381 void Verify_MainResource_Fallback() { | 370 void Verify_MainResource_Fallback() { |
| 382 EXPECT_FALSE(job_->is_waiting()); | 371 EXPECT_FALSE(job_->is_waiting()); |
| 383 EXPECT_TRUE(job_->is_delivering_network_response()); | 372 EXPECT_TRUE(job_->is_delivering_network_response()); |
| 384 | 373 |
| 385 // When the request is restarted, the existing job is dropped so a | 374 // When the request is restarted, the existing job is dropped so a |
| 386 // real network job gets created. We expect NULL here which will cause | 375 // real network job gets created. We expect NULL here which will cause |
| 387 // the net library to create a real job. | 376 // the net library to create a real job. |
| 388 job_ = handler_->MaybeLoadResource(request_.get(), empty_network_delegate_); | 377 job_ = handler_->MaybeLoadResource(request_.get(), |
| 378 request_->context()->network_delegate()); |
| 389 EXPECT_FALSE(job_.get()); | 379 EXPECT_FALSE(job_.get()); |
| 390 | 380 |
| 391 // Simulate an http error of the real network job. | 381 // Simulate an http error of the real network job. |
| 392 request_->SimulateResponseCode(500); | 382 request_->SimulateResponseCode(500); |
| 393 | 383 |
| 394 job_ = handler_->MaybeLoadFallbackForResponse( | 384 job_ = handler_->MaybeLoadFallbackForResponse( |
| 395 request_.get(), empty_network_delegate_); | 385 request_.get(), request_->context()->network_delegate()); |
| 396 EXPECT_TRUE(job_.get()); | 386 EXPECT_TRUE(job_.get()); |
| 397 EXPECT_TRUE(job_->is_delivering_appcache_response()); | 387 EXPECT_TRUE(job_->is_delivering_appcache_response()); |
| 398 | 388 |
| 399 int64 cache_id = kNoCacheId; | 389 int64 cache_id = kNoCacheId; |
| 400 GURL manifest_url; | 390 GURL manifest_url; |
| 401 handler_->GetExtraResponseInfo(&cache_id, &manifest_url); | 391 handler_->GetExtraResponseInfo(&cache_id, &manifest_url); |
| 402 EXPECT_EQ(1, cache_id); | 392 EXPECT_EQ(1, cache_id); |
| 403 EXPECT_EQ(GURL("http://blah/manifest/"), manifest_url); | 393 EXPECT_EQ(GURL("http://blah/manifest/"), manifest_url); |
| 404 EXPECT_TRUE(host_->main_resource_was_namespace_entry_); | 394 EXPECT_TRUE(host_->main_resource_was_namespace_entry_); |
| 405 EXPECT_EQ(GURL("http://blah/fallbackurl"), host_->namespace_entry_url_); | 395 EXPECT_EQ(GURL("http://blah/fallbackurl"), host_->namespace_entry_url_); |
| 406 | 396 |
| 407 EXPECT_EQ(GURL("http://blah/manifest/"), | 397 EXPECT_EQ(GURL("http://blah/manifest/"), |
| 408 host_->preferred_manifest_url()); | 398 host_->preferred_manifest_url()); |
| 409 | 399 |
| 410 TestFinished(); | 400 TestFinished(); |
| 411 } | 401 } |
| 412 | 402 |
| 413 // MainResource_FallbackOverride -------------------------------------------- | 403 // MainResource_FallbackOverride -------------------------------------------- |
| 414 | 404 |
| 415 void MainResource_FallbackOverride() { | 405 void MainResource_FallbackOverride() { |
| 416 PushNextTask(base::Bind( | 406 PushNextTask(base::Bind( |
| 417 &AppCacheRequestHandlerTest::Verify_MainResource_FallbackOverride, | 407 &AppCacheRequestHandlerTest::Verify_MainResource_FallbackOverride, |
| 418 base::Unretained(this))); | 408 base::Unretained(this))); |
| 419 | 409 |
| 420 request_.reset(new MockURLRequest( | 410 request_.reset(new MockURLRequest(GURL("http://blah/fallback-override"), |
| 421 GURL("http://blah/fallback-override"), | 411 &empty_context_)); |
| 422 &empty_context_, empty_network_delegate_)); | |
| 423 handler_.reset(host_->CreateRequestHandler(request_.get(), | 412 handler_.reset(host_->CreateRequestHandler(request_.get(), |
| 424 ResourceType::MAIN_FRAME)); | 413 ResourceType::MAIN_FRAME)); |
| 425 EXPECT_TRUE(handler_.get()); | 414 EXPECT_TRUE(handler_.get()); |
| 426 | 415 |
| 427 mock_storage()->SimulateFindMainResource( | 416 mock_storage()->SimulateFindMainResource( |
| 428 AppCacheEntry(), | 417 AppCacheEntry(), |
| 429 GURL("http://blah/fallbackurl"), | 418 GURL("http://blah/fallbackurl"), |
| 430 AppCacheEntry(AppCacheEntry::EXPLICIT, 1), | 419 AppCacheEntry(AppCacheEntry::EXPLICIT, 1), |
| 431 1, 2, GURL("http://blah/manifest/")); | 420 1, 2, GURL("http://blah/manifest/")); |
| 432 | 421 |
| 433 job_ = handler_->MaybeLoadResource(request_.get(), empty_network_delegate_); | 422 job_ = handler_->MaybeLoadResource(request_.get(), |
| 423 request_->context()->network_delegate()); |
| 434 EXPECT_TRUE(job_.get()); | 424 EXPECT_TRUE(job_.get()); |
| 435 EXPECT_TRUE(job_->is_waiting()); | 425 EXPECT_TRUE(job_->is_waiting()); |
| 436 | 426 |
| 437 // We have to wait for completion of storage->FindResponseForMainRequest. | 427 // We have to wait for completion of storage->FindResponseForMainRequest. |
| 438 ScheduleNextTask(); | 428 ScheduleNextTask(); |
| 439 } | 429 } |
| 440 | 430 |
| 441 void Verify_MainResource_FallbackOverride() { | 431 void Verify_MainResource_FallbackOverride() { |
| 442 EXPECT_FALSE(job_->is_waiting()); | 432 EXPECT_FALSE(job_->is_waiting()); |
| 443 EXPECT_TRUE(job_->is_delivering_network_response()); | 433 EXPECT_TRUE(job_->is_delivering_network_response()); |
| 444 | 434 |
| 445 // When the request is restarted, the existing job is dropped so a | 435 // When the request is restarted, the existing job is dropped so a |
| 446 // real network job gets created. We expect NULL here which will cause | 436 // real network job gets created. We expect NULL here which will cause |
| 447 // the net library to create a real job. | 437 // the net library to create a real job. |
| 448 job_ = handler_->MaybeLoadResource(request_.get(), empty_network_delegate_); | 438 job_ = handler_->MaybeLoadResource(request_.get(), |
| 439 request_->context()->network_delegate()); |
| 449 EXPECT_FALSE(job_.get()); | 440 EXPECT_FALSE(job_.get()); |
| 450 | 441 |
| 451 // Simulate an http error of the real network job, but with custom | 442 // Simulate an http error of the real network job, but with custom |
| 452 // headers that override the fallback behavior. | 443 // headers that override the fallback behavior. |
| 453 const char kOverrideHeaders[] = | 444 const char kOverrideHeaders[] = |
| 454 "HTTP/1.1 404 BOO HOO\0" | 445 "HTTP/1.1 404 BOO HOO\0" |
| 455 "x-chromium-appcache-fallback-override: disallow-fallback\0" | 446 "x-chromium-appcache-fallback-override: disallow-fallback\0" |
| 456 "\0"; | 447 "\0"; |
| 457 net::HttpResponseInfo info; | 448 net::HttpResponseInfo info; |
| 458 info.headers = new net::HttpResponseHeaders( | 449 info.headers = new net::HttpResponseHeaders( |
| 459 std::string(kOverrideHeaders, arraysize(kOverrideHeaders))); | 450 std::string(kOverrideHeaders, arraysize(kOverrideHeaders))); |
| 460 request_->SimulateResponseInfo(info); | 451 request_->SimulateResponseInfo(info); |
| 461 | 452 |
| 462 job_ = handler_->MaybeLoadFallbackForResponse( | 453 job_ = handler_->MaybeLoadFallbackForResponse( |
| 463 request_.get(), empty_network_delegate_); | 454 request_.get(), request_->context()->network_delegate()); |
| 464 EXPECT_FALSE(job_.get()); | 455 EXPECT_FALSE(job_.get()); |
| 465 | 456 |
| 466 TestFinished(); | 457 TestFinished(); |
| 467 } | 458 } |
| 468 | 459 |
| 469 // SubResource_Miss_WithNoCacheSelected ---------------------------------- | 460 // SubResource_Miss_WithNoCacheSelected ---------------------------------- |
| 470 | 461 |
| 471 void SubResource_Miss_WithNoCacheSelected() { | 462 void SubResource_Miss_WithNoCacheSelected() { |
| 472 request_.reset(new MockURLRequest( | 463 request_.reset(new MockURLRequest(GURL("http://blah/"), &empty_context_)); |
| 473 GURL("http://blah/"), &empty_context_, empty_network_delegate_)); | |
| 474 handler_.reset(host_->CreateRequestHandler(request_.get(), | 464 handler_.reset(host_->CreateRequestHandler(request_.get(), |
| 475 ResourceType::SUB_RESOURCE)); | 465 ResourceType::SUB_RESOURCE)); |
| 476 | 466 |
| 477 // We avoid creating handler when possible, sub-resource requests are not | 467 // We avoid creating handler when possible, sub-resource requests are not |
| 478 // subject to retrieval from an appcache when there's no associated cache. | 468 // subject to retrieval from an appcache when there's no associated cache. |
| 479 EXPECT_FALSE(handler_.get()); | 469 EXPECT_FALSE(handler_.get()); |
| 480 | 470 |
| 481 TestFinished(); | 471 TestFinished(); |
| 482 } | 472 } |
| 483 | 473 |
| 484 // SubResource_Miss_WithCacheSelected ---------------------------------- | 474 // SubResource_Miss_WithCacheSelected ---------------------------------- |
| 485 | 475 |
| 486 void SubResource_Miss_WithCacheSelected() { | 476 void SubResource_Miss_WithCacheSelected() { |
| 487 // A sub-resource load where the resource is not in an appcache, or | 477 // A sub-resource load where the resource is not in an appcache, or |
| 488 // in a network or fallback namespace, should result in a failed request. | 478 // in a network or fallback namespace, should result in a failed request. |
| 489 host_->AssociateCompleteCache(MakeNewCache()); | 479 host_->AssociateCompleteCache(MakeNewCache()); |
| 490 | 480 |
| 491 request_.reset(new MockURLRequest( | 481 request_.reset(new MockURLRequest(GURL("http://blah/"), &empty_context_)); |
| 492 GURL("http://blah/"), &empty_context_, empty_network_delegate_)); | |
| 493 handler_.reset(host_->CreateRequestHandler(request_.get(), | 482 handler_.reset(host_->CreateRequestHandler(request_.get(), |
| 494 ResourceType::SUB_RESOURCE)); | 483 ResourceType::SUB_RESOURCE)); |
| 495 EXPECT_TRUE(handler_.get()); | 484 EXPECT_TRUE(handler_.get()); |
| 496 | 485 |
| 497 job_ = handler_->MaybeLoadResource(request_.get(), empty_network_delegate_); | 486 job_ = handler_->MaybeLoadResource(request_.get(), |
| 487 request_->context()->network_delegate()); |
| 498 EXPECT_TRUE(job_.get()); | 488 EXPECT_TRUE(job_.get()); |
| 499 EXPECT_TRUE(job_->is_delivering_error_response()); | 489 EXPECT_TRUE(job_->is_delivering_error_response()); |
| 500 | 490 |
| 501 AppCacheURLRequestJob* fallback_job; | 491 AppCacheURLRequestJob* fallback_job; |
| 502 fallback_job = handler_->MaybeLoadFallbackForRedirect( | 492 fallback_job = handler_->MaybeLoadFallbackForRedirect( |
| 503 request_.get(), empty_network_delegate_, GURL("http://blah/redirect")); | 493 request_.get(), |
| 494 request_->context()->network_delegate(), |
| 495 GURL("http://blah/redirect")); |
| 504 EXPECT_FALSE(fallback_job); | 496 EXPECT_FALSE(fallback_job); |
| 505 fallback_job = handler_->MaybeLoadFallbackForResponse( | 497 fallback_job = handler_->MaybeLoadFallbackForResponse( |
| 506 request_.get(), empty_network_delegate_); | 498 request_.get(), request_->context()->network_delegate()); |
| 507 EXPECT_FALSE(fallback_job); | 499 EXPECT_FALSE(fallback_job); |
| 508 | 500 |
| 509 TestFinished(); | 501 TestFinished(); |
| 510 } | 502 } |
| 511 | 503 |
| 512 // SubResource_Miss_WithWaitForCacheSelection ----------------------------- | 504 // SubResource_Miss_WithWaitForCacheSelection ----------------------------- |
| 513 | 505 |
| 514 void SubResource_Miss_WithWaitForCacheSelection() { | 506 void SubResource_Miss_WithWaitForCacheSelection() { |
| 515 // Precondition, the host is waiting on cache selection. | 507 // Precondition, the host is waiting on cache selection. |
| 516 scoped_refptr<AppCache> cache(MakeNewCache()); | 508 scoped_refptr<AppCache> cache(MakeNewCache()); |
| 517 host_->pending_selected_cache_id_ = cache->cache_id(); | 509 host_->pending_selected_cache_id_ = cache->cache_id(); |
| 518 host_->set_preferred_manifest_url(cache->owning_group()->manifest_url()); | 510 host_->set_preferred_manifest_url(cache->owning_group()->manifest_url()); |
| 519 | 511 |
| 520 request_.reset(new MockURLRequest( | 512 request_.reset(new MockURLRequest(GURL("http://blah/"), &empty_context_)); |
| 521 GURL("http://blah/"), &empty_context_, empty_network_delegate_)); | |
| 522 handler_.reset(host_->CreateRequestHandler(request_.get(), | 513 handler_.reset(host_->CreateRequestHandler(request_.get(), |
| 523 ResourceType::SUB_RESOURCE)); | 514 ResourceType::SUB_RESOURCE)); |
| 524 EXPECT_TRUE(handler_.get()); | 515 EXPECT_TRUE(handler_.get()); |
| 525 job_ = handler_->MaybeLoadResource(request_.get(), empty_network_delegate_); | 516 job_ = handler_->MaybeLoadResource(request_.get(), |
| 517 request_->context()->network_delegate()); |
| 526 EXPECT_TRUE(job_.get()); | 518 EXPECT_TRUE(job_.get()); |
| 527 EXPECT_TRUE(job_->is_waiting()); | 519 EXPECT_TRUE(job_->is_waiting()); |
| 528 | 520 |
| 529 host_->FinishCacheSelection(cache.get(), NULL); | 521 host_->FinishCacheSelection(cache.get(), NULL); |
| 530 EXPECT_FALSE(job_->is_waiting()); | 522 EXPECT_FALSE(job_->is_waiting()); |
| 531 EXPECT_TRUE(job_->is_delivering_error_response()); | 523 EXPECT_TRUE(job_->is_delivering_error_response()); |
| 532 | 524 |
| 533 AppCacheURLRequestJob* fallback_job; | 525 AppCacheURLRequestJob* fallback_job; |
| 534 fallback_job = handler_->MaybeLoadFallbackForRedirect( | 526 fallback_job = handler_->MaybeLoadFallbackForRedirect( |
| 535 request_.get(), empty_network_delegate_, GURL("http://blah/redirect")); | 527 request_.get(), |
| 528 request_->context()->network_delegate(), |
| 529 GURL("http://blah/redirect")); |
| 536 EXPECT_FALSE(fallback_job); | 530 EXPECT_FALSE(fallback_job); |
| 537 fallback_job = handler_->MaybeLoadFallbackForResponse( | 531 fallback_job = handler_->MaybeLoadFallbackForResponse( |
| 538 request_.get(), empty_network_delegate_); | 532 request_.get(), request_->context()->network_delegate()); |
| 539 EXPECT_FALSE(fallback_job); | 533 EXPECT_FALSE(fallback_job); |
| 540 | 534 |
| 541 TestFinished(); | 535 TestFinished(); |
| 542 } | 536 } |
| 543 | 537 |
| 544 // SubResource_Hit ----------------------------- | 538 // SubResource_Hit ----------------------------- |
| 545 | 539 |
| 546 void SubResource_Hit() { | 540 void SubResource_Hit() { |
| 547 host_->AssociateCompleteCache(MakeNewCache()); | 541 host_->AssociateCompleteCache(MakeNewCache()); |
| 548 | 542 |
| 549 mock_storage()->SimulateFindSubResource( | 543 mock_storage()->SimulateFindSubResource( |
| 550 AppCacheEntry(AppCacheEntry::EXPLICIT, 1), AppCacheEntry(), false); | 544 AppCacheEntry(AppCacheEntry::EXPLICIT, 1), AppCacheEntry(), false); |
| 551 | 545 |
| 552 request_.reset(new MockURLRequest( | 546 request_.reset(new MockURLRequest(GURL("http://blah/"), &empty_context_)); |
| 553 GURL("http://blah/"), &empty_context_, empty_network_delegate_)); | |
| 554 handler_.reset(host_->CreateRequestHandler(request_.get(), | 547 handler_.reset(host_->CreateRequestHandler(request_.get(), |
| 555 ResourceType::SUB_RESOURCE)); | 548 ResourceType::SUB_RESOURCE)); |
| 556 EXPECT_TRUE(handler_.get()); | 549 EXPECT_TRUE(handler_.get()); |
| 557 job_ = handler_->MaybeLoadResource(request_.get(), empty_network_delegate_); | 550 job_ = handler_->MaybeLoadResource(request_.get(), |
| 551 request_->context()->network_delegate()); |
| 558 EXPECT_TRUE(job_.get()); | 552 EXPECT_TRUE(job_.get()); |
| 559 EXPECT_TRUE(job_->is_delivering_appcache_response()); | 553 EXPECT_TRUE(job_->is_delivering_appcache_response()); |
| 560 | 554 |
| 561 AppCacheURLRequestJob* fallback_job; | 555 AppCacheURLRequestJob* fallback_job; |
| 562 fallback_job = handler_->MaybeLoadFallbackForRedirect( | 556 fallback_job = handler_->MaybeLoadFallbackForRedirect( |
| 563 request_.get(), empty_network_delegate_, GURL("http://blah/redirect")); | 557 request_.get(), |
| 558 request_->context()->network_delegate(), |
| 559 GURL("http://blah/redirect")); |
| 564 EXPECT_FALSE(fallback_job); | 560 EXPECT_FALSE(fallback_job); |
| 565 fallback_job = handler_->MaybeLoadFallbackForResponse( | 561 fallback_job = handler_->MaybeLoadFallbackForResponse( |
| 566 request_.get(), empty_network_delegate_); | 562 request_.get(), request_->context()->network_delegate()); |
| 567 EXPECT_FALSE(fallback_job); | 563 EXPECT_FALSE(fallback_job); |
| 568 | 564 |
| 569 TestFinished(); | 565 TestFinished(); |
| 570 } | 566 } |
| 571 | 567 |
| 572 // SubResource_RedirectFallback ----------------------------- | 568 // SubResource_RedirectFallback ----------------------------- |
| 573 | 569 |
| 574 void SubResource_RedirectFallback() { | 570 void SubResource_RedirectFallback() { |
| 575 // Redirects to resources in the a different origin are subject to | 571 // Redirects to resources in the a different origin are subject to |
| 576 // fallback namespaces. | 572 // fallback namespaces. |
| 577 host_->AssociateCompleteCache(MakeNewCache()); | 573 host_->AssociateCompleteCache(MakeNewCache()); |
| 578 | 574 |
| 579 mock_storage()->SimulateFindSubResource( | 575 mock_storage()->SimulateFindSubResource( |
| 580 AppCacheEntry(), AppCacheEntry(AppCacheEntry::EXPLICIT, 1), false); | 576 AppCacheEntry(), AppCacheEntry(AppCacheEntry::EXPLICIT, 1), false); |
| 581 | 577 |
| 582 request_.reset(new MockURLRequest( | 578 request_.reset(new MockURLRequest(GURL("http://blah/"), &empty_context_)); |
| 583 GURL("http://blah/"), &empty_context_, empty_network_delegate_)); | |
| 584 handler_.reset(host_->CreateRequestHandler(request_.get(), | 579 handler_.reset(host_->CreateRequestHandler(request_.get(), |
| 585 ResourceType::SUB_RESOURCE)); | 580 ResourceType::SUB_RESOURCE)); |
| 586 EXPECT_TRUE(handler_.get()); | 581 EXPECT_TRUE(handler_.get()); |
| 587 job_ = handler_->MaybeLoadResource(request_.get(), empty_network_delegate_); | 582 job_ = handler_->MaybeLoadResource(request_.get(), |
| 583 request_->context()->network_delegate()); |
| 588 EXPECT_FALSE(job_.get()); | 584 EXPECT_FALSE(job_.get()); |
| 589 | 585 |
| 590 job_ = handler_->MaybeLoadFallbackForRedirect( | 586 job_ = handler_->MaybeLoadFallbackForRedirect( |
| 591 request_.get(), | 587 request_.get(), |
| 592 empty_network_delegate_, | 588 request_->context()->network_delegate(), |
| 593 GURL("http://not_blah/redirect")); | 589 GURL("http://not_blah/redirect")); |
| 594 EXPECT_TRUE(job_.get()); | 590 EXPECT_TRUE(job_.get()); |
| 595 EXPECT_TRUE(job_->is_delivering_appcache_response()); | 591 EXPECT_TRUE(job_->is_delivering_appcache_response()); |
| 596 | 592 |
| 597 AppCacheURLRequestJob* fallback_job; | 593 AppCacheURLRequestJob* fallback_job; |
| 598 fallback_job = handler_->MaybeLoadFallbackForResponse( | 594 fallback_job = handler_->MaybeLoadFallbackForResponse( |
| 599 request_.get(), empty_network_delegate_); | 595 request_.get(), request_->context()->network_delegate()); |
| 600 EXPECT_FALSE(fallback_job); | 596 EXPECT_FALSE(fallback_job); |
| 601 | 597 |
| 602 TestFinished(); | 598 TestFinished(); |
| 603 } | 599 } |
| 604 | 600 |
| 605 // SubResource_NoRedirectFallback ----------------------------- | 601 // SubResource_NoRedirectFallback ----------------------------- |
| 606 | 602 |
| 607 void SubResource_NoRedirectFallback() { | 603 void SubResource_NoRedirectFallback() { |
| 608 // Redirects to resources in the same-origin are not subject to | 604 // Redirects to resources in the same-origin are not subject to |
| 609 // fallback namespaces. | 605 // fallback namespaces. |
| 610 host_->AssociateCompleteCache(MakeNewCache()); | 606 host_->AssociateCompleteCache(MakeNewCache()); |
| 611 | 607 |
| 612 mock_storage()->SimulateFindSubResource( | 608 mock_storage()->SimulateFindSubResource( |
| 613 AppCacheEntry(), AppCacheEntry(AppCacheEntry::EXPLICIT, 1), false); | 609 AppCacheEntry(), AppCacheEntry(AppCacheEntry::EXPLICIT, 1), false); |
| 614 | 610 |
| 615 request_.reset(new MockURLRequest( | 611 request_.reset(new MockURLRequest(GURL("http://blah/"), &empty_context_)); |
| 616 GURL("http://blah/"), &empty_context_, empty_network_delegate_)); | |
| 617 handler_.reset(host_->CreateRequestHandler(request_.get(), | 612 handler_.reset(host_->CreateRequestHandler(request_.get(), |
| 618 ResourceType::SUB_RESOURCE)); | 613 ResourceType::SUB_RESOURCE)); |
| 619 EXPECT_TRUE(handler_.get()); | 614 EXPECT_TRUE(handler_.get()); |
| 620 job_ = handler_->MaybeLoadResource(request_.get(), empty_network_delegate_); | 615 job_ = handler_->MaybeLoadResource(request_.get(), |
| 616 request_->context()->network_delegate()); |
| 621 EXPECT_FALSE(job_.get()); | 617 EXPECT_FALSE(job_.get()); |
| 622 | 618 |
| 623 AppCacheURLRequestJob* fallback_job; | 619 AppCacheURLRequestJob* fallback_job; |
| 624 fallback_job = handler_->MaybeLoadFallbackForRedirect( | 620 fallback_job = handler_->MaybeLoadFallbackForRedirect( |
| 625 request_.get(), empty_network_delegate_, GURL("http://blah/redirect")); | 621 request_.get(), |
| 622 request_->context()->network_delegate(), |
| 623 GURL("http://blah/redirect")); |
| 626 EXPECT_FALSE(fallback_job); | 624 EXPECT_FALSE(fallback_job); |
| 627 | 625 |
| 628 request_->SimulateResponseCode(200); | 626 request_->SimulateResponseCode(200); |
| 629 fallback_job = handler_->MaybeLoadFallbackForResponse( | 627 fallback_job = handler_->MaybeLoadFallbackForResponse( |
| 630 request_.get(), empty_network_delegate_); | 628 request_.get(), request_->context()->network_delegate()); |
| 631 EXPECT_FALSE(fallback_job); | 629 EXPECT_FALSE(fallback_job); |
| 632 | 630 |
| 633 TestFinished(); | 631 TestFinished(); |
| 634 } | 632 } |
| 635 | 633 |
| 636 // SubResource_Network ----------------------------- | 634 // SubResource_Network ----------------------------- |
| 637 | 635 |
| 638 void SubResource_Network() { | 636 void SubResource_Network() { |
| 639 // A sub-resource load where the resource is in a network namespace, | 637 // A sub-resource load where the resource is in a network namespace, |
| 640 // should result in the system using a 'real' job to do the network | 638 // should result in the system using a 'real' job to do the network |
| 641 // retrieval. | 639 // retrieval. |
| 642 host_->AssociateCompleteCache(MakeNewCache()); | 640 host_->AssociateCompleteCache(MakeNewCache()); |
| 643 | 641 |
| 644 mock_storage()->SimulateFindSubResource( | 642 mock_storage()->SimulateFindSubResource( |
| 645 AppCacheEntry(), AppCacheEntry(), true); | 643 AppCacheEntry(), AppCacheEntry(), true); |
| 646 | 644 |
| 647 request_.reset(new MockURLRequest( | 645 request_.reset(new MockURLRequest(GURL("http://blah/"), &empty_context_)); |
| 648 GURL("http://blah/"), &empty_context_, empty_network_delegate_)); | |
| 649 handler_.reset(host_->CreateRequestHandler(request_.get(), | 646 handler_.reset(host_->CreateRequestHandler(request_.get(), |
| 650 ResourceType::SUB_RESOURCE)); | 647 ResourceType::SUB_RESOURCE)); |
| 651 EXPECT_TRUE(handler_.get()); | 648 EXPECT_TRUE(handler_.get()); |
| 652 job_ = handler_->MaybeLoadResource(request_.get(), empty_network_delegate_); | 649 job_ = handler_->MaybeLoadResource(request_.get(), |
| 650 request_->context()->network_delegate()); |
| 653 EXPECT_FALSE(job_.get()); | 651 EXPECT_FALSE(job_.get()); |
| 654 | 652 |
| 655 AppCacheURLRequestJob* fallback_job; | 653 AppCacheURLRequestJob* fallback_job; |
| 656 fallback_job = handler_->MaybeLoadFallbackForRedirect( | 654 fallback_job = handler_->MaybeLoadFallbackForRedirect( |
| 657 request_.get(), empty_network_delegate_, GURL("http://blah/redirect")); | 655 request_.get(), |
| 656 request_->context()->network_delegate(), |
| 657 GURL("http://blah/redirect")); |
| 658 EXPECT_FALSE(fallback_job); | 658 EXPECT_FALSE(fallback_job); |
| 659 fallback_job = handler_->MaybeLoadFallbackForResponse( | 659 fallback_job = handler_->MaybeLoadFallbackForResponse( |
| 660 request_.get(), empty_network_delegate_); | 660 request_.get(), request_->context()->network_delegate()); |
| 661 EXPECT_FALSE(fallback_job); | 661 EXPECT_FALSE(fallback_job); |
| 662 | 662 |
| 663 TestFinished(); | 663 TestFinished(); |
| 664 } | 664 } |
| 665 | 665 |
| 666 // DestroyedHost ----------------------------- | 666 // DestroyedHost ----------------------------- |
| 667 | 667 |
| 668 void DestroyedHost() { | 668 void DestroyedHost() { |
| 669 host_->AssociateCompleteCache(MakeNewCache()); | 669 host_->AssociateCompleteCache(MakeNewCache()); |
| 670 | 670 |
| 671 mock_storage()->SimulateFindSubResource( | 671 mock_storage()->SimulateFindSubResource( |
| 672 AppCacheEntry(AppCacheEntry::EXPLICIT, 1), AppCacheEntry(), false); | 672 AppCacheEntry(AppCacheEntry::EXPLICIT, 1), AppCacheEntry(), false); |
| 673 | 673 |
| 674 request_.reset(new MockURLRequest( | 674 request_.reset(new MockURLRequest(GURL("http://blah/"), &empty_context_)); |
| 675 GURL("http://blah/"), &empty_context_, empty_network_delegate_)); | |
| 676 handler_.reset(host_->CreateRequestHandler(request_.get(), | 675 handler_.reset(host_->CreateRequestHandler(request_.get(), |
| 677 ResourceType::SUB_RESOURCE)); | 676 ResourceType::SUB_RESOURCE)); |
| 678 EXPECT_TRUE(handler_.get()); | 677 EXPECT_TRUE(handler_.get()); |
| 679 | 678 |
| 680 backend_impl_->UnregisterHost(1); | 679 backend_impl_->UnregisterHost(1); |
| 681 host_ = NULL; | 680 host_ = NULL; |
| 682 | 681 |
| 683 EXPECT_FALSE(handler_->MaybeLoadResource( | 682 EXPECT_FALSE(handler_->MaybeLoadResource( |
| 684 request_.get(), empty_network_delegate_)); | 683 request_.get(), request_->context()->network_delegate())); |
| 685 EXPECT_FALSE(handler_->MaybeLoadFallbackForRedirect( | 684 EXPECT_FALSE(handler_->MaybeLoadFallbackForRedirect( |
| 686 request_.get(), empty_network_delegate_, GURL("http://blah/redirect"))); | 685 request_.get(), |
| 686 request_->context()->network_delegate(), |
| 687 GURL("http://blah/redirect"))); |
| 687 EXPECT_FALSE(handler_->MaybeLoadFallbackForResponse( | 688 EXPECT_FALSE(handler_->MaybeLoadFallbackForResponse( |
| 688 request_.get(), empty_network_delegate_)); | 689 request_.get(), request_->context()->network_delegate())); |
| 689 | 690 |
| 690 TestFinished(); | 691 TestFinished(); |
| 691 } | 692 } |
| 692 | 693 |
| 693 // DestroyedHostWithWaitingJob ----------------------------- | 694 // DestroyedHostWithWaitingJob ----------------------------- |
| 694 | 695 |
| 695 void DestroyedHostWithWaitingJob() { | 696 void DestroyedHostWithWaitingJob() { |
| 696 // Precondition, the host is waiting on cache selection. | 697 // Precondition, the host is waiting on cache selection. |
| 697 host_->pending_selected_cache_id_ = 1; | 698 host_->pending_selected_cache_id_ = 1; |
| 698 | 699 |
| 699 request_.reset(new MockURLRequest( | 700 request_.reset(new MockURLRequest(GURL("http://blah/"), &empty_context_)); |
| 700 GURL("http://blah/"), &empty_context_, empty_network_delegate_)); | |
| 701 handler_.reset(host_->CreateRequestHandler(request_.get(), | 701 handler_.reset(host_->CreateRequestHandler(request_.get(), |
| 702 ResourceType::SUB_RESOURCE)); | 702 ResourceType::SUB_RESOURCE)); |
| 703 EXPECT_TRUE(handler_.get()); | 703 EXPECT_TRUE(handler_.get()); |
| 704 | 704 |
| 705 job_ = handler_->MaybeLoadResource(request_.get(), empty_network_delegate_); | 705 job_ = handler_->MaybeLoadResource(request_.get(), |
| 706 request_->context()->network_delegate()); |
| 706 EXPECT_TRUE(job_.get()); | 707 EXPECT_TRUE(job_.get()); |
| 707 EXPECT_TRUE(job_->is_waiting()); | 708 EXPECT_TRUE(job_->is_waiting()); |
| 708 | 709 |
| 709 backend_impl_->UnregisterHost(1); | 710 backend_impl_->UnregisterHost(1); |
| 710 host_ = NULL; | 711 host_ = NULL; |
| 711 EXPECT_TRUE(job_->has_been_killed()); | 712 EXPECT_TRUE(job_->has_been_killed()); |
| 712 | 713 |
| 713 EXPECT_FALSE(handler_->MaybeLoadResource( | 714 EXPECT_FALSE(handler_->MaybeLoadResource( |
| 714 request_.get(), empty_network_delegate_)); | 715 request_.get(), request_->context()->network_delegate())); |
| 715 EXPECT_FALSE(handler_->MaybeLoadFallbackForRedirect( | 716 EXPECT_FALSE(handler_->MaybeLoadFallbackForRedirect( |
| 716 request_.get(), empty_network_delegate_, GURL("http://blah/redirect"))); | 717 request_.get(), |
| 718 request_->context()->network_delegate(), |
| 719 GURL("http://blah/redirect"))); |
| 717 EXPECT_FALSE(handler_->MaybeLoadFallbackForResponse( | 720 EXPECT_FALSE(handler_->MaybeLoadFallbackForResponse( |
| 718 request_.get(), empty_network_delegate_)); | 721 request_.get(), request_->context()->network_delegate())); |
| 719 | 722 |
| 720 TestFinished(); | 723 TestFinished(); |
| 721 } | 724 } |
| 722 | 725 |
| 723 // UnsupportedScheme ----------------------------- | 726 // UnsupportedScheme ----------------------------- |
| 724 | 727 |
| 725 void UnsupportedScheme() { | 728 void UnsupportedScheme() { |
| 726 // Precondition, the host is waiting on cache selection. | 729 // Precondition, the host is waiting on cache selection. |
| 727 host_->pending_selected_cache_id_ = 1; | 730 host_->pending_selected_cache_id_ = 1; |
| 728 | 731 |
| 729 request_.reset(new MockURLRequest( | 732 request_.reset(new MockURLRequest(GURL("ftp://blah/"), &empty_context_)); |
| 730 GURL("ftp://blah/"), &empty_context_, empty_network_delegate_)); | |
| 731 handler_.reset(host_->CreateRequestHandler(request_.get(), | 733 handler_.reset(host_->CreateRequestHandler(request_.get(), |
| 732 ResourceType::SUB_RESOURCE)); | 734 ResourceType::SUB_RESOURCE)); |
| 733 EXPECT_TRUE(handler_.get()); // we could redirect to http (conceivably) | 735 EXPECT_TRUE(handler_.get()); // we could redirect to http (conceivably) |
| 734 | 736 |
| 735 EXPECT_FALSE(handler_->MaybeLoadResource( | 737 EXPECT_FALSE(handler_->MaybeLoadResource( |
| 736 request_.get(), empty_network_delegate_)); | 738 request_.get(), request_->context()->network_delegate())); |
| 737 EXPECT_FALSE(handler_->MaybeLoadFallbackForRedirect( | 739 EXPECT_FALSE(handler_->MaybeLoadFallbackForRedirect( |
| 738 request_.get(), empty_network_delegate_, GURL("ftp://blah/redirect"))); | 740 request_.get(), |
| 741 request_->context()->network_delegate(), |
| 742 GURL("ftp://blah/redirect"))); |
| 739 EXPECT_FALSE(handler_->MaybeLoadFallbackForResponse( | 743 EXPECT_FALSE(handler_->MaybeLoadFallbackForResponse( |
| 740 request_.get(), empty_network_delegate_)); | 744 request_.get(), request_->context()->network_delegate())); |
| 741 | 745 |
| 742 TestFinished(); | 746 TestFinished(); |
| 743 } | 747 } |
| 744 | 748 |
| 745 // CanceledRequest ----------------------------- | 749 // CanceledRequest ----------------------------- |
| 746 | 750 |
| 747 void CanceledRequest() { | 751 void CanceledRequest() { |
| 748 request_.reset(new MockURLRequest( | 752 request_.reset(new MockURLRequest(GURL("http://blah/"), &empty_context_)); |
| 749 GURL("http://blah/"), &empty_context_, empty_network_delegate_)); | |
| 750 handler_.reset(host_->CreateRequestHandler(request_.get(), | 753 handler_.reset(host_->CreateRequestHandler(request_.get(), |
| 751 ResourceType::MAIN_FRAME)); | 754 ResourceType::MAIN_FRAME)); |
| 752 EXPECT_TRUE(handler_.get()); | 755 EXPECT_TRUE(handler_.get()); |
| 753 | 756 |
| 754 job_ = handler_->MaybeLoadResource(request_.get(), empty_network_delegate_); | 757 job_ = handler_->MaybeLoadResource(request_.get(), |
| 758 request_->context()->network_delegate()); |
| 755 EXPECT_TRUE(job_.get()); | 759 EXPECT_TRUE(job_.get()); |
| 756 EXPECT_TRUE(job_->is_waiting()); | 760 EXPECT_TRUE(job_->is_waiting()); |
| 757 EXPECT_FALSE(job_->has_been_started()); | 761 EXPECT_FALSE(job_->has_been_started()); |
| 758 | 762 |
| 759 mock_factory_job_ = job_.get(); | 763 mock_factory_job_ = job_.get(); |
| 760 request_->Start(); | 764 request_->Start(); |
| 761 EXPECT_TRUE(job_->has_been_started()); | 765 EXPECT_TRUE(job_->has_been_started()); |
| 762 | 766 |
| 763 request_->Cancel(); | 767 request_->Cancel(); |
| 764 EXPECT_TRUE(job_->has_been_killed()); | 768 EXPECT_TRUE(job_->has_been_killed()); |
| 765 | 769 |
| 766 EXPECT_FALSE(handler_->MaybeLoadFallbackForResponse( | 770 EXPECT_FALSE(handler_->MaybeLoadFallbackForResponse( |
| 767 request_.get(), empty_network_delegate_)); | 771 request_.get(), request_->context()->network_delegate())); |
| 768 | 772 |
| 769 TestFinished(); | 773 TestFinished(); |
| 770 } | 774 } |
| 771 | 775 |
| 772 // WorkerRequest ----------------------------- | 776 // WorkerRequest ----------------------------- |
| 773 | 777 |
| 774 void WorkerRequest() { | 778 void WorkerRequest() { |
| 775 EXPECT_TRUE(AppCacheRequestHandler::IsMainResourceType( | 779 EXPECT_TRUE(AppCacheRequestHandler::IsMainResourceType( |
| 776 ResourceType::MAIN_FRAME)); | 780 ResourceType::MAIN_FRAME)); |
| 777 EXPECT_TRUE(AppCacheRequestHandler::IsMainResourceType( | 781 EXPECT_TRUE(AppCacheRequestHandler::IsMainResourceType( |
| 778 ResourceType::SUB_FRAME)); | 782 ResourceType::SUB_FRAME)); |
| 779 EXPECT_TRUE(AppCacheRequestHandler::IsMainResourceType( | 783 EXPECT_TRUE(AppCacheRequestHandler::IsMainResourceType( |
| 780 ResourceType::SHARED_WORKER)); | 784 ResourceType::SHARED_WORKER)); |
| 781 EXPECT_FALSE(AppCacheRequestHandler::IsMainResourceType( | 785 EXPECT_FALSE(AppCacheRequestHandler::IsMainResourceType( |
| 782 ResourceType::WORKER)); | 786 ResourceType::WORKER)); |
| 783 | 787 |
| 784 request_.reset(new MockURLRequest( | 788 request_.reset(new MockURLRequest(GURL("http://blah/"), &empty_context_)); |
| 785 GURL("http://blah/"), &empty_context_, empty_network_delegate_)); | |
| 786 | 789 |
| 787 const int kParentHostId = host_->host_id(); | 790 const int kParentHostId = host_->host_id(); |
| 788 const int kWorkerHostId = 2; | 791 const int kWorkerHostId = 2; |
| 789 const int kAbandonedWorkerHostId = 3; | 792 const int kAbandonedWorkerHostId = 3; |
| 790 const int kNonExsitingHostId = 700; | 793 const int kNonExsitingHostId = 700; |
| 791 | 794 |
| 792 backend_impl_->RegisterHost(kWorkerHostId); | 795 backend_impl_->RegisterHost(kWorkerHostId); |
| 793 AppCacheHost* worker_host = backend_impl_->GetHost(kWorkerHostId); | 796 AppCacheHost* worker_host = backend_impl_->GetHost(kWorkerHostId); |
| 794 worker_host->SelectCacheForWorker(kParentHostId, kMockProcessId); | 797 worker_host->SelectCacheForWorker(kParentHostId, kMockProcessId); |
| 795 handler_.reset(worker_host->CreateRequestHandler( | 798 handler_.reset(worker_host->CreateRequestHandler( |
| (...skipping 16 matching lines...) Expand all Loading... |
| 812 TestFinished(); | 815 TestFinished(); |
| 813 } | 816 } |
| 814 | 817 |
| 815 // MainResource_Blocked -------------------------------------------------- | 818 // MainResource_Blocked -------------------------------------------------- |
| 816 | 819 |
| 817 void MainResource_Blocked() { | 820 void MainResource_Blocked() { |
| 818 PushNextTask( | 821 PushNextTask( |
| 819 base::Bind(&AppCacheRequestHandlerTest::Verify_MainResource_Blocked, | 822 base::Bind(&AppCacheRequestHandlerTest::Verify_MainResource_Blocked, |
| 820 base::Unretained(this))); | 823 base::Unretained(this))); |
| 821 | 824 |
| 822 request_.reset(new MockURLRequest( | 825 request_.reset(new MockURLRequest(GURL("http://blah/"), &empty_context_)); |
| 823 GURL("http://blah/"), &empty_context_, empty_network_delegate_)); | |
| 824 handler_.reset(host_->CreateRequestHandler(request_.get(), | 826 handler_.reset(host_->CreateRequestHandler(request_.get(), |
| 825 ResourceType::MAIN_FRAME)); | 827 ResourceType::MAIN_FRAME)); |
| 826 EXPECT_TRUE(handler_.get()); | 828 EXPECT_TRUE(handler_.get()); |
| 827 | 829 |
| 828 mock_policy_->can_load_return_value_ = false; | 830 mock_policy_->can_load_return_value_ = false; |
| 829 mock_storage()->SimulateFindMainResource( | 831 mock_storage()->SimulateFindMainResource( |
| 830 AppCacheEntry(AppCacheEntry::EXPLICIT, 1), | 832 AppCacheEntry(AppCacheEntry::EXPLICIT, 1), |
| 831 GURL(), AppCacheEntry(), | 833 GURL(), AppCacheEntry(), |
| 832 1, 2, GURL("http://blah/manifest/")); | 834 1, 2, GURL("http://blah/manifest/")); |
| 833 | 835 |
| 834 job_ = handler_->MaybeLoadResource(request_.get(), empty_network_delegate_); | 836 job_ = handler_->MaybeLoadResource(request_.get(), |
| 837 request_->context()->network_delegate()); |
| 835 EXPECT_TRUE(job_.get()); | 838 EXPECT_TRUE(job_.get()); |
| 836 EXPECT_TRUE(job_->is_waiting()); | 839 EXPECT_TRUE(job_->is_waiting()); |
| 837 | 840 |
| 838 // We have to wait for completion of storage->FindResponseForMainRequest. | 841 // We have to wait for completion of storage->FindResponseForMainRequest. |
| 839 ScheduleNextTask(); | 842 ScheduleNextTask(); |
| 840 } | 843 } |
| 841 | 844 |
| 842 void Verify_MainResource_Blocked() { | 845 void Verify_MainResource_Blocked() { |
| 843 EXPECT_FALSE(job_->is_waiting()); | 846 EXPECT_FALSE(job_->is_waiting()); |
| 844 EXPECT_FALSE(job_->is_delivering_appcache_response()); | 847 EXPECT_FALSE(job_->is_delivering_appcache_response()); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 873 // Data members -------------------------------------------------- | 876 // Data members -------------------------------------------------- |
| 874 | 877 |
| 875 scoped_ptr<base::WaitableEvent> test_finished_event_; | 878 scoped_ptr<base::WaitableEvent> test_finished_event_; |
| 876 std::stack<base::Closure> task_stack_; | 879 std::stack<base::Closure> task_stack_; |
| 877 scoped_ptr<MockAppCacheService> mock_service_; | 880 scoped_ptr<MockAppCacheService> mock_service_; |
| 878 scoped_ptr<AppCacheBackendImpl> backend_impl_; | 881 scoped_ptr<AppCacheBackendImpl> backend_impl_; |
| 879 scoped_ptr<MockFrontend> mock_frontend_; | 882 scoped_ptr<MockFrontend> mock_frontend_; |
| 880 scoped_ptr<MockAppCachePolicy> mock_policy_; | 883 scoped_ptr<MockAppCachePolicy> mock_policy_; |
| 881 AppCacheHost* host_; | 884 AppCacheHost* host_; |
| 882 net::URLRequestContext empty_context_; | 885 net::URLRequestContext empty_context_; |
| 883 net::NetworkDelegate* empty_network_delegate_; | |
| 884 scoped_ptr<MockURLRequest> request_; | 886 scoped_ptr<MockURLRequest> request_; |
| 885 scoped_ptr<AppCacheRequestHandler> handler_; | 887 scoped_ptr<AppCacheRequestHandler> handler_; |
| 886 scoped_refptr<AppCacheURLRequestJob> job_; | 888 scoped_refptr<AppCacheURLRequestJob> job_; |
| 887 net::URLRequest::ProtocolFactory* orig_http_factory_; | 889 net::URLRequest::ProtocolFactory* orig_http_factory_; |
| 888 | 890 |
| 889 static scoped_ptr<base::Thread> io_thread_; | 891 static scoped_ptr<base::Thread> io_thread_; |
| 890 static net::URLRequestJob* mock_factory_job_; | 892 static net::URLRequestJob* mock_factory_job_; |
| 891 }; | 893 }; |
| 892 | 894 |
| 893 // static | 895 // static |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 962 | 964 |
| 963 TEST_F(AppCacheRequestHandlerTest, WorkerRequest) { | 965 TEST_F(AppCacheRequestHandlerTest, WorkerRequest) { |
| 964 RunTestOnIOThread(&AppCacheRequestHandlerTest::WorkerRequest); | 966 RunTestOnIOThread(&AppCacheRequestHandlerTest::WorkerRequest); |
| 965 } | 967 } |
| 966 | 968 |
| 967 TEST_F(AppCacheRequestHandlerTest, MainResource_Blocked) { | 969 TEST_F(AppCacheRequestHandlerTest, MainResource_Blocked) { |
| 968 RunTestOnIOThread(&AppCacheRequestHandlerTest::MainResource_Blocked); | 970 RunTestOnIOThread(&AppCacheRequestHandlerTest::MainResource_Blocked); |
| 969 } | 971 } |
| 970 | 972 |
| 971 } // namespace appcache | 973 } // namespace appcache |
| OLD | NEW |