// Copyright 2020 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 <base/files/file_path.h>
#include <base/files/file_util.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>

#include "dlcservice/boot/boot_slot.h"
#include "dlcservice/dlc.h"
#include "dlcservice/prefs.h"
#include "dlcservice/system_state.h"
#include "dlcservice/test_utils.h"
#include "dlcservice/utils.h"

using base::FilePath;
using std::string;

namespace dlcservice {

class PrefsTest : public BaseTest {};

TEST_F(PrefsTest, DlcBaseCreateAndDelete) {
  auto active_boot_slot = SystemState::Get()->active_boot_slot();
  Prefs prefs(DlcBase("id"), active_boot_slot);
  string key = "key";
  EXPECT_TRUE(prefs.Create(key));
  EXPECT_TRUE(prefs.Exists(key));
  Prefs prefs_non_dlcbase(JoinPaths(SystemState::Get()->dlc_prefs_dir(), "id",
                                    BootSlot::ToString(active_boot_slot)));
  EXPECT_TRUE(prefs_non_dlcbase.Exists(key));
}

TEST_F(PrefsTest, CreateAndDelete) {
  Prefs prefs(FilePath(SystemState::Get()->prefs_dir()));
  string key = "key";
  EXPECT_TRUE(prefs.Create(key));
  EXPECT_TRUE(prefs.Exists(key));
  EXPECT_TRUE(prefs.Delete(key));
  EXPECT_FALSE(prefs.Exists(key));
}

TEST_F(PrefsTest, SetAndGetThenDelete) {
  Prefs prefs(FilePath(SystemState::Get()->prefs_dir()));
  string key = "key", value = "value";
  EXPECT_TRUE(prefs.SetKey(key, value));
  string actual_value;
  EXPECT_TRUE(prefs.GetKey(key, &actual_value));
  EXPECT_EQ(value, actual_value);
  EXPECT_TRUE(prefs.Delete(key));
  EXPECT_FALSE(prefs.Exists(key));
}

TEST_F(PrefsTest, RepeatedSet) {
  Prefs prefs(FilePath(SystemState::Get()->prefs_dir()));
  string key = "key", value = "value";
  EXPECT_TRUE(prefs.SetKey(key, value));
  EXPECT_TRUE(prefs.SetKey(key, value));
}

}  // namespace dlcservice
