// Copyright 2018 The Chromium OS 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 "shill/json_store.h"

#include <array>
#include <limits>
#include <memory>
#include <set>
#include <string>
#include <utility>
#include <vector>

#include <base/files/file_enumerator.h>
#include <base/files/file_util.h>
#include <base/files/scoped_temp_dir.h>
#include <base/strings/string_util.h>
#include <gtest/gtest.h>

#include "shill/mock_log.h"

using base::FileEnumerator;
using base::FilePath;
using base::ScopedTempDir;
using std::array;
using std::pair;
using std::set;
using std::string;
using std::unique_ptr;
using std::vector;
using testing::_;
using testing::AnyNumber;
using testing::ContainsRegex;
using testing::HasSubstr;
using testing::StartsWith;
using testing::Test;

namespace shill {

class JsonStoreTest : public Test {
 public:
  JsonStoreTest()
      : kStringWithEmbeddedNulls({0, 'a', 0, 'z'}),
        kNonUtf8String("ab\xc0") {}

  void SetUp() override {
    ScopeLogger::GetInstance()->EnableScopesByName("+storage");
    ASSERT_FALSE(base::IsStringUTF8(kNonUtf8String));
    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
    test_file_ = temp_dir_.GetPath().Append("test-json-store");
    store_.reset(new JsonStore(test_file_));
    EXPECT_CALL(log_, Log(_, _, _)).Times(AnyNumber());
  }

  void TearDown() override {
    ScopeLogger::GetInstance()->EnableScopesByName("-storage");
    ScopeLogger::GetInstance()->set_verbose_level(0);
  }

 protected:
  void SetVerboseLevel(int new_level);
  void SetJsonFileContents(const string& data);

