// Copyright 2016 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 "components/prefs/in_memory_pref_store.h"

#include <memory>

#include "base/test/scoped_task_environment.h"
#include "base/values.h"
#include "components/prefs/persistent_pref_store_unittest.h"
#include "components/prefs/pref_store_observer_mock.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace {
const char kTestPref[] = "test.pref";

class InMemoryPrefStoreTest : public testing::Test {
 public:
  InMemoryPrefStoreTest() { }

  void SetUp() override { store_ = new InMemoryPrefStore(); }
 protected:
  base::test::ScopedTaskEnvironment scoped_task_environment_;
  scoped_refptr<InMemoryPrefStore> store_;
  PrefStoreObserverMock observer_;
};

TEST_F(InMemoryPrefStoreTest, SetGetValue) {
  const base::Value* value = nullptr;
  base::Value* mutable_value = nullptr;
  EXPECT_FALSE(store_->GetValue(kTestPref, &value));
  EXPECT_FALSE(store_->GetMutableValue(kTestPref, &mutable_value));

  store_->SetValue(kTestPref, std::make_unique<base::Value>(42),
                   WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
  EXPECT_TRUE(store_->GetValue(kTestPref, &value));
  EXPECT_TRUE(base::Value(42).Equals(value));
  EXPECT_TRUE(store_->GetMutableValue(kTestPref, &mutable_value));
  EXPECT_TRUE(base::Value(42).Equals(mutable_value));

  store_->RemoveValue(kTestPref, WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
  EXPECT_FALSE(store_->GetValue(kTestPref, &value));
  EXPECT_FALSE(store_->GetMutableValue(kTestPref, &mutable_value));
}

TEST_F(InMemoryPrefStoreTest, GetSetObserver) {
  // Starts with no observers.
  EXPECT_FALSE(store_->HasObservers());

  // Add one.
  store_->AddObserver(&observer_);
  EXPECT_TRUE(store_->HasObservers());

  // Remove only observer.
  store_->RemoveObserver(&observer_);
  EXPECT_FALSE(store_->HasObservers());
}

TEST_F(InMemoryPrefStoreTest, CallObserver) {
  // With observer included.
  store_->AddObserver(&observer_);

  // Triggers on SetValue.
  store_->SetValue(kTestPref, std::make_unique<base::Value>(42),
                   WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
  observer_.VerifyAndResetChangedKey(kTestPref);

  // And RemoveValue.
  store_->RemoveValue(kTestPref, WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
  observer_.VerifyAndResetChangedKey(kTestPref);

  // But not SetValueSilently.
  store_->SetValueSilently(kTestPref, std::make_unique<base::Value>(42),
                           WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
  EXPECT_EQ(0u, observer_.changed_keys.size());

  // On multiple RemoveValues only the first one triggers observer.
  store_->RemoveValue(kTestPref, WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
  observer_.VerifyAndResetChangedKey(kTestPref);
  store_->RemoveValue(kTestPref, WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
  EXPECT_EQ(0u, observer_.changed_keys.size());

  // Doesn't make call on removed observers.
  store_->RemoveObserver(&observer_);
  store_->SetValue(kTestPref, std::make_unique<base::Value>(42),
                   WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
  store_->RemoveValue(kTestPref, WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
  EXPECT_EQ(0u, observer_.changed_keys.size());
}

TEST_F(InMemoryPrefStoreTest, Initialization) {
  EXPECT_TRUE(store_->IsInitializationComplete());
}

TEST_F(InMemoryPrefStoreTest, ReadOnly) {
  EXPECT_FALSE(store_->ReadOnly());
}

TEST_F(InMemoryPrefStoreTest, GetReadError) {
  EXPECT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE, store_->GetReadError());
}

TEST_F(InMemoryPrefStoreTest, ReadPrefs) {
  EXPECT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE, store_->ReadPrefs());
}

TEST_F(InMemoryPrefStoreTest, CommitPendingWriteWithCallback) {
  TestCommitPendingWriteWithCallback(store_.get(), &scoped_task_environment_);
}

}  // namespace
