| Index: content/browser/quota/storage_monitor_unittest.cc
 | 
| diff --git a/content/browser/quota/storage_monitor_unittest.cc b/content/browser/quota/storage_monitor_unittest.cc
 | 
| deleted file mode 100644
 | 
| index 7cbeb9140ee282a0040c544ad2f01b833b833845..0000000000000000000000000000000000000000
 | 
| --- a/content/browser/quota/storage_monitor_unittest.cc
 | 
| +++ /dev/null
 | 
| @@ -1,703 +0,0 @@
 | 
| -// Copyright 2014 The Chromium Authors. All rights reserved.
 | 
| -// Use of this source code is governed by a BSD-style license that can be
 | 
| -// found in the LICENSE file.
 | 
| -
 | 
| -#include <stdint.h>
 | 
| -
 | 
| -#include <vector>
 | 
| -
 | 
| -#include "base/files/scoped_temp_dir.h"
 | 
| -#include "base/run_loop.h"
 | 
| -#include "base/threading/thread_task_runner_handle.h"
 | 
| -#include "content/public/test/mock_special_storage_policy.h"
 | 
| -#include "content/public/test/mock_storage_client.h"
 | 
| -#include "net/base/url_util.h"
 | 
| -#include "storage/browser/quota/quota_manager.h"
 | 
| -#include "storage/browser/quota/quota_manager_proxy.h"
 | 
| -#include "storage/browser/quota/storage_monitor.h"
 | 
| -#include "storage/browser/quota/storage_observer.h"
 | 
| -#include "testing/gtest/include/gtest/gtest.h"
 | 
| -
 | 
| -using storage::HostStorageObservers;
 | 
| -using storage::kQuotaErrorNotSupported;
 | 
| -using storage::kQuotaStatusOk;
 | 
| -using storage::kStorageTypePersistent;
 | 
| -using storage::kStorageTypeTemporary;
 | 
| -using storage::QuotaClient;
 | 
| -using storage::QuotaManager;
 | 
| -using storage::QuotaStatusCode;
 | 
| -using storage::SpecialStoragePolicy;
 | 
| -using storage::StorageMonitor;
 | 
| -using storage::StorageObserver;
 | 
| -using storage::StorageObserverList;
 | 
| -using storage::StorageType;
 | 
| -using storage::StorageTypeObservers;
 | 
| -
 | 
