//
// Copyright (C) 2012 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

#include "update_engine/common/prefs.h"

#include <inttypes.h>

#include <limits>
#include <string>
#include <vector>

#include <base/files/file_util.h>
#include <base/files/scoped_temp_dir.h>
#include <android-base/macros.h>
#include <base/strings/string_util.h>
#include <android-base/stringprintf.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>

using std::string;
using std::vector;
using testing::_;
using testing::ElementsAre;
using testing::Eq;
using testing::UnorderedElementsAre;

namespace {
// Test key used along the tests.
const char kKey[] = "test-key";
}  // namespace

namespace chromeos_update_engine {

class BasePrefsTest : public ::testing::Test {
 protected:
  void MultiNamespaceKeyTest() {
    ASSERT_TRUE(common_prefs_);
    auto key0 = common_prefs_->CreateSubKey({"ns1", "key"});
    // Corner case for "ns1".
    auto key0corner = common_prefs_->CreateSubKey({"ns11", "key"});
    auto key1A = common_prefs_->CreateSubKey({"ns1", "nsA", "keyA"});
    auto key1B = common_prefs_->CreateSubKey({"ns1", "nsA", "keyB"});
    auto key2 = common_prefs_->CreateSubKey({"ns1", "nsB", "key"});
    // Corner case for "ns1/nsB".
    auto key2corner = common_prefs_->CreateSubKey({"ns1", "nsB1", "key"});
    EXPECT_FALSE(common_prefs_->Exists(key0));
    EXPECT_FALSE(common_prefs_->Exists(key1A));
    EXPECT_FALSE(common_prefs_->Exists(key1B));
    EXPECT_FALSE(common_prefs_->Exists(key2));

    EXPECT_TRUE(common_prefs_->SetString(key0, ""));
    EXPECT_TRUE(common_prefs_->SetString(key0corner, ""));
    EXPECT_TRUE(common_prefs_->SetString(key1A, ""));
    EXPECT_TRUE(common_prefs_->SetString(key1B, ""));
    EXPECT_TRUE(common_prefs_->SetString(key2, ""));
    EXPECT_TRUE(common_prefs_->SetString(key2corner, ""));

    EXPECT_TRUE(common_prefs_->Exists(key0));
    EXPECT_TRUE(common_prefs_->Exists(key0corner));
    EXPECT_TRUE(common_prefs_->Exists(key1A));
    EXPECT_TRUE(common_prefs_->Exists(key1B));
    EXPECT_TRUE(common_prefs_->Exists(key2));
    EXPECT_TRUE(common_prefs_->Exists(key2corner));

    vector<string> keys2;
    EXPECT_TRUE(common_prefs_->GetSubKeys("ns1/nsB/", &keys2));
    EXPECT_THAT(keys2, ElementsAre(key2));
    for (const auto& key : keys2)
      EXPECT_TRUE(common_prefs_->Delete(key));
    EXPECT_TRUE(common_prefs_->Exists(key0));
    EXPECT_TRUE(common_prefs_->Exists(key0corner));
    EXPECT_TRUE(common_prefs_->Exists(key1A));
    EXPECT_TRUE(common_prefs_->Exists(key1B));
    EXPECT_FALSE(common_prefs_->Exists(key2));
    EXPECT_TRUE(common_prefs_->Exists(key2corner));

    vector<string> keys2corner;
    EXPECT_TRUE(common_prefs_->GetSubKeys("ns1/nsB", &keys2corner));
    EXPECT_THAT(keys2corner, ElementsAre(key2corner));
    for (const auto& key : keys2corner)
      EXPECT_TRUE(common_prefs_->Delete(key));
    EXPECT_FALSE(common_prefs_->Exists(key2corner));

    vector<string> keys1;
    EXPECT_TRUE(common_prefs_->GetSubKeys("ns1/nsA/", &keys1));
    EXPECT_THAT(keys1, UnorderedElementsAre(key1A, key1B));
    for (const auto& key : keys1)
      EXPECT_TRUE(common_prefs_->Delete(key));
    EXPECT_TRUE(common_prefs_->Exists(key0));
    EXPECT_TRUE(common_prefs_->Exists(key0corner));
    EXPECT_FALSE(common_prefs_->Exists(key1A));
    EXPECT_FALSE(common_prefs_->Exists(key1B));

    vector<string> keys0;
    EXPECT_TRUE(common_prefs_->GetSubKeys("ns1/", &keys0));
    EXPECT_THAT(keys0, ElementsAre(key0));
    for (const auto& key : keys0)
      EXPECT_TRUE(common_prefs_->Delete(key));
    EXPECT_FALSE(common_prefs_->Exists(key0));
    EXPECT_TRUE(common_prefs_->Exists(key0corner));

    vector<string> keys0corner;
    EXPECT_TRUE(common_prefs_->GetSubKeys("ns1", &keys0corner));
    EXPECT_THAT(keys0corner, ElementsAre(key0corner));
    for (const auto& key : keys0corner)
      EXPECT_TRUE(common_prefs_->Delete(key));
    EXPECT_FALSE(common_prefs_->Exists(key0corner));

    // Test sub directory namespace.
    const string kDlcPrefsSubDir = "foo-dir";
    key1A = common_prefs_->CreateSubKey({kDlcPrefsSubDir, "dlc1", "keyA"});
    EXPECT_TRUE(common_prefs_->SetString(key1A, "fp_1A"));
    key1B = common_prefs_->CreateSubKey({kDlcPrefsSubDir, "dlc1", "keyB"});
    EXPECT_TRUE(common_prefs_->SetString(key1B, "fp_1B"));
    auto key2A = common_prefs_->CreateSubKey({kDlcPrefsSubDir, "dlc2", "keyA"});
    EXPECT_TRUE(common_prefs_->SetString(key2A, "fp_A2"));

    vector<string> fpKeys;
    EXPECT_TRUE(common_prefs_->GetSubKeys(kDlcPrefsSubDir, &fpKeys));
    EXPECT_EQ(fpKeys.size(), 3UL);
    EXPECT_TRUE(common_prefs_->Delete(fpKeys[0]));
    EXPECT_TRUE(common_prefs_->Delete(fpKeys[1]));
    EXPECT_TRUE(common_prefs_->Delete(fpKeys[2]));
    EXPECT_FALSE(common_prefs_->Exists(key1A));
  }

