// Copyright 2018 The Fuchsia 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 "garnet/bin/run_test_component/env_config.h"

#include <string>

#include "gmock/gmock.h"
#include "gtest/gtest.h"
#include "lib/fxl/files/directory.h"
#include "lib/fxl/files/file.h"
#include "lib/fxl/files/scoped_temp_dir.h"
#include "lib/fxl/strings/string_printf.h"
#include "lib/fxl/strings/substitute.h"
#include "lib/json/json_parser.h"

namespace run {
namespace {

class EnvironmentConfigTest : public ::testing::Test {
 protected:
  void SetUp() override {
    ASSERT_NE("", tmp_dir_.path()) << "Cannot acccess /tmp";
  }

  bool ParseFrom(EnvironmentConfig* config, const std::string& json) {
    std::string json_path;
    if (!tmp_dir_.NewTempFileWithData(json, &json_path)) {
      return false;
    }
    const bool ret = config->ParseFromFile(json_path);
    EXPECT_EQ(ret, !config->HasError());
    return ret;
  }

 private:
  files::ScopedTempDir tmp_dir_;
};

TEST_F(EnvironmentConfigTest, InvalidJson) {
  const std::string json = R"JSON({,,,})JSON";
  EnvironmentConfig config;
  EXPECT_FALSE(ParseFrom(&config, json));
  EXPECT_THAT(config.error_str(),
              ::testing::HasSubstr("Missing a name for object member."));
}

TEST_F(EnvironmentConfigTest, NoRootElement) {
  const std::string json = R"JSON({
  "sys": ["url2", "url4"]
  })JSON";
  EnvironmentConfig config;
  EXPECT_FALSE(ParseFrom(&config, json));
  EXPECT_THAT(config.error_str(),
              ::testing::HasSubstr("Environment 'root' not found."));
  EXPECT_EQ(2u, config.url_map().size());
}

TEST_F(EnvironmentConfigTest, NoSysElement) {
  const std::string json = R"JSON({
  "root": ["url2", "url4"]
  })JSON";
  EnvironmentConfig config;
  EXPECT_FALSE(ParseFrom(&config, json));
  EXPECT_THAT(config.error_str(),
              ::testing::HasSubstr("Environment 'sys' not found."));
  EXPECT_EQ(2u, config.url_map().size());
}

TEST_F(EnvironmentConfigTest, InvalidSection) {
  {
    const std::string json = R"JSON({
    "root": ["url2", "url4"],
    "sys": 3
    })JSON";
    EnvironmentConfig config;
    EXPECT_FALSE(ParseFrom(&config, json));
    EXPECT_THAT(config.error_str(),
                ::testing::HasSubstr("'sys' section should be an array."));
  }
  {
    const std::string json = R"JSON({
    "root": ["url2", 42],
    "sys": ["url1"]
    })JSON";
    EnvironmentConfig config;
    EXPECT_FALSE(ParseFrom(&config, json));
    EXPECT_THAT(
        config.error_str(),
        ::testing::HasSubstr("'root' section should be a string array."));
  }
}

TEST_F(EnvironmentConfigTest, ValidConfig) {
  const std::string json = R"JSON({
  "root": ["url1", "url3", "url5"],
  "sys": ["url2", "url4"]
  })JSON";
  EnvironmentConfig config;
  EXPECT_TRUE(ParseFrom(&config, json));
  EXPECT_FALSE(config.HasError());
  ASSERT_EQ(5u, config.url_map().size());
  std::vector<std::string> root_urls = {"url1", "url3", "url5"};
  for (auto& url : root_urls) {
    auto map_entry = config.url_map().find(url);
    ASSERT_NE(map_entry, config.url_map().end());
    EXPECT_EQ(map_entry->second, run::EnvironmentType::ROOT);
  }

  std::vector<std::string> sys_urls = {"url2", "url4"};
  for (auto& url : sys_urls) {
    auto map_entry = config.url_map().find(url);
    ASSERT_NE(map_entry, config.url_map().end());
    EXPECT_EQ(map_entry->second, run::EnvironmentType::SYS);
  }
}

}  // namespace
}  // namespace run
