X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/8bf8303f84623a9346997d71d828a2e843c685d3..cd8cf3e33c5e55c7daa82efd1445475f4574eb92:/src/mc/sosp/Snapshot_test.cpp diff --git a/src/mc/sosp/Snapshot_test.cpp b/src/mc/sosp/Snapshot_test.cpp index cadb7bdf43..abf1dd03da 100644 --- a/src/mc/sosp/Snapshot_test.cpp +++ b/src/mc/sosp/Snapshot_test.cpp @@ -1,87 +1,76 @@ -/* Copyright (c) 2014-2019. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2014-2023. The SimGrid Team. All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ -#include "src/include/catch.hpp" +#include "src/3rd-party/catch.hpp" #include "src/mc/mc_config.hpp" #include "src/mc/sosp/Snapshot.hpp" #include -#include +#include #include +#include -/**************** Class BOOST_tests *************************/ -using simgrid::mc::Region; class snap_test_helper { -public: - static void init_memory(void* mem, size_t size); - static void Init(); - typedef struct { + simgrid::mc::PageStore page_store_{500}; + simgrid::mc::RemoteProcessMemory memory_{getpid(), nullptr}; + + struct prologue_return { size_t size; - void* src; - void* dstn; - Region* region0; - Region* region; - } prologue_return; - static prologue_return prologue(int n); // common to the below 5 fxs - static void read_whole_region(); - static void read_region_parts(); - static void compare_whole_region(); - static void compare_region_parts(); - static void read_pointer(); - - static void cleanup() - { - delete mc_model_checker; - mc_model_checker = nullptr; - } + std::byte* src; + std::byte* dstn; + std::unique_ptr region0; + std::unique_ptr region; + }; + prologue_return prologue(int n); // common to the below 5 fxs - static std::default_random_engine rnd_engine; - static std::unique_ptr process; -}; + static void init_memory(std::byte* mem, size_t size); -// static member variables init. -std::default_random_engine snap_test_helper::rnd_engine; -std::unique_ptr snap_test_helper::process = nullptr; +public: + void read_whole_region(); + void read_region_parts(); + void compare_whole_region(); + void compare_region_parts(); + void read_pointer(); -void snap_test_helper::init_memory(void* mem, size_t size) + static void basic_requirements(); +}; + +void snap_test_helper::init_memory(std::byte* mem, size_t size) { - char* dest = (char*)mem; - for (size_t i = 0; i < size; ++i) { - dest[i] = rnd_engine() & 255; - } + std::generate_n(mem, size, []() { return static_cast(simgrid::xbt::random::uniform_int(0, 0xff)); }); } -void snap_test_helper::Init() +void snap_test_helper::basic_requirements() { REQUIRE(xbt_pagesize == getpagesize()); REQUIRE(1 << xbt_pagebits == xbt_pagesize); - - process.reset(new simgrid::mc::RemoteClient(getpid(), -1)); - process->init(); - mc_model_checker = new ::simgrid::mc::ModelChecker(std::move(process)); } snap_test_helper::prologue_return snap_test_helper::prologue(int n) { // Store region page(s): size_t byte_size = n * xbt_pagesize; - void* source = mmap(nullptr, byte_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); - INFO("Could not allocate source memory") + auto* source = + static_cast(mmap(nullptr, byte_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0)); + INFO("Could not allocate source memory"); REQUIRE(source != MAP_FAILED); // Init memory and take snapshots: init_memory(source, byte_size); - simgrid::mc::Region* region0 = new simgrid::mc::Region(simgrid::mc::RegionType::Data, source, byte_size); + auto region0 = + std::make_unique(page_store_, memory_, simgrid::mc::RegionType::Data, source, byte_size); for (int i = 0; i < n; i += 2) { - init_memory((char*)source + i * xbt_pagesize, xbt_pagesize); + init_memory(source + i * xbt_pagesize, xbt_pagesize); } - simgrid::mc::Region* region = new simgrid::mc::Region(simgrid::mc::RegionType::Data, source, byte_size); + auto region = + std::make_unique(page_store_, memory_, simgrid::mc::RegionType::Data, source, byte_size); - void* destination = mmap(nullptr, byte_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + auto* destination = + static_cast(mmap(nullptr, byte_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0)); INFO("Could not allocate destination memory"); - REQUIRE(source != MAP_FAILED); + REQUIRE(destination != MAP_FAILED); return {.size = byte_size, .src = source, @@ -93,7 +82,6 @@ snap_test_helper::prologue_return snap_test_helper::prologue(int n) void snap_test_helper::read_whole_region() { for (int n = 1; n != 32; ++n) { - prologue_return ret = prologue(n); const void* read = ret.region->read(ret.dstn, ret.src, ret.size); INFO("Mismatch in MC_region_read()"); @@ -101,107 +89,93 @@ void snap_test_helper::read_whole_region() munmap(ret.dstn, ret.size); munmap(ret.src, ret.size); - delete ret.region0; - delete ret.region; } } void snap_test_helper::read_region_parts() { for (int n = 1; n != 32; ++n) { - prologue_return ret = prologue(n); for (int j = 0; j != 100; ++j) { - size_t offset = rnd_engine() % ret.size; - size_t size = rnd_engine() % (ret.size - offset); + size_t offset = simgrid::xbt::random::uniform_int(0, ret.size - 1); + size_t size = simgrid::xbt::random::uniform_int(0, ret.size - offset - 1); const void* read = ret.region->read(ret.dstn, (const char*)ret.src + offset, size); INFO("Mismatch in MC_region_read()"); REQUIRE(not memcmp((char*)ret.src + offset, read, size)); } munmap(ret.dstn, ret.size); munmap(ret.src, ret.size); - delete ret.region0; - delete ret.region; } } void snap_test_helper::compare_whole_region() { for (int n = 1; n != 32; ++n) { - prologue_return ret = prologue(n); INFO("Unexpected match in MC_snapshot_region_memcmp() with previous snapshot"); - REQUIRE(MC_snapshot_region_memcmp(ret.src, ret.region0, ret.src, ret.region, ret.size)); + REQUIRE(MC_snapshot_region_memcmp(ret.src, ret.region0.get(), ret.src, ret.region.get(), ret.size)); munmap(ret.dstn, ret.size); munmap(ret.src, ret.size); - delete ret.region0; - delete ret.region; } } void snap_test_helper::compare_region_parts() { for (int n = 1; n != 32; ++n) { - prologue_return ret = prologue(n); for (int j = 0; j != 100; ++j) { - size_t offset = rnd_engine() % ret.size; - size_t size = rnd_engine() % (ret.size - offset); + size_t offset = simgrid::xbt::random::uniform_int(0, ret.size - 1); + size_t size = simgrid::xbt::random::uniform_int(0, ret.size - offset - 1); INFO("Mismatch in MC_snapshot_region_memcmp()"); - REQUIRE(not MC_snapshot_region_memcmp((char*)ret.src + offset, ret.region, (char*)ret.src + offset, ret.region, - size)); + REQUIRE(not MC_snapshot_region_memcmp((char*)ret.src + offset, ret.region.get(), (char*)ret.src + offset, + ret.region.get(), size)); } munmap(ret.dstn, ret.size); munmap(ret.src, ret.size); - delete ret.region0; - delete ret.region; } } +const int some_global_variable = 42; +const void* const some_global_pointer = &some_global_variable; void snap_test_helper::read_pointer() { - prologue_return ret = prologue(1); - memcpy(ret.src, &mc_model_checker, sizeof(void*)); - simgrid::mc::Region* region2 = new simgrid::mc::Region(simgrid::mc::RegionType::Data, ret.src, ret.size); + memcpy(ret.src, &some_global_pointer, sizeof(void*)); + const simgrid::mc::Region region2(page_store_, memory_, simgrid::mc::RegionType::Data, ret.src, ret.size); INFO("Mismtach in MC_region_read_pointer()"); - REQUIRE(MC_region_read_pointer(region2, ret.src) == mc_model_checker); + REQUIRE(MC_region_read_pointer(®ion2, ret.src) == some_global_pointer); munmap(ret.dstn, ret.size); munmap(ret.src, ret.size); - delete ret.region0; - delete ret.region; - delete region2; } /*************** End: class snap_test_helper *****************************/ TEST_CASE("MC::Snapshot: A copy/snapshot of a given memory region", "MC::Snapshot") { - INFO("Sparse snapshot (using pages)"); - snap_test_helper::Init(); + snap_test_helper::basic_requirements(); + + snap_test_helper snap_test; INFO("Read whole region"); - snap_test_helper::read_whole_region(); + snap_test.read_whole_region(); INFO("Read region parts"); - snap_test_helper::read_region_parts(); + snap_test.read_region_parts(); INFO("Compare whole region"); - snap_test_helper::compare_whole_region(); + snap_test.compare_whole_region(); INFO("Compare region parts"); - snap_test_helper::compare_region_parts(); + snap_test.compare_region_parts(); INFO("Read pointer"); - snap_test_helper::read_pointer(); - - snap_test_helper::cleanup(); + snap_test.read_pointer(); }