//===-- XcodeSDKTest.cpp --------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include "gtest/gtest.h"

#include "lldb/Utility/FileSpec.h"
#include "lldb/Utility/XcodeSDK.h"

#include "llvm/ADT/StringRef.h"
#include "llvm/TargetParser/Triple.h"

#include <tuple>

using namespace lldb_private;

TEST(XcodeSDKTest, ParseTest) {
  EXPECT_EQ(XcodeSDK::GetAnyMacOS().GetType(), XcodeSDK::MacOSX);
  EXPECT_EQ(XcodeSDK("MacOSX.sdk").GetType(), XcodeSDK::MacOSX);
  EXPECT_EQ(XcodeSDK("iPhoneSimulator.sdk").GetType(), XcodeSDK::iPhoneSimulator);
  EXPECT_EQ(XcodeSDK("iPhoneOS.sdk").GetType(), XcodeSDK::iPhoneOS);
  EXPECT_EQ(XcodeSDK("AppleTVSimulator.sdk").GetType(), XcodeSDK::AppleTVSimulator);
  EXPECT_EQ(XcodeSDK("AppleTVOS.sdk").GetType(), XcodeSDK::AppleTVOS);
  EXPECT_EQ(XcodeSDK("WatchSimulator.sdk").GetType(), XcodeSDK::WatchSimulator);
  EXPECT_EQ(XcodeSDK("WatchOS.sdk").GetType(), XcodeSDK::watchOS);
  EXPECT_EQ(XcodeSDK("XRSimulator.sdk").GetType(), XcodeSDK::XRSimulator);
  EXPECT_EQ(XcodeSDK("XROS.sdk").GetType(), XcodeSDK::XROS);
  EXPECT_EQ(XcodeSDK("Linux.sdk").GetType(), XcodeSDK::Linux);
  EXPECT_EQ(XcodeSDK("MacOSX.sdk").GetVersion(), llvm::VersionTuple());
  EXPECT_EQ(XcodeSDK("MacOSX10.9.sdk").GetVersion(), llvm::VersionTuple(10, 9));
  EXPECT_EQ(XcodeSDK("MacOSX10.15.4.sdk").GetVersion(), llvm::VersionTuple(10, 15));
  EXPECT_EQ(XcodeSDK("MacOSX.sdk").IsAppleInternalSDK(), false);
  EXPECT_EQ(
      XcodeSDK("MacOSX.sdk", FileSpec{"/Path/To/MacOSX.sdk"}).GetSysroot(),
      FileSpec("/Path/To/MacOSX.sdk"));
  EXPECT_EQ(XcodeSDK("MacOSX10.15.Internal.sdk").GetType(), XcodeSDK::MacOSX);
  EXPECT_EQ(XcodeSDK("MacOSX10.15.Internal.sdk").GetVersion(),
            llvm::VersionTuple(10, 15));
  EXPECT_EQ(XcodeSDK("MacOSX10.15.Internal.sdk").IsAppleInternalSDK(), true);
  EXPECT_FALSE(XcodeSDK("MacOSX10.15.Internal.sdk").GetSysroot());
  EXPECT_EQ(XcodeSDK().GetType(), XcodeSDK::unknown);
  EXPECT_EQ(XcodeSDK().GetVersion(), llvm::VersionTuple());
  EXPECT_FALSE(XcodeSDK().GetSysroot());
}

TEST(XcodeSDKTest, MergeTest) {
  XcodeSDK sdk("MacOSX.sdk");
  sdk.Merge(XcodeSDK("WatchOS.sdk"));
  // This doesn't make any particular sense and shouldn't happen in practice, we
  // just want to guarantee a well-defined behavior when choosing one
  // SDK to fit all CUs in an lldb::Module.
  // -> The higher number wins.
  EXPECT_EQ(sdk.GetType(), XcodeSDK::watchOS);
  sdk.Merge(XcodeSDK("WatchOS1.1.sdk"));
  EXPECT_EQ(sdk.GetVersion(), llvm::VersionTuple(1, 1));
  sdk.Merge(XcodeSDK("WatchOS2.0.sdk"));
  EXPECT_EQ(sdk.GetVersion(), llvm::VersionTuple(2, 0));
  sdk.Merge(XcodeSDK("WatchOS1.1.Internal.sdk"));
  EXPECT_EQ(sdk.GetVersion(), llvm::VersionTuple(2, 0));
  EXPECT_EQ(sdk.IsAppleInternalSDK(), true);
  XcodeSDK empty;
  empty.Merge(XcodeSDK("MacOSX10.14.Internal.sdk"));
  EXPECT_EQ(empty.GetString(), llvm::StringRef("MacOSX10.14.Internal.sdk"));
  EXPECT_FALSE(empty.GetSysroot());
  empty.Merge(XcodeSDK("MacOSX9.5.Internal.sdk",
                       FileSpec{"/Path/To/MacOSX9.5.Internal.sdk"}));
  EXPECT_FALSE(empty.GetSysroot());
  empty.Merge(XcodeSDK("MacOSX12.5.sdk", FileSpec{"/Path/To/MacOSX12.5.sdk"}));
  EXPECT_EQ(empty.GetSysroot(), FileSpec{"/Path/To/MacOSX12.5.sdk"});
  empty.Merge(XcodeSDK("MacOSX11.5.Internal.sdk",
                       FileSpec{"/Path/To/MacOSX11.5.Internal.sdk"}));
  EXPECT_EQ(empty.GetSysroot(), FileSpec{"/Path/To/MacOSX12.5.Internal.sdk"});
}

#ifndef _WIN32
TEST(XcodeSDKTest, SDKSupportsModules) {
  std::string base = "/Applications/Xcode.app/Contents/Developer/Platforms/";
  EXPECT_TRUE(XcodeSDK::SDKSupportsModules(
      XcodeSDK::Type::iPhoneSimulator,
      FileSpec(
          base +
          "iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator12.0.sdk")));
  EXPECT_TRUE(XcodeSDK::SDKSupportsModules(
      XcodeSDK::Type::iPhoneSimulator,
      FileSpec(base + "iPhoneSimulator.platform/Developer/SDKs/"
                      "iPhoneSimulator12.0.Internal.sdk")));
  EXPECT_FALSE(XcodeSDK::SDKSupportsModules(
      XcodeSDK::Type::iPhoneSimulator,
      FileSpec(
          base +
          "iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator7.2.sdk")));
  EXPECT_TRUE(XcodeSDK::SDKSupportsModules(
      XcodeSDK::Type::MacOSX,
      FileSpec(base + "MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk")));
  EXPECT_FALSE(XcodeSDK::SDKSupportsModules(
      XcodeSDK::Type::MacOSX,
      FileSpec(base + "MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk")));
}
#endif

TEST(XcodeSDKTest, SDKSupportsSwift) {
  EXPECT_TRUE(XcodeSDK("iPhoneSimulator12.0.sdk").SupportsSwift());
  EXPECT_TRUE(XcodeSDK("iPhoneSimulator12.0.Internal.sdk").SupportsSwift());
  EXPECT_FALSE(XcodeSDK("iPhoneSimulator7.2.sdk").SupportsSwift());
  EXPECT_TRUE(XcodeSDK("MacOSX10.10.sdk").SupportsSwift());
  EXPECT_FALSE(XcodeSDK("MacOSX10.9.sdk").SupportsSwift());
  EXPECT_TRUE(XcodeSDK("Linux.sdk").SupportsSwift());
  EXPECT_TRUE(XcodeSDK("MacOSX.sdk").SupportsSwift());
  EXPECT_FALSE(XcodeSDK("EverythingElse.sdk").SupportsSwift());
}

TEST(XcodeSDKTest, GetCanonicalNameAndConstruct) {
  XcodeSDK::Info info;
  info.type = XcodeSDK::Type::MacOSX;
  EXPECT_EQ("macosx", XcodeSDK::GetCanonicalName(info));
  EXPECT_EQ(XcodeSDK(info).Parse(), info);

  info.type = XcodeSDK::Type::iPhoneSimulator;
  EXPECT_EQ("iphonesimulator", XcodeSDK::GetCanonicalName(info));
  EXPECT_EQ(XcodeSDK(info).Parse(), info);

  info.type = XcodeSDK::Type::iPhoneOS;
  EXPECT_EQ("iphoneos", XcodeSDK::GetCanonicalName(info));
  EXPECT_EQ(XcodeSDK(info).Parse(), info);

  info.type = XcodeSDK::Type::AppleTVSimulator;
  EXPECT_EQ("appletvsimulator", XcodeSDK::GetCanonicalName(info));
  EXPECT_EQ(XcodeSDK(info).Parse(), info);

  info.type = XcodeSDK::Type::AppleTVOS;
  EXPECT_EQ("appletvos", XcodeSDK::GetCanonicalName(info));
  EXPECT_EQ(XcodeSDK(info).Parse(), info);

  info.type = XcodeSDK::Type::WatchSimulator;
  EXPECT_EQ("watchsimulator", XcodeSDK::GetCanonicalName(info));
  EXPECT_EQ(XcodeSDK(info).Parse(), info);

  info.type = XcodeSDK::Type::watchOS;
  EXPECT_EQ("watchos", XcodeSDK::GetCanonicalName(info));
  EXPECT_EQ(XcodeSDK(info).Parse(), info);

  info.type = XcodeSDK::Type::XRSimulator;
  EXPECT_EQ("xrsimulator", XcodeSDK::GetCanonicalName(info));
  EXPECT_EQ(XcodeSDK(info).Parse(), info);

  info.type = XcodeSDK::Type::XROS;
  EXPECT_EQ("xros", XcodeSDK::GetCanonicalName(info));
  EXPECT_EQ(XcodeSDK(info).Parse(), info);

  info.type = XcodeSDK::Type::Linux;
  EXPECT_EQ("linux", XcodeSDK::GetCanonicalName(info));
  EXPECT_EQ(XcodeSDK(info).Parse(), info);

  info.type = XcodeSDK::Type::unknown;
  EXPECT_EQ("", XcodeSDK::GetCanonicalName(info));
  EXPECT_EQ(XcodeSDK(info).Parse(), info);

  info.internal = true;
  info.type = XcodeSDK::Type::MacOSX;
  EXPECT_EQ("macosx.internal", XcodeSDK::GetCanonicalName(info));
  EXPECT_EQ(XcodeSDK(info).Parse(), info);

  info.type = XcodeSDK::Type::iPhoneSimulator;
  EXPECT_EQ("iphonesimulator.internal", XcodeSDK::GetCanonicalName(info));
  EXPECT_EQ(XcodeSDK(info).Parse(), info);

  info.type = XcodeSDK::Type::iPhoneOS;
  EXPECT_EQ("iphoneos.internal", XcodeSDK::GetCanonicalName(info));
  EXPECT_EQ(XcodeSDK(info).Parse(), info);

  info.type = XcodeSDK::Type::AppleTVSimulator;
  EXPECT_EQ("appletvsimulator.internal", XcodeSDK::GetCanonicalName(info));
  EXPECT_EQ(XcodeSDK(info).Parse(), info);

  info.type = XcodeSDK::Type::AppleTVOS;
  EXPECT_EQ("appletvos.internal", XcodeSDK::GetCanonicalName(info));
  EXPECT_EQ(XcodeSDK(info).Parse(), info);

  info.type = XcodeSDK::Type::WatchSimulator;
  EXPECT_EQ("watchsimulator.internal", XcodeSDK::GetCanonicalName(info));
  EXPECT_EQ(XcodeSDK(info).Parse(), info);

  info.type = XcodeSDK::Type::watchOS;
  EXPECT_EQ("watchos.internal", XcodeSDK::GetCanonicalName(info));
  EXPECT_EQ(XcodeSDK(info).Parse(), info);

  info.type = XcodeSDK::Type::XRSimulator;
  EXPECT_EQ("xrsimulator.internal", XcodeSDK::GetCanonicalName(info));
  EXPECT_EQ(XcodeSDK(info).Parse(), info);

  info.type = XcodeSDK::Type::XROS;
  EXPECT_EQ("xros.internal", XcodeSDK::GetCanonicalName(info));
  EXPECT_EQ(XcodeSDK(info).Parse(), info);
  info.type = XcodeSDK::Type::MacOSX;
  info.version = llvm::VersionTuple(10, 9);
  EXPECT_EQ("macosx10.9.internal", XcodeSDK::GetCanonicalName(info));
  EXPECT_EQ(XcodeSDK(info).Parse(), info);

  info.type = XcodeSDK::Type::iPhoneOS;
  info.version = llvm::VersionTuple(7, 0);
  EXPECT_EQ("iphoneos7.0.internal", XcodeSDK::GetCanonicalName(info));
  EXPECT_EQ(XcodeSDK(info).Parse(), info);
}

TEST(XcodeSDKTest, GetSDKTypeForTriple) {
  EXPECT_EQ(
      XcodeSDK::GetSDKTypeForTriple(llvm::Triple("x86_64-apple-macosx10.14")),
      XcodeSDK::Type::MacOSX);
  EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(llvm::Triple("x86_64-apple-darwin")),
            XcodeSDK::Type::MacOSX);
  EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(
                llvm::Triple("x86_64-apple-ios13.4-simulator")),
            XcodeSDK::Type::iPhoneSimulator);
  EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(llvm::Triple("arm64-apple-ios13.4")),
            XcodeSDK::Type::iPhoneOS);
  EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(
                llvm::Triple("x86_64-apple-ios13.4-macabi")),
            XcodeSDK::Type::MacOSX);
  EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(
                llvm::Triple("x86_64-apple-tvos-simulator")),
            XcodeSDK::Type::AppleTVSimulator);
  EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(llvm::Triple("arm64-apple-tvos")),
            XcodeSDK::Type::AppleTVOS);
  EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(
                llvm::Triple("x86_64-apple-watchos-simulator")),
            XcodeSDK::Type::WatchSimulator);
  EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(llvm::Triple("arm64-apple-watchos")),
            XcodeSDK::Type::watchOS);
  EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(
                llvm::Triple("arm64e-apple-xros-simulator")),
            XcodeSDK::Type::XRSimulator);
  EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(llvm::Triple("arm64e-apple-xros")),
            XcodeSDK::Type::XROS);
  EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(llvm::Triple("x86_64-unknown-linux")),
            XcodeSDK::Type::Linux);
  EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(llvm::Triple("i386-unknown-netbsd")),
            XcodeSDK::Type::unknown);
}

TEST(XcodeSDKTest, FindXcodeContentsDirectoryInPath) {
  std::string standard =
      "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/"
      "Developer/SDKs/MacOSX.sdk";
  EXPECT_EQ("/Applications/Xcode.app/Contents",
            XcodeSDK::FindXcodeContentsDirectoryInPath(standard));

  std::string standard_version =
      "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/"
      "Developer/SDKs/MacOSX10.15.sdk";
  EXPECT_EQ("/Applications/Xcode.app/Contents",
            XcodeSDK::FindXcodeContentsDirectoryInPath(standard_version));

  std::string beta = "/Applications/Xcode-beta.app/Contents/Developer/"
                     "Platforms/MacOSX.platform/"
                     "Developer/SDKs/MacOSX10.15.sdk";
  EXPECT_EQ("/Applications/Xcode-beta.app/Contents",
            XcodeSDK::FindXcodeContentsDirectoryInPath(beta));

  std::string no_app =
      "/Applications/Xcode/Contents/Developer/Platforms/MacOSX.platform/"
      "Developer/SDKs/MacOSX10.15.sdk";
  EXPECT_EQ("", XcodeSDK::FindXcodeContentsDirectoryInPath(no_app));

  std::string no_contents =
      "/Applications/Xcode.app/Developer/Platforms/MacOSX.platform/"
      "Developer/SDKs/MacOSX10.15.sdk";
  EXPECT_EQ("", XcodeSDK::FindXcodeContentsDirectoryInPath(no_contents));

  std::string no_capitalization =
      "/Applications/Xcode.app/contents/Developer/Platforms/MacOSX.platform/"
      "Developer/SDKs/MacOSX10.15.sdk";
  EXPECT_EQ("", XcodeSDK::FindXcodeContentsDirectoryInPath(no_capitalization));
}