  PrefsInterface* common_prefs_;
};

class PrefsTest : public BasePrefsTest {
 protected:
  void SetUp() override {
    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
    prefs_dir_ = temp_dir_.GetPath();
    ASSERT_TRUE(prefs_.Init(prefs_dir_));
    common_prefs_ = &prefs_;
  }

  bool SetValue(const string& key, const string& value) {
    return base::WriteFile(prefs_dir_.Append(key),
                           value.data(),
                           value.length()) == static_cast<int>(value.length());
  }

  base::ScopedTempDir temp_dir_;
  base::FilePath prefs_dir_;
  Prefs prefs_;
};

TEST(Prefs, Init) {
  Prefs prefs;
  const string ns1 = "ns1";
  const string ns2A = "ns2A";
  const string ns2B = "ns2B";
  const string sub_pref = "sp";

  base::ScopedTempDir temp_dir;
  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
  auto ns1_path = temp_dir.GetPath().Append(ns1);
  auto ns2A_path = ns1_path.Append(ns2A);
  auto ns2B_path = ns1_path.Append(ns2B);
  auto sub_pref_path = ns2A_path.Append(sub_pref);

  EXPECT_TRUE(base::CreateDirectory(ns2B_path));
  EXPECT_TRUE(base::PathExists(ns2B_path));

  EXPECT_TRUE(base::CreateDirectory(sub_pref_path));
  EXPECT_TRUE(base::PathExists(sub_pref_path));

  EXPECT_TRUE(base::PathExists(ns1_path));
  ASSERT_TRUE(prefs.Init(temp_dir.GetPath()));
  EXPECT_FALSE(base::PathExists(ns1_path));
}

TEST_F(PrefsTest, GetFileNameForKey) {
  const char kAllvalidCharsKey[] =
      "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_-";
  base::FilePath path;
  EXPECT_TRUE(prefs_.file_storage_.GetFileNameForKey(kAllvalidCharsKey, &path));
  EXPECT_EQ(prefs_dir_.Append(kAllvalidCharsKey).value(), path.value());
}

TEST_F(PrefsTest, GetFileNameForKeyBadCharacter) {
  base::FilePath path;
  EXPECT_FALSE(prefs_.file_storage_.GetFileNameForKey("ABC abc", &path));
}

TEST_F(PrefsTest, GetFileNameForKeyEmpty) {
  base::FilePath path;
  EXPECT_FALSE(prefs_.file_storage_.GetFileNameForKey("", &path));
}

TEST_F(PrefsTest, CreateSubKey) {
  const string name_space = "ns";
  const string sub_pref1 = "sp1";
  const string sub_pref2 = "sp2";
  const string sub_key = "sk";

  EXPECT_EQ(PrefsInterface::CreateSubKey({name_space, sub_pref1, sub_key}),
            "ns/sp1/sk");
  EXPECT_EQ(PrefsInterface::CreateSubKey({name_space, sub_pref2, sub_key}),
            "ns/sp2/sk");
}

TEST_F(PrefsTest, GetString) {
  const string test_data = "test data";
  ASSERT_TRUE(SetValue(kKey, test_data));
  string value;
  EXPECT_TRUE(prefs_.GetString(kKey, &value));
  EXPECT_EQ(test_data, value);
}

TEST_F(PrefsTest, GetStringBadKey) {
  string value;
  EXPECT_FALSE(prefs_.GetString(",bad", &value));
}

TEST_F(PrefsTest, GetStringNonExistentKey) {
  string value;
  EXPECT_FALSE(prefs_.GetString("non-existent-key", &value));
}

TEST_F(PrefsTest, SetString) {
  const char kValue[] = "some test value\non 2 lines";
  EXPECT_TRUE(prefs_.SetString(kKey, kValue));
  string value;
  EXPECT_TRUE(base::ReadFileToString(prefs_dir_.Append(kKey), &value));
  EXPECT_EQ(kValue, value);
}

TEST_F(PrefsTest, SetStringBadKey) {
  const char kKeyWithDots[] = ".no-dots";
  EXPECT_FALSE(prefs_.SetString(kKeyWithDots, "some value"));
  EXPECT_FALSE(base::PathExists(prefs_dir_.Append(kKeyWithDots)));
}

TEST_F(PrefsTest, SetStringCreateDir) {
  const char kValue[] = "test value";
  base::FilePath subdir = prefs_dir_.Append("subdir1").Append("subdir2");
  EXPECT_TRUE(prefs_.Init(subdir));
  EXPECT_TRUE(prefs_.SetString(kKey, kValue));
  string value;
  EXPECT_TRUE(base::ReadFileToString(subdir.Append(kKey), &value));
  EXPECT_EQ(kValue, value);
}

TEST_F(PrefsTest, SetStringDirCreationFailure) {
  EXPECT_TRUE(prefs_.Init(base::FilePath("/dev/null")));
  EXPECT_FALSE(prefs_.SetString(kKey, "test value"));
}

TEST_F(PrefsTest, SetStringFileCreationFailure) {
  base::CreateDirectory(prefs_dir_.Append(kKey));
  EXPECT_FALSE(prefs_.SetString(kKey, "test value"));
  EXPECT_TRUE(base::DirectoryExists(prefs_dir_.Append(kKey)));
}

TEST_F(PrefsTest, GetInt64) {
  ASSERT_TRUE(SetValue(kKey, " \n 25 \t "));
  int64_t value;
  EXPECT_TRUE(prefs_.GetInt64(kKey, &value));
  EXPECT_EQ(25, value);
}

TEST_F(PrefsTest, GetInt64BadValue) {
  ASSERT_TRUE(SetValue(kKey, "30a"));
  int64_t value;
  EXPECT_FALSE(prefs_.GetInt64(kKey, &value));
}

TEST_F(PrefsTest, GetInt64Max) {
  ASSERT_TRUE(SetValue(kKey,
                       android::base::StringPrintf(
                           "%" PRIi64, std::numeric_limits<int64_t>::max())));
  int64_t value;
  EXPECT_TRUE(prefs_.GetInt64(kKey, &value));
  EXPECT_EQ(std::numeric_limits<int64_t>::max(), value);
}

TEST_F(PrefsTest, GetInt64Min) {
  ASSERT_TRUE(SetValue(kKey,
                       android::base::StringPrintf(
                           "%" PRIi64, std::numeric_limits<int64_t>::min())));
  int64_t value;
  EXPECT_TRUE(prefs_.GetInt64(kKey, &value));
  EXPECT_EQ(std::numeric_limits<int64_t>::min(), value);
}

TEST_F(PrefsTest, GetInt64Negative) {
  ASSERT_TRUE(SetValue(kKey, " \t -100 \n "));
  int64_t value;
  EXPECT_TRUE(prefs_.GetInt64(kKey, &value));
  EXPECT_EQ(-100, value);
}

TEST_F(PrefsTest, GetInt64NonExistentKey) {
  int64_t value;
  EXPECT_FALSE(prefs_.GetInt64("random-key", &value));
}

TEST_F(PrefsTest, SetInt64) {
  EXPECT_TRUE(prefs_.SetInt64(kKey, -123));
  string value;
  EXPECT_TRUE(base::ReadFileToString(prefs_dir_.Append(kKey), &value));
  EXPECT_EQ("-123", value);
}

TEST_F(PrefsTest, SetInt64BadKey) {
  const char kKeyWithSpaces[] = "s p a c e s";
  EXPECT_FALSE(prefs_.SetInt64(kKeyWithSpaces, 20));
  EXPECT_FALSE(base::PathExists(prefs_dir_.Append(kKeyWithSpaces)));
}

TEST_F(PrefsTest, SetInt64Max) {
  EXPECT_TRUE(prefs_.SetInt64(kKey, std::numeric_limits<int64_t>::max()));
  string value;
  EXPECT_TRUE(base::ReadFileToString(prefs_dir_.Append(kKey), &value));
  EXPECT_EQ(android::base::StringPrintf("%" PRIi64,
                                        std::numeric_limits<int64_t>::max()),
            value);
}

TEST_F(PrefsTest, SetInt64Min) {
  EXPECT_TRUE(prefs_.SetInt64(kKey, std::numeric_limits<int64_t>::min()));
  string value;
  EXPECT_TRUE(base::ReadFileToString(prefs_dir_.Append(kKey), &value));
  EXPECT_EQ(android::base::StringPrintf("%" PRIi64,
                                        std::numeric_limits<int64_t>::min()),
            value);
}

TEST_F(PrefsTest, GetBooleanFalse) {
  ASSERT_TRUE(SetValue(kKey, " \n false \t "));
  bool value;
  EXPECT_TRUE(prefs_.GetBoolean(kKey, &value));
  EXPECT_FALSE(value);
}

TEST_F(PrefsTest, GetBooleanTrue) {
  const char kKey[] = "test-key";
  ASSERT_TRUE(SetValue(kKey, " \t true \n "));
  bool value;
  EXPECT_TRUE(prefs_.GetBoolean(kKey, &value));
  EXPECT_TRUE(value);
}

TEST_F(PrefsTest, GetBooleanBadValue) {
  const char kKey[] = "test-key";
  ASSERT_TRUE(SetValue(kKey, "1"));
  bool value;
  EXPECT_FALSE(prefs_.GetBoolean(kKey, &value));
}

TEST_F(PrefsTest, GetBooleanBadEmptyValue) {
  const char kKey[] = "test-key";
  ASSERT_TRUE(SetValue(kKey, ""));
  bool value;
  EXPECT_FALSE(prefs_.GetBoolean(kKey, &value));
}

TEST_F(PrefsTest, GetBooleanNonExistentKey) {
  bool value;
  EXPECT_FALSE(prefs_.GetBoolean("random-key", &value));
}

TEST_F(PrefsTest, SetBooleanTrue) {
  const char kKey[] = "test-bool";
  EXPECT_TRUE(prefs_.SetBoolean(kKey, true));
  string value;
  EXPECT_TRUE(base::ReadFileToString(prefs_dir_.Append(kKey), &value));
  EXPECT_EQ("true", value);
}

TEST_F(PrefsTest, SetBooleanFalse) {
  const char kKey[] = "test-bool";
  EXPECT_TRUE(prefs_.SetBoolean(kKey, false));
  string value;
  EXPECT_TRUE(base::ReadFileToString(prefs_dir_.Append(kKey), &value));
  EXPECT_EQ("false", value);
}

TEST_F(PrefsTest, SetBooleanBadKey) {
  const char kKey[] = "s p a c e s";
  EXPECT_FALSE(prefs_.SetBoolean(kKey, true));
  EXPECT_FALSE(base::PathExists(prefs_dir_.Append(kKey)));
}

TEST_F(PrefsTest, ExistsWorks) {
  // test that the key doesn't exist before we set it.
  EXPECT_FALSE(prefs_.Exists(kKey));

  // test that the key exists after we set it.
  ASSERT_TRUE(prefs_.SetInt64(kKey, 8));
  EXPECT_TRUE(prefs_.Exists(kKey));
}

TEST_F(PrefsTest, DeleteWorks) {
  // test that it's alright to delete a non-existent key.
  EXPECT_TRUE(prefs_.Delete(kKey));

  // delete the key after we set it.
  ASSERT_TRUE(prefs_.SetInt64(kKey, 0));
  EXPECT_TRUE(prefs_.Delete(kKey));

  // make sure it doesn't exist anymore.
  EXPECT_FALSE(prefs_.Exists(kKey));
}

TEST_F(PrefsTest, SetDeleteSubKey) {
  const string name_space = "ns";
  const string sub_pref = "sp";
  const string sub_key1 = "sk1";
  const string sub_key2 = "sk2";
  auto key1 = prefs_.CreateSubKey({name_space, sub_pref, sub_key1});
  auto key2 = prefs_.CreateSubKey({name_space, sub_pref, sub_key2});
  base::FilePath sub_pref_path = prefs_dir_.Append(name_space).Append(sub_pref);

  ASSERT_TRUE(prefs_.SetInt64(key1, 0));
  ASSERT_TRUE(prefs_.SetInt64(key2, 0));
  EXPECT_TRUE(base::PathExists(sub_pref_path.Append(sub_key1)));
  EXPECT_TRUE(base::PathExists(sub_pref_path.Append(sub_key2)));

  ASSERT_TRUE(prefs_.Delete(key1));
  EXPECT_FALSE(base::PathExists(sub_pref_path.Append(sub_key1)));
  EXPECT_TRUE(base::PathExists(sub_pref_path.Append(sub_key2)));
  ASSERT_TRUE(prefs_.Delete(key2));
  EXPECT_FALSE(base::PathExists(sub_pref_path.Append(sub_key2)));
  prefs_.Init(prefs_dir_);
  EXPECT_FALSE(base::PathExists(prefs_dir_.Append(name_space)));
}

TEST_F(PrefsTest, DeletePrefs) {
  const string kPrefsSubDir = "foo-dir";
  const string kFpKey = "kPrefFp";
  const string kNotFpKey = "NotkPrefFp";
  const string kOtherKey = "kPrefNotFp";

  EXPECT_TRUE(prefs_.SetString(kFpKey, "3.000"));
  EXPECT_TRUE(prefs_.SetString(kOtherKey, "not_fp_val"));

  auto key1_fp = prefs_.CreateSubKey({kPrefsSubDir, "id-1", kFpKey});
  EXPECT_TRUE(prefs_.SetString(key1_fp, "3.7"));
  auto key_not_fp = prefs_.CreateSubKey({kPrefsSubDir, "id-1", kOtherKey});
  EXPECT_TRUE(prefs_.SetString(key_not_fp, "not_fp_val"));
  auto key2_fp = prefs_.CreateSubKey({kPrefsSubDir, "id-2", kFpKey});
  EXPECT_TRUE(prefs_.SetString(key2_fp, "3.9"));
  auto key3_fp = prefs_.CreateSubKey({kPrefsSubDir, "id-3", kFpKey});
  EXPECT_TRUE(prefs_.SetString(key3_fp, "3.45"));

  // Pref key does not match full subkey at end, should not delete.
  auto key_middle_fp = prefs_.CreateSubKey({kPrefsSubDir, kFpKey, kOtherKey});
  EXPECT_TRUE(prefs_.SetString(key_middle_fp, "not_fp_val"));
  auto key_end_not_fp = prefs_.CreateSubKey({kPrefsSubDir, "id-1", kNotFpKey});
  EXPECT_TRUE(prefs_.SetString(key_end_not_fp, "not_fp_val"));

  // Delete key in platform and one namespace.
  prefs_.Delete(kFpKey, {kPrefsSubDir});

  EXPECT_FALSE(prefs_.Exists(kFpKey));
  EXPECT_FALSE(prefs_.Exists(key1_fp));
  EXPECT_FALSE(prefs_.Exists(key2_fp));
  EXPECT_FALSE(prefs_.Exists(key3_fp));

  // Check other keys are not deleted.
  EXPECT_TRUE(prefs_.Exists(kOtherKey));
  EXPECT_TRUE(prefs_.Exists(key_not_fp));
  EXPECT_TRUE(prefs_.Exists(key_middle_fp));
  EXPECT_TRUE(prefs_.Exists(key_end_not_fp));
}

TEST_F(PrefsTest, DeleteMultipleNamespaces) {
  const string kFirstSubDir = "foo-dir";
  const string kSecondarySubDir = "bar-dir";
  const string kTertiarySubDir = "ter-dir";
  const string kFpKey = "kPrefFp";

  EXPECT_TRUE(prefs_.SetString(kFpKey, "3.000"));
  // Set pref key in different namespaces.
  auto key1_fp = prefs_.CreateSubKey({kFirstSubDir, "id-1", kFpKey});
  EXPECT_TRUE(prefs_.SetString(key1_fp, "3.7"));
  auto key2_fp = prefs_.CreateSubKey({kSecondarySubDir, "id-3", kFpKey});
  EXPECT_TRUE(prefs_.SetString(key2_fp, "7.45"));
  auto key3_fp = prefs_.CreateSubKey({kTertiarySubDir, "id-3", kFpKey});
  EXPECT_TRUE(prefs_.SetString(key3_fp, "7.45"));

  // Delete key in platform and given namespaces.
  prefs_.Delete(kFpKey, {kFirstSubDir, kSecondarySubDir});

  EXPECT_FALSE(prefs_.Exists(kFpKey));
  EXPECT_FALSE(prefs_.Exists(key1_fp));
  EXPECT_FALSE(prefs_.Exists(key2_fp));

  // Tertiary namespace not given to delete. Key should still exist.
  EXPECT_TRUE(prefs_.Exists(key3_fp));
}

class MockPrefsObserver : public PrefsInterface::ObserverInterface {
 public:
  MOCK_METHOD1(OnPrefSet, void(std::string_view));
  MOCK_METHOD1(OnPrefDeleted, void(std::string_view));
};

TEST_F(PrefsTest, ObserversCalled) {
  MockPrefsObserver mock_obserser;
  prefs_.AddObserver(kKey, &mock_obserser);

  EXPECT_CALL(mock_obserser, OnPrefSet(Eq(kKey)));
  EXPECT_CALL(mock_obserser, OnPrefDeleted(_)).Times(0);
  prefs_.SetString(kKey, "value");
  testing::Mock::VerifyAndClearExpectations(&mock_obserser);

  EXPECT_CALL(mock_obserser, OnPrefSet(_)).Times(0);
  EXPECT_CALL(mock_obserser, OnPrefDeleted(Eq(kKey)));
  prefs_.Delete(kKey);
  testing::Mock::VerifyAndClearExpectations(&mock_obserser);

  auto key1 = prefs_.CreateSubKey({"ns", "sp1", "key1"});
  prefs_.AddObserver(key1, &mock_obserser);

  EXPECT_CALL(mock_obserser, OnPrefSet(key1));
  EXPECT_CALL(mock_obserser, OnPrefDeleted(_)).Times(0);
  prefs_.SetString(key1, "value");
  testing::Mock::VerifyAndClearExpectations(&mock_obserser);

  EXPECT_CALL(mock_obserser, OnPrefSet(_)).Times(0);
  EXPECT_CALL(mock_obserser, OnPrefDeleted(Eq(key1)));
  prefs_.Delete(key1);
  testing::Mock::VerifyAndClearExpectations(&mock_obserser);

  prefs_.RemoveObserver(kKey, &mock_obserser);
}

TEST_F(PrefsTest, OnlyCalledOnObservedKeys) {
  MockPrefsObserver mock_obserser;
  const char kUnusedKey[] = "unused-key";
  prefs_.AddObserver(kUnusedKey, &mock_obserser);

  EXPECT_CALL(mock_obserser, OnPrefSet(_)).Times(0);
  EXPECT_CALL(mock_obserser, OnPrefDeleted(_)).Times(0);
  prefs_.SetString(kKey, "value");
  prefs_.Delete(kKey);

  prefs_.RemoveObserver(kUnusedKey, &mock_obserser);
}

TEST_F(PrefsTest, RemovedObserversNotCalled) {
  MockPrefsObserver mock_obserser_a, mock_obserser_b;
  prefs_.AddObserver(kKey, &mock_obserser_a);
  prefs_.AddObserver(kKey, &mock_obserser_b);
  EXPECT_CALL(mock_obserser_a, OnPrefSet(_)).Times(2);
  EXPECT_CALL(mock_obserser_b, OnPrefSet(_)).Times(1);
  EXPECT_TRUE(prefs_.SetString(kKey, "value"));
  prefs_.RemoveObserver(kKey, &mock_obserser_b);
  EXPECT_TRUE(prefs_.SetString(kKey, "other value"));
  prefs_.RemoveObserver(kKey, &mock_obserser_a);
  EXPECT_TRUE(prefs_.SetString(kKey, "yet another value"));
}

TEST_F(PrefsTest, UnsuccessfulCallsNotObserved) {
  MockPrefsObserver mock_obserser;
  const char kInvalidKey[] = "no spaces or .";
  prefs_.AddObserver(kInvalidKey, &mock_obserser);

  EXPECT_CALL(mock_obserser, OnPrefSet(_)).Times(0);
  EXPECT_CALL(mock_obserser, OnPrefDeleted(_)).Times(0);
  EXPECT_FALSE(prefs_.SetString(kInvalidKey, "value"));
  EXPECT_FALSE(prefs_.Delete(kInvalidKey));

  prefs_.RemoveObserver(kInvalidKey, &mock_obserser);
}

TEST_F(PrefsTest, MultiNamespaceKeyTest) {
  MultiNamespaceKeyTest();
}

class MemoryPrefsTest : public BasePrefsTest {
 protected:
  void SetUp() override { common_prefs_ = &prefs_; }

  MemoryPrefs prefs_;
};

TEST_F(MemoryPrefsTest, BasicTest) {
  EXPECT_FALSE(prefs_.Exists(kKey));
  int64_t value = 0;
  EXPECT_FALSE(prefs_.GetInt64(kKey, &value));

  EXPECT_TRUE(prefs_.SetInt64(kKey, 1234));
  EXPECT_TRUE(prefs_.Exists(kKey));
  EXPECT_TRUE(prefs_.GetInt64(kKey, &value));
  EXPECT_EQ(1234, value);

  EXPECT_TRUE(prefs_.Delete(kKey));
  EXPECT_FALSE(prefs_.Exists(kKey));
  EXPECT_TRUE(prefs_.Delete(kKey));

  auto key = prefs_.CreateSubKey({"ns", "sp", "sk"});
  ASSERT_TRUE(prefs_.SetInt64(key, 0));
  EXPECT_TRUE(prefs_.Exists(key));
  EXPECT_TRUE(prefs_.Delete(kKey));
}

TEST_F(MemoryPrefsTest, MultiNamespaceKeyTest) {
  MultiNamespaceKeyTest();
}

}  // namespace chromeos_update_engine
