// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef STORAGE_BROWSER_TEST_MOCK_SPECIAL_STORAGE_POLICY_H_
#define STORAGE_BROWSER_TEST_MOCK_SPECIAL_STORAGE_POLICY_H_

#include <set>
#include <string>

#include "storage/browser/quota/special_storage_policy.h"
#include "url/gurl.h"

namespace storage {

class MockSpecialStoragePolicy : public SpecialStoragePolicy {
 public:
  MockSpecialStoragePolicy();

  bool IsStorageProtected(const GURL& origin) override;
  bool IsStorageUnlimited(const GURL& origin) override;
  bool IsStorageSessionOnly(const GURL& origin) override;
  bool HasIsolatedStorage(const GURL& origin) override;
  bool HasSessionOnlyOrigins() override;
  bool IsStoragePersistent(const GURL& origin) override;

  void AddProtected(const GURL& origin) { protected_.insert(origin); }

  void AddUnlimited(const GURL& origin) { unlimited_.insert(origin); }

  void RemoveUnlimited(const GURL& origin) { unlimited_.erase(origin); }

  void AddSessionOnly(const GURL& origin) { session_only_.insert(origin); }
  void RemoveSessionOnly(const GURL& origin) { session_only_.erase(origin); }

  void AddIsolated(const GURL& origin) { isolated_.insert(origin); }

  void RemoveIsolated(const GURL& origin) { isolated_.erase(origin); }

  void SetAllUnlimited(bool all_unlimited) { all_unlimited_ = all_unlimited; }

  void AddPersistent(const GURL& origin) { persistent_.insert(origin); }

  void Reset() {
    protected_.clear();
    unlimited_.clear();
    session_only_.clear();
    file_handlers_.clear();
    isolated_.clear();
    all_unlimited_ = false;
  }

  void NotifyGranted(const url::Origin& origin, int change_flags) {
    SpecialStoragePolicy::NotifyGranted(origin, change_flags);
  }

  void NotifyRevoked(const url::Origin& origin, int change_flags) {
    SpecialStoragePolicy::NotifyRevoked(origin, change_flags);
  }

  void NotifyCleared() { SpecialStoragePolicy::NotifyCleared(); }

  void NotifyPolicyChanged() { SpecialStoragePolicy::NotifyPolicyChanged(); }

 protected:
  ~MockSpecialStoragePolicy() override;

 private:
  std::set<GURL> protected_;
  std::set<GURL> unlimited_;
  std::set<GURL> session_only_;
  std::set<GURL> isolated_;
  std::set<GURL> persistent_;
  std::set<std::string> file_handlers_;

  bool all_unlimited_;
};

}  // namespace storage

#endif  // STORAGE_BROWSER_TEST_MOCK_SPECIAL_STORAGE_POLICY_H_
