mirror of
https://github.com/momo5502/emulator.git
synced 2026-01-19 03:33:56 +00:00
Create proper emulator
This commit is contained in:
@@ -22,14 +22,14 @@ namespace test
|
||||
|
||||
TEST(EmulationTest, CountedEmulationIsAccurate)
|
||||
{
|
||||
auto emu = create_reproducible_sample_emulator();
|
||||
auto emu = create_sample_emulator();
|
||||
emu.start();
|
||||
|
||||
ASSERT_TERMINATED_SUCCESSFULLY(emu);
|
||||
|
||||
const auto executedInstructions = emu.get_executed_instructions();
|
||||
|
||||
auto new_emu = create_reproducible_sample_emulator();
|
||||
auto new_emu = create_sample_emulator();
|
||||
|
||||
constexpr auto offset = 1;
|
||||
const auto instructionsToExecute = executedInstructions - offset;
|
||||
|
||||
@@ -57,6 +57,29 @@ namespace test
|
||||
return settings;
|
||||
}
|
||||
|
||||
inline windows_emulator create_emulator(emulator_settings settings, emulator_callbacks callbacks = {})
|
||||
{
|
||||
const auto is_verbose = enable_verbose_logging();
|
||||
|
||||
if (is_verbose)
|
||||
{
|
||||
settings.disable_logging = false;
|
||||
}
|
||||
|
||||
settings.emulation_root = get_emulator_root();
|
||||
|
||||
settings.path_mappings["C:\\a.txt"] =
|
||||
std::filesystem::temp_directory_path() / ("emulator-test-file-" + std::to_string(getpid()) + ".txt");
|
||||
|
||||
return windows_emulator{
|
||||
settings,
|
||||
std::move(callbacks),
|
||||
emulator_interfaces{
|
||||
.socket_factory = network::create_static_socket_factory(),
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
inline windows_emulator create_sample_emulator(emulator_settings settings, const sample_configuration& config = {},
|
||||
emulator_callbacks callbacks = {})
|
||||
{
|
||||
@@ -93,9 +116,14 @@ namespace test
|
||||
return create_sample_emulator(std::move(settings), config);
|
||||
}
|
||||
|
||||
inline windows_emulator create_reproducible_sample_emulator()
|
||||
inline windows_emulator create_empty_emulator()
|
||||
{
|
||||
return create_sample_emulator();
|
||||
emulator_settings settings{
|
||||
.disable_logging = true,
|
||||
.use_relative_time = true,
|
||||
};
|
||||
|
||||
return create_emulator(std::move(settings));
|
||||
}
|
||||
|
||||
inline void bisect_emulation(windows_emulator& emu)
|
||||
|
||||
@@ -4,7 +4,7 @@ namespace test
|
||||
{
|
||||
TEST(SerializationTest, ResettingEmulatorWorks)
|
||||
{
|
||||
auto emu = create_reproducible_sample_emulator();
|
||||
auto emu = create_sample_emulator();
|
||||
|
||||
utils::buffer_serializer start_state{};
|
||||
emu.serialize(start_state);
|
||||
@@ -31,7 +31,7 @@ namespace test
|
||||
|
||||
TEST(SerializationTest, SerializedDataIsReproducible)
|
||||
{
|
||||
auto emu1 = create_reproducible_sample_emulator();
|
||||
auto emu1 = create_sample_emulator();
|
||||
emu1.start();
|
||||
|
||||
ASSERT_TERMINATED_SUCCESSFULLY(emu1);
|
||||
@@ -41,7 +41,7 @@ namespace test
|
||||
|
||||
utils::buffer_deserializer deserializer{serializer1.get_buffer()};
|
||||
|
||||
windows_emulator new_emu{{.emulation_root = get_emulator_root(), .use_relative_time = true}};
|
||||
auto new_emu = create_empty_emulator();
|
||||
new_emu.deserialize(deserializer);
|
||||
|
||||
utils::buffer_serializer serializer2{};
|
||||
@@ -55,7 +55,7 @@ namespace test
|
||||
|
||||
TEST(SerializationTest, EmulationIsReproducible)
|
||||
{
|
||||
auto emu1 = create_reproducible_sample_emulator();
|
||||
auto emu1 = create_sample_emulator();
|
||||
emu1.start();
|
||||
|
||||
ASSERT_TERMINATED_SUCCESSFULLY(emu1);
|
||||
@@ -63,7 +63,7 @@ namespace test
|
||||
utils::buffer_serializer serializer1{};
|
||||
emu1.serialize(serializer1);
|
||||
|
||||
auto emu2 = create_reproducible_sample_emulator();
|
||||
auto emu2 = create_sample_emulator();
|
||||
emu2.start();
|
||||
|
||||
ASSERT_TERMINATED_SUCCESSFULLY(emu2);
|
||||
@@ -76,7 +76,7 @@ namespace test
|
||||
|
||||
TEST(SerializationTest, DeserializedEmulatorBehavesLikeSource)
|
||||
{
|
||||
auto emu = create_reproducible_sample_emulator();
|
||||
auto emu = create_sample_emulator();
|
||||
emu.start({}, 100);
|
||||
|
||||
utils::buffer_serializer serializer{};
|
||||
@@ -84,14 +84,7 @@ namespace test
|
||||
|
||||
utils::buffer_deserializer deserializer{serializer.get_buffer()};
|
||||
|
||||
windows_emulator new_emu{
|
||||
{.emulation_root = get_emulator_root(), .use_relative_time = true},
|
||||
{
|
||||
.socket_factory = network::create_static_socket_factory(),
|
||||
},
|
||||
};
|
||||
|
||||
new_emu.log.disable_output(true);
|
||||
auto new_emu = create_empty_emulator();
|
||||
new_emu.deserialize(deserializer);
|
||||
|
||||
new_emu.start();
|
||||
|
||||
@@ -213,25 +213,24 @@ std::unique_ptr<x64_emulator> create_default_x64_emulator()
|
||||
windows_emulator::windows_emulator(application_settings app_settings, const emulator_settings& settings,
|
||||
emulator_callbacks callbacks, emulator_interfaces interfaces,
|
||||
std::unique_ptr<x64_emulator> emu)
|
||||
: windows_emulator(settings, std::move(interfaces), std::move(emu))
|
||||
: windows_emulator(settings, std::move(callbacks), std::move(interfaces), std::move(emu))
|
||||
{
|
||||
this->callbacks = std::move(callbacks);
|
||||
|
||||
fixup_application_settings(app_settings);
|
||||
this->setup_process(app_settings);
|
||||
}
|
||||
|
||||
windows_emulator::windows_emulator(const emulator_settings& settings, emulator_interfaces interfaces,
|
||||
std::unique_ptr<x64_emulator> emu)
|
||||
windows_emulator::windows_emulator(const emulator_settings& settings, emulator_callbacks callbacks,
|
||||
emulator_interfaces interfaces, std::unique_ptr<x64_emulator> emu)
|
||||
: emu_(std::move(emu)),
|
||||
clock_(get_clock(interfaces, this->executed_instructions_, settings.use_relative_time)),
|
||||
socket_factory_(get_socket_factory(interfaces)),
|
||||
emulation_root{settings.emulation_root.empty() ? settings.emulation_root : absolute(settings.emulation_root)},
|
||||
callbacks(std::move(callbacks)),
|
||||
file_sys(emulation_root.empty() ? emulation_root : emulation_root / "filesys"),
|
||||
memory(*this->emu_),
|
||||
registry(emulation_root.empty() ? settings.registry_directory : emulation_root / "registry"),
|
||||
mod_manager(memory, file_sys, callbacks),
|
||||
process(*this->emu_, memory, *this->clock_, callbacks)
|
||||
mod_manager(memory, file_sys, this->callbacks),
|
||||
process(*this->emu_, memory, *this->clock_, this->callbacks)
|
||||
{
|
||||
#ifndef OS_WINDOWS
|
||||
if (this->emulation_root.empty())
|
||||
|
||||
@@ -71,7 +71,8 @@ class windows_emulator
|
||||
process_context process;
|
||||
syscall_dispatcher dispatcher;
|
||||
|
||||
windows_emulator(const emulator_settings& settings = {}, emulator_interfaces interfaces = {},
|
||||
windows_emulator(const emulator_settings& settings = {}, emulator_callbacks callbacks = {},
|
||||
emulator_interfaces interfaces = {},
|
||||
std::unique_ptr<x64_emulator> emu = create_default_x64_emulator());
|
||||
windows_emulator(application_settings app_settings, const emulator_settings& settings = {},
|
||||
emulator_callbacks callbacks = {}, emulator_interfaces interfaces = {},
|
||||
|
||||
Reference in New Issue
Block a user