// 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
