// 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 "src/sys/appmgr/scheme_map.h"

#include <unistd.h>

#include <string>

#include <gmock/gmock.h>
#include <gtest/gtest.h>

#include "src/lib/files/directory.h"
#include "src/lib/files/file.h"
#include "src/lib/files/path.h"
#include "src/lib/files/scoped_temp_dir.h"
#include "src/lib/fxl/strings/substitute.h"

namespace component {
namespace {

class SchemeMapTest : public ::testing::Test {
 protected:
  void ExpectFailedParse(const std::string& json, std::string expected_error) {
    SchemeMap scheme_map;
    std::string dir;
    ASSERT_TRUE(tmp_dir_.NewTempDir(&dir));
    const std::string json_file = NewJSONFile(dir, json);
    EXPECT_FALSE(scheme_map.ParseFromDirectory(dir));
    EXPECT_THAT(scheme_map.error_str(), ::testing::HasSubstr(expected_error));
  }

  std::string NewJSONFile(const std::string& dir, const std::string& json) {
    const std::string json_file =
        fxl::Substitute("$0/json_file$1", dir, std::to_string(unique_id_++));
    if (!files::WriteFile(json_file, json.data(), json.size())) {
      return "";
    }
    return json_file;
  }

  files::ScopedTempDir tmp_dir_;

 private:
  int unique_id_ = 1;
};

TEST_F(SchemeMapTest, Parse) {
  static constexpr char kJson[] = R"JSON({
  "launchers": {
    "web_runner": [ "http", "https" ],
    "package": [ "file" ]
  }
  })JSON";

  SchemeMap scheme_map;
  std::string dir;
  ASSERT_TRUE(tmp_dir_.NewTempDir(&dir));
  NewJSONFile(dir, kJson);
  EXPECT_TRUE(scheme_map.ParseFromDirectory(dir));
  EXPECT_FALSE(scheme_map.HasError());
  EXPECT_EQ("web_runner", scheme_map.LookUp("http"));
  EXPECT_EQ("web_runner", scheme_map.LookUp("https"));
  EXPECT_EQ("package", scheme_map.LookUp("file"));
  EXPECT_EQ("", scheme_map.LookUp("doofus"));
}

TEST_F(SchemeMapTest, ParseMultiple) {
  static constexpr char kJson1[] = R"JSON({
  "launchers": { "web_runner": [ "http" ] }
  })JSON";
  static constexpr char kJson2[] = R"JSON({
  "launchers": { "web_runner": [ "https" ] }
  })JSON";
  static constexpr char kJson3[] = R"JSON({
  "launchers": { "package": [ "file" ] }
  })JSON";

  SchemeMap scheme_map;
  std::string dir;
  ASSERT_TRUE(tmp_dir_.NewTempDir(&dir));
  NewJSONFile(dir, kJson1);
  NewJSONFile(dir, kJson2);
  NewJSONFile(dir, kJson3);
  EXPECT_TRUE(scheme_map.ParseFromDirectory(dir));
  EXPECT_FALSE(scheme_map.HasError());
  EXPECT_EQ("web_runner", scheme_map.LookUp("http"));
  EXPECT_EQ("web_runner", scheme_map.LookUp("https"));
  EXPECT_EQ("package", scheme_map.LookUp("file"));
  EXPECT_EQ("", scheme_map.LookUp("doofus"));
}

TEST_F(SchemeMapTest, ParseWithErrors) {
  ExpectFailedParse(R"JSON({})JSON", "Missing 'launchers'.");
  ExpectFailedParse(R"JSON({ "launchers": 42 })JSON", "'launchers' is not a valid object.");
  ExpectFailedParse(
      R"JSON({
        "launchers": {
          "web_runner": "http"
        }
      })JSON",
      "Schemes for 'web_runner' are not a list."),
      ExpectFailedParse(
          R"JSON({
        "launchers": {
          "package": [ "file" ],
          "web_runner": [ "http", 42 ]
        }
      })JSON",
          "Scheme for 'web_runner' is not a string.");
}

TEST_F(SchemeMapTest, ParseMultipleWithErrors) {
  static constexpr char kJson1[] = R"JSON({
  "launchers": { "web_runner": [ "http" ] }
  })JSON";
  static constexpr char kJson2[] = R"JSON({
  "launchers": { "package": [ "http" ] }
  })JSON";

  SchemeMap scheme_map;
  std::string dir;
  ASSERT_TRUE(tmp_dir_.NewTempDir(&dir));
  NewJSONFile(dir, kJson1);
  const std::string json_file2 = NewJSONFile(dir, kJson2);
  EXPECT_FALSE(scheme_map.ParseFromDirectory(dir));
  EXPECT_TRUE(scheme_map.HasError());
  EXPECT_THAT(scheme_map.error_str(),
              ::testing::HasSubstr("Scheme 'http' is assigned to two launchers."));
}

}  // namespace
}  // namespace component
