Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(472)

Side by Side Diff: webkit/browser/quota/storage_monitor_unittest.cc

Issue 218793002: Provide monitoring of usage for a storage type and origin (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix test failures Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « webkit/browser/quota/storage_monitor.cc ('k') | webkit/browser/quota/storage_observer.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
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.
4
5 #include <vector>
6
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 "net/base/net_util.h"
12 #include "testing/gtest/include/gtest/gtest.h"
13 #include "webkit/browser/quota/mock_special_storage_policy.h"
14 #include "webkit/browser/quota/mock_storage_client.h"
15 #include "webkit/browser/quota/quota_manager.h"
16 #include "webkit/browser/quota/quota_manager_proxy.h"
17 #include "webkit/browser/quota/storage_monitor.h"
18 #include "webkit/browser/quota/storage_observer.h"
19
20 namespace quota {
21
22 namespace {
23
24 const char kDefaultOrigin[] = "http://www.foo.com/";
25 const char kAlternativeOrigin[] = "http://www.bar.com/";
26
27 class MockObserver : public StorageObserver {
28 public:
29 const StorageObserver::Event& LastEvent() const {
30 CHECK(!events_.empty());
31 return events_.back();
32 }
33
34 int EventCount() const {
35 return events_.size();
36 }
37
38 // StorageObserver implementation:
39 virtual void OnStorageEvent(const StorageObserver::Event& event) OVERRIDE {
40 events_.push_back(event);
41 }
42
43 private:
44 std::vector<StorageObserver::Event> events_;
45 };
46
47 // A mock quota manager for overriding GetUsageAndQuotaForWebApps().
48 class UsageMockQuotaManager : public QuotaManager {
49 public:
50 UsageMockQuotaManager(SpecialStoragePolicy* special_storage_policy)
51 : QuotaManager(
52 false,
53 base::FilePath(),
54 base::MessageLoopProxy::current().get(),
55 base::MessageLoopProxy::current().get(),
56 special_storage_policy),
57 callback_usage_(0),
58 callback_quota_(0),
59 callback_status_(kQuotaStatusOk) {
60 }
61
62 void SetCallbackParams(int64 usage, int64 quota, QuotaStatusCode status) {
63 callback_quota_ = quota;
64 callback_usage_ = usage;
65 callback_status_ = status;
66 }
67
68 virtual void GetUsageAndQuotaForWebApps(
69 const GURL& origin,
70 StorageType type,
71 const GetUsageAndQuotaCallback& callback) OVERRIDE {
72 callback.Run(callback_status_, callback_usage_, callback_quota_);
73 }
74
75 protected:
76 virtual ~UsageMockQuotaManager() {}
77
78 private:
79 int64 callback_usage_;
80 int64 callback_quota_;
81 QuotaStatusCode callback_status_;
82 };
83
84 } // namespace
85
86 class StorageMonitorTestBase : public testing::Test {
87 protected:
88 void DispatchPendingEvents(StorageObserverList& observer_list) {
89 observer_list.DispatchPendingEvent();
90 }
91
92 const StorageObserver::Event* GetPendingEvent(
93 const StorageObserverList& observer_list) {
94 return observer_list.notification_timer_.IsRunning()
95 ? &observer_list.pending_event_ : NULL;
96 }
97
98 const StorageObserver::Event* GetPendingEvent(
99 const HostStorageObservers& host_observers) {
100 return GetPendingEvent(host_observers.observers_);
101 }
102
103 int GetRequiredUpdatesCount(const StorageObserverList& observer_list) {
104 int count = 0;
105 for (StorageObserverList::StorageObserverStateMap::const_iterator it =
106 observer_list.observers_.begin();
107 it != observer_list.observers_.end(); ++it) {
108 if (it->second.requires_update)
109 ++count;
110 }
111
112 return count;
113 }
114
115 int GetRequiredUpdatesCount(const HostStorageObservers& host_observers) {
116 return GetRequiredUpdatesCount(host_observers.observers_);
117 }
118
119 void SetLastNotificationTime(StorageObserverList& observer_list,
120 StorageObserver* observer) {
121 ASSERT_TRUE(observer_list.observers_.find(observer) !=
122 observer_list.observers_.end());
123
124 StorageObserverList::ObserverState& state =
125 observer_list.observers_[observer];
126 state.last_notification_time = base::TimeTicks::Now() - state.rate;
127 }
128
129 void SetLastNotificationTime(HostStorageObservers& host_observers,
130 StorageObserver* observer) {
131 SetLastNotificationTime(host_observers.observers_, observer);
132 }
133
134 int GetObserverCount(const HostStorageObservers& host_observers) {
135 return host_observers.observers_.ObserverCount();
136 }
137 };
138
139 class StorageTestWithManagerBase : public StorageMonitorTestBase {
140 public:
141 virtual void SetUp() OVERRIDE {
142 storage_policy_ = new MockSpecialStoragePolicy();
143 quota_manager_ = new UsageMockQuotaManager(storage_policy_.get());
144 }
145
146 virtual void TearDown() OVERRIDE {
147 // This ensures the quota manager is destroyed correctly.
148 quota_manager_ = NULL;
149 base::RunLoop().RunUntilIdle();
150 }
151
152 protected:
153 base::MessageLoop message_loop_;
154 scoped_refptr<MockSpecialStoragePolicy> storage_policy_;
155 scoped_refptr<UsageMockQuotaManager> quota_manager_;
156 };
157
158 // Tests for StorageObserverList:
159
160 typedef StorageMonitorTestBase StorageObserverListTest;
161
162 // Test dispatching events to one observer.
163 TEST_F(StorageObserverListTest, DispatchEventToSingleObserver) {
164 // A message loop is required as StorageObserverList may schedule jobs.
165 base::MessageLoop loop(base::MessageLoop::TYPE_DEFAULT);
166
167 StorageObserver::MonitorParams params(kStorageTypePersistent,
168 GURL(kDefaultOrigin),
169 base::TimeDelta::FromHours(1),
170 false);
171 MockObserver mock_observer;
172 StorageObserverList observer_list;
173 observer_list.AddObserver(&mock_observer, params);
174
175 StorageObserver::Event event;
176 event.filter = params.filter;
177
178 // Verify that the first event is dispatched immediately.
179 event.quota = 1;
180 event.usage = 1;
181 observer_list.OnStorageChange(event);
182 EXPECT_EQ(1, mock_observer.EventCount());
183 EXPECT_EQ(event, mock_observer.LastEvent());
184 EXPECT_EQ(NULL, GetPendingEvent(observer_list));
185 EXPECT_EQ(0, GetRequiredUpdatesCount(observer_list));
186
187 // Verify that the next event is pending.
188 event.quota = 2;
189 event.usage = 2;
190 observer_list.OnStorageChange(event);
191 EXPECT_EQ(1, mock_observer.EventCount());
192 ASSERT_TRUE(GetPendingEvent(observer_list));
193 EXPECT_EQ(event, *GetPendingEvent(observer_list));
194 EXPECT_EQ(1, GetRequiredUpdatesCount(observer_list));
195
196 // Fake the last notification time so that an event will be dispatched.
197 SetLastNotificationTime(observer_list, &mock_observer);
198 event.quota = 3;
199 event.usage = 3;
200 observer_list.OnStorageChange(event);
201 EXPECT_EQ(2, mock_observer.EventCount());
202 EXPECT_EQ(event, mock_observer.LastEvent());
203 EXPECT_EQ(NULL, GetPendingEvent(observer_list));
204 EXPECT_EQ(0, GetRequiredUpdatesCount(observer_list));
205
206 // Remove the observer.
207 event.quota = 4;
208 event.usage = 4;
209 observer_list.RemoveObserver(&mock_observer);
210 observer_list.OnStorageChange(event);
211 EXPECT_EQ(2, mock_observer.EventCount());
212 EXPECT_EQ(NULL, GetPendingEvent(observer_list));
213 }
214
215 // Test dispatching events to multiple observers.
216 TEST_F(StorageObserverListTest, DispatchEventToMultipleObservers) {
217 // A message loop is required as StorageObserverList may schedule jobs.
218 base::MessageLoop loop(base::MessageLoop::TYPE_DEFAULT);
219
220 MockObserver mock_observer1;
221 MockObserver mock_observer2;
222 StorageObserverList observer_list;
223 StorageObserver::Filter filter(kStorageTypePersistent,
224 GURL(kDefaultOrigin));
225 observer_list.AddObserver(
226 &mock_observer1,
227 StorageObserver::MonitorParams(
228 filter, base::TimeDelta::FromHours(1), false));
229 observer_list.AddObserver(
230 &mock_observer2,
231 StorageObserver::MonitorParams(
232 filter, base::TimeDelta::FromHours(2), false));
233
234 StorageObserver::Event event;
235 event.filter = filter;
236
237 // Verify that the first event is dispatched immediately.
238 event.quota = 1;
239 event.usage = 1;
240 observer_list.OnStorageChange(event);
241 EXPECT_EQ(1, mock_observer1.EventCount());
242 EXPECT_EQ(1, mock_observer2.EventCount());
243 EXPECT_EQ(event, mock_observer1.LastEvent());
244 EXPECT_EQ(event, mock_observer2.LastEvent());
245 EXPECT_EQ(NULL, GetPendingEvent(observer_list));
246 EXPECT_EQ(0, GetRequiredUpdatesCount(observer_list));
247
248 // Fake the last notification time so that observer1 will receive the next
249 // event, but it will be pending for observer2.
250 SetLastNotificationTime(observer_list, &mock_observer1);
251 event.quota = 2;
252 event.usage = 2;
253 observer_list.OnStorageChange(event);
254 EXPECT_EQ(2, mock_observer1.EventCount());
255 EXPECT_EQ(1, mock_observer2.EventCount());
256 EXPECT_EQ(event, mock_observer1.LastEvent());
257 ASSERT_TRUE(GetPendingEvent(observer_list));
258 EXPECT_EQ(event, *GetPendingEvent(observer_list));
259 EXPECT_EQ(1, GetRequiredUpdatesCount(observer_list));
260
261 // Now dispatch the pending event to observer2.
262 SetLastNotificationTime(observer_list, &mock_observer2);
263 DispatchPendingEvents(observer_list);
264 EXPECT_EQ(2, mock_observer1.EventCount());
265 EXPECT_EQ(2, mock_observer2.EventCount());
266 EXPECT_EQ(event, mock_observer1.LastEvent());
267 EXPECT_EQ(event, mock_observer2.LastEvent());
268 EXPECT_EQ(NULL, GetPendingEvent(observer_list));
269 EXPECT_EQ(0, GetRequiredUpdatesCount(observer_list));
270 }
271
272 // Ensure that the |origin| field in events match the origin specified by the
273 // observer on registration.
274 TEST_F(StorageObserverListTest, ReplaceEventOrigin) {
275 StorageObserver::MonitorParams params(kStorageTypePersistent,
276 GURL(kDefaultOrigin),
277 base::TimeDelta::FromHours(1),
278 false);
279 MockObserver mock_observer;
280 StorageObserverList observer_list;
281 observer_list.AddObserver(&mock_observer, params);
282
283 StorageObserver::Event dispatched_event;
284 dispatched_event.filter = params.filter;
285 dispatched_event.filter.origin = GURL("https://www.foo.com/bar");
286 observer_list.OnStorageChange(dispatched_event);
287
288 EXPECT_EQ(params.filter.origin, mock_observer.LastEvent().filter.origin);
289 }
290
291 // Tests for HostStorageObservers:
292
293 typedef StorageTestWithManagerBase HostStorageObserversTest;
294
295 // Verify that HostStorageObservers is initialized after the first usage change.
296 TEST_F(HostStorageObserversTest, InitializeOnUsageChange) {
297 StorageObserver::MonitorParams params(kStorageTypePersistent,
298 GURL(kDefaultOrigin),
299 base::TimeDelta::FromHours(1),
300 false);
301 const int64 kUsage = 324554;
302 const int64 kQuota = 234354354;
303 quota_manager_->SetCallbackParams(kUsage, kQuota, kQuotaStatusOk);
304
305 MockObserver mock_observer;
306 HostStorageObservers host_observers(quota_manager_.get());
307 host_observers.AddObserver(&mock_observer, params);
308
309 // Verify that HostStorageObservers dispatches the first event correctly.
310 StorageObserver::Event expected_event(params.filter, kUsage, kQuota);
311 host_observers.NotifyUsageChange(params.filter, 87324);
312 EXPECT_EQ(1, mock_observer.EventCount());
313 EXPECT_EQ(expected_event, mock_observer.LastEvent());
314 EXPECT_TRUE(host_observers.is_initialized());
315
316 // Verify that HostStorageObservers handles subsequent usage changes
317 // correctly.
318 const int64 kDelta = 2345;
319 expected_event.usage += kDelta;
320 SetLastNotificationTime(host_observers, &mock_observer);
321 host_observers.NotifyUsageChange(params.filter, kDelta);
322 EXPECT_EQ(2, mock_observer.EventCount());
323 EXPECT_EQ(expected_event, mock_observer.LastEvent());
324 }
325
326 // Verify that HostStorageObservers is initialized after the adding the first
327 // observer that elected to receive the initial state.
328 TEST_F(HostStorageObserversTest, InitializeOnObserver) {
329 const int64 kUsage = 74387;
330 const int64 kQuota = 92834743;
331 quota_manager_->SetCallbackParams(kUsage, kQuota, kQuotaStatusOk);
332 HostStorageObservers host_observers(quota_manager_.get());
333
334 // |host_observers| should not be initialized after the first observer is
335 // added because it did not elect to receive the initial state.
336 StorageObserver::MonitorParams params(kStorageTypePersistent,
337 GURL(kDefaultOrigin),
338 base::TimeDelta::FromHours(1),
339 false);
340 MockObserver mock_observer1;
341 host_observers.AddObserver(&mock_observer1, params);
342 EXPECT_FALSE(host_observers.is_initialized());
343 EXPECT_EQ(0, mock_observer1.EventCount());
344
345 // |host_observers| should be initialized after the second observer is
346 // added.
347 MockObserver mock_observer2;
348 params.dispatch_initial_state = true;
349 host_observers.AddObserver(&mock_observer2, params);
350 StorageObserver::Event expected_event(params.filter, kUsage, kQuota);
351 EXPECT_EQ(0, mock_observer1.EventCount());
352 EXPECT_EQ(1, mock_observer2.EventCount());
353 EXPECT_EQ(expected_event, mock_observer2.LastEvent());
354 EXPECT_TRUE(host_observers.is_initialized());
355 EXPECT_EQ(NULL, GetPendingEvent(host_observers));
356 EXPECT_EQ(0, GetRequiredUpdatesCount(host_observers));
357
358 // Verify that both observers will receive events after a usage change.
359 const int64 kDelta = 2345;
360 expected_event.usage += kDelta;
361 SetLastNotificationTime(host_observers, &mock_observer2);
362 host_observers.NotifyUsageChange(params.filter, kDelta);
363 EXPECT_EQ(1, mock_observer1.EventCount());
364 EXPECT_EQ(2, mock_observer2.EventCount());
365 EXPECT_EQ(expected_event, mock_observer1.LastEvent());
366 EXPECT_EQ(expected_event, mock_observer2.LastEvent());
367 EXPECT_EQ(NULL, GetPendingEvent(host_observers));
368 EXPECT_EQ(0, GetRequiredUpdatesCount(host_observers));
369
370 // Verify that the addition of a third observer only causes an event to be
371 // dispatched to the new observer.
372 MockObserver mock_observer3;
373 params.dispatch_initial_state = true;
374 host_observers.AddObserver(&mock_observer3, params);
375 EXPECT_EQ(1, mock_observer1.EventCount());
376 EXPECT_EQ(2, mock_observer2.EventCount());
377 EXPECT_EQ(1, mock_observer3.EventCount());
378 EXPECT_EQ(expected_event, mock_observer3.LastEvent());
379 }
380
381 // Verify that negative usage and quota is changed to zero.
382 TEST_F(HostStorageObserversTest, NegativeUsageAndQuota) {
383 StorageObserver::MonitorParams params(kStorageTypePersistent,
384 GURL(kDefaultOrigin),
385 base::TimeDelta::FromHours(1),
386 false);
387 const int64 kUsage = -324554;
388 const int64 kQuota = -234354354;
389 quota_manager_->SetCallbackParams(kUsage, kQuota, kQuotaStatusOk);
390
391 MockObserver mock_observer;
392 HostStorageObservers host_observers(quota_manager_.get());
393 host_observers.AddObserver(&mock_observer, params);
394
395 StorageObserver::Event expected_event(params.filter, 0, 0);
396 host_observers.NotifyUsageChange(params.filter, -87324);
397 EXPECT_EQ(expected_event, mock_observer.LastEvent());
398 }
399
400 // Verify that HostStorageObservers can recover from a bad initialization.
401 TEST_F(HostStorageObserversTest, RecoverFromBadUsageInit) {
402 StorageObserver::MonitorParams params(kStorageTypePersistent,
403 GURL(kDefaultOrigin),
404 base::TimeDelta::FromHours(1),
405 false);
406 MockObserver mock_observer;
407 HostStorageObservers host_observers(quota_manager_.get());
408 host_observers.AddObserver(&mock_observer, params);
409
410 // Set up the quota manager to return an error status.
411 const int64 kUsage = 6656;
412 const int64 kQuota = 99585556;
413 quota_manager_->SetCallbackParams(kUsage, kQuota, kQuotaErrorNotSupported);
414
415 // Verify that |host_observers| is not initialized and an event has not been
416 // dispatched.
417 host_observers.NotifyUsageChange(params.filter, 9438);
418 EXPECT_EQ(0, mock_observer.EventCount());
419 EXPECT_FALSE(host_observers.is_initialized());
420 EXPECT_EQ(NULL, GetPendingEvent(host_observers));
421 EXPECT_EQ(0, GetRequiredUpdatesCount(host_observers));
422
423 // Now ensure that quota manager returns a good status.
424 quota_manager_->SetCallbackParams(kUsage, kQuota, kQuotaStatusOk);
425 host_observers.NotifyUsageChange(params.filter, 9048543);
426 StorageObserver::Event expected_event(params.filter, kUsage, kQuota);
427 EXPECT_EQ(1, mock_observer.EventCount());
428 EXPECT_EQ(expected_event, mock_observer.LastEvent());
429 EXPECT_TRUE(host_observers.is_initialized());
430 }
431
432 // Tests for StorageTypeObservers:
433
434 typedef StorageTestWithManagerBase StorageTypeObserversTest;
435
436 // Test adding and removing observers.
437 TEST_F(StorageTypeObserversTest, AddRemoveObservers) {
438 StorageTypeObservers type_observers(quota_manager_.get());
439
440 StorageObserver::MonitorParams params1(kStorageTypePersistent,
441 GURL(kDefaultOrigin),
442 base::TimeDelta::FromHours(1),
443 false);
444 StorageObserver::MonitorParams params2(kStorageTypePersistent,
445 GURL(kAlternativeOrigin),
446 base::TimeDelta::FromHours(1),
447 false);
448 std::string host1 = net::GetHostOrSpecFromURL(params1.filter.origin);
449 std::string host2 = net::GetHostOrSpecFromURL(params2.filter.origin);
450
451 MockObserver mock_observer1;
452 MockObserver mock_observer2;
453 MockObserver mock_observer3;
454 type_observers.AddObserver(&mock_observer1, params1);
455 type_observers.AddObserver(&mock_observer2, params1);
456
457 type_observers.AddObserver(&mock_observer1, params2);
458 type_observers.AddObserver(&mock_observer2, params2);
459 type_observers.AddObserver(&mock_observer3, params2);
460
461 // Verify that the observers have been removed correctly.
462 ASSERT_TRUE(type_observers.GetHostObservers(host1));
463 ASSERT_TRUE(type_observers.GetHostObservers(host2));
464 EXPECT_EQ(2, GetObserverCount(*type_observers.GetHostObservers(host1)));
465 EXPECT_EQ(3, GetObserverCount(*type_observers.GetHostObservers(host2)));
466
467 // Remove an observer for a specific filter.
468 type_observers.RemoveObserverForFilter(&mock_observer1, params1.filter);
469 ASSERT_TRUE(type_observers.GetHostObservers(host1));
470 ASSERT_TRUE(type_observers.GetHostObservers(host2));
471 EXPECT_EQ(1, GetObserverCount(*type_observers.GetHostObservers(host1)));
472 EXPECT_EQ(3, GetObserverCount(*type_observers.GetHostObservers(host2)));
473
474 // Remove all instances of an observer.
475 type_observers.RemoveObserver(&mock_observer2);
476 ASSERT_TRUE(type_observers.GetHostObservers(host2));
477 EXPECT_EQ(2, GetObserverCount(*type_observers.GetHostObservers(host2)));
478 // Observers of host1 has been deleted as it is empty.
479 EXPECT_FALSE(type_observers.GetHostObservers(host1));
480 }
481
482 // Tests for StorageMonitor:
483
484 class StorageMonitorTest : public StorageTestWithManagerBase {
485 public:
486 StorageMonitorTest()
487 : storage_monitor_(NULL),
488 params1_(kStorageTypeTemporary,
489 GURL(kDefaultOrigin),
490 base::TimeDelta::FromHours(1),
491 false),
492 params2_(kStorageTypePersistent,
493 GURL(kDefaultOrigin),
494 base::TimeDelta::FromHours(1),
495 false) {
496 }
497
498 protected:
499 virtual void SetUp() OVERRIDE {
500 StorageTestWithManagerBase::SetUp();
501
502 storage_monitor_ = quota_manager_->storage_monitor_.get();
503 host_ = net::GetHostOrSpecFromURL(params1_.filter.origin);
504
505 storage_monitor_->AddObserver(&mock_observer1_, params1_);
506 storage_monitor_->AddObserver(&mock_observer2_, params1_);
507
508 storage_monitor_->AddObserver(&mock_observer1_, params2_);
509 storage_monitor_->AddObserver(&mock_observer2_, params2_);
510 storage_monitor_->AddObserver(&mock_observer3_, params2_);
511 }
512
513 int GetObserverCount(StorageType storage_type) {
514 const StorageTypeObservers* type_observers =
515 storage_monitor_->GetStorageTypeObservers(storage_type);
516 return StorageMonitorTestBase::GetObserverCount(
517 *type_observers->GetHostObservers(host_));
518 }
519
520 void CheckObserverCount(int expected_temporary, int expected_persistent) {
521 ASSERT_TRUE(storage_monitor_->GetStorageTypeObservers(
522 kStorageTypeTemporary));
523 ASSERT_TRUE(storage_monitor_->GetStorageTypeObservers(
524 kStorageTypeTemporary)->GetHostObservers(host_));
525 EXPECT_EQ(expected_temporary, GetObserverCount(kStorageTypeTemporary));
526
527 ASSERT_TRUE(storage_monitor_->GetStorageTypeObservers(
528 kStorageTypePersistent));
529 ASSERT_TRUE(storage_monitor_->GetStorageTypeObservers(
530 kStorageTypePersistent)->GetHostObservers(host_));
531 EXPECT_EQ(expected_persistent, GetObserverCount(kStorageTypePersistent));
532 }
533
534 StorageMonitor* storage_monitor_;
535 StorageObserver::MonitorParams params1_;
536 StorageObserver::MonitorParams params2_;
537 MockObserver mock_observer1_;
538 MockObserver mock_observer2_;
539 MockObserver mock_observer3_;
540 std::string host_;
541 };
542
543 // Test adding storage observers.
544 TEST_F(StorageMonitorTest, AddObservers) {
545 // Verify that the observers are added correctly.
546 CheckObserverCount(2, 3);
547 }
548
549 // Test dispatching events to storage observers.
550 TEST_F(StorageMonitorTest, EventDispatch) {
551 // Verify dispatch of events.
552 const int64 kUsage = 5325;
553 const int64 kQuota = 903845;
554 quota_manager_->SetCallbackParams(kUsage, kQuota, kQuotaStatusOk);
555 storage_monitor_->NotifyUsageChange(params1_.filter, 9048543);
556
557 StorageObserver::Event expected_event(params1_.filter, kUsage, kQuota);
558 EXPECT_EQ(1, mock_observer1_.EventCount());
559 EXPECT_EQ(1, mock_observer2_.EventCount());
560 EXPECT_EQ(0, mock_observer3_.EventCount());
561 EXPECT_EQ(expected_event, mock_observer1_.LastEvent());
562 EXPECT_EQ(expected_event, mock_observer2_.LastEvent());
563 }
564
565 // Test removing all instances of an observer.
566 TEST_F(StorageMonitorTest, RemoveObserver) {
567 storage_monitor_->RemoveObserver(&mock_observer1_);
568 CheckObserverCount(1, 2);
569 }
570
571 // Test removing an observer for a specific filter.
572 TEST_F(StorageMonitorTest, RemoveObserverForFilter) {
573 storage_monitor_->RemoveObserverForFilter(&mock_observer1_, params2_.filter);
574 CheckObserverCount(2, 2);
575 }
576
577 // Integration test for QuotaManager and StorageMonitor:
578
579 class StorageMonitorIntegrationTest : public testing::Test {
580 public:
581 virtual void SetUp() OVERRIDE {
582 ASSERT_TRUE(data_dir_.CreateUniqueTempDir());
583 storage_policy_ = new MockSpecialStoragePolicy();
584 quota_manager_ = new QuotaManager(
585 false,
586 data_dir_.path(),
587 base::MessageLoopProxy::current().get(),
588 base::MessageLoopProxy::current().get(),
589 storage_policy_.get());
590
591 client_ = new MockStorageClient(quota_manager_->proxy(),
592 NULL,
593 QuotaClient::kFileSystem,
594 0);
595
596 quota_manager_->proxy()->RegisterClient(client_);
597 }
598
599 virtual void TearDown() OVERRIDE {
600 // This ensures the quota manager is destroyed correctly.
601 quota_manager_ = NULL;
602 base::RunLoop().RunUntilIdle();
603 }
604
605 protected:
606 base::MessageLoop message_loop_;
607 base::ScopedTempDir data_dir_;
608 scoped_refptr<MockSpecialStoragePolicy> storage_policy_;
609 scoped_refptr<QuotaManager> quota_manager_;
610 MockStorageClient* client_;
611 };
612
613 // This test simulates a usage change in a quota client and verifies that a
614 // storage observer will receive a storage event.
615 TEST_F(StorageMonitorIntegrationTest, NotifyUsageEvent) {
616 const StorageType kTestStorageType = kStorageTypePersistent;
617 const int64 kTestUsage = 234743;
618
619 // Register the observer.
620 StorageObserver::MonitorParams params(kTestStorageType,
621 GURL(kDefaultOrigin),
622 base::TimeDelta::FromHours(1),
623 false);
624 MockObserver mock_observer;
625 quota_manager_->AddStorageObserver(&mock_observer, params);
626
627 // Fire a usage change.
628 client_->AddOriginAndNotify(GURL(kDefaultOrigin),
629 kTestStorageType,
630 kTestUsage);
631 base::RunLoop().RunUntilIdle();
632
633 // Verify that the observer receives it.
634 ASSERT_EQ(1, mock_observer.EventCount());
635 const StorageObserver::Event& event = mock_observer.LastEvent();
636 EXPECT_EQ(params.filter, event.filter);
637 EXPECT_EQ(kTestUsage, event.usage);
638 }
639
640 } // namespace quota
OLDNEW
« no previous file with comments | « webkit/browser/quota/storage_monitor.cc ('k') | webkit/browser/quota/storage_observer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698