  const string kStringWithEmbeddedNulls;
  const string kNonUtf8String;
  ScopedTempDir temp_dir_;
  FilePath test_file_;
  unique_ptr<JsonStore> store_;
  ScopedMockLog log_;
};

void JsonStoreTest::SetVerboseLevel(int new_level) {
  ScopeLogger::GetInstance()->set_verbose_level(new_level);
}

void JsonStoreTest::SetJsonFileContents(const string& data) {
  EXPECT_EQ(data.size(),
            base::WriteFile(test_file_, data.data(), data.size()));
}

// In memory operations: basic storage and retrieval.
TEST_F(JsonStoreTest, StringsCanBeStoredInMemory) {
  const array<string, 5> our_values{
    {"", "hello", "world\n", kStringWithEmbeddedNulls, kNonUtf8String}};
  for (const auto& our_value : our_values) {
    string value_from_store;
    EXPECT_TRUE(store_->SetString("group_a", "knob_1", our_value));
    EXPECT_TRUE(store_->GetString("group_a", "knob_1", &value_from_store));
    EXPECT_EQ(our_value, value_from_store);
  }
}

TEST_F(JsonStoreTest, BoolsCanBeStoredInMemory) {
  const array<bool, 2> our_values{{false, true}};
  for (const auto& our_value : our_values) {
    bool value_from_store;
    EXPECT_TRUE(store_->SetBool("group_a", "knob_1", our_value));
    EXPECT_TRUE(store_->GetBool("group_a", "knob_1", &value_from_store));
    EXPECT_EQ(our_value, value_from_store);
  }
}

TEST_F(JsonStoreTest, IntsCanBeStoredInMemory) {
  const array<int, 3> our_values{{
      std::numeric_limits<int>::min(), 0, std::numeric_limits<int>::max()}};
  for (const auto& our_value : our_values) {
    int value_from_store;
    EXPECT_TRUE(store_->SetInt("group_a", "knob_1", our_value));
    EXPECT_TRUE(store_->GetInt("group_a", "knob_1", &value_from_store));
    EXPECT_EQ(our_value, value_from_store);
  }
}

TEST_F(JsonStoreTest, Uint64sCanBeStoredInMemory) {
  const array<uint64_t, 3> our_values{{
      std::numeric_limits<uint64_t>::min(),
      0,
      std::numeric_limits<uint64_t>::max()}};
  for (const auto& our_value : our_values) {
    uint64_t value_from_store;
    EXPECT_TRUE(store_->SetUint64("group_a", "knob_1", our_value));
    EXPECT_TRUE(store_->GetUint64("group_a", "knob_1", &value_from_store));
    EXPECT_EQ(our_value, value_from_store);
  }
}

TEST_F(JsonStoreTest, StringListsCanBeStoredInMemory) {
  const array<vector<string>, 7> our_values{{
      vector<string>{},
      vector<string>{""},
      vector<string>{"a"},
      vector<string>{"", "a"},
      vector<string>{"a", ""},
      vector<string>{"", "a", ""},
      vector<string>{"a", "b", "c", kStringWithEmbeddedNulls, kNonUtf8String}}};
  for (const auto& our_value : our_values) {
    vector<string> value_from_store;
    EXPECT_TRUE(store_->SetStringList("group_a", "knob_1", our_value));
    EXPECT_TRUE(store_->GetStringList("group_a", "knob_1", &value_from_store));
    EXPECT_EQ(our_value, value_from_store);
  }
}

TEST_F(JsonStoreTest, CryptedStringsCanBeStoredInMemory) {
  const array<string, 5> our_values{{
      string(), string("some stuff"), kStringWithEmbeddedNulls, kNonUtf8String
  }};
  for (const auto& our_value : our_values) {
    string value_from_store;
    EXPECT_TRUE(store_->SetCryptedString("group_a", "knob_1", our_value));
    EXPECT_TRUE(
        store_->GetCryptedString("group_a", "knob_1", &value_from_store));
    EXPECT_EQ(our_value, value_from_store);
  }
}

TEST_F(JsonStoreTest, RawValuesOfCryptedStringsDifferFromOriginalValues) {
  const array<string, 3> our_values{{
      string("simple string"), kStringWithEmbeddedNulls, kNonUtf8String
  }};
  for (const auto& our_value : our_values) {
    string raw_value_from_store;
    EXPECT_TRUE(store_->SetCryptedString("group_a", "knob_1", our_value));
    EXPECT_TRUE(store_->GetString("group_a", "knob_1", &raw_value_from_store));
    EXPECT_NE(our_value, raw_value_from_store);
  }
}

TEST_F(JsonStoreTest, DifferentGroupsCanHaveDifferentValuesForSameKey) {
  store_->SetString("group_a", "knob_1", "value_1");
  store_->SetString("group_b", "knob_1", "value_2");

  string value_from_store;
  EXPECT_TRUE(store_->GetString("group_a", "knob_1", &value_from_store));
  EXPECT_EQ("value_1", value_from_store);
  EXPECT_TRUE(store_->GetString("group_b", "knob_1", &value_from_store));
  EXPECT_EQ("value_2", value_from_store);
}

// In memory operations: presence checking.
TEST_F(JsonStoreTest, CanUseNullptrToCheckPresenceOfKey) {
  SetVerboseLevel(10);

  EXPECT_CALL(log_, Log(_, _, HasSubstr("Could not find group"))).Times(6);
  EXPECT_FALSE(store_->GetString("group_a", "string_knob", nullptr));
  EXPECT_FALSE(store_->GetBool("group_a", "bool_knob", nullptr));
  EXPECT_FALSE(store_->GetInt("group_a", "int_knob", nullptr));
  EXPECT_FALSE(store_->GetUint64("group_a", "uint64_knob", nullptr));
  EXPECT_FALSE(store_->GetStringList("group_a", "string_list_knob", nullptr));
  EXPECT_FALSE(
      store_->GetCryptedString("group_a", "crypted_string_knob", nullptr));

  ASSERT_TRUE(store_->SetString("group_a", "random_knob", "random value"));
  EXPECT_CALL(log_, Log(_, _, HasSubstr("Could not find property"))).Times(6);
  EXPECT_FALSE(store_->GetString("group_a", "string_knob", nullptr));
  EXPECT_FALSE(store_->GetBool("group_a", "bool_knob", nullptr));
  EXPECT_FALSE(store_->GetInt("group_a", "int_knob", nullptr));
  EXPECT_FALSE(store_->GetUint64("group_a", "uint64_knob", nullptr));
  EXPECT_FALSE(store_->GetStringList("group_a", "string_list_knob", nullptr));
  EXPECT_FALSE(
      store_->GetCryptedString("group_a", "crypted_string_knob", nullptr));

  ASSERT_TRUE(store_->SetString("group_a", "string_knob", "stuff goes here"));
  ASSERT_TRUE(store_->SetBool("group_a", "bool_knob", true));
  ASSERT_TRUE(store_->SetInt("group_a", "int_knob", -1));
  ASSERT_TRUE(store_->SetUint64("group_a", "uint64_knob", 1));
  ASSERT_TRUE(store_->SetStringList(
      "group_a", "string_list_knob", vector<string>{{"hello"}}));
  ASSERT_TRUE(
      store_->SetCryptedString("group_a", "crypted_string_knob", "s3kr!t"));

  EXPECT_TRUE(store_->GetString("group_a", "string_knob", nullptr));
  EXPECT_TRUE(store_->GetBool("group_a", "bool_knob", nullptr));
  EXPECT_TRUE(store_->GetInt("group_a", "int_knob", nullptr));
  EXPECT_TRUE(store_->GetUint64("group_a", "uint64_knob", nullptr));
  EXPECT_TRUE(store_->GetStringList("group_a", "string_list_knob", nullptr));
  EXPECT_TRUE(
      store_->GetCryptedString("group_a", "crypted_string_knob", nullptr));
}

// In memory operations: access to missing elements.
TEST_F(JsonStoreTest, GetFromEmptyStoreFails) {
  bool value_from_store;
  SetVerboseLevel(10);
  EXPECT_CALL(log_, Log(_, _, HasSubstr("Could not find group")));
  EXPECT_FALSE(store_->GetBool("group_a", "knob_1", &value_from_store));
}

TEST_F(JsonStoreTest, GetFromNonexistentGroupAndKeyFails) {
  bool value_from_store;
  SetVerboseLevel(10);
  EXPECT_TRUE(store_->SetBool("group_a", "knob_1", true));
  EXPECT_CALL(log_, Log(_, _, HasSubstr("Could not find group")));
  EXPECT_FALSE(store_->GetBool("group_b", "knob_1", &value_from_store));
}

TEST_F(JsonStoreTest, GetOfNonexistentPropertyFails) {
  bool value_from_store;
  SetVerboseLevel(10);
  EXPECT_TRUE(store_->SetBool("group_a", "knob_1", true));
  EXPECT_CALL(log_, Log(_, _, HasSubstr("Could not find property")));
  EXPECT_FALSE(store_->GetBool("group_a", "knob_2", &value_from_store));
}

TEST_F(JsonStoreTest, GetOfPropertyFromWrongGroupFails) {
  bool value_from_store;
  SetVerboseLevel(10);
  EXPECT_TRUE(store_->SetBool("group_a", "knob_1", true));
  EXPECT_CALL(log_, Log(_, _, HasSubstr("Could not find group")));
  EXPECT_FALSE(store_->GetBool("group_b", "knob_1", &value_from_store));
}

TEST_F(JsonStoreTest, GetDoesNotMatchOnValue) {
  string value_from_store;
  SetVerboseLevel(10);
  EXPECT_TRUE(store_->SetString("group_a", "knob_1", "value_1"));
  EXPECT_CALL(log_, Log(_, _, HasSubstr("Could not find property")));
  EXPECT_FALSE(store_->GetString("group_a", "value_1", &value_from_store));
}

// In memory operations: type conversions on read.
TEST_F(JsonStoreTest, ConversionFromStringIsProhibited) {
  EXPECT_CALL(
      log_,
      Log(logging::LOG_ERROR, _,
          ContainsRegex("Can not read \\|.+\\| from \\|.+\\|"))).Times(4);
  EXPECT_TRUE(store_->SetString("group_a", "knob_1", "stuff goes here"));
  EXPECT_FALSE(store_->GetBool("group_a", "knob_1", nullptr));
  EXPECT_FALSE(store_->GetInt("group_a", "knob_1", nullptr));
  EXPECT_FALSE(store_->GetUint64("group_a", "knob_1", nullptr));
  EXPECT_FALSE(store_->GetStringList("group_a", "knob_1", nullptr));
  // We deliberately omit checking store_->GetCryptedString(). While
  // this "works" right now, it's not something we're committed to.
}

TEST_F(JsonStoreTest, ConversionFromBoolIsProhibited) {
  EXPECT_CALL(
      log_,
      Log(logging::LOG_ERROR, _,
          ContainsRegex("Can not read \\|.+\\| from \\|.+\\|"))).Times(5);
  EXPECT_TRUE(store_->SetBool("group_a", "knob_1", true));
  EXPECT_FALSE(store_->GetString("group_a", "knob_1", nullptr));
  EXPECT_FALSE(store_->GetInt("group_a", "knob_1", nullptr));
  EXPECT_FALSE(store_->GetUint64("group_a", "knob_1", nullptr));
  EXPECT_FALSE(store_->GetStringList("group_a", "knob_1", nullptr));
  EXPECT_FALSE(store_->GetCryptedString("group_a", "knob_1", nullptr));
}

TEST_F(JsonStoreTest, ConversionFromIntIsProhibited) {
  EXPECT_CALL(
      log_,
      Log(logging::LOG_ERROR, _,
          ContainsRegex("Can not read \\|.+\\| from \\|.+\\|"))).Times(5);
  EXPECT_TRUE(store_->SetInt("group_a", "knob_1", -1));
  EXPECT_FALSE(store_->GetString("group_a", "knob_1", nullptr));
  EXPECT_FALSE(store_->GetBool("group_a", "knob_1", nullptr));
  EXPECT_FALSE(store_->GetUint64("group_a", "knob_1", nullptr));
  EXPECT_FALSE(store_->GetStringList("group_a", "knob_1", nullptr));
  EXPECT_FALSE(store_->GetCryptedString("group_a", "knob_1", nullptr));
}

TEST_F(JsonStoreTest, ConversionFromUint64IsProhibited) {
  EXPECT_CALL(
      log_,
      Log(logging::LOG_ERROR, _,
          ContainsRegex("Can not read \\|.+\\| from \\|.+\\|"))).Times(5);
  EXPECT_TRUE(store_->SetUint64("group_a", "knob_1", 1));
  EXPECT_FALSE(store_->GetString("group_a", "knob_1", nullptr));
  EXPECT_FALSE(store_->GetBool("group_a", "knob_1", nullptr));
  EXPECT_FALSE(store_->GetInt("group_a", "knob_1", nullptr));
  EXPECT_FALSE(store_->GetStringList("group_a", "knob_1", nullptr));
  EXPECT_FALSE(store_->GetCryptedString("group_a", "knob_1", nullptr));
}

TEST_F(JsonStoreTest, ConversionFromStringListIsProhibited) {
  EXPECT_CALL(
      log_,
      Log(logging::LOG_ERROR, _,
          ContainsRegex("Can not read \\|.+\\| from \\|.+\\|"))).Times(5);
  EXPECT_TRUE(store_->SetStringList(
      "group_a", "knob_1", vector<string>{{"hello"}}));
  EXPECT_FALSE(store_->GetString("group_a", "knob_1", nullptr));
  EXPECT_FALSE(store_->GetBool("group_a", "knob_1", nullptr));
  EXPECT_FALSE(store_->GetInt("group_a", "knob_1", nullptr));
  EXPECT_FALSE(store_->GetUint64("group_a", "knob_1", nullptr));
  EXPECT_FALSE(store_->GetCryptedString("group_a", "knob_1", nullptr));
}

TEST_F(JsonStoreTest, ConversionFromCryptedStringIsProhibited) {
  EXPECT_CALL(
      log_,
      Log(logging::LOG_ERROR, _,
          ContainsRegex("Can not read \\|.+\\| from \\|.+\\|"))).Times(4);
  EXPECT_TRUE(store_->SetCryptedString("group_a", "knob_1", "s3kr!t"));
  // We deliberately omit checking store_->GetString(). While this
  // "works" right now, it's not something we're committed to.
  EXPECT_FALSE(store_->GetBool("group_a", "knob_1", nullptr));
  EXPECT_FALSE(store_->GetInt("group_a", "knob_1", nullptr));
  EXPECT_FALSE(store_->GetUint64("group_a", "knob_1", nullptr));
  EXPECT_FALSE(store_->GetStringList("group_a", "knob_1", nullptr));
}

// In memory operations: key deletion.
TEST_F(JsonStoreTest, DeleteKeyDeletesExistingKey) {
  SetVerboseLevel(10);
  store_->SetBool("group_a", "knob_1", bool());
  EXPECT_TRUE(store_->DeleteKey("group_a", "knob_1"));
  EXPECT_CALL(log_, Log(_, _, HasSubstr("Could not find property")));
  EXPECT_FALSE(store_->GetBool("group_a", "knob_1", nullptr));
}

TEST_F(JsonStoreTest, DeleteKeyDeletesOnlySpecifiedKey) {
  store_->SetBool("group_a", "knob_1", bool());
  store_->SetBool("group_a", "knob_2", bool());
  EXPECT_TRUE(store_->DeleteKey("group_a", "knob_1"));
  EXPECT_FALSE(store_->GetBool("group_a", "knob_1", nullptr));
  EXPECT_TRUE(store_->GetBool("group_a", "knob_2", nullptr));
}

TEST_F(JsonStoreTest, DeleteKeySucceedsOnMissingKey) {
  store_->SetBool("group_a", "knob_1", bool());
  EXPECT_TRUE(store_->DeleteKey("group_a", "knob_2"));
  EXPECT_TRUE(store_->GetBool("group_a", "knob_1", nullptr));
}

TEST_F(JsonStoreTest, DeleteKeyFailsWhenGivenWrongGroup) {
  SetVerboseLevel(10);
  store_->SetBool("group_a", "knob_1", bool());
  EXPECT_CALL(log_, Log(_, _, HasSubstr("Could not find group")));
  EXPECT_FALSE(store_->DeleteKey("group_b", "knob_1"));
  EXPECT_TRUE(store_->GetBool("group_a", "knob_1", nullptr));
}

// In memory operations: group operations.
TEST_F(JsonStoreTest, EmptyStoreReturnsNoGroups) {
  EXPECT_EQ(set<string>(), store_->GetGroups());
  EXPECT_EQ(set<string>(), store_->GetGroupsWithKey("knob_1"));
  EXPECT_EQ(set<string>(), store_->GetGroupsWithProperties(KeyValueStore()));
}

TEST_F(JsonStoreTest, GetGroupsReturnsAllGroups) {
  store_->SetBool("group_a", "knob_1", bool());
  store_->SetBool("group_b", "knob_1", bool());
  EXPECT_EQ(set<string>({"group_a", "group_b"}), store_->GetGroups());
}

TEST_F(JsonStoreTest, GetGroupsWithKeyReturnsAllMatchingGroups) {
  store_->SetBool("group_a", "knob_1", bool());
  store_->SetBool("group_b", "knob_1", bool());
  EXPECT_EQ(set<string>({"group_a", "group_b"}),
            store_->GetGroupsWithKey("knob_1"));
}

TEST_F(JsonStoreTest, GetGroupsWithKeyReturnsOnlyMatchingGroups) {
  store_->SetBool("group_a", "knob_1", bool());
  store_->SetBool("group_b", "knob_2", bool());
  EXPECT_EQ(set<string>({"group_a"}), store_->GetGroupsWithKey("knob_1"));
}

TEST_F(JsonStoreTest, GetGroupsWithPropertiesReturnsAllMatchingGroups) {
  store_->SetBool("group_a", "knob_1", true);
  store_->SetBool("group_b", "knob_1", true);

  KeyValueStore required_properties;
  required_properties.SetBool("knob_1", true);
  EXPECT_EQ(set<string>({"group_a", "group_b"}),
            store_->GetGroupsWithProperties(required_properties));
}

TEST_F(JsonStoreTest, GetGroupsWithPropertiesReturnsOnlyMatchingGroups) {
  store_->SetBool("group_a", "knob_1", true);
  store_->SetBool("group_b", "knob_1", false);

  KeyValueStore required_properties;
  required_properties.SetBool("knob_1", true);
  EXPECT_EQ(set<string>({"group_a"}),
            store_->GetGroupsWithProperties(required_properties));
}

TEST_F(JsonStoreTest, GetGroupsWithPropertiesCanMatchOnMultipleProperties) {
  store_->SetBool("group_a", "knob_1", true);
  store_->SetBool("group_a", "knob_2", true);
  store_->SetBool("group_b", "knob_1", true);
  store_->SetBool("group_b", "knob_2", false);

  KeyValueStore required_properties;
  required_properties.SetBool("knob_1", true);
  required_properties.SetBool("knob_2", true);
  EXPECT_EQ(set<string>({"group_a"}),
            store_->GetGroupsWithProperties(required_properties));
}

TEST_F(JsonStoreTest, GetGroupsWithPropertiesChecksValuesForBoolIntAndString) {
  // Documentation in StoreInterface says GetGroupsWithProperties
  // checks only Bool, Int, and String properties. For now, we interpret
  // that permissively. i.e., checking other types is not guaranteed one
  // way or the other.
  //
  // Said differently: we test that that Bool, Int, and String are
  // supported. But we don't test that other types are ignored. (In
  // fact, JsonStore supports filtering on uint64 and StringList as
  // well. JsonStore does not, however, support filtering on
  // CryptedStrings.)
  //
  // This should be fine, as StoreInterface clients currently only use
  // String value filtering.
  const brillo::VariantDictionary exact_matcher({
      {"knob_1", string("good-string")},
      {"knob_2", bool{true}},
      {"knob_3", int{1}},
    });
  store_->SetString("group_a", "knob_1", "good-string");
  store_->SetBool("group_a", "knob_2", true);
  store_->SetInt("group_a", "knob_3", 1);

  {
    KeyValueStore correct_properties;
    KeyValueStore::ConvertFromVariantDictionary(
        exact_matcher, &correct_properties);
    EXPECT_EQ(set<string>({"group_a"}),
              store_->GetGroupsWithProperties(correct_properties));
  }

  const vector<pair<string, brillo::Any>> bad_matchers({
      {"knob_1", string("bad-string")},
      {"knob_2", bool{false}},
      {"knob_3", int{2}},
    });
  for (const auto& match_key_and_value : bad_matchers) {
    const auto& match_key = match_key_and_value.first;
    const auto& match_value = match_key_and_value.second;
    brillo::VariantDictionary bad_matcher_dict(exact_matcher);
    KeyValueStore bad_properties;
    bad_matcher_dict[match_key] = match_value;
    KeyValueStore::ConvertFromVariantDictionary(
        bad_matcher_dict, &bad_properties);
    EXPECT_EQ(set<string>(), store_->GetGroupsWithProperties(bad_properties))
        << "Failing match key: " << match_key;
  }
}

TEST_F(JsonStoreTest, ContainsGroupFindsExistingGroup) {
  store_->SetBool("group_a", "knob_1", bool());
  EXPECT_TRUE(store_->ContainsGroup("group_a"));
}

TEST_F(JsonStoreTest, ContainsGroupDoesNotFabricateGroups) {
  EXPECT_FALSE(store_->ContainsGroup("group_a"));
}

TEST_F(JsonStoreTest, DeleteGroupDeletesExistingGroup) {
  SetVerboseLevel(10);
  store_->SetBool("group_a", "knob_1", bool());
  store_->SetBool("group_a", "knob_2", bool());
  EXPECT_TRUE(store_->DeleteGroup("group_a"));
  EXPECT_CALL(log_, Log(_, _, HasSubstr("Could not find group"))).Times(2);
  EXPECT_FALSE(store_->GetBool("group_a", "knob_1", nullptr));
  EXPECT_FALSE(store_->GetBool("group_a", "knob_2", nullptr));
}

TEST_F(JsonStoreTest, DeleteGroupDeletesOnlySpecifiedGroup) {
  store_->SetBool("group_a", "knob_1", bool());
  store_->SetBool("group_b", "knob_1", bool());
  EXPECT_TRUE(store_->DeleteGroup("group_a"));
  EXPECT_FALSE(store_->GetBool("group_a", "knob_1", nullptr));
  EXPECT_TRUE(store_->GetBool("group_b", "knob_1", nullptr));
}

TEST_F(JsonStoreTest, DeleteGroupSucceedsOnMissingGroup) {
  store_->SetBool("group_a", "knob_1", bool());
  EXPECT_TRUE(store_->DeleteGroup("group_b"));
  EXPECT_TRUE(store_->GetBool("group_a", "knob_1", nullptr));
}

// File open: basic file structure.
TEST_F(JsonStoreTest, OpenSucceedsOnNonExistentFile) {
  // If the file does not already exist, we assume the caller will
  // give us data later.
  EXPECT_TRUE(store_->Open());
}

TEST_F(JsonStoreTest, OpenFailsOnNonJsonData) {
  SetJsonFileContents("some random junk");
  EXPECT_CALL(log_,
              Log(logging::LOG_ERROR, _,
                  StartsWith("Failed to parse JSON data")));
  EXPECT_FALSE(store_->Open());
}

// File open: root element handling.
TEST_F(JsonStoreTest, OpenFailsWhenRootIsNonDictionary) {
  SetJsonFileContents("\"a string\"");
  EXPECT_CALL(log_,
              Log(logging::LOG_ERROR, _,
                  StartsWith("JSON value is not a dictionary")));
  EXPECT_FALSE(store_->Open());
}

TEST_F(JsonStoreTest, OpenWarnsOnRootDictionaryWithNonStringDescription) {
  SetJsonFileContents("{\"description\": 1}");
  EXPECT_CALL(
      log_,
      Log(logging::LOG_WARNING, _, HasSubstr("|description| is not a string")));
  store_->Open();
}

TEST_F(JsonStoreTest, OpenFailsOnRootDictionaryWithoutSettings) {
  SetJsonFileContents("{}");
  EXPECT_CALL(log_,
              Log(logging::LOG_ERROR, _,
                  StartsWith("Property |settings| is missing")));
  EXPECT_FALSE(store_->Open());
}

// File open: settings element handling.
TEST_F(JsonStoreTest, OpenSucceedsOnEmptySettings) {
  SetJsonFileContents("{\"settings\": {}}");
  EXPECT_TRUE(store_->Open());
}

TEST_F(JsonStoreTest, OpenFailsWhenSettingsIsNonDictionary) {
  SetJsonFileContents("{\"settings\": 1}");
  EXPECT_CALL(log_,
              Log(logging::LOG_ERROR, _,
                  StartsWith("Property |settings| is not a dictionary")));
  EXPECT_FALSE(store_->Open());
}

// File open: group structure.
TEST_F(JsonStoreTest, OpenSucceedsOnEmptyGroup) {
  SetJsonFileContents(
      "{\"settings\": {"
      "    \"group_a\": {}"
      "}}");
  EXPECT_TRUE(store_->Open());
}

TEST_F(JsonStoreTest, OpenFailsWhenGroupIsNonDictionary) {
  SetJsonFileContents(
      "{\"settings\": {"
      "    \"group_a\": 1"
      "}}");
  EXPECT_CALL(log_,
              Log(logging::LOG_ERROR, _,
                  StartsWith("Group |group_a| is not a dictionary")));
  EXPECT_FALSE(store_->Open());
}

// File open: each supported property type (with selected valid
// values for each type), ordered by base::Value::Type enum.  Types
// which are not supported by base::Value are ordered as
// TYPE_DICTIONARY.
TEST_F(JsonStoreTest, OpenSucceedsOnSettingWithBooleanValue) {
  SetJsonFileContents(
      "{\"settings\": {"
      "    \"group_a\": {"
      "        \"knob_1\": true"
      "}}}");
  EXPECT_TRUE(store_->Open());
}

TEST_F(JsonStoreTest, OpenSucceedsOnSettingWithMinIntegerValue) {
  SetJsonFileContents(
      "{\"settings\": {"
      "    \"group_a\": {"
      "        \"knob_1\": -2147483648"  // -2^31
      "}}}");
  EXPECT_TRUE(store_->Open());
}

TEST_F(JsonStoreTest, OpenSucceedsOnSettingWithMaxIntegerValue) {
  SetJsonFileContents(
      "{\"settings\": {"
      "    \"group_a\": {"
      "        \"knob_1\": 2147483647"  // 2^31-1
      "}}}");
  EXPECT_TRUE(store_->Open());
}

TEST_F(JsonStoreTest, OpenSucceedsOnSettingWithStringValue) {
  SetJsonFileContents(
      "{\"settings\": {"
      "    \"group_a\": {"
      "        \"knob_1\": \"this is \\\"a\\\" string\\n\""
      "}}}");
  EXPECT_TRUE(store_->Open());
}

TEST_F(JsonStoreTest, OpenSucceedsOnSettingWithEscapedStringValue) {
  SetJsonFileContents(
      "{\"settings\": {"
      "    \"group_a\": {"
      "        \"knob_1\": {"
      "            \"_native_type\": \"non_ascii_string\","
      "            \"_encoded_value\": \"0001020304\""
      "}}}}");
  EXPECT_TRUE(store_->Open());
}

TEST_F(JsonStoreTest, OpenSucceedsOnSettingWithMinUint64Value) {
  SetJsonFileContents(
      "{\"settings\": {"
      "    \"group_a\": {"
      "        \"knob_1\": {"
      "            \"_native_type\": \"uint64\","
      "            \"_encoded_value\": \"0\""  // 2^64-1
      "}}}}");
  EXPECT_TRUE(store_->Open());
}

TEST_F(JsonStoreTest, OpenSucceedsOnSettingWithMaxUint64Value) {
  SetJsonFileContents(
      "{\"settings\": {"
      "    \"group_a\": {"
      "        \"knob_1\": {"
      "            \"_native_type\": \"uint64\","
      "            \"_encoded_value\": \"18446744073709551615\""  // 2^64-1
      "}}}}");
  EXPECT_TRUE(store_->Open());
}

TEST_F(JsonStoreTest, OpenSucceedsOnSettingWithEmptyListValue) {
  // Empty list is presumed to be an empty string list.
  SetJsonFileContents(
      "{\"settings\": {"
      "    \"group_a\": {"
      "        \"knob_1\": []"
      "}}}");
  EXPECT_TRUE(store_->Open());
}

TEST_F(JsonStoreTest, OpenSucceedsOnSettingWithStringListValueWithSingleItem) {
  SetJsonFileContents(
      "{\"settings\": {"
      "    \"group_a\": {"
      "        \"knob_1\": [ \"a string\" ]"
      "}}}");
  EXPECT_TRUE(store_->Open());
}

TEST_F(
    JsonStoreTest, OpenSucceedsOnSettingWithStringListValueWithMultipleItems) {
  SetJsonFileContents(
      "{\"settings\": {"
      "    \"group_a\": {"
      "        \"knob_1\": [ \"string 1\", \"string 2\\n\" ]"
      "}}}");
  EXPECT_TRUE(store_->Open());
}

TEST_F(JsonStoreTest, OpenSucceedsOnSettingWhenStringListHasEscapedItem) {
  SetJsonFileContents(
      "{\"settings\": {"
      "    \"group_a\": {"
      "        \"knob_1\": [{"
      "            \"_native_type\": \"non_ascii_string\","
      "            \"_encoded_value\": \"0001020304\""
      "}]}}}");
  EXPECT_TRUE(store_->Open());
}

TEST_F(JsonStoreTest,
       OpenSucceedsOnSettingWhenStringListHasEscapedAndUnescapedItems) {
  SetJsonFileContents(
      "{\"settings\": {"
      "    \"group_a\": {"
      "        \"knob_1\": ["
      "            {\"_native_type\": \"non_ascii_string\","
      "             \"_encoded_value\": \"0001020304\"},"
      "            \"normal string\""
      "]}}}");
  EXPECT_TRUE(store_->Open());
}

// File open: unsupported types, and invalid values. Ordered by
// base::Value::Type enum.  Types which are supported by JsonStore,
// but not directly supported by base::Value, are ordered as
// TYPE_DICTIONARY.
TEST_F(JsonStoreTest, OpenFailsOnSettingWithNullValue) {
  SetJsonFileContents(
      "{\"settings\": {"
      "    \"group_a\": {"
      "        \"knob_1\": null"
      "}}}");
  EXPECT_CALL(log_,
              Log(logging::LOG_ERROR, _,
                  HasSubstr("has unsupported TYPE_NULL")));
  EXPECT_FALSE(store_->Open());
}

TEST_F(JsonStoreTest, OpenFailsOnSettingWithBadBooleanValue) {
  SetJsonFileContents(
      "{\"settings\": {"
      "    \"group_a\": {"
      "        \"knob_1\": truthy"
      "}}}");
  EXPECT_CALL(log_,
              Log(logging::LOG_ERROR, _, StartsWith("Failed to parse JSON")));
  EXPECT_FALSE(store_->Open());
}

TEST_F(JsonStoreTest, OpenFailsOnSettingWithOverlySmallInteger) {
  SetJsonFileContents(
      "{\"settings\": {"
      "    \"group_a\": {"
      "        \"knob_1\": -2147483649"  // -2^31-1
      "}}}");
  EXPECT_CALL(log_,
              Log(logging::LOG_ERROR, _, HasSubstr("unsupported TYPE_DOUBLE")));
  EXPECT_FALSE(store_->Open());
}

TEST_F(JsonStoreTest, OpenFailsOnSettingWithOverlyLargeInteger) {
  SetJsonFileContents(
      "{\"settings\": {"
      "    \"group_a\": {"
      "        \"knob_1\": 2147483648"  // 2^31
      "}}}");
  EXPECT_CALL(log_,
              Log(logging::LOG_ERROR, _, HasSubstr("unsupported TYPE_DOUBLE")));
  EXPECT_FALSE(store_->Open());
}

TEST_F(JsonStoreTest, OpenFailsOnSettingWithDoubleValue) {
  SetJsonFileContents(
      "{\"settings\": {"
      "    \"group_a\": {"
      "        \"knob_1\": 1.234"
      "}}}");
  EXPECT_CALL(log_,
              Log(logging::LOG_ERROR, _, HasSubstr("unsupported TYPE_DOUBLE")));
  EXPECT_FALSE(store_->Open());
}

TEST_F(JsonStoreTest, OpenFailsOnSettingWithDictionaryValue) {
  SetJsonFileContents(
      "{\"settings\": {"
      "    \"group_a\": {"
      "        \"knob_1\": {}"
      "}}}");
  EXPECT_CALL(log_,
              Log(logging::LOG_ERROR, _,
                  HasSubstr("unsupported TYPE_DICTIONARY")));
  EXPECT_FALSE(store_->Open());
}

TEST_F(JsonStoreTest, OpenFailsOnSettingWithOverlayLargeUint64Value) {
  SetJsonFileContents(
      "{\"settings\": {"
      "    \"group_a\": {"
      "        \"knob_1\": {"
      "            \"_native_type\": \"uint64\","
      "            \"_encoded_value\": \"18446744073709551616\""  // 2^64
      "}}}}");
  EXPECT_CALL(log_,
              Log(logging::LOG_ERROR, _, StartsWith("Failed to parse uint64")));
  EXPECT_FALSE(store_->Open());
}

TEST_F(JsonStoreTest, OpenFailsOnSettingWithOverlaySmallUint64Value) {
  SetJsonFileContents(
      "{\"settings\": {"
      "    \"group_a\": {"
      "        \"knob_1\": {"
      "            \"_native_type\": \"uint64\","
      "            \"_encoded_value\": \"-1\""
      "}}}}");
  EXPECT_CALL(log_,
              Log(logging::LOG_ERROR, _, StartsWith("Failed to parse uint64")));
  EXPECT_FALSE(store_->Open());
}

TEST_F(JsonStoreTest, OpenFailsWhenSettingHasEscapedStringWithInvalidHex) {
  SetJsonFileContents(
      "{\"settings\": {"
      "    \"group_a\": {"
      "        \"knob_1\": {"
      "            \"_native_type\": \"non_ascii_string\","
      "            \"_encoded_value\": \"-1\""
      "}}}}");
  EXPECT_CALL(log_,
              Log(logging::LOG_ERROR, _, StartsWith("Failed to decode hex")));
  EXPECT_FALSE(store_->Open());
}

TEST_F(JsonStoreTest,
       OpenFailsWhenSettingHasEscapedStringListItemWithInvalidHex) {
  SetJsonFileContents(
      "{\"settings\": {"
      "    \"group_a\": {"
      "        \"knob_1\": [{"
      "            \"_native_type\": \"non_ascii_string\","
      "            \"_encoded_value\": \"-1\""
      "}]}}}");
  EXPECT_CALL(log_,
              Log(logging::LOG_ERROR, _, StartsWith("Failed to decode hex")));
  EXPECT_FALSE(store_->Open());
}

TEST_F(JsonStoreTest, OpenFailsOnCoercedSettingWithBadNativeType) {
  SetJsonFileContents(
      "{\"settings\": {"
      "    \"group_a\": {"
      "        \"knob_1\": {"
      "            \"_native_type\": true,"
      "            \"_encoded_value\": \"1234\""
      "}}}}");
  EXPECT_CALL(log_,
              Log(logging::LOG_ERROR, _,
                  StartsWith("Property |_native_type| is not a string")));
  EXPECT_FALSE(store_->Open());
}

TEST_F(JsonStoreTest, OpenFailsOnCoercedSettingWhenEncodedValueIsNotAString) {
  SetJsonFileContents(
      "{\"settings\": {"
      "    \"group_a\": {"
      "        \"knob_1\": {"
      "            \"_native_type\": \"uint64\","
      "            \"_encoded_value\": 1234"
      "}}}}");
  EXPECT_CALL(log_,
              Log(logging::LOG_ERROR, _,
                  StartsWith("Property |_encoded_value| is not a string")));
  EXPECT_FALSE(store_->Open());
}

TEST_F(JsonStoreTest, OpenFailsOnSettingWithIntListValue) {
  SetJsonFileContents(
      "{\"settings\": {"
      "    \"group_a\": {"
      "        \"knob_1\": [ 1 ]"
      "}}}");
  EXPECT_CALL(log_,
              Log(logging::LOG_ERROR, _,
                  HasSubstr("instead of expected type")));
  EXPECT_FALSE(store_->Open());
}

// File open: miscellaneous.
TEST_F(JsonStoreTest, OpenClearsExistingInMemoryData) {
  store_->SetString("group_a", "knob_1", "watch me disappear");
  ASSERT_TRUE(store_->GetString("group_a", "knob_1", nullptr));

  SetJsonFileContents(
      "{\"settings\": {"
      "    \"group_a\": {"
      "        \"knob_2\": \"new stuff\""
      "}}}");
  ASSERT_TRUE(store_->Open());
  EXPECT_FALSE(store_->GetString("group_a", "knob_1", nullptr));
  EXPECT_TRUE(store_->GetString("group_a", "knob_2", nullptr));
}

TEST_F(JsonStoreTest, OpenClearsExistingInMemoryGroups) {
  store_->SetString("group_a", "knob_1", "watch me disappear");
  ASSERT_FALSE(store_->GetGroups().empty());

  // In the delete case, we're non-comittal about whether empty groups
  // are garbage collected. But, in the Open() case, we commit to
  // fully clearing in-memory data.
  SetJsonFileContents("{\"settings\": {}}");
  ASSERT_TRUE(store_->Open());
  EXPECT_TRUE(store_->GetGroups().empty());
}

// File operations: Close() basic functionality.
TEST_F(JsonStoreTest, ClosePersistsData) {
  ASSERT_FALSE(store_->IsNonEmpty());
  ASSERT_TRUE(store_->Close());

  // Verify that the file actually got written with the right name.
  FileEnumerator file_enumerator(
      temp_dir_.GetPath(), false /* not recursive */, FileEnumerator::FILES);
  EXPECT_EQ(test_file_.value(), file_enumerator.Next().value());

  // Verify that the profile is a regular file, readable and writeable by the
  // owner only.
  FileEnumerator::FileInfo file_info = file_enumerator.GetInfo();
  EXPECT_EQ(S_IFREG | S_IRUSR | S_IWUSR, file_info.stat().st_mode);
}

// File operations: Flush() basics.
TEST_F(JsonStoreTest, FlushCreatesPersistentStore) {
  ASSERT_FALSE(store_->IsNonEmpty());
  ASSERT_TRUE(store_->Flush());

  // Verify that the file actually got written with the right name.
  FileEnumerator file_enumerator(
      temp_dir_.GetPath(), false /* not recursive */, FileEnumerator::FILES);
  EXPECT_EQ(test_file_.value(), file_enumerator.Next().value());

  // Verify that the profile is a regular file, readable and writeable by the
  // owner only.
  FileEnumerator::FileInfo file_info = file_enumerator.GetInfo();
  EXPECT_EQ(S_IFREG | S_IRUSR | S_IWUSR, file_info.stat().st_mode);
}

TEST_F(JsonStoreTest, FlushFailsWhenPathIsNotWriteable) {
  ASSERT_TRUE(base::CreateDirectory(test_file_));
  EXPECT_CALL(log_,
              Log(logging::LOG_ERROR, _, StartsWith("Failed to write")));
  EXPECT_FALSE(store_->Flush());
}

// File operations: writing.
//
// The ordering of groups, and the ordering of keys within a group,
// are decided by the JSON writer. Hence, we can not simply compare
// the written data to an expected literal value.
//
// Instead, we write the data out, and verify that reading the data
// yields the same groups, keys, and values.
TEST_F(JsonStoreTest, CanPersistAndRestoreHeader) {
  store_->SetHeader("rosetta stone");
  ASSERT_EQ("rosetta stone", store_->file_description_);
  store_->Flush();

  JsonStore persisted_data(test_file_);
  persisted_data.Open();
  EXPECT_EQ(
      store_->file_description_, persisted_data.file_description_);
}

TEST_F(JsonStoreTest, CanPersistAndRestoreAllTypes) {
  store_->SetString("group_a", "string_knob", "our string");
  store_->SetBool("group_a", "bool_knob", true);
  store_->SetInt("group_a", "int_knob", 1);
  store_->SetUint64(
      "group_a", "uint64_knob", std::numeric_limits<uint64_t>::max());
  store_->SetStringList(
      "group_a", "stringlist_knob", vector<string>{"a", "b", "c"});
  store_->SetCryptedString("group_a", "cryptedstring_knob", "s3kr!t");
  store_->Flush();

  JsonStore persisted_data(test_file_);
  persisted_data.Open();
  EXPECT_EQ(
      store_->group_name_to_settings_, persisted_data.group_name_to_settings_);
}

TEST_F(JsonStoreTest, CanPersistAndRestoreNonUtf8Strings) {
  store_->SetString("group_a", "string_knob", kNonUtf8String);
  store_->Flush();

  JsonStore persisted_data(test_file_);
  persisted_data.Open();
  EXPECT_EQ(
      store_->group_name_to_settings_, persisted_data.group_name_to_settings_);
}

TEST_F(JsonStoreTest, CanPersistAndRestoreNonUtf8StringList) {
  store_->SetStringList(
      "group_a", "string_knob", vector<string>({kNonUtf8String}));
  store_->Flush();

  JsonStore persisted_data(test_file_);
  persisted_data.Open();
  EXPECT_EQ(
      store_->group_name_to_settings_, persisted_data.group_name_to_settings_);
}

TEST_F(JsonStoreTest, CanPersistAndRestoreStringsWithEmbeddedNulls) {
  store_->SetString("group_a", "string_knob", kStringWithEmbeddedNulls);
  store_->Flush();

  JsonStore persisted_data(test_file_);
  persisted_data.Open();
  EXPECT_EQ(
      store_->group_name_to_settings_, persisted_data.group_name_to_settings_);
}

TEST_F(JsonStoreTest, CanPersistAndRestoreStringListWithEmbeddedNulls) {
  store_->SetStringList(
      "group_a", "string_knob", vector<string>({kStringWithEmbeddedNulls}));
  store_->Flush();

  JsonStore persisted_data(test_file_);
  persisted_data.Open();
  EXPECT_EQ(
      store_->group_name_to_settings_, persisted_data.group_name_to_settings_);
}

TEST_F(JsonStoreTest, CanPersistAndRestoreMultipleGroups) {
  store_->SetString("group_a", "knob_1", "first string");
  store_->SetString("group_b", "knob_2", "second string");
  store_->Flush();

  JsonStore persisted_data(test_file_);
  persisted_data.Open();
  EXPECT_EQ(
      store_->group_name_to_settings_, persisted_data.group_name_to_settings_);
}

TEST_F(JsonStoreTest, CanPersistAndRestoreMultipleGroupsWithSameKeys) {
  store_->SetString("group_a", "knob_1", "first string");
  store_->SetString("group_a", "knob_2", "second string");
  store_->SetString("group_b", "knob_1", "frist post!");
  store_->SetStringList("group_b", "knob_2", vector<string>{"2nd try"});
  store_->Flush();

  JsonStore persisted_data(test_file_);
  persisted_data.Open();
  EXPECT_EQ(
      store_->group_name_to_settings_, persisted_data.group_name_to_settings_);
}

TEST_F(JsonStoreTest, CanDeleteKeyFromPersistedData) {
  store_->SetString("group_a", "knob_1", "first string");
  store_->Flush();

  JsonStore persisted_data_v1(test_file_);
  persisted_data_v1.Open();
  ASSERT_TRUE(persisted_data_v1.GetString("group_a", "knob_1", nullptr));
  store_->DeleteKey("group_a", "knob_1");
  store_->Flush();

  JsonStore persisted_data_v2(test_file_);
  SetVerboseLevel(10);
  // Whether an empty group is written or not is an implementation
  // detail.  Hence, we don't care if the error message is about a
  // missing group, or a missing property.
  EXPECT_CALL(log_, Log(_, _, HasSubstr("Could not find")));
  EXPECT_FALSE(persisted_data_v2.GetString("group_a", "knob_1", nullptr));
}

TEST_F(JsonStoreTest, CanDeleteGroupFromPersistedData) {
  store_->SetString("group_a", "knob_1", "first string");
  store_->Flush();

  JsonStore persisted_data_v1(test_file_);
  persisted_data_v1.Open();
  ASSERT_TRUE(persisted_data_v1.GetString("group_a", "knob_1", nullptr));
  store_->DeleteGroup("group_a");
  store_->Flush();

  JsonStore persisted_data_v2(test_file_);
  SetVerboseLevel(10);
  persisted_data_v2.Open();
  EXPECT_CALL(log_, Log(_, _, HasSubstr("Could not find group")));
  EXPECT_FALSE(persisted_data_v2.GetString("group_a", "knob_1", nullptr));
}

// File operations: file management.
TEST_F(JsonStoreTest, MarkAsCorruptedFailsWhenStoreHasNotBeenPersisted) {
  EXPECT_CALL(log_,
              Log(logging::LOG_ERROR, _, HasSubstr("rename failed")));
  EXPECT_FALSE(store_->MarkAsCorrupted());
}

TEST_F(JsonStoreTest, MarkAsCorruptedMovesCorruptStore) {
  store_->Flush();
  ASSERT_TRUE(store_->IsNonEmpty());
  ASSERT_TRUE(base::PathExists(test_file_));

  EXPECT_TRUE(store_->MarkAsCorrupted());
  EXPECT_FALSE(store_->IsNonEmpty());
  EXPECT_FALSE(base::PathExists(test_file_));
  EXPECT_TRUE(base::PathExists(FilePath(test_file_.value() + ".corrupted")));
}

}  // namespace shill
