From ee165379c56b22b105ca02c65984b697b4e10ad2 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Mon, 21 Feb 2022 14:55:39 -0800 Subject: [PATCH] TestHarnessRunner: Wire up environment variable option setting Wire up the environment variable option setting so asm files can set these and it works --- Source/Tests/HarnessHelpers.h | 18 +++++++++++ Source/Tests/TestHarnessRunner.cpp | 52 ++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) diff --git a/Source/Tests/HarnessHelpers.h b/Source/Tests/HarnessHelpers.h index d313c1127..1f7294f4e 100644 --- a/Source/Tests/HarnessHelpers.h +++ b/Source/Tests/HarnessHelpers.h @@ -161,6 +161,21 @@ namespace FEX::HarnessHelper { void Init(std::string const &ConfigFilename) { ReadFile(ConfigFilename, &RawConfigFile); memcpy(&BaseConfig, RawConfigFile.data(), sizeof(ConfigStructBase)); + GetEnvironmentOptions(); + } + + std::vector> GetEnvironmentOptions() { + std::vector> Env{}; + + uintptr_t DataOffset = BaseConfig.OptionEnvOptionOffset; + for (unsigned i = 0; i < BaseConfig.OptionEnvOptionCount; ++i) { + // Environment variables are null terminated strings + std::string_view Key = RawConfigFile.data() + DataOffset; + std::string_view Value = RawConfigFile.data() + DataOffset + Key.size() + 1; + DataOffset += Key.size() + Value.size() + 2; + Env.emplace_back(Key, Value); + } + return Env; } bool CompareStates(FEXCore::Core::CPUState const* State1, FEXCore::Core::CPUState const* State2) { @@ -426,6 +441,9 @@ namespace FEX::HarnessHelper { Config.LoadMemory(); } + std::vector> GetEnvironmentOptions() { + return Config.GetEnvironmentOptions(); + } bool CompareStates(FEXCore::Core::CPUState const* State1, FEXCore::Core::CPUState const* State2) { return Config.CompareStates(State1, State2); diff --git a/Source/Tests/TestHarnessRunner.cpp b/Source/Tests/TestHarnessRunner.cpp index 318c8d262..7da915560 100644 --- a/Source/Tests/TestHarnessRunner.cpp +++ b/Source/Tests/TestHarnessRunner.cpp @@ -64,6 +64,53 @@ void AssertHandler(char const *Message) { fmt::print("[ASSERT] {}\n", Message); } +namespace { +static const std::vector> EnvConfigLookup = {{ +#define OPT_BASE(type, group, enum, json, default) {"FEX_" #enum, FEXCore::Config::ConfigOption::CONFIG_##enum}, +#include +}}; + +// Claims to be a local application config layer +class TestEnvLoader final : public FEXCore::Config::Layer { +public: + explicit TestEnvLoader(std::vector> _Env) + : FEXCore::Config::Layer(FEXCore::Config::LayerType::LAYER_LOCAL_APP) + , Env {std::move(_Env)} { + Load(); + } + + void Load() override { + std::unordered_map EnvMap; + for (auto &Option : Env) { + std::string_view Key = Option.first; + std::string_view Value = Option.second; + +#define ENVLOADER +#include + + EnvMap.insert_or_assign(Key, Value); + } + + auto GetVar = [&](const std::string_view id) -> std::optional { + const auto it = EnvMap.find(id); + if (it == EnvMap.end()) + return std::nullopt; + + return it->second; + }; + + for (auto &it : EnvConfigLookup) { + if (auto Value = GetVar(it.first); Value) { + Set(it.second, *Value); + } + } + } + +private: + std::vector> Env; +}; +} + int main(int argc, char **argv, char **const envp) { LogMan::Throw::InstallHandler(AssertHandler); LogMan::Msg::InstallHandler(MsgHandler); @@ -80,6 +127,11 @@ int main(int argc, char **argv, char **const envp) { } FEX::HarnessHelper::HarnessCodeLoader Loader{Args[0], Args[1].c_str()}; + + // Adds in environment options from the test harness config + FEXCore::Config::AddLayer(std::make_unique(Loader.GetEnvironmentOptions())); + FEXCore::Config::ReloadMetaLayer(); + FEXCore::Config::Set(FEXCore::Config::CONFIG_IS64BIT_MODE, Loader.Is64BitMode() ? "1" : "0"); FEXCore::Context::InitializeStaticTables(Loader.Is64BitMode() ? FEXCore::Context::MODE_64BIT : FEXCore::Context::MODE_32BIT);