| -namespace content {
 | 
| -
 | 
| -namespace {
 | 
| -
 | 
| -const char kDefaultOrigin[] = "http://www.foo.com/";
 | 
| -const char kAlternativeOrigin[] = "http://www.bar.com/";
 | 
| -
 | 
| -class MockObserver : public StorageObserver {
 | 
| - public:
 | 
| -  const StorageObserver::Event& LastEvent() const {
 | 
| -    CHECK(!events_.empty());
 | 
| -    return events_.back();
 | 
| -  }
 | 
| -
 | 
| -  int EventCount() const {
 | 
| -    return events_.size();
 | 
| -  }
 | 
| -
 | 
| -  // StorageObserver implementation:
 | 
| -  void OnStorageEvent(const StorageObserver::Event& event) override {
 | 
| -    events_.push_back(event);
 | 
| -  }
 | 
| -
 | 
| - private:
 | 
| -  std::vector<StorageObserver::Event> events_;
 | 
| -};
 | 
| -
 | 
| -// A mock quota manager for overriding GetUsageAndQuotaForWebApps().
 | 
| -class UsageMockQuotaManager : public QuotaManager {
 | 
| - public:
 | 
| -  UsageMockQuotaManager(SpecialStoragePolicy* special_storage_policy)
 | 
| -      : QuotaManager(false,
 | 
| -                     base::FilePath(),
 | 
| -                     base::ThreadTaskRunnerHandle::Get().get(),
 | 
| -                     base::ThreadTaskRunnerHandle::Get().get(),
 | 
| -                     special_storage_policy),
 | 
| -        callback_usage_(0),
 | 
| -        callback_quota_(0),
 | 
| -        callback_status_(kQuotaStatusOk),
 | 
| -        initialized_(false) {}
 | 
| -
 | 
| -  void SetCallbackParams(int64_t usage, int64_t quota, QuotaStatusCode status) {
 | 
| -    initialized_ = true;
 | 
| -    callback_quota_ = quota;
 | 
| -    callback_usage_ = usage;
 | 
| -    callback_status_ = status;
 | 
| -  }
 | 
| -
 | 
| -  void InvokeCallback() {
 | 
| -    delayed_callback_.Run(callback_status_, callback_usage_, callback_quota_);
 | 
| -  }
 | 
| -
 | 
| -  void GetUsageAndQuotaForWebApps(
 | 
| -      const GURL& origin,
 | 
| -      StorageType type,
 | 
| -      const GetUsageAndQuotaCallback& callback) override {
 | 
| -    if (initialized_)
 | 
| -      callback.Run(callback_status_, callback_usage_, callback_quota_);
 | 
| -    else
 | 
| -      delayed_callback_ = callback;
 | 
| -  }
 | 
| -
 | 
| - protected:
 | 
| -  ~UsageMockQuotaManager() override {}
 | 
| -
 | 
| - private:
 | 
| -  int64_t callback_usage_;
 | 
| -  int64_t callback_quota_;
 | 
| -  QuotaStatusCode callback_status_;
 | 
| -  bool initialized_;
 | 
| -  GetUsageAndQuotaCallback delayed_callback_;
 | 
| -};
 | 
| -
 | 
| -}  // namespace
 | 
| -
 | 
| -class StorageMonitorTestBase : public testing::Test {
 | 
| - protected:
 | 
| -  void DispatchPendingEvents(StorageObserverList& observer_list) {
 | 
| -    observer_list.DispatchPendingEvent();
 | 
| -  }
 | 
| -
 | 
| -  const StorageObserver::Event* GetPendingEvent(
 | 
| -      const StorageObserverList& observer_list) {
 | 
| -    return observer_list.notification_timer_.IsRunning()
 | 
| -                ? &observer_list.pending_event_ : NULL;
 | 
| -  }
 | 
| -
 | 
| -  const StorageObserver::Event* GetPendingEvent(
 | 
| -      const HostStorageObservers& host_observers) {
 | 
| -    return GetPendingEvent(host_observers.observers_);
 | 
| -  }
 | 
| -
 | 
| -  int GetRequiredUpdatesCount(const StorageObserverList& observer_list) {
 | 
| -    int count = 0;
 | 
| -    for (StorageObserverList::StorageObserverStateMap::const_iterator it =
 | 
| -            observer_list.observers_.begin();
 | 
| -         it != observer_list.observers_.end(); ++it) {
 | 
| -      if (it->second.requires_update)
 | 
| -        ++count;
 | 
| -    }
 | 
| -
 | 
| -    return count;
 | 
| -  }
 | 
| -
 | 
| -  int GetRequiredUpdatesCount(const HostStorageObservers& host_observers) {
 | 
| -    return GetRequiredUpdatesCount(host_observers.observers_);
 | 
| -  }
 | 
| -
 | 
| -  void SetLastNotificationTime(StorageObserverList& observer_list,
 | 
| -                               StorageObserver* observer) {
 | 
| -    ASSERT_TRUE(observer_list.observers_.find(observer) !=
 | 
| -                observer_list.observers_.end());
 | 
| -
 | 
| -    StorageObserverList::ObserverState& state =
 | 
| -        observer_list.observers_[observer];
 | 
| -    state.last_notification_time = base::TimeTicks::Now() - state.rate;
 | 
| -  }
 | 
| -
 | 
| -  void SetLastNotificationTime(HostStorageObservers& host_observers,
 | 
| -                               StorageObserver* observer) {
 | 
| -    SetLastNotificationTime(host_observers.observers_, observer);
 | 
| -  }
 | 
| -
 | 
| -  int GetObserverCount(const HostStorageObservers& host_observers) {
 | 
| -    return host_observers.observers_.ObserverCount();
 | 
| -  }
 | 
| -};
 | 
| -
 | 
| -class StorageTestWithManagerBase : public StorageMonitorTestBase {
 | 
| - public:
 | 
| -  void SetUp() override {
 | 
| -    storage_policy_ = new MockSpecialStoragePolicy();
 | 
| -    quota_manager_ = new UsageMockQuotaManager(storage_policy_.get());
 | 
| -  }
 | 
| -
 | 
| -  void TearDown() override {
 | 
| -    // This ensures the quota manager is destroyed correctly.
 | 
| -    quota_manager_ = NULL;
 | 
| -    base::RunLoop().RunUntilIdle();
 | 
| -  }
 | 
| -
 | 
| - protected:
 | 
| -  base::MessageLoop message_loop_;
 | 
| -  scoped_refptr<MockSpecialStoragePolicy> storage_policy_;
 | 
| -  scoped_refptr<UsageMockQuotaManager> quota_manager_;
 | 
| -};
 | 
| -
 | 
| -// Tests for StorageObserverList:
 | 
| -
 | 
| -typedef StorageMonitorTestBase StorageObserverListTest;
 | 
| -
 | 
| -// Test dispatching events to one observer.
 | 
| -TEST_F(StorageObserverListTest, DispatchEventToSingleObserver) {
 | 
| -  // A message loop is required as StorageObserverList may schedule jobs.
 | 
| -  base::MessageLoop loop(base::MessageLoop::TYPE_DEFAULT);
 | 
| -
 | 
| -  StorageObserver::MonitorParams params(kStorageTypePersistent,
 | 
| -                                        GURL(kDefaultOrigin),
 | 
| -                                        base::TimeDelta::FromHours(1),
 | 
| -                                        false);
 | 
| -  MockObserver mock_observer;
 | 
| -  StorageObserverList observer_list;
 | 
| -  observer_list.AddObserver(&mock_observer, params);
 | 
| -
 | 
| -  StorageObserver::Event event;
 | 
| -  event.filter = params.filter;
 | 
| -
 | 
| -  // Verify that the first event is dispatched immediately.
 | 
| -  event.quota = 1;
 | 
| -  event.usage = 1;
 | 
| -  observer_list.OnStorageChange(event);
 | 
| -  EXPECT_EQ(1, mock_observer.EventCount());
 | 
| -  EXPECT_EQ(event, mock_observer.LastEvent());
 | 
| -  EXPECT_EQ(NULL, GetPendingEvent(observer_list));
 | 
| -  EXPECT_EQ(0, GetRequiredUpdatesCount(observer_list));
 | 
| -
 | 
| -  // Verify that the next event is pending.
 | 
| -  event.quota = 2;
 | 
| -  event.usage = 2;
 | 
| -  observer_list.OnStorageChange(event);
 | 
| -  EXPECT_EQ(1, mock_observer.EventCount());
 | 
| -  ASSERT_TRUE(GetPendingEvent(observer_list));
 | 
| -  EXPECT_EQ(event, *GetPendingEvent(observer_list));
 | 
| -  EXPECT_EQ(1, GetRequiredUpdatesCount(observer_list));
 | 
| -
 | 
| -  // Fake the last notification time so that an event will be dispatched.
 | 
| -  SetLastNotificationTime(observer_list, &mock_observer);
 | 
| -  event.quota = 3;
 | 
| -  event.usage = 3;
 | 
| -  observer_list.OnStorageChange(event);
 | 
| -  EXPECT_EQ(2, mock_observer.EventCount());
 | 
| -  EXPECT_EQ(event, mock_observer.LastEvent());
 | 
| -  EXPECT_EQ(NULL, GetPendingEvent(observer_list));
 | 
| -  EXPECT_EQ(0, GetRequiredUpdatesCount(observer_list));
 | 
| -
 | 
| -  // Remove the observer.
 | 
| -  event.quota = 4;
 | 
| -  event.usage = 4;
 | 
| -  observer_list.RemoveObserver(&mock_observer);
 | 
| -  observer_list.OnStorageChange(event);
 | 
| -  EXPECT_EQ(2, mock_observer.EventCount());
 | 
| -  EXPECT_EQ(NULL, GetPendingEvent(observer_list));
 | 
| -}
 | 
| -
 | 
| -// Test dispatching events to multiple observers.
 | 
| -TEST_F(StorageObserverListTest, DispatchEventToMultipleObservers) {
 | 
| -  // A message loop is required as StorageObserverList may schedule jobs.
 | 
| -  base::MessageLoop loop(base::MessageLoop::TYPE_DEFAULT);
 | 
| -
 | 
| -  MockObserver mock_observer1;
 | 
| -  MockObserver mock_observer2;
 | 
| -  StorageObserverList observer_list;
 | 
| -  StorageObserver::Filter filter(kStorageTypePersistent,
 | 
| -                                 GURL(kDefaultOrigin));
 | 
| -  observer_list.AddObserver(
 | 
| -      &mock_observer1,
 | 
| -      StorageObserver::MonitorParams(
 | 
| -          filter, base::TimeDelta::FromHours(1), false));
 | 
| -  observer_list.AddObserver(
 | 
| -      &mock_observer2,
 | 
| -      StorageObserver::MonitorParams(
 | 
| -          filter, base::TimeDelta::FromHours(2), false));
 | 
| -
 | 
| -  StorageObserver::Event event;
 | 
| -  event.filter = filter;
 | 
| -
 | 
| -  // Verify that the first event is dispatched immediately.
 | 
| -  event.quota = 1;
 | 
| -  event.usage = 1;
 | 
| -  observer_list.OnStorageChange(event);
 | 
| -  EXPECT_EQ(1, mock_observer1.EventCount());
 | 
| -  EXPECT_EQ(1, mock_observer2.EventCount());
 | 
| -  EXPECT_EQ(event, mock_observer1.LastEvent());
 | 
| -  EXPECT_EQ(event, mock_observer2.LastEvent());
 | 
| -  EXPECT_EQ(NULL, GetPendingEvent(observer_list));
 | 
| -  EXPECT_EQ(0, GetRequiredUpdatesCount(observer_list));
 | 
| -
 | 
| -  // Fake the last notification time so that observer1 will receive the next
 | 
| -  // event, but it will be pending for observer2.
 | 
| -  SetLastNotificationTime(observer_list, &mock_observer1);
 | 
| -  event.quota = 2;
 | 
| -  event.usage = 2;
 | 
| -  observer_list.OnStorageChange(event);
 | 
| -  EXPECT_EQ(2, mock_observer1.EventCount());
 | 
| -  EXPECT_EQ(1, mock_observer2.EventCount());
 | 
| -  EXPECT_EQ(event, mock_observer1.LastEvent());
 | 
| -  ASSERT_TRUE(GetPendingEvent(observer_list));
 | 
| -  EXPECT_EQ(event, *GetPendingEvent(observer_list));
 | 
| -  EXPECT_EQ(1, GetRequiredUpdatesCount(observer_list));
 | 
| -
 | 
| -  // Now dispatch the pending event to observer2.
 | 
| -  SetLastNotificationTime(observer_list, &mock_observer2);
 | 
| -  DispatchPendingEvents(observer_list);
 | 
| -  EXPECT_EQ(2, mock_observer1.EventCount());
 | 
| -  EXPECT_EQ(2, mock_observer2.EventCount());
 | 
| -  EXPECT_EQ(event, mock_observer1.LastEvent());
 | 
| -  EXPECT_EQ(event, mock_observer2.LastEvent());
 | 
| -  EXPECT_EQ(NULL, GetPendingEvent(observer_list));
 | 
| -  EXPECT_EQ(0, GetRequiredUpdatesCount(observer_list));
 | 
| -}
 | 
| -
 | 
| -// Ensure that the |origin| field in events match the origin specified by the
 | 
| -// observer on registration.
 | 
| -TEST_F(StorageObserverListTest, ReplaceEventOrigin) {
 | 
| -  StorageObserver::MonitorParams params(kStorageTypePersistent,
 | 
| -                                        GURL(kDefaultOrigin),
 | 
| -                                        base::TimeDelta::FromHours(1),
 | 
| -                                        false);
 | 
| -  MockObserver mock_observer;
 | 
| -  StorageObserverList observer_list;
 | 
| -  observer_list.AddObserver(&mock_observer, params);
 | 
| -
 | 
| -  StorageObserver::Event dispatched_event;
 | 
| -  dispatched_event.filter = params.filter;
 | 
| -  dispatched_event.filter.origin = GURL("https://www.foo.com/bar");
 | 
| -  observer_list.OnStorageChange(dispatched_event);
 | 
| -
 | 
| -  EXPECT_EQ(params.filter.origin, mock_observer.LastEvent().filter.origin);
 | 
| -}
 | 
| -
 | 
| -// Tests for HostStorageObservers:
 | 
| -
 | 
| -typedef StorageTestWithManagerBase HostStorageObserversTest;
 | 
| -
 | 
| -// Verify that HostStorageObservers is initialized after the first usage change.
 | 
| -TEST_F(HostStorageObserversTest, InitializeOnUsageChange) {
 | 
| -  StorageObserver::MonitorParams params(kStorageTypePersistent,
 | 
| -                                        GURL(kDefaultOrigin),
 | 
| -                                        base::TimeDelta::FromHours(1),
 | 
| -                                        false);
 | 
| -  const int64_t kUsage = 324554;
 | 
| -  const int64_t kQuota = 234354354;
 | 
| -  quota_manager_->SetCallbackParams(kUsage, kQuota, kQuotaStatusOk);
 | 
| -
 | 
| -  MockObserver mock_observer;
 | 
| -  HostStorageObservers host_observers(quota_manager_.get());
 | 
| -  host_observers.AddObserver(&mock_observer, params);
 | 
| -
 | 
| -  // Verify that HostStorageObservers dispatches the first event correctly.
 | 
| -  StorageObserver::Event expected_event(params.filter, kUsage, kQuota);
 | 
| -  host_observers.NotifyUsageChange(params.filter, 87324);
 | 
| -  EXPECT_EQ(1, mock_observer.EventCount());
 | 
| -  EXPECT_EQ(expected_event, mock_observer.LastEvent());
 | 
| -  EXPECT_TRUE(host_observers.is_initialized());
 | 
| -
 | 
| -  // Verify that HostStorageObservers handles subsequent usage changes
 | 
| -  // correctly.
 | 
| -  const int64_t kDelta = 2345;
 | 
| -  expected_event.usage += kDelta;
 | 
| -  SetLastNotificationTime(host_observers, &mock_observer);
 | 
| -  host_observers.NotifyUsageChange(params.filter, kDelta);
 | 
| -  EXPECT_EQ(2, mock_observer.EventCount());
 | 
| -  EXPECT_EQ(expected_event, mock_observer.LastEvent());
 | 
| -}
 | 
| -
 | 
| -// Verify that HostStorageObservers is initialized after the adding the first
 | 
| -// observer that elected to receive the initial state.
 | 
| -TEST_F(HostStorageObserversTest, InitializeOnObserver) {
 | 
| -  const int64_t kUsage = 74387;
 | 
| -  const int64_t kQuota = 92834743;
 | 
| -  quota_manager_->SetCallbackParams(kUsage, kQuota, kQuotaStatusOk);
 | 
| -  HostStorageObservers host_observers(quota_manager_.get());
 | 
| -
 | 
| -  // |host_observers| should not be initialized after the first observer is
 | 
| -  // added because it did not elect to receive the initial state.
 | 
| -  StorageObserver::MonitorParams params(kStorageTypePersistent,
 | 
| -                                        GURL(kDefaultOrigin),
 | 
| -                                        base::TimeDelta::FromHours(1),
 | 
| -                                        false);
 | 
| -  MockObserver mock_observer1;
 | 
| -  host_observers.AddObserver(&mock_observer1, params);
 | 
| -  EXPECT_FALSE(host_observers.is_initialized());
 | 
| -  EXPECT_EQ(0, mock_observer1.EventCount());
 | 
| -
 | 
| -  // |host_observers| should be initialized after the second observer is
 | 
| -  // added.
 | 
| -  MockObserver mock_observer2;
 | 
| -  params.dispatch_initial_state = true;
 | 
| -  host_observers.AddObserver(&mock_observer2, params);
 | 
| -  StorageObserver::Event expected_event(params.filter, kUsage, kQuota);
 | 
| -  EXPECT_EQ(0, mock_observer1.EventCount());
 | 
| -  EXPECT_EQ(1, mock_observer2.EventCount());
 | 
| -  EXPECT_EQ(expected_event, mock_observer2.LastEvent());
 | 
| -  EXPECT_TRUE(host_observers.is_initialized());
 | 
| -  EXPECT_EQ(NULL, GetPendingEvent(host_observers));
 | 
| -  EXPECT_EQ(0, GetRequiredUpdatesCount(host_observers));
 | 
| -
 | 
| -  // Verify that both observers will receive events after a usage change.
 | 
| -  const int64_t kDelta = 2345;
 | 
| -  expected_event.usage += kDelta;
 | 
| -  SetLastNotificationTime(host_observers, &mock_observer2);
 | 
| -  host_observers.NotifyUsageChange(params.filter, kDelta);
 | 
| -  EXPECT_EQ(1, mock_observer1.EventCount());
 | 
| -  EXPECT_EQ(2, mock_observer2.EventCount());
 | 
| -  EXPECT_EQ(expected_event, mock_observer1.LastEvent());
 | 
| -  EXPECT_EQ(expected_event, mock_observer2.LastEvent());
 | 
| -  EXPECT_EQ(NULL, GetPendingEvent(host_observers));
 | 
| -  EXPECT_EQ(0, GetRequiredUpdatesCount(host_observers));
 | 
| -
 | 
| -  // Verify that the addition of a third observer only causes an event to be
 | 
| -  // dispatched to the new observer.
 | 
| -  MockObserver mock_observer3;
 | 
| -  params.dispatch_initial_state = true;
 | 
| -  host_observers.AddObserver(&mock_observer3, params);
 | 
| -  EXPECT_EQ(1, mock_observer1.EventCount());
 | 
| -  EXPECT_EQ(2, mock_observer2.EventCount());
 | 
| -  EXPECT_EQ(1, mock_observer3.EventCount());
 | 
| -  EXPECT_EQ(expected_event, mock_observer3.LastEvent());
 | 
| -}
 | 
| -
 | 
| -// Verify that negative usage and quota is changed to zero.
 | 
| -TEST_F(HostStorageObserversTest, NegativeUsageAndQuota) {
 | 
| -  StorageObserver::MonitorParams params(kStorageTypePersistent,
 | 
| -                                        GURL(kDefaultOrigin),
 | 
| -                                        base::TimeDelta::FromHours(1),
 | 
| -                                        false);
 | 
| -  const int64_t kUsage = -324554;
 | 
| -  const int64_t kQuota = -234354354;
 | 
| -  quota_manager_->SetCallbackParams(kUsage, kQuota, kQuotaStatusOk);
 | 
| -
 | 
| -  MockObserver mock_observer;
 | 
| -  HostStorageObservers host_observers(quota_manager_.get());
 | 
| -  host_observers.AddObserver(&mock_observer, params);
 | 
| -
 | 
| -  StorageObserver::Event expected_event(params.filter, 0, 0);
 | 
| -  host_observers.NotifyUsageChange(params.filter, -87324);
 | 
| -  EXPECT_EQ(expected_event, mock_observer.LastEvent());
 | 
| -}
 | 
| -
 | 
| -// Verify that HostStorageObservers can recover from a bad initialization.
 | 
| -TEST_F(HostStorageObserversTest, RecoverFromBadUsageInit) {
 | 
| -  StorageObserver::MonitorParams params(kStorageTypePersistent,
 | 
| -                                        GURL(kDefaultOrigin),
 | 
| -                                        base::TimeDelta::FromHours(1),
 | 
| -                                        false);
 | 
| -  MockObserver mock_observer;
 | 
| -  HostStorageObservers host_observers(quota_manager_.get());
 | 
| -  host_observers.AddObserver(&mock_observer, params);
 | 
| -
 | 
| -  // Set up the quota manager to return an error status.
 | 
| -  const int64_t kUsage = 6656;
 | 
| -  const int64_t kQuota = 99585556;
 | 
| -  quota_manager_->SetCallbackParams(kUsage, kQuota, kQuotaErrorNotSupported);
 | 
| -
 | 
| -  // Verify that |host_observers| is not initialized and an event has not been
 | 
| -  // dispatched.
 | 
| -  host_observers.NotifyUsageChange(params.filter, 9438);
 | 
| -  EXPECT_EQ(0, mock_observer.EventCount());
 | 
| -  EXPECT_FALSE(host_observers.is_initialized());
 | 
| -  EXPECT_EQ(NULL, GetPendingEvent(host_observers));
 | 
| -  EXPECT_EQ(0, GetRequiredUpdatesCount(host_observers));
 | 
| -
 | 
| -  // Now ensure that quota manager returns a good status.
 | 
| -  quota_manager_->SetCallbackParams(kUsage, kQuota, kQuotaStatusOk);
 | 
| -  host_observers.NotifyUsageChange(params.filter, 9048543);
 | 
| -  StorageObserver::Event expected_event(params.filter, kUsage, kQuota);
 | 
| -  EXPECT_EQ(1, mock_observer.EventCount());
 | 
| -  EXPECT_EQ(expected_event, mock_observer.LastEvent());
 | 
| -  EXPECT_TRUE(host_observers.is_initialized());
 | 
| -}
 | 
| -
 | 
| -// Verify that HostStorageObservers handle initialization of the cached usage
 | 
| -// and quota correctly.
 | 
| -TEST_F(HostStorageObserversTest, AsyncInitialization) {
 | 
| -  StorageObserver::MonitorParams params(kStorageTypePersistent,
 | 
| -                                        GURL(kDefaultOrigin),
 | 
| -                                        base::TimeDelta::FromHours(1),
 | 
| -                                        false);
 | 
| -  MockObserver mock_observer;
 | 
| -  HostStorageObservers host_observers(quota_manager_.get());
 | 
| -  host_observers.AddObserver(&mock_observer, params);
 | 
| -
 | 
| -  // Trigger initialization. Leave the mock quota manager uninitialized so that
 | 
| -  // the callback is not invoked.
 | 
| -  host_observers.NotifyUsageChange(params.filter, 7645);
 | 
| -  EXPECT_EQ(0, mock_observer.EventCount());
 | 
| -  EXPECT_FALSE(host_observers.is_initialized());
 | 
| -  EXPECT_EQ(NULL, GetPendingEvent(host_observers));
 | 
| -  EXPECT_EQ(0, GetRequiredUpdatesCount(host_observers));
 | 
| -
 | 
| -  // Simulate notifying |host_observers| of a usage change before initialization
 | 
| -  // is complete.
 | 
| -  const int64_t kUsage = 6656;
 | 
| -  const int64_t kQuota = 99585556;
 | 
| -  const int64_t kDelta = 327643;
 | 
| -  host_observers.NotifyUsageChange(params.filter, kDelta);
 | 
| -  EXPECT_EQ(0, mock_observer.EventCount());
 | 
| -  EXPECT_FALSE(host_observers.is_initialized());
 | 
| -  EXPECT_EQ(NULL, GetPendingEvent(host_observers));
 | 
| -  EXPECT_EQ(0, GetRequiredUpdatesCount(host_observers));
 | 
| -
 | 
| -  // Simulate an asynchronous callback from QuotaManager.
 | 
| -  quota_manager_->SetCallbackParams(kUsage, kQuota, kQuotaStatusOk);
 | 
| -  quota_manager_->InvokeCallback();
 | 
| -  StorageObserver::Event expected_event(params.filter, kUsage + kDelta, kQuota);
 | 
| -  EXPECT_EQ(1, mock_observer.EventCount());
 | 
| -  EXPECT_EQ(expected_event, mock_observer.LastEvent());
 | 
| -  EXPECT_TRUE(host_observers.is_initialized());
 | 
| -  EXPECT_EQ(NULL, GetPendingEvent(host_observers));
 | 
| -  EXPECT_EQ(0, GetRequiredUpdatesCount(host_observers));
 | 
| -}
 | 
| -
 | 
| -// Tests for StorageTypeObservers:
 | 
| -
 | 
| -typedef StorageTestWithManagerBase StorageTypeObserversTest;
 | 
| -
 | 
| -// Test adding and removing observers.
 | 
| -TEST_F(StorageTypeObserversTest, AddRemoveObservers) {
 | 
| -  StorageTypeObservers type_observers(quota_manager_.get());
 | 
| -
 | 
| -  StorageObserver::MonitorParams params1(kStorageTypePersistent,
 | 
| -                                         GURL(kDefaultOrigin),
 | 
| -                                         base::TimeDelta::FromHours(1),
 | 
| -                                         false);
 | 
| -  StorageObserver::MonitorParams params2(kStorageTypePersistent,
 | 
| -                                         GURL(kAlternativeOrigin),
 | 
| -                                         base::TimeDelta::FromHours(1),
 | 
| -                                         false);
 | 
| -  std::string host1 = net::GetHostOrSpecFromURL(params1.filter.origin);
 | 
| -  std::string host2 = net::GetHostOrSpecFromURL(params2.filter.origin);
 | 
| -
 | 
| -  MockObserver mock_observer1;
 | 
| -  MockObserver mock_observer2;
 | 
| -  MockObserver mock_observer3;
 | 
| -  type_observers.AddObserver(&mock_observer1, params1);
 | 
| -  type_observers.AddObserver(&mock_observer2, params1);
 | 
| -
 | 
| -  type_observers.AddObserver(&mock_observer1, params2);
 | 
| -  type_observers.AddObserver(&mock_observer2, params2);
 | 
| -  type_observers.AddObserver(&mock_observer3, params2);
 | 
| -
 | 
| -  // Verify that the observers have been removed correctly.
 | 
| -  ASSERT_TRUE(type_observers.GetHostObservers(host1));
 | 
| -  ASSERT_TRUE(type_observers.GetHostObservers(host2));
 | 
| -  EXPECT_EQ(2, GetObserverCount(*type_observers.GetHostObservers(host1)));
 | 
| -  EXPECT_EQ(3, GetObserverCount(*type_observers.GetHostObservers(host2)));
 | 
| -
 | 
| -  // Remove an observer for a specific filter.
 | 
| -  type_observers.RemoveObserverForFilter(&mock_observer1, params1.filter);
 | 
| -  ASSERT_TRUE(type_observers.GetHostObservers(host1));
 | 
| -  ASSERT_TRUE(type_observers.GetHostObservers(host2));
 | 
| -  EXPECT_EQ(1, GetObserverCount(*type_observers.GetHostObservers(host1)));
 | 
| -  EXPECT_EQ(3, GetObserverCount(*type_observers.GetHostObservers(host2)));
 | 
| -
 | 
| -  // Remove all instances of an observer.
 | 
| -  type_observers.RemoveObserver(&mock_observer2);
 | 
| -  ASSERT_TRUE(type_observers.GetHostObservers(host2));
 | 
| -  EXPECT_EQ(2, GetObserverCount(*type_observers.GetHostObservers(host2)));
 | 
| -  // Observers of host1 has been deleted as it is empty.
 | 
| -  EXPECT_FALSE(type_observers.GetHostObservers(host1));
 | 
| -}
 | 
| -
 | 
| -// Tests for StorageMonitor:
 | 
| -
 | 
| -class StorageMonitorTest : public StorageTestWithManagerBase {
 | 
| - public:
 | 
| -  StorageMonitorTest()
 | 
| -      : storage_monitor_(NULL),
 | 
| -        params1_(kStorageTypeTemporary,
 | 
| -                 GURL(kDefaultOrigin),
 | 
| -                 base::TimeDelta::FromHours(1),
 | 
| -                 false),
 | 
| -        params2_(kStorageTypePersistent,
 | 
| -                 GURL(kDefaultOrigin),
 | 
| -                 base::TimeDelta::FromHours(1),
 | 
| -                 false) {
 | 
| -  }
 | 
| -
 | 
| - protected:
 | 
| -  void SetUp() override {
 | 
| -    StorageTestWithManagerBase::SetUp();
 | 
| -
 | 
| -    storage_monitor_ = quota_manager_->storage_monitor_.get();
 | 
| -    host_ = net::GetHostOrSpecFromURL(params1_.filter.origin);
 | 
| -
 | 
| -    storage_monitor_->AddObserver(&mock_observer1_, params1_);
 | 
| -    storage_monitor_->AddObserver(&mock_observer2_, params1_);
 | 
| -
 | 
| -    storage_monitor_->AddObserver(&mock_observer1_, params2_);
 | 
| -    storage_monitor_->AddObserver(&mock_observer2_, params2_);
 | 
| -    storage_monitor_->AddObserver(&mock_observer3_, params2_);
 | 
| -  }
 | 
| -
 | 
| -  int GetObserverCount(StorageType storage_type) {
 | 
| -    const StorageTypeObservers* type_observers =
 | 
| -        storage_monitor_->GetStorageTypeObservers(storage_type);
 | 
| -    return StorageMonitorTestBase::GetObserverCount(
 | 
| -                *type_observers->GetHostObservers(host_));
 | 
| -  }
 | 
| -
 | 
| -  void CheckObserverCount(int expected_temporary, int expected_persistent) {
 | 
| -    ASSERT_TRUE(storage_monitor_->GetStorageTypeObservers(
 | 
| -                    kStorageTypeTemporary));
 | 
| -    ASSERT_TRUE(storage_monitor_->GetStorageTypeObservers(
 | 
| -                    kStorageTypeTemporary)->GetHostObservers(host_));
 | 
| -    EXPECT_EQ(expected_temporary, GetObserverCount(kStorageTypeTemporary));
 | 
| -
 | 
| -    ASSERT_TRUE(storage_monitor_->GetStorageTypeObservers(
 | 
| -                    kStorageTypePersistent));
 | 
| -    ASSERT_TRUE(storage_monitor_->GetStorageTypeObservers(
 | 
| -                    kStorageTypePersistent)->GetHostObservers(host_));
 | 
| -    EXPECT_EQ(expected_persistent, GetObserverCount(kStorageTypePersistent));
 | 
| -  }
 | 
| -
 | 
| -  StorageMonitor* storage_monitor_;
 | 
| -  StorageObserver::MonitorParams params1_;
 | 
| -  StorageObserver::MonitorParams params2_;
 | 
| -  MockObserver mock_observer1_;
 | 
| -  MockObserver mock_observer2_;
 | 
| -  MockObserver mock_observer3_;
 | 
| -  std::string host_;
 | 
| -};
 | 
| -
 | 
| -// Test adding storage observers.
 | 
| -TEST_F(StorageMonitorTest, AddObservers) {
 | 
| -  // Verify that the observers are added correctly.
 | 
| -  CheckObserverCount(2, 3);
 | 
| -}
 | 
| -
 | 
| -// Test dispatching events to storage observers.
 | 
| -TEST_F(StorageMonitorTest, EventDispatch) {
 | 
| -  // Verify dispatch of events.
 | 
| -  const int64_t kUsage = 5325;
 | 
| -  const int64_t kQuota = 903845;
 | 
| -  quota_manager_->SetCallbackParams(kUsage, kQuota, kQuotaStatusOk);
 | 
| -  storage_monitor_->NotifyUsageChange(params1_.filter, 9048543);
 | 
| -
 | 
| -  StorageObserver::Event expected_event(params1_.filter, kUsage, kQuota);
 | 
| -  EXPECT_EQ(1, mock_observer1_.EventCount());
 | 
| -  EXPECT_EQ(1, mock_observer2_.EventCount());
 | 
| -  EXPECT_EQ(0, mock_observer3_.EventCount());
 | 
| -  EXPECT_EQ(expected_event, mock_observer1_.LastEvent());
 | 
| -  EXPECT_EQ(expected_event, mock_observer2_.LastEvent());
 | 
| -}
 | 
| -
 | 
| -// Test removing all instances of an observer.
 | 
| -TEST_F(StorageMonitorTest, RemoveObserver) {
 | 
| -  storage_monitor_->RemoveObserver(&mock_observer1_);
 | 
| -  CheckObserverCount(1, 2);
 | 
| -}
 | 
| -
 | 
| -// Test removing an observer for a specific filter.
 | 
| -TEST_F(StorageMonitorTest, RemoveObserverForFilter) {
 | 
| -  storage_monitor_->RemoveObserverForFilter(&mock_observer1_, params2_.filter);
 | 
| -  CheckObserverCount(2, 2);
 | 
| -}
 | 
| -
 | 
| -// Integration test for QuotaManager and StorageMonitor:
 | 
| -
 | 
| -class StorageMonitorIntegrationTest : public testing::Test {
 | 
| - public:
 | 
| -  void SetUp() override {
 | 
| -    ASSERT_TRUE(data_dir_.CreateUniqueTempDir());
 | 
| -    storage_policy_ = new MockSpecialStoragePolicy();
 | 
| -    quota_manager_ = new QuotaManager(
 | 
| -        false, data_dir_.GetPath(), base::ThreadTaskRunnerHandle::Get().get(),
 | 
| -        base::ThreadTaskRunnerHandle::Get().get(), storage_policy_.get());
 | 
| -
 | 
| -    client_ = new MockStorageClient(quota_manager_->proxy(),
 | 
| -                                    NULL,
 | 
| -                                    QuotaClient::kFileSystem,
 | 
| -                                    0);
 | 
| -
 | 
| -    quota_manager_->proxy()->RegisterClient(client_);
 | 
| -  }
 | 
| -
 | 
| -  void TearDown() override {
 | 
| -    // This ensures the quota manager is destroyed correctly.
 | 
| -    quota_manager_ = NULL;
 | 
| -    base::RunLoop().RunUntilIdle();
 | 
| -  }
 | 
| -
 | 
| - protected:
 | 
| -  base::MessageLoop message_loop_;
 | 
| -  base::ScopedTempDir data_dir_;
 | 
| -  scoped_refptr<MockSpecialStoragePolicy> storage_policy_;
 | 
| -  scoped_refptr<QuotaManager> quota_manager_;
 | 
| -  MockStorageClient* client_;
 | 
| -};
 | 
| -
 | 
| -// This test simulates a usage change in a quota client and verifies that a
 | 
| -// storage observer will receive a storage event.
 | 
| -TEST_F(StorageMonitorIntegrationTest, NotifyUsageEvent) {
 | 
| -  const StorageType kTestStorageType = kStorageTypePersistent;
 | 
| -  const int64_t kTestUsage = 234743;
 | 
| -
 | 
| -  // Register the observer.
 | 
| -  StorageObserver::MonitorParams params(kTestStorageType,
 | 
| -                                        GURL(kDefaultOrigin),
 | 
| -                                        base::TimeDelta::FromHours(1),
 | 
| -                                        false);
 | 
| -  MockObserver mock_observer;
 | 
| -  quota_manager_->AddStorageObserver(&mock_observer, params);
 | 
| -
 | 
| -  // Fire a usage change.
 | 
| -  client_->AddOriginAndNotify(GURL(kDefaultOrigin),
 | 
| -                              kTestStorageType,
 | 
| -                              kTestUsage);
 | 
| -  base::RunLoop().RunUntilIdle();
 | 
| -
 | 
| -  // Verify that the observer receives it.
 | 
| -  ASSERT_EQ(1, mock_observer.EventCount());
 | 
| -  const StorageObserver::Event& event = mock_observer.LastEvent();
 | 
| -  EXPECT_EQ(params.filter, event.filter);
 | 
| -  EXPECT_EQ(kTestUsage, event.usage);
 | 
| -}
 | 
| -
 | 
| -}  // namespace content
 | 
| 
 |