// Copyright 2017 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.

// Tests for cros_config command-line utility.

#include <libgen.h>

#include <cstdio>
#include <string>
#include <vector>

#include <base/process/launch.h>
#include <base/strings/stringprintf.h>
#include <gtest/gtest.h>

namespace {

// Directory where cros_config is installed.  Needed because the tests run out
// of a different directory.
char* installed_dir = nullptr;

};  // namespace

// Return a vector containing a command-line to run cros_config.  If non-empty,
// |params| will be appended as additional parameters.
std::vector<std::string> GetCrosConfigCommand(
    const std::vector<std::string>& params) {
  std::vector<std::string> cmd = {
      base::StringPrintf("%s/cros_config", installed_dir),
#ifndef USE_JSON
      "--test_database=test.dtb",
#else
      "--test_database=test_config.json",
#endif
      "--test_name=Pyro"};
  cmd.insert(cmd.end(), params.begin(), params.end());
  return cmd;
}

TEST(CrosConfigTest, MissingParams) {
  std::string output;
  bool success = base::GetAppOutput(GetCrosConfigCommand({}), &output);
  EXPECT_FALSE(success);
}

TEST(CrosConfigTest, GetStringRoot) {
  std::string val;
  bool success =
      base::GetAppOutput(GetCrosConfigCommand({"/", "wallpaper"}), &val);
  EXPECT_TRUE(success);
  EXPECT_EQ("default", val);
}

TEST(CrosConfigTest, GetStringNonRoot) {
  std::string val;
  bool success = base::GetAppOutput(
      GetCrosConfigCommand({"/touch", "present"}), &val);
  EXPECT_TRUE(success);
  EXPECT_EQ("probe", val);
}

#ifndef USE_JSON
TEST(CrosConfigTest, GetAbsPath) {
  std::string val;
  bool success =
      base::GetAppOutput(GetCrosConfigCommand({"/thermal", "dptf-dv"}), &val);
  EXPECT_TRUE(success);
  EXPECT_EQ("pyro/dptf.dv", val);

  success = base::GetAppOutput(GetCrosConfigCommand(
      {"--abspath", "/thermal", "dptf-dv"}), &val);
  EXPECT_TRUE(success);
  EXPECT_EQ("/etc/dptf/pyro/dptf.dv", val);

  success = base::GetAppOutput(GetCrosConfigCommand(
      {"/audio/main", "cras-config-dir"}), &val);
  EXPECT_TRUE(success);
  EXPECT_EQ("pyro", val);

  success = base::GetAppOutput(GetCrosConfigCommand(
      {"--abspath", "/audio/main", "cras-config-dir"}), &val);
  EXPECT_TRUE(success);
  EXPECT_EQ("/etc/cras/pyro", val);

  // We are not allowed to request an absolute path on something that is not
  // a PropFile.
  success = base::GetAppOutput(GetCrosConfigCommand(
      {"--abspath", "/", "wallpaper"}), &val);
  EXPECT_FALSE(success);
  EXPECT_EQ("", val);
}
#endif /* !USE_JSON */

int main(int argc, char** argv) {
  int status = system("exec ./chromeos-config-test-setup.sh");
  if (status != 0)
    return EXIT_FAILURE;
  testing::InitGoogleTest(&argc, argv);

  installed_dir = dirname(argv[0]);
  if (!installed_dir)
    return EXIT_FAILURE;

  return RUN_ALL_TESTS();
}
