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.
7 #include "base/files/scoped_temp_dir.h"
8 #include "base/message_loop/message_loop.h"
9 #include "base/message_loop/message_loop_proxy.h"
10 #include "base/run_loop.h"
11 #include "content/public/test/mock_special_storage_policy.h"
12 #include "content/public/test/mock_storage_client.h"
13 #include "net/base/net_util.h"
14 #include "storage/browser/quota/quota_manager.h"
15 #include "storage/browser/quota/quota_manager_proxy.h"
16 #include "storage/browser/quota/storage_monitor.h"
17 #include "storage/browser/quota/storage_observer.h"
18 #include "testing/gtest/include/gtest/gtest.h"
20 using storage::HostStorageObservers
;
21 using storage::kQuotaErrorNotSupported
;
22 using storage::kQuotaStatusOk
;
23 using storage::kStorageTypePersistent
;
24 using storage::kStorageTypeTemporary
;
25 using storage::QuotaClient
;
26 using storage::QuotaManager
;
27 using storage::QuotaStatusCode
;
28 using storage::SpecialStoragePolicy
;
29 using storage::StorageMonitor
;
30 using storage::StorageObserver
;
31 using storage::StorageObserverList
;
32 using storage::StorageType
;
33 using storage::StorageTypeObservers
;
39 const char kDefaultOrigin
[] = "http://www.foo.com/";
40 const char kAlternativeOrigin
[] = "http://www.bar.com/";
42 class MockObserver
: public StorageObserver
{
44 const StorageObserver::Event
& LastEvent() const {
45 CHECK(!events_
.empty());
46 return events_
.back();
49 int EventCount() const {
50 return events_
.size();
53 // StorageObserver implementation:
54 virtual void OnStorageEvent(const StorageObserver::Event
& event
) OVERRIDE
{
55 events_
.push_back(event
);
59 std::vector
<StorageObserver::Event
> events_
;
62 // A mock quota manager for overriding GetUsageAndQuotaForWebApps().
63 class UsageMockQuotaManager
: public QuotaManager
{
65 UsageMockQuotaManager(SpecialStoragePolicy
* special_storage_policy
)
69 base::MessageLoopProxy::current().get(),
70 base::MessageLoopProxy::current().get(),
71 special_storage_policy
),
74 callback_status_(kQuotaStatusOk
),
78 void SetCallbackParams(int64 usage
, int64 quota
, QuotaStatusCode status
) {
80 callback_quota_
= quota
;
81 callback_usage_
= usage
;
82 callback_status_
= status
;
85 void InvokeCallback() {
86 delayed_callback_
.Run(callback_status_
, callback_usage_
, callback_quota_
);
89 virtual void GetUsageAndQuotaForWebApps(
92 const GetUsageAndQuotaCallback
& callback
) OVERRIDE
{
94 callback
.Run(callback_status_
, callback_usage_
, callback_quota_
);
96 delayed_callback_
= callback
;
100 virtual ~UsageMockQuotaManager() {}
103 int64 callback_usage_
;
104 int64 callback_quota_
;
105 QuotaStatusCode callback_status_
;
107 GetUsageAndQuotaCallback delayed_callback_
;
112 class StorageMonitorTestBase
: public testing::Test
{
114 void DispatchPendingEvents(StorageObserverList
& observer_list
) {
115 observer_list
.DispatchPendingEvent();
118 const StorageObserver::Event
* GetPendingEvent(
119 const StorageObserverList
& observer_list
) {
120 return observer_list
.notification_timer_
.IsRunning()
121 ? &observer_list
.pending_event_
: NULL
;
124 const StorageObserver::Event
* GetPendingEvent(
125 const HostStorageObservers
& host_observers
) {
126 return GetPendingEvent(host_observers
.observers_
);
129 int GetRequiredUpdatesCount(const StorageObserverList
& observer_list
) {
131 for (StorageObserverList::StorageObserverStateMap::const_iterator it
=
132 observer_list
.observers_
.begin();
133 it
!= observer_list
.observers_
.end(); ++it
) {
134 if (it
->second
.requires_update
)
141 int GetRequiredUpdatesCount(const HostStorageObservers
& host_observers
) {
142 return GetRequiredUpdatesCount(host_observers
.observers_
);
145 void SetLastNotificationTime(StorageObserverList
& observer_list
,
146 StorageObserver
* observer
) {
147 ASSERT_TRUE(observer_list
.observers_
.find(observer
) !=
148 observer_list
.observers_
.end());
150 StorageObserverList::ObserverState
& state
=
151 observer_list
.observers_
[observer
];
152 state
.last_notification_time
= base::TimeTicks::Now() - state
.rate
;
155 void SetLastNotificationTime(HostStorageObservers
& host_observers
,
156 StorageObserver
* observer
) {
157 SetLastNotificationTime(host_observers
.observers_
, observer
);
160 int GetObserverCount(const HostStorageObservers
& host_observers
) {
161 return host_observers
.observers_
.ObserverCount();
165 class StorageTestWithManagerBase
: public StorageMonitorTestBase
{
167 virtual void SetUp() OVERRIDE
{
168 storage_policy_
= new MockSpecialStoragePolicy();
169 quota_manager_
= new UsageMockQuotaManager(storage_policy_
.get());
172 virtual void TearDown() OVERRIDE
{
173 // This ensures the quota manager is destroyed correctly.
174 quota_manager_
= NULL
;
175 base::RunLoop().RunUntilIdle();
179 base::MessageLoop message_loop_
;
180 scoped_refptr
<MockSpecialStoragePolicy
> storage_policy_
;
181 scoped_refptr
<UsageMockQuotaManager
> quota_manager_
;
184 // Tests for StorageObserverList:
186 typedef StorageMonitorTestBase StorageObserverListTest
;
188 // Test dispatching events to one observer.
189 TEST_F(StorageObserverListTest
, DispatchEventToSingleObserver
) {
190 // A message loop is required as StorageObserverList may schedule jobs.
191 base::MessageLoop
loop(base::MessageLoop::TYPE_DEFAULT
);
193 StorageObserver::MonitorParams
params(kStorageTypePersistent
,
194 GURL(kDefaultOrigin
),
195 base::TimeDelta::FromHours(1),
197 MockObserver mock_observer
;
198 StorageObserverList observer_list
;
199 observer_list
.AddObserver(&mock_observer
, params
);
201 StorageObserver::Event event
;
202 event
.filter
= params
.filter
;
204 // Verify that the first event is dispatched immediately.
207 observer_list
.OnStorageChange(event
);
208 EXPECT_EQ(1, mock_observer
.EventCount());
209 EXPECT_EQ(event
, mock_observer
.LastEvent());
210 EXPECT_EQ(NULL
, GetPendingEvent(observer_list
));
211 EXPECT_EQ(0, GetRequiredUpdatesCount(observer_list
));
213 // Verify that the next event is pending.
216 observer_list
.OnStorageChange(event
);
217 EXPECT_EQ(1, mock_observer
.EventCount());
218 ASSERT_TRUE(GetPendingEvent(observer_list
));
219 EXPECT_EQ(event
, *GetPendingEvent(observer_list
));
220 EXPECT_EQ(1, GetRequiredUpdatesCount(observer_list
));
222 // Fake the last notification time so that an event will be dispatched.
223 SetLastNotificationTime(observer_list
, &mock_observer
);
226 observer_list
.OnStorageChange(event
);
227 EXPECT_EQ(2, mock_observer
.EventCount());
228 EXPECT_EQ(event
, mock_observer
.LastEvent());
229 EXPECT_EQ(NULL
, GetPendingEvent(observer_list
));
230 EXPECT_EQ(0, GetRequiredUpdatesCount(observer_list
));
232 // Remove the observer.
235 observer_list
.RemoveObserver(&mock_observer
);
236 observer_list
.OnStorageChange(event
);
237 EXPECT_EQ(2, mock_observer
.EventCount());
238 EXPECT_EQ(NULL
, GetPendingEvent(observer_list
));
241 // Test dispatching events to multiple observers.
242 TEST_F(StorageObserverListTest
, DispatchEventToMultipleObservers
) {
243 // A message loop is required as StorageObserverList may schedule jobs.
244 base::MessageLoop
loop(base::MessageLoop::TYPE_DEFAULT
);
246 MockObserver mock_observer1
;
247 MockObserver mock_observer2
;
248 StorageObserverList observer_list
;
249 StorageObserver::Filter
filter(kStorageTypePersistent
,
250 GURL(kDefaultOrigin
));
251 observer_list
.AddObserver(
253 StorageObserver::MonitorParams(
254 filter
, base::TimeDelta::FromHours(1), false));
255 observer_list
.AddObserver(
257 StorageObserver::MonitorParams(
258 filter
, base::TimeDelta::FromHours(2), false));
260 StorageObserver::Event event
;
261 event
.filter
= filter
;
263 // Verify that the first event is dispatched immediately.
266 observer_list
.OnStorageChange(event
);
267 EXPECT_EQ(1, mock_observer1
.EventCount());
268 EXPECT_EQ(1, mock_observer2
.EventCount());
269 EXPECT_EQ(event
, mock_observer1
.LastEvent());
270 EXPECT_EQ(event
, mock_observer2
.LastEvent());
271 EXPECT_EQ(NULL
, GetPendingEvent(observer_list
));
272 EXPECT_EQ(0, GetRequiredUpdatesCount(observer_list
));
274 // Fake the last notification time so that observer1 will receive the next
275 // event, but it will be pending for observer2.
276 SetLastNotificationTime(observer_list
, &mock_observer1
);
279 observer_list
.OnStorageChange(event
);
280 EXPECT_EQ(2, mock_observer1
.EventCount());
281 EXPECT_EQ(1, mock_observer2
.EventCount());
282 EXPECT_EQ(event
, mock_observer1
.LastEvent());
283 ASSERT_TRUE(GetPendingEvent(observer_list
));
284 EXPECT_EQ(event
, *GetPendingEvent(observer_list
));
285 EXPECT_EQ(1, GetRequiredUpdatesCount(observer_list
));
287 // Now dispatch the pending event to observer2.
288 SetLastNotificationTime(observer_list
, &mock_observer2
);
289 DispatchPendingEvents(observer_list
);
290 EXPECT_EQ(2, mock_observer1
.EventCount());
291 EXPECT_EQ(2, mock_observer2
.EventCount());
292 EXPECT_EQ(event
, mock_observer1
.LastEvent());
293 EXPECT_EQ(event
, mock_observer2
.LastEvent());
294 EXPECT_EQ(NULL
, GetPendingEvent(observer_list
));
295 EXPECT_EQ(0, GetRequiredUpdatesCount(observer_list
));
298 // Ensure that the |origin| field in events match the origin specified by the
299 // observer on registration.
300 TEST_F(StorageObserverListTest
, ReplaceEventOrigin
) {
301 StorageObserver::MonitorParams
params(kStorageTypePersistent
,
302 GURL(kDefaultOrigin
),
303 base::TimeDelta::FromHours(1),
305 MockObserver mock_observer
;
306 StorageObserverList observer_list
;
307 observer_list
.AddObserver(&mock_observer
, params
);
309 StorageObserver::Event dispatched_event
;
310 dispatched_event
.filter
= params
.filter
;
311 dispatched_event
.filter
.origin
= GURL("https://www.foo.com/bar");
312 observer_list
.OnStorageChange(dispatched_event
);
314 EXPECT_EQ(params
.filter
.origin
, mock_observer
.LastEvent().filter
.origin
);
317 // Tests for HostStorageObservers:
319 typedef StorageTestWithManagerBase HostStorageObserversTest
;
321 // Verify that HostStorageObservers is initialized after the first usage change.
322 TEST_F(HostStorageObserversTest
, InitializeOnUsageChange
) {
323 StorageObserver::MonitorParams
params(kStorageTypePersistent
,
324 GURL(kDefaultOrigin
),
325 base::TimeDelta::FromHours(1),
327 const int64 kUsage
= 324554;
328 const int64 kQuota
= 234354354;
329 quota_manager_
->SetCallbackParams(kUsage
, kQuota
, kQuotaStatusOk
);
331 MockObserver mock_observer
;
332 HostStorageObservers
host_observers(quota_manager_
.get());
333 host_observers
.AddObserver(&mock_observer
, params
);
335 // Verify that HostStorageObservers dispatches the first event correctly.
336 StorageObserver::Event
expected_event(params
.filter
, kUsage
, kQuota
);
337 host_observers
.NotifyUsageChange(params
.filter
, 87324);
338 EXPECT_EQ(1, mock_observer
.EventCount());
339 EXPECT_EQ(expected_event
, mock_observer
.LastEvent());
340 EXPECT_TRUE(host_observers
.is_initialized());
342 // Verify that HostStorageObservers handles subsequent usage changes
344 const int64 kDelta
= 2345;
345 expected_event
.usage
+= kDelta
;
346 SetLastNotificationTime(host_observers
, &mock_observer
);
347 host_observers
.NotifyUsageChange(params
.filter
, kDelta
);
348 EXPECT_EQ(2, mock_observer
.EventCount());
349 EXPECT_EQ(expected_event
, mock_observer
.LastEvent());
352 // Verify that HostStorageObservers is initialized after the adding the first
353 // observer that elected to receive the initial state.
354 TEST_F(HostStorageObserversTest
, InitializeOnObserver
) {
355 const int64 kUsage
= 74387;
356 const int64 kQuota
= 92834743;
357 quota_manager_
->SetCallbackParams(kUsage
, kQuota
, kQuotaStatusOk
);
358 HostStorageObservers
host_observers(quota_manager_
.get());
360 // |host_observers| should not be initialized after the first observer is
361 // added because it did not elect to receive the initial state.
362 StorageObserver::MonitorParams
params(kStorageTypePersistent
,
363 GURL(kDefaultOrigin
),
364 base::TimeDelta::FromHours(1),
366 MockObserver mock_observer1
;
367 host_observers
.AddObserver(&mock_observer1
, params
);
368 EXPECT_FALSE(host_observers
.is_initialized());
369 EXPECT_EQ(0, mock_observer1
.EventCount());
371 // |host_observers| should be initialized after the second observer is
373 MockObserver mock_observer2
;
374 params
.dispatch_initial_state
= true;
375 host_observers
.AddObserver(&mock_observer2
, params
);
376 StorageObserver::Event
expected_event(params
.filter
, kUsage
, kQuota
);
377 EXPECT_EQ(0, mock_observer1
.EventCount());
378 EXPECT_EQ(1, mock_observer2
.EventCount());
379 EXPECT_EQ(expected_event
, mock_observer2
.LastEvent());
380 EXPECT_TRUE(host_observers
.is_initialized());
381 EXPECT_EQ(NULL
, GetPendingEvent(host_observers
));
382 EXPECT_EQ(0, GetRequiredUpdatesCount(host_observers
));
384 // Verify that both observers will receive events after a usage change.
385 const int64 kDelta
= 2345;
386 expected_event
.usage
+= kDelta
;
387 SetLastNotificationTime(host_observers
, &mock_observer2
);
388 host_observers
.NotifyUsageChange(params
.filter
, kDelta
);
389 EXPECT_EQ(1, mock_observer1
.EventCount());
390 EXPECT_EQ(2, mock_observer2
.EventCount());
391 EXPECT_EQ(expected_event
, mock_observer1
.LastEvent());
392 EXPECT_EQ(expected_event
, mock_observer2
.LastEvent());
393 EXPECT_EQ(NULL
, GetPendingEvent(host_observers
));
394 EXPECT_EQ(0, GetRequiredUpdatesCount(host_observers
));
396 // Verify that the addition of a third observer only causes an event to be
397 // dispatched to the new observer.
398 MockObserver mock_observer3
;
399 params
.dispatch_initial_state
= true;
400 host_observers
.AddObserver(&mock_observer3
, params
);
401 EXPECT_EQ(1, mock_observer1
.EventCount());
402 EXPECT_EQ(2, mock_observer2
.EventCount());
403 EXPECT_EQ(1, mock_observer3
.EventCount());
404 EXPECT_EQ(expected_event
, mock_observer3
.LastEvent());
407 // Verify that negative usage and quota is changed to zero.
408 TEST_F(HostStorageObserversTest
, NegativeUsageAndQuota
) {
409 StorageObserver::MonitorParams
params(kStorageTypePersistent
,
410 GURL(kDefaultOrigin
),
411 base::TimeDelta::FromHours(1),
413 const int64 kUsage
= -324554;
414 const int64 kQuota
= -234354354;
415 quota_manager_
->SetCallbackParams(kUsage
, kQuota
, kQuotaStatusOk
);
417 MockObserver mock_observer
;
418 HostStorageObservers
host_observers(quota_manager_
.get());
419 host_observers
.AddObserver(&mock_observer
, params
);
421 StorageObserver::Event
expected_event(params
.filter
, 0, 0);
422 host_observers
.NotifyUsageChange(params
.filter
, -87324);
423 EXPECT_EQ(expected_event
, mock_observer
.LastEvent());
426 // Verify that HostStorageObservers can recover from a bad initialization.
427 TEST_F(HostStorageObserversTest
, RecoverFromBadUsageInit
) {
428 StorageObserver::MonitorParams
params(kStorageTypePersistent
,
429 GURL(kDefaultOrigin
),
430 base::TimeDelta::FromHours(1),
432 MockObserver mock_observer
;
433 HostStorageObservers
host_observers(quota_manager_
.get());
434 host_observers
.AddObserver(&mock_observer
, params
);
436 // Set up the quota manager to return an error status.
437 const int64 kUsage
= 6656;
438 const int64 kQuota
= 99585556;
439 quota_manager_
->SetCallbackParams(kUsage
, kQuota
, kQuotaErrorNotSupported
);
441 // Verify that |host_observers| is not initialized and an event has not been
443 host_observers
.NotifyUsageChange(params
.filter
, 9438);
444 EXPECT_EQ(0, mock_observer
.EventCount());
445 EXPECT_FALSE(host_observers
.is_initialized());
446 EXPECT_EQ(NULL
, GetPendingEvent(host_observers
));
447 EXPECT_EQ(0, GetRequiredUpdatesCount(host_observers
));
449 // Now ensure that quota manager returns a good status.
450 quota_manager_
->SetCallbackParams(kUsage
, kQuota
, kQuotaStatusOk
);
451 host_observers
.NotifyUsageChange(params
.filter
, 9048543);
452 StorageObserver::Event
expected_event(params
.filter
, kUsage
, kQuota
);
453 EXPECT_EQ(1, mock_observer
.EventCount());
454 EXPECT_EQ(expected_event
, mock_observer
.LastEvent());
455 EXPECT_TRUE(host_observers
.is_initialized());
458 // Verify that HostStorageObservers handle initialization of the cached usage
459 // and quota correctly.
460 TEST_F(HostStorageObserversTest
, AsyncInitialization
) {
461 StorageObserver::MonitorParams
params(kStorageTypePersistent
,
462 GURL(kDefaultOrigin
),
463 base::TimeDelta::FromHours(1),
465 MockObserver mock_observer
;
466 HostStorageObservers
host_observers(quota_manager_
.get());
467 host_observers
.AddObserver(&mock_observer
, params
);
469 // Trigger initialization. Leave the mock quota manager uninitialized so that
470 // the callback is not invoked.
471 host_observers
.NotifyUsageChange(params
.filter
, 7645);
472 EXPECT_EQ(0, mock_observer
.EventCount());
473 EXPECT_FALSE(host_observers
.is_initialized());
474 EXPECT_EQ(NULL
, GetPendingEvent(host_observers
));
475 EXPECT_EQ(0, GetRequiredUpdatesCount(host_observers
));
477 // Simulate notifying |host_observers| of a usage change before initialization
479 const int64 kUsage
= 6656;
480 const int64 kQuota
= 99585556;
481 const int64 kDelta
= 327643;
482 host_observers
.NotifyUsageChange(params
.filter
, kDelta
);
483 EXPECT_EQ(0, mock_observer
.EventCount());
484 EXPECT_FALSE(host_observers
.is_initialized());
485 EXPECT_EQ(NULL
, GetPendingEvent(host_observers
));
486 EXPECT_EQ(0, GetRequiredUpdatesCount(host_observers
));
488 // Simulate an asynchronous callback from QuotaManager.
489 quota_manager_
->SetCallbackParams(kUsage
, kQuota
, kQuotaStatusOk
);
490 quota_manager_
->InvokeCallback();
491 StorageObserver::Event
expected_event(params
.filter
, kUsage
+ kDelta
, kQuota
);
492 EXPECT_EQ(1, mock_observer
.EventCount());
493 EXPECT_EQ(expected_event
, mock_observer
.LastEvent());
494 EXPECT_TRUE(host_observers
.is_initialized());
495 EXPECT_EQ(NULL
, GetPendingEvent(host_observers
));
496 EXPECT_EQ(0, GetRequiredUpdatesCount(host_observers
));
499 // Tests for StorageTypeObservers:
501 typedef StorageTestWithManagerBase StorageTypeObserversTest
;
503 // Test adding and removing observers.
504 TEST_F(StorageTypeObserversTest
, AddRemoveObservers
) {
505 StorageTypeObservers
type_observers(quota_manager_
.get());
507 StorageObserver::MonitorParams
params1(kStorageTypePersistent
,
508 GURL(kDefaultOrigin
),
509 base::TimeDelta::FromHours(1),
511 StorageObserver::MonitorParams
params2(kStorageTypePersistent
,
512 GURL(kAlternativeOrigin
),
513 base::TimeDelta::FromHours(1),
515 std::string host1
= net::GetHostOrSpecFromURL(params1
.filter
.origin
);
516 std::string host2
= net::GetHostOrSpecFromURL(params2
.filter
.origin
);
518 MockObserver mock_observer1
;
519 MockObserver mock_observer2
;
520 MockObserver mock_observer3
;
521 type_observers
.AddObserver(&mock_observer1
, params1
);
522 type_observers
.AddObserver(&mock_observer2
, params1
);
524 type_observers
.AddObserver(&mock_observer1
, params2
);
525 type_observers
.AddObserver(&mock_observer2
, params2
);
526 type_observers
.AddObserver(&mock_observer3
, params2
);
528 // Verify that the observers have been removed correctly.
529 ASSERT_TRUE(type_observers
.GetHostObservers(host1
));
530 ASSERT_TRUE(type_observers
.GetHostObservers(host2
));
531 EXPECT_EQ(2, GetObserverCount(*type_observers
.GetHostObservers(host1
)));
532 EXPECT_EQ(3, GetObserverCount(*type_observers
.GetHostObservers(host2
)));
534 // Remove an observer for a specific filter.
535 type_observers
.RemoveObserverForFilter(&mock_observer1
, params1
.filter
);
536 ASSERT_TRUE(type_observers
.GetHostObservers(host1
));
537 ASSERT_TRUE(type_observers
.GetHostObservers(host2
));
538 EXPECT_EQ(1, GetObserverCount(*type_observers
.GetHostObservers(host1
)));
539 EXPECT_EQ(3, GetObserverCount(*type_observers
.GetHostObservers(host2
)));
541 // Remove all instances of an observer.
542 type_observers
.RemoveObserver(&mock_observer2
);
543 ASSERT_TRUE(type_observers
.GetHostObservers(host2
));
544 EXPECT_EQ(2, GetObserverCount(*type_observers
.GetHostObservers(host2
)));
545 // Observers of host1 has been deleted as it is empty.
546 EXPECT_FALSE(type_observers
.GetHostObservers(host1
));
549 // Tests for StorageMonitor:
551 class StorageMonitorTest
: public StorageTestWithManagerBase
{
554 : storage_monitor_(NULL
),
555 params1_(kStorageTypeTemporary
,
556 GURL(kDefaultOrigin
),
557 base::TimeDelta::FromHours(1),
559 params2_(kStorageTypePersistent
,
560 GURL(kDefaultOrigin
),
561 base::TimeDelta::FromHours(1),
566 virtual void SetUp() OVERRIDE
{
567 StorageTestWithManagerBase::SetUp();
569 storage_monitor_
= quota_manager_
->storage_monitor_
.get();
570 host_
= net::GetHostOrSpecFromURL(params1_
.filter
.origin
);
572 storage_monitor_
->AddObserver(&mock_observer1_
, params1_
);
573 storage_monitor_
->AddObserver(&mock_observer2_
, params1_
);
575 storage_monitor_
->AddObserver(&mock_observer1_
, params2_
);
576 storage_monitor_
->AddObserver(&mock_observer2_
, params2_
);
577 storage_monitor_
->AddObserver(&mock_observer3_
, params2_
);
580 int GetObserverCount(StorageType storage_type
) {
581 const StorageTypeObservers
* type_observers
=
582 storage_monitor_
->GetStorageTypeObservers(storage_type
);
583 return StorageMonitorTestBase::GetObserverCount(
584 *type_observers
->GetHostObservers(host_
));
587 void CheckObserverCount(int expected_temporary
, int expected_persistent
) {
588 ASSERT_TRUE(storage_monitor_
->GetStorageTypeObservers(
589 kStorageTypeTemporary
));
590 ASSERT_TRUE(storage_monitor_
->GetStorageTypeObservers(
591 kStorageTypeTemporary
)->GetHostObservers(host_
));
592 EXPECT_EQ(expected_temporary
, GetObserverCount(kStorageTypeTemporary
));
594 ASSERT_TRUE(storage_monitor_
->GetStorageTypeObservers(
595 kStorageTypePersistent
));
596 ASSERT_TRUE(storage_monitor_
->GetStorageTypeObservers(
597 kStorageTypePersistent
)->GetHostObservers(host_
));
598 EXPECT_EQ(expected_persistent
, GetObserverCount(kStorageTypePersistent
));
601 StorageMonitor
* storage_monitor_
;
602 StorageObserver::MonitorParams params1_
;
603 StorageObserver::MonitorParams params2_
;
604 MockObserver mock_observer1_
;
605 MockObserver mock_observer2_
;
606 MockObserver mock_observer3_
;
610 // Test adding storage observers.
611 TEST_F(StorageMonitorTest
, AddObservers
) {
612 // Verify that the observers are added correctly.
613 CheckObserverCount(2, 3);
616 // Test dispatching events to storage observers.
617 TEST_F(StorageMonitorTest
, EventDispatch
) {
618 // Verify dispatch of events.
619 const int64 kUsage
= 5325;
620 const int64 kQuota
= 903845;
621 quota_manager_
->SetCallbackParams(kUsage
, kQuota
, kQuotaStatusOk
);
622 storage_monitor_
->NotifyUsageChange(params1_
.filter
, 9048543);
624 StorageObserver::Event
expected_event(params1_
.filter
, kUsage
, kQuota
);
625 EXPECT_EQ(1, mock_observer1_
.EventCount());
626 EXPECT_EQ(1, mock_observer2_
.EventCount());
627 EXPECT_EQ(0, mock_observer3_
.EventCount());
628 EXPECT_EQ(expected_event
, mock_observer1_
.LastEvent());
629 EXPECT_EQ(expected_event
, mock_observer2_
.LastEvent());
632 // Test removing all instances of an observer.
633 TEST_F(StorageMonitorTest
, RemoveObserver
) {
634 storage_monitor_
->RemoveObserver(&mock_observer1_
);
635 CheckObserverCount(1, 2);
638 // Test removing an observer for a specific filter.
639 TEST_F(StorageMonitorTest
, RemoveObserverForFilter
) {
640 storage_monitor_
->RemoveObserverForFilter(&mock_observer1_
, params2_
.filter
);
641 CheckObserverCount(2, 2);
644 // Integration test for QuotaManager and StorageMonitor:
646 class StorageMonitorIntegrationTest
: public testing::Test
{
648 virtual void SetUp() OVERRIDE
{
649 ASSERT_TRUE(data_dir_
.CreateUniqueTempDir());
650 storage_policy_
= new MockSpecialStoragePolicy();
651 quota_manager_
= new QuotaManager(
654 base::MessageLoopProxy::current().get(),
655 base::MessageLoopProxy::current().get(),
656 storage_policy_
.get());
658 client_
= new MockStorageClient(quota_manager_
->proxy(),
660 QuotaClient::kFileSystem
,
663 quota_manager_
->proxy()->RegisterClient(client_
);
666 virtual void TearDown() OVERRIDE
{
667 // This ensures the quota manager is destroyed correctly.
668 quota_manager_
= NULL
;
669 base::RunLoop().RunUntilIdle();
673 base::MessageLoop message_loop_
;
674 base::ScopedTempDir data_dir_
;
675 scoped_refptr
<MockSpecialStoragePolicy
> storage_policy_
;
676 scoped_refptr
<QuotaManager
> quota_manager_
;
677 MockStorageClient
* client_
;
680 // This test simulates a usage change in a quota client and verifies that a
681 // storage observer will receive a storage event.
682 TEST_F(StorageMonitorIntegrationTest
, NotifyUsageEvent
) {
683 const StorageType kTestStorageType
= kStorageTypePersistent
;
684 const int64 kTestUsage
= 234743;
686 // Register the observer.
687 StorageObserver::MonitorParams
params(kTestStorageType
,
688 GURL(kDefaultOrigin
),
689 base::TimeDelta::FromHours(1),
691 MockObserver mock_observer
;
692 quota_manager_
->AddStorageObserver(&mock_observer
, params
);
694 // Fire a usage change.
695 client_
->AddOriginAndNotify(GURL(kDefaultOrigin
),
698 base::RunLoop().RunUntilIdle();
700 // Verify that the observer receives it.
701 ASSERT_EQ(1, mock_observer
.EventCount());
702 const StorageObserver::Event
& event
= mock_observer
.LastEvent();
703 EXPECT_EQ(params
.filter
, event
.filter
);
704 EXPECT_EQ(kTestUsage
, event
.usage
);
707 } // namespace content