// 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/lib/pkg_url/fuchsia_pkg_url.h"

#include "gtest/gtest.h"

namespace component {
namespace {

FuchsiaPkgUrl ParseFuchsiaPkgUrl(const std::string& s) {
  FuchsiaPkgUrl url;
  EXPECT_TRUE(url.Parse(s));
  return url;
}

TEST(FuchsiaPkgUrl, Parse) {
  FuchsiaPkgUrl fp;
  EXPECT_FALSE(fp.Parse(""));
  EXPECT_FALSE(fp.Parse("{}"));
  EXPECT_FALSE(fp.Parse(
      "file://fuchsia.com/component_hello_world#meta/hello_world.cmx"));
  EXPECT_FALSE(fp.Parse("#meta/stuff"));
  EXPECT_FALSE(fp.Parse("fuchsia-pkg://fuchsia.com/component_hello_world#"));

  EXPECT_TRUE(fp.Parse("fuchsia-pkg://fuchsia.com/component_hello_world"));
  EXPECT_EQ("fuchsia.com", fp.host_name());
  EXPECT_EQ("component_hello_world", fp.package_name());
  EXPECT_EQ("0", fp.variant());
  EXPECT_EQ("", fp.hash());
  EXPECT_EQ("", fp.resource_path());

  EXPECT_TRUE(fp.Parse(
      "fuchsia-pkg://fuchsia.com/component_hello_world#meta/hello_world.cmx"));
  EXPECT_EQ("fuchsia.com", fp.host_name());
  EXPECT_EQ("component_hello_world", fp.package_name());
  EXPECT_EQ("0", fp.variant());
  EXPECT_EQ("", fp.hash());
  EXPECT_EQ("meta/hello_world.cmx", fp.resource_path());

  EXPECT_TRUE(
      fp.Parse("fuchsia-pkg://fuchsia.com/component_hello_world#meta/stuff"));
  EXPECT_EQ("fuchsia.com", fp.host_name());
  EXPECT_EQ("component_hello_world", fp.package_name());
  EXPECT_EQ("0", fp.variant());
  EXPECT_EQ("", fp.hash());
  EXPECT_EQ("meta/stuff", fp.resource_path());

  EXPECT_TRUE(fp.Parse("fuchsia-pkg://example.com/data-package#stuff"));
  EXPECT_EQ("example.com", fp.host_name());
  EXPECT_EQ("data-package", fp.package_name());
  EXPECT_EQ("0", fp.variant());
  EXPECT_EQ("", fp.hash());
  EXPECT_EQ("stuff", fp.resource_path());

  EXPECT_TRUE(
      fp.Parse("fuchsia-pkg://example.com/data-package/variant123#stuff"));
  EXPECT_EQ("example.com", fp.host_name());
  EXPECT_EQ("data-package", fp.package_name());
  EXPECT_EQ("variant123", fp.variant());
  EXPECT_EQ("", fp.hash());
  EXPECT_EQ("stuff", fp.resource_path());

  EXPECT_TRUE(fp.Parse(
      "fuchsia-pkg://example.com/data-package/variant123?hash=1234#stuff"));
  EXPECT_EQ("example.com", fp.host_name());
  EXPECT_EQ("data-package", fp.package_name());
  EXPECT_EQ("variant123", fp.variant());
  EXPECT_EQ("1234", fp.hash());
  EXPECT_EQ("stuff", fp.resource_path());
}

TEST(FuchsiaPkgUrl, pkgfs_dir_path) {
  FuchsiaPkgUrl fp;
  EXPECT_TRUE(fp.Parse(
      "fuchsia-pkg://fuchsia.com/component_hello_world#meta/hello_world.cmx"));
  EXPECT_EQ("/pkgfs/packages/component_hello_world/0", fp.pkgfs_dir_path());

  EXPECT_TRUE(fp.Parse(
      "fuchsia-pkg://fuchsia.com/component_hello_world/variant123#meta/"
      "hello_world.cmx"));
  EXPECT_EQ("/pkgfs/packages/component_hello_world/variant123",
            fp.pkgfs_dir_path());
}

TEST(FuchsiaPkgUrl, GetComponentDefaults) {
  EXPECT_EQ("meta/sysmgr.cmx",
            ParseFuchsiaPkgUrl("fuchsia-pkg://fuchsia.com/sysmgr")
                .GetDefaultComponentCmxPath());
  EXPECT_EQ("meta/sysmgr.cmx",
            ParseFuchsiaPkgUrl("fuchsia-pkg://fuchsia.com/sysmgr#meta/blah.cmx")
                .GetDefaultComponentCmxPath());
}

}  // namespace
}  // namespace component
