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
3 // found in the LICENSE file.
6 #include "base/bind_helpers.h"
7 #include "base/memory/scoped_ptr.h"
8 #include "base/message_loop/message_loop.h"
9 #include "content/browser/appcache/appcache.h"
10 #include "content/browser/appcache/appcache_backend_impl.h"
11 #include "content/browser/appcache/appcache_group.h"
12 #include "content/browser/appcache/appcache_host.h"
13 #include "content/browser/appcache/mock_appcache_policy.h"
14 #include "content/browser/appcache/mock_appcache_service.h"
15 #include "net/url_request/url_request.h"
16 #include "testing/gtest/include/gtest/gtest.h"
17 #include "webkit/browser/quota/quota_manager.h"
21 class AppCacheHostTest
: public testing::Test
{
24 get_status_callback_
=
25 base::Bind(&AppCacheHostTest::GetStatusCallback
,
26 base::Unretained(this));
27 start_update_callback_
=
28 base::Bind(&AppCacheHostTest::StartUpdateCallback
,
29 base::Unretained(this));
30 swap_cache_callback_
=
31 base::Bind(&AppCacheHostTest::SwapCacheCallback
,
32 base::Unretained(this));
35 class MockFrontend
: public AppCacheFrontend
{
38 : last_host_id_(-222), last_cache_id_(-222),
39 last_status_(APPCACHE_STATUS_OBSOLETE
),
40 last_status_changed_(APPCACHE_STATUS_OBSOLETE
),
41 last_event_id_(APPCACHE_OBSOLETE_EVENT
),
42 content_blocked_(false) {
45 virtual void OnCacheSelected(
46 int host_id
, const AppCacheInfo
& info
) OVERRIDE
{
47 last_host_id_
= host_id
;
48 last_cache_id_
= info
.cache_id
;
49 last_status_
= info
.status
;
52 virtual void OnStatusChanged(const std::vector
<int>& host_ids
,
53 AppCacheStatus status
) OVERRIDE
{
54 last_status_changed_
= status
;
57 virtual void OnEventRaised(const std::vector
<int>& host_ids
,
58 AppCacheEventID event_id
) OVERRIDE
{
59 last_event_id_
= event_id
;
62 virtual void OnErrorEventRaised(
63 const std::vector
<int>& host_ids
,
64 const AppCacheErrorDetails
& details
) OVERRIDE
{
65 last_event_id_
= APPCACHE_ERROR_EVENT
;
68 virtual void OnProgressEventRaised(const std::vector
<int>& host_ids
,
71 int num_complete
) OVERRIDE
{
72 last_event_id_
= APPCACHE_PROGRESS_EVENT
;
75 virtual void OnLogMessage(int host_id
,
76 AppCacheLogLevel log_level
,
77 const std::string
& message
) OVERRIDE
{
80 virtual void OnContentBlocked(int host_id
,
81 const GURL
& manifest_url
) OVERRIDE
{
82 content_blocked_
= true;
87 AppCacheStatus last_status_
;
88 AppCacheStatus last_status_changed_
;
89 AppCacheEventID last_event_id_
;
90 bool content_blocked_
;
93 class MockQuotaManagerProxy
: public storage::QuotaManagerProxy
{
95 MockQuotaManagerProxy() : QuotaManagerProxy(NULL
, NULL
) {}
97 // Not needed for our tests.
98 virtual void RegisterClient(storage::QuotaClient
* client
) OVERRIDE
{}
99 virtual void NotifyStorageAccessed(storage::QuotaClient::ID client_id
,
101 storage::StorageType type
) OVERRIDE
{}
102 virtual void NotifyStorageModified(storage::QuotaClient::ID client_id
,
104 storage::StorageType type
,
105 int64 delta
) OVERRIDE
{}
106 virtual void SetUsageCacheEnabled(storage::QuotaClient::ID client_id
,
108 storage::StorageType type
,
109 bool enabled
) OVERRIDE
{}
110 virtual void GetUsageAndQuota(
111 base::SequencedTaskRunner
* original_task_runner
,
113 storage::StorageType type
,
114 const GetUsageAndQuotaCallback
& callback
) OVERRIDE
{}
116 virtual void NotifyOriginInUse(const GURL
& origin
) OVERRIDE
{
120 virtual void NotifyOriginNoLongerInUse(const GURL
& origin
) OVERRIDE
{
124 int GetInUseCount(const GURL
& origin
) {
125 return inuse_
[origin
];
132 // Map from origin to count of inuse notifications.
133 std::map
<GURL
, int> inuse_
;
136 virtual ~MockQuotaManagerProxy() {}
139 void GetStatusCallback(AppCacheStatus status
, void* param
) {
140 last_status_result_
= status
;
141 last_callback_param_
= param
;
144 void StartUpdateCallback(bool result
, void* param
) {
145 last_start_result_
= result
;
146 last_callback_param_
= param
;
149 void SwapCacheCallback(bool result
, void* param
) {
150 last_swap_result_
= result
;
151 last_callback_param_
= param
;
154 base::MessageLoop message_loop_
;
156 // Mock classes for the 'host' to work with
157 MockAppCacheService service_
;
158 MockFrontend mock_frontend_
;
160 // Mock callbacks we expect to receive from the 'host'
161 content::GetStatusCallback get_status_callback_
;
162 content::StartUpdateCallback start_update_callback_
;
163 content::SwapCacheCallback swap_cache_callback_
;
165 AppCacheStatus last_status_result_
;
166 bool last_swap_result_
;
167 bool last_start_result_
;
168 void* last_callback_param_
;
171 TEST_F(AppCacheHostTest
, Basic
) {
172 // Construct a host and test what state it appears to be in.
173 AppCacheHost
host(1, &mock_frontend_
, &service_
);
174 EXPECT_EQ(1, host
.host_id());
175 EXPECT_EQ(&service_
, host
.service());
176 EXPECT_EQ(&mock_frontend_
, host
.frontend());
177 EXPECT_EQ(NULL
, host
.associated_cache());
178 EXPECT_FALSE(host
.is_selection_pending());
180 // See that the callbacks are delivered immediately
181 // and respond as if there is no cache selected.
182 last_status_result_
= APPCACHE_STATUS_OBSOLETE
;
183 host
.GetStatusWithCallback(get_status_callback_
, reinterpret_cast<void*>(1));
184 EXPECT_EQ(APPCACHE_STATUS_UNCACHED
, last_status_result_
);
185 EXPECT_EQ(reinterpret_cast<void*>(1), last_callback_param_
);
187 last_start_result_
= true;
188 host
.StartUpdateWithCallback(start_update_callback_
,
189 reinterpret_cast<void*>(2));
190 EXPECT_FALSE(last_start_result_
);
191 EXPECT_EQ(reinterpret_cast<void*>(2), last_callback_param_
);
193 last_swap_result_
= true;
194 host
.SwapCacheWithCallback(swap_cache_callback_
, reinterpret_cast<void*>(3));
195 EXPECT_FALSE(last_swap_result_
);
196 EXPECT_EQ(reinterpret_cast<void*>(3), last_callback_param_
);
199 TEST_F(AppCacheHostTest
, SelectNoCache
) {
200 scoped_refptr
<MockQuotaManagerProxy
> mock_quota_proxy(
201 new MockQuotaManagerProxy
);
202 service_
.set_quota_manager_proxy(mock_quota_proxy
.get());
204 // Reset our mock frontend
205 mock_frontend_
.last_cache_id_
= -333;
206 mock_frontend_
.last_host_id_
= -333;
207 mock_frontend_
.last_status_
= APPCACHE_STATUS_OBSOLETE
;
209 const GURL
kDocAndOriginUrl(GURL("http://whatever/").GetOrigin());
211 AppCacheHost
host(1, &mock_frontend_
, &service_
);
212 host
.SelectCache(kDocAndOriginUrl
, kAppCacheNoCacheId
, GURL());
213 EXPECT_EQ(1, mock_quota_proxy
->GetInUseCount(kDocAndOriginUrl
));
215 // We should have received an OnCacheSelected msg
216 EXPECT_EQ(1, mock_frontend_
.last_host_id_
);
217 EXPECT_EQ(kAppCacheNoCacheId
, mock_frontend_
.last_cache_id_
);
218 EXPECT_EQ(APPCACHE_STATUS_UNCACHED
, mock_frontend_
.last_status_
);
220 // Otherwise, see that it respond as if there is no cache selected.
221 EXPECT_EQ(1, host
.host_id());
222 EXPECT_EQ(&service_
, host
.service());
223 EXPECT_EQ(&mock_frontend_
, host
.frontend());
224 EXPECT_EQ(NULL
, host
.associated_cache());
225 EXPECT_FALSE(host
.is_selection_pending());
226 EXPECT_TRUE(host
.preferred_manifest_url().is_empty());
228 EXPECT_EQ(0, mock_quota_proxy
->GetInUseCount(kDocAndOriginUrl
));
229 service_
.set_quota_manager_proxy(NULL
);
232 TEST_F(AppCacheHostTest
, ForeignEntry
) {
233 // Reset our mock frontend
234 mock_frontend_
.last_cache_id_
= -333;
235 mock_frontend_
.last_host_id_
= -333;
236 mock_frontend_
.last_status_
= APPCACHE_STATUS_OBSOLETE
;
238 // Precondition, a cache with an entry that is not marked as foreign.
239 const int kCacheId
= 22;
240 const GURL
kDocumentURL("http://origin/document");
241 scoped_refptr
<AppCache
> cache
= new AppCache(service_
.storage(), kCacheId
);
242 cache
->AddEntry(kDocumentURL
, AppCacheEntry(AppCacheEntry::EXPLICIT
));
244 AppCacheHost
host(1, &mock_frontend_
, &service_
);
245 host
.MarkAsForeignEntry(kDocumentURL
, kCacheId
);
247 // We should have received an OnCacheSelected msg for kAppCacheNoCacheId.
248 EXPECT_EQ(1, mock_frontend_
.last_host_id_
);
249 EXPECT_EQ(kAppCacheNoCacheId
, mock_frontend_
.last_cache_id_
);
250 EXPECT_EQ(APPCACHE_STATUS_UNCACHED
, mock_frontend_
.last_status_
);
252 // See that it respond as if there is no cache selected.
253 EXPECT_EQ(1, host
.host_id());
254 EXPECT_EQ(&service_
, host
.service());
255 EXPECT_EQ(&mock_frontend_
, host
.frontend());
256 EXPECT_EQ(NULL
, host
.associated_cache());
257 EXPECT_FALSE(host
.is_selection_pending());
259 // See that the entry was marked as foreign.
260 EXPECT_TRUE(cache
->GetEntry(kDocumentURL
)->IsForeign());
263 TEST_F(AppCacheHostTest
, ForeignFallbackEntry
) {
264 // Reset our mock frontend
265 mock_frontend_
.last_cache_id_
= -333;
266 mock_frontend_
.last_host_id_
= -333;
267 mock_frontend_
.last_status_
= APPCACHE_STATUS_OBSOLETE
;
269 // Precondition, a cache with a fallback entry that is not marked as foreign.
270 const int kCacheId
= 22;
271 const GURL
kFallbackURL("http://origin/fallback_resource");
272 scoped_refptr
<AppCache
> cache
= new AppCache(service_
.storage(), kCacheId
);
273 cache
->AddEntry(kFallbackURL
, AppCacheEntry(AppCacheEntry::FALLBACK
));
275 AppCacheHost
host(1, &mock_frontend_
, &service_
);
276 host
.NotifyMainResourceIsNamespaceEntry(kFallbackURL
);
277 host
.MarkAsForeignEntry(GURL("http://origin/missing_document"), kCacheId
);
279 // We should have received an OnCacheSelected msg for kAppCacheNoCacheId.
280 EXPECT_EQ(1, mock_frontend_
.last_host_id_
);
281 EXPECT_EQ(kAppCacheNoCacheId
, mock_frontend_
.last_cache_id_
);
282 EXPECT_EQ(APPCACHE_STATUS_UNCACHED
, mock_frontend_
.last_status_
);
284 // See that the fallback entry was marked as foreign.
285 EXPECT_TRUE(cache
->GetEntry(kFallbackURL
)->IsForeign());
288 TEST_F(AppCacheHostTest
, FailedCacheLoad
) {
289 // Reset our mock frontend
290 mock_frontend_
.last_cache_id_
= -333;
291 mock_frontend_
.last_host_id_
= -333;
292 mock_frontend_
.last_status_
= APPCACHE_STATUS_OBSOLETE
;
294 AppCacheHost
host(1, &mock_frontend_
, &service_
);
295 EXPECT_FALSE(host
.is_selection_pending());
297 const int kMockCacheId
= 333;
299 // Put it in a state where we're waiting on a cache
300 // load prior to finishing cache selection.
301 host
.pending_selected_cache_id_
= kMockCacheId
;
302 EXPECT_TRUE(host
.is_selection_pending());
304 // The callback should not occur until we finish cache selection.
305 last_status_result_
= APPCACHE_STATUS_OBSOLETE
;
306 last_callback_param_
= reinterpret_cast<void*>(-1);
307 host
.GetStatusWithCallback(get_status_callback_
, reinterpret_cast<void*>(1));
308 EXPECT_EQ(APPCACHE_STATUS_OBSOLETE
, last_status_result_
);
309 EXPECT_EQ(reinterpret_cast<void*>(-1), last_callback_param_
);
311 // Satisfy the load with NULL, a failure.
312 host
.OnCacheLoaded(NULL
, kMockCacheId
);
314 // Cache selection should have finished
315 EXPECT_FALSE(host
.is_selection_pending());
316 EXPECT_EQ(1, mock_frontend_
.last_host_id_
);
317 EXPECT_EQ(kAppCacheNoCacheId
, mock_frontend_
.last_cache_id_
);
318 EXPECT_EQ(APPCACHE_STATUS_UNCACHED
, mock_frontend_
.last_status_
);
320 // Callback should have fired upon completing the cache load too.
321 EXPECT_EQ(APPCACHE_STATUS_UNCACHED
, last_status_result_
);
322 EXPECT_EQ(reinterpret_cast<void*>(1), last_callback_param_
);
325 TEST_F(AppCacheHostTest
, FailedGroupLoad
) {
326 AppCacheHost
host(1, &mock_frontend_
, &service_
);
328 const GURL
kMockManifestUrl("http://foo.bar/baz");
330 // Put it in a state where we're waiting on a cache
331 // load prior to finishing cache selection.
332 host
.pending_selected_manifest_url_
= kMockManifestUrl
;
333 EXPECT_TRUE(host
.is_selection_pending());
335 // The callback should not occur until we finish cache selection.
336 last_status_result_
= APPCACHE_STATUS_OBSOLETE
;
337 last_callback_param_
= reinterpret_cast<void*>(-1);
338 host
.GetStatusWithCallback(get_status_callback_
, reinterpret_cast<void*>(1));
339 EXPECT_EQ(APPCACHE_STATUS_OBSOLETE
, last_status_result_
);
340 EXPECT_EQ(reinterpret_cast<void*>(-1), last_callback_param_
);
342 // Satisfy the load will NULL, a failure.
343 host
.OnGroupLoaded(NULL
, kMockManifestUrl
);
345 // Cache selection should have finished
346 EXPECT_FALSE(host
.is_selection_pending());
347 EXPECT_EQ(1, mock_frontend_
.last_host_id_
);
348 EXPECT_EQ(kAppCacheNoCacheId
, mock_frontend_
.last_cache_id_
);
349 EXPECT_EQ(APPCACHE_STATUS_UNCACHED
, mock_frontend_
.last_status_
);
351 // Callback should have fired upon completing the group load.
352 EXPECT_EQ(APPCACHE_STATUS_UNCACHED
, last_status_result_
);
353 EXPECT_EQ(reinterpret_cast<void*>(1), last_callback_param_
);
356 TEST_F(AppCacheHostTest
, SetSwappableCache
) {
357 AppCacheHost
host(1, &mock_frontend_
, &service_
);
358 host
.SetSwappableCache(NULL
);
359 EXPECT_FALSE(host
.swappable_cache_
.get());
361 scoped_refptr
<AppCacheGroup
> group1(new AppCacheGroup(
362 service_
.storage(), GURL(), service_
.storage()->NewGroupId()));
363 host
.SetSwappableCache(group1
.get());
364 EXPECT_FALSE(host
.swappable_cache_
.get());
366 AppCache
* cache1
= new AppCache(service_
.storage(), 111);
367 cache1
->set_complete(true);
368 group1
->AddCache(cache1
);
369 host
.SetSwappableCache(group1
.get());
370 EXPECT_EQ(cache1
, host
.swappable_cache_
.get());
372 mock_frontend_
.last_host_id_
= -222; // to verify we received OnCacheSelected
374 host
.AssociateCompleteCache(cache1
);
375 EXPECT_FALSE(host
.swappable_cache_
.get()); // was same as associated cache
376 EXPECT_EQ(APPCACHE_STATUS_IDLE
, host
.GetStatus());
377 // verify OnCacheSelected was called
378 EXPECT_EQ(host
.host_id(), mock_frontend_
.last_host_id_
);
379 EXPECT_EQ(cache1
->cache_id(), mock_frontend_
.last_cache_id_
);
380 EXPECT_EQ(APPCACHE_STATUS_IDLE
, mock_frontend_
.last_status_
);
382 AppCache
* cache2
= new AppCache(service_
.storage(), 222);
383 cache2
->set_complete(true);
384 group1
->AddCache(cache2
);
385 EXPECT_EQ(cache2
, host
.swappable_cache_
.get()); // updated to newest
387 scoped_refptr
<AppCacheGroup
> group2(
388 new AppCacheGroup(service_
.storage(), GURL("http://foo.com"),
389 service_
.storage()->NewGroupId()));
390 AppCache
* cache3
= new AppCache(service_
.storage(), 333);
391 cache3
->set_complete(true);
392 group2
->AddCache(cache3
);
394 AppCache
* cache4
= new AppCache(service_
.storage(), 444);
395 cache4
->set_complete(true);
396 group2
->AddCache(cache4
);
397 EXPECT_EQ(cache2
, host
.swappable_cache_
.get()); // unchanged
399 host
.AssociateCompleteCache(cache3
);
400 EXPECT_EQ(cache4
, host
.swappable_cache_
.get()); // newest cache in group2
401 EXPECT_FALSE(group1
->HasCache()); // both caches in group1 have refcount 0
403 host
.AssociateNoCache(GURL());
404 EXPECT_FALSE(host
.swappable_cache_
.get());
405 EXPECT_FALSE(group2
->HasCache()); // both caches in group2 have refcount 0
407 // Host adds reference to newest cache when an update is complete.
408 AppCache
* cache5
= new AppCache(service_
.storage(), 555);
409 cache5
->set_complete(true);
410 group2
->AddCache(cache5
);
411 host
.group_being_updated_
= group2
;
412 host
.OnUpdateComplete(group2
.get());
413 EXPECT_FALSE(host
.group_being_updated_
.get());
414 EXPECT_EQ(cache5
, host
.swappable_cache_
.get());
416 group2
->RemoveCache(cache5
);
417 EXPECT_FALSE(group2
->HasCache());
418 host
.group_being_updated_
= group2
;
419 host
.OnUpdateComplete(group2
.get());
420 EXPECT_FALSE(host
.group_being_updated_
.get());
421 EXPECT_FALSE(host
.swappable_cache_
.get()); // group2 had no newest cache
424 TEST_F(AppCacheHostTest
, ForDedicatedWorker
) {
425 const int kMockProcessId
= 1;
426 const int kParentHostId
= 1;
427 const int kWorkerHostId
= 2;
429 AppCacheBackendImpl backend_impl
;
430 backend_impl
.Initialize(&service_
, &mock_frontend_
, kMockProcessId
);
431 backend_impl
.RegisterHost(kParentHostId
);
432 backend_impl
.RegisterHost(kWorkerHostId
);
434 AppCacheHost
* parent_host
= backend_impl
.GetHost(kParentHostId
);
435 EXPECT_FALSE(parent_host
->is_for_dedicated_worker());
437 AppCacheHost
* worker_host
= backend_impl
.GetHost(kWorkerHostId
);
438 worker_host
->SelectCacheForWorker(kParentHostId
, kMockProcessId
);
439 EXPECT_TRUE(worker_host
->is_for_dedicated_worker());
440 EXPECT_EQ(parent_host
, worker_host
->GetParentAppCacheHost());
442 // We should have received an OnCacheSelected msg for the worker_host.
443 // The host for workers always indicates 'no cache selected' regardless
444 // of its parent's state. This is OK because the worker cannot access
445 // the scriptable interface, the only function available is resource
446 // loading (see appcache_request_handler_unittests those tests).
447 EXPECT_EQ(kWorkerHostId
, mock_frontend_
.last_host_id_
);
448 EXPECT_EQ(kAppCacheNoCacheId
, mock_frontend_
.last_cache_id_
);
449 EXPECT_EQ(APPCACHE_STATUS_UNCACHED
, mock_frontend_
.last_status_
);
451 // Simulate the parent being torn down.
452 backend_impl
.UnregisterHost(kParentHostId
);
454 EXPECT_EQ(NULL
, backend_impl
.GetHost(kParentHostId
));
455 EXPECT_EQ(NULL
, worker_host
->GetParentAppCacheHost());
458 TEST_F(AppCacheHostTest
, SelectCacheAllowed
) {
459 scoped_refptr
<MockQuotaManagerProxy
> mock_quota_proxy(
460 new MockQuotaManagerProxy
);
461 MockAppCachePolicy mock_appcache_policy
;
462 mock_appcache_policy
.can_create_return_value_
= true;
463 service_
.set_quota_manager_proxy(mock_quota_proxy
.get());
464 service_
.set_appcache_policy(&mock_appcache_policy
);
466 // Reset our mock frontend
467 mock_frontend_
.last_cache_id_
= -333;
468 mock_frontend_
.last_host_id_
= -333;
469 mock_frontend_
.last_status_
= APPCACHE_STATUS_OBSOLETE
;
470 mock_frontend_
.last_event_id_
= APPCACHE_OBSOLETE_EVENT
;
471 mock_frontend_
.content_blocked_
= false;
473 const GURL
kDocAndOriginUrl(GURL("http://whatever/").GetOrigin());
474 const GURL
kManifestUrl(GURL("http://whatever/cache.manifest"));
476 AppCacheHost
host(1, &mock_frontend_
, &service_
);
477 host
.first_party_url_
= kDocAndOriginUrl
;
478 host
.SelectCache(kDocAndOriginUrl
, kAppCacheNoCacheId
, kManifestUrl
);
479 EXPECT_EQ(1, mock_quota_proxy
->GetInUseCount(kDocAndOriginUrl
));
481 // MockAppCacheService::LoadOrCreateGroup is asynchronous, so we shouldn't
482 // have received an OnCacheSelected msg yet.
483 EXPECT_EQ(-333, mock_frontend_
.last_host_id_
);
484 EXPECT_EQ(-333, mock_frontend_
.last_cache_id_
);
485 EXPECT_EQ(APPCACHE_STATUS_OBSOLETE
, mock_frontend_
.last_status_
);
486 // No error events either
487 EXPECT_EQ(APPCACHE_OBSOLETE_EVENT
, mock_frontend_
.last_event_id_
);
488 EXPECT_FALSE(mock_frontend_
.content_blocked_
);
490 EXPECT_TRUE(host
.is_selection_pending());
492 EXPECT_EQ(0, mock_quota_proxy
->GetInUseCount(kDocAndOriginUrl
));
493 service_
.set_quota_manager_proxy(NULL
);
496 TEST_F(AppCacheHostTest
, SelectCacheBlocked
) {
497 scoped_refptr
<MockQuotaManagerProxy
> mock_quota_proxy(
498 new MockQuotaManagerProxy
);
499 MockAppCachePolicy mock_appcache_policy
;
500 mock_appcache_policy
.can_create_return_value_
= false;
501 service_
.set_quota_manager_proxy(mock_quota_proxy
.get());
502 service_
.set_appcache_policy(&mock_appcache_policy
);
504 // Reset our mock frontend
505 mock_frontend_
.last_cache_id_
= -333;
506 mock_frontend_
.last_host_id_
= -333;
507 mock_frontend_
.last_status_
= APPCACHE_STATUS_OBSOLETE
;
508 mock_frontend_
.last_event_id_
= APPCACHE_OBSOLETE_EVENT
;
509 mock_frontend_
.content_blocked_
= false;
511 const GURL
kDocAndOriginUrl(GURL("http://whatever/").GetOrigin());
512 const GURL
kManifestUrl(GURL("http://whatever/cache.manifest"));
514 AppCacheHost
host(1, &mock_frontend_
, &service_
);
515 host
.first_party_url_
= kDocAndOriginUrl
;
516 host
.SelectCache(kDocAndOriginUrl
, kAppCacheNoCacheId
, kManifestUrl
);
517 EXPECT_EQ(1, mock_quota_proxy
->GetInUseCount(kDocAndOriginUrl
));
519 // We should have received an OnCacheSelected msg
520 EXPECT_EQ(1, mock_frontend_
.last_host_id_
);
521 EXPECT_EQ(kAppCacheNoCacheId
, mock_frontend_
.last_cache_id_
);
522 EXPECT_EQ(APPCACHE_STATUS_UNCACHED
, mock_frontend_
.last_status_
);
524 // Also, an error event was raised
525 EXPECT_EQ(APPCACHE_ERROR_EVENT
, mock_frontend_
.last_event_id_
);
526 EXPECT_TRUE(mock_frontend_
.content_blocked_
);
528 // Otherwise, see that it respond as if there is no cache selected.
529 EXPECT_EQ(1, host
.host_id());
530 EXPECT_EQ(&service_
, host
.service());
531 EXPECT_EQ(&mock_frontend_
, host
.frontend());
532 EXPECT_EQ(NULL
, host
.associated_cache());
533 EXPECT_FALSE(host
.is_selection_pending());
534 EXPECT_TRUE(host
.preferred_manifest_url().is_empty());
536 EXPECT_EQ(0, mock_quota_proxy
->GetInUseCount(kDocAndOriginUrl
));
537 service_
.set_quota_manager_proxy(NULL
);
540 } // namespace content