blob: 8ab223ea2cd578fb19892acc8075a47f84f73cdd [file] [log] [blame]
//===-- PlatformTest.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 "Plugins/Platform/POSIX/PlatformPOSIX.h"
#include "TestingSupport/SubsystemRAII.h"
#include "lldb/Core/PluginManager.h"
#include "lldb/Host/FileSystem.h"
#include "lldb/Host/HostInfo.h"
#include "lldb/Target/Platform.h"
using namespace lldb;
using namespace lldb_private;
class TestPlatform : public PlatformPOSIX {
public:
TestPlatform() : PlatformPOSIX(false) {}
};
class PlatformArm : public TestPlatform {
public:
PlatformArm() = default;
std::vector<ArchSpec>
GetSupportedArchitectures(const ArchSpec &process_host_arch) override {
return {ArchSpec("arm64-apple-ps4")};
}
llvm::StringRef GetPluginName() override { return "arm"; }
llvm::StringRef GetDescription() override { return "arm"; }
};
class PlatformIntel : public TestPlatform {
public:
PlatformIntel() = default;
std::vector<ArchSpec>
GetSupportedArchitectures(const ArchSpec &process_host_arch) override {
return {ArchSpec("x86_64-apple-ps4")};
}
llvm::StringRef GetPluginName() override { return "intel"; }
llvm::StringRef GetDescription() override { return "intel"; }
};
class PlatformThumb : public TestPlatform {
public:
static void Initialize() {
PluginManager::RegisterPlugin("thumb", "thumb",
PlatformThumb::CreateInstance);
}
static void Terminate() {
PluginManager::UnregisterPlugin(PlatformThumb::CreateInstance);
}
static PlatformSP CreateInstance(bool force, const ArchSpec *arch) {
return std::make_shared<PlatformThumb>();
}
std::vector<ArchSpec>
GetSupportedArchitectures(const ArchSpec &process_host_arch) override {
return {ArchSpec("thumbv7-apple-ps4"), ArchSpec("thumbv7f-apple-ps4")};
}
llvm::StringRef GetPluginName() override { return "thumb"; }
llvm::StringRef GetDescription() override { return "thumb"; }
};
class PlatformTest : public ::testing::Test {
SubsystemRAII<FileSystem, HostInfo> subsystems;
protected:
PlatformList list;
void SetHostPlatform(const PlatformSP &platform_sp) {
Platform::SetHostPlatform(platform_sp);
ASSERT_EQ(Platform::GetHostPlatform(), platform_sp);
list.Append(platform_sp, /*set_selected=*/true);
}
};
TEST_F(PlatformTest, GetPlatformForArchitecturesHost) {
SetHostPlatform(std::make_shared<PlatformArm>());
const std::vector<ArchSpec> archs = {ArchSpec("arm64-apple-ps4"),
ArchSpec("arm64e-apple-ps4")};
std::vector<PlatformSP> candidates;
// The host platform matches all architectures.
PlatformSP platform_sp = list.GetOrCreate(archs, {}, candidates);
ASSERT_TRUE(platform_sp);
EXPECT_EQ(platform_sp, Platform::GetHostPlatform());
}
TEST_F(PlatformTest, GetPlatformForArchitecturesSelected) {
SetHostPlatform(std::make_shared<PlatformIntel>());
const std::vector<ArchSpec> archs = {ArchSpec("arm64-apple-ps4"),
ArchSpec("arm64e-apple-ps4")};
std::vector<PlatformSP> candidates;
// The host platform matches no architectures.
PlatformSP platform_sp = list.GetOrCreate(archs, {}, candidates);
ASSERT_FALSE(platform_sp);
// The selected platform matches all architectures.
const PlatformSP selected_platform_sp = std::make_shared<PlatformArm>();
list.Append(selected_platform_sp, /*set_selected=*/true);
platform_sp = list.GetOrCreate(archs, {}, candidates);
ASSERT_TRUE(platform_sp);
EXPECT_EQ(platform_sp, selected_platform_sp);
}
TEST_F(PlatformTest, GetPlatformForArchitecturesSelectedOverHost) {
SetHostPlatform(std::make_shared<PlatformIntel>());
const std::vector<ArchSpec> archs = {ArchSpec("arm64-apple-ps4"),
ArchSpec("x86_64-apple-ps4")};
std::vector<PlatformSP> candidates;
// The host platform matches one architecture.
PlatformSP platform_sp = list.GetOrCreate(archs, {}, candidates);
ASSERT_TRUE(platform_sp);
EXPECT_EQ(platform_sp, Platform::GetHostPlatform());
// The selected and host platform each match one architecture.
// The selected platform is preferred.
const PlatformSP selected_platform_sp = std::make_shared<PlatformArm>();
list.Append(selected_platform_sp, /*set_selected=*/true);
platform_sp = list.GetOrCreate(archs, {}, candidates);
ASSERT_TRUE(platform_sp);
EXPECT_EQ(platform_sp, selected_platform_sp);
}
TEST_F(PlatformTest, GetPlatformForArchitecturesCandidates) {
PlatformThumb::Initialize();
SetHostPlatform(std::make_shared<PlatformIntel>());
const PlatformSP selected_platform_sp = std::make_shared<PlatformArm>();
list.Append(selected_platform_sp, /*set_selected=*/true);
const std::vector<ArchSpec> archs = {ArchSpec("thumbv7-apple-ps4"),
ArchSpec("thumbv7f-apple-ps4")};
std::vector<PlatformSP> candidates;
// The host platform matches one architecture.
PlatformSP platform_sp = list.GetOrCreate(archs, {}, candidates);
ASSERT_TRUE(platform_sp);
EXPECT_EQ(platform_sp->GetName(), "thumb");
PlatformThumb::Terminate();
}