} // namespace mc
} // namespace simgrid
-
-#ifdef SIMGRID_TEST
-
-#include <cstdint>
-#include <cstring>
-
-#include <sys/mman.h>
-#include <unistd.h>
-
-#include <memory>
-
-#include "src/mc/PageStore.hpp"
-
-static int value = 0;
-
-static void new_content(void* data, std::size_t size)
-{
- ::memset(data, ++value, size);
-}
-
-static void* getpage()
-{
- return mmap(nullptr, getpagesize(), PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
-}
-
-XBT_TEST_SUITE("mc_page_store", "Page store");
-
-XBT_TEST_UNIT("base", test_mc_page_store, "Test adding/removing pages in the store")
-{
- using simgrid::mc::PageStore;
-
- xbt_test_add("Init");
- std::size_t pagesize = (size_t)getpagesize();
- std::unique_ptr<PageStore> store = std::unique_ptr<PageStore>(new simgrid::mc::PageStore(500));
- void* data = getpage();
- xbt_test_assert(store->size() == 0, "Bad size");
-
- xbt_test_add("Store the page once");
- new_content(data, pagesize);
- size_t pageno1 = store->store_page(data);
- xbt_test_assert(store->get_ref(pageno1) == 1, "Bad refcount");
- const void* copy = store->get_page(pageno1);
- xbt_test_assert(::memcmp(data, copy, pagesize) == 0, "Page data should be the same");
- xbt_test_assert(store->size() == 1, "Bad size");
-
- xbt_test_add("Store the same page again");
- size_t pageno2 = store->store_page(data);
- xbt_test_assert(pageno1 == pageno2, "Page should be the same");
- xbt_test_assert(store->get_ref(pageno1) == 2, "Bad refcount");
- xbt_test_assert(store->size() == 1, "Bad size");
-
- xbt_test_add("Store a new page");
- new_content(data, pagesize);
- size_t pageno3 = store->store_page(data);
- xbt_test_assert(pageno1 != pageno3, "New page should be different");
- xbt_test_assert(store->size() == 2, "Bad size");
-
- xbt_test_add("Unref pages");
- store->unref_page(pageno1);
- xbt_assert(store->get_ref(pageno1) == 1, "Bad refcount");
- xbt_assert(store->size() == 2, "Bad size");
- store->unref_page(pageno2);
- xbt_test_assert(store->size() == 1, "Bad size");
-
- xbt_test_add("Reallocate page");
- new_content(data, pagesize);
- size_t pageno4 = store->store_page(data);
- xbt_test_assert(pageno1 == pageno4, "Page was not reused");
- xbt_test_assert(store->get_ref(pageno4) == 1, "Bad refcount");
- xbt_test_assert(store->size() == 2, "Bad size");
-}
-
-#endif /* SIMGRID_TEST */
} // namespace mc
} // namespace simgrid
-
-#ifdef SIMGRID_TEST
-
-#include <cstdlib>
-#include <cstring>
-
-#include <sys/mman.h>
-
-#include "src/mc/mc_config.hpp"
-#include "src/mc/mc_mmu.hpp"
-#include "src/mc/mc_private.hpp"
-#include "src/mc/mc_snapshot.hpp"
-
-XBT_TEST_SUITE("mc_snapshot", "Snapshots");
-
-static inline void init_memory(void* mem, size_t size)
-{
- char* dest = (char*)mem;
- for (size_t i = 0; i < size; ++i) {
- dest[i] = rand() & 255;
- }
-}
-
-static void test_snapshot(bool sparse_checkpoint);
-
-XBT_TEST_UNIT("flat_snapshot", test_flat_snapshots, "Test flat snapshots")
-{
- test_snapshot(0);
-}
-
-XBT_TEST_UNIT("page_snapshots", test_per_snpashots, "Test per-page snapshots")
-{
- test_snapshot(1);
-}
-
-static void test_snapshot(bool sparse_checkpoint)
-{
-
- xbt_test_add("Initialization");
- _sg_mc_sparse_checkpoint = sparse_checkpoint;
- xbt_assert(xbt_pagesize == getpagesize());
- xbt_assert(1 << xbt_pagebits == xbt_pagesize);
-
- std::unique_ptr<simgrid::mc::RemoteClient> process(new simgrid::mc::RemoteClient(getpid(), -1));
- process->init();
- mc_model_checker = new ::simgrid::mc::ModelChecker(std::move(process));
-
- for (int n = 1; n != 256; ++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);
- xbt_assert(source != MAP_FAILED, "Could not allocate source memory");
-
- // Init memory and take snapshots:
- init_memory(source, byte_size);
- simgrid::mc::RegionSnapshot region0 =
- simgrid::mc::sparse_region(simgrid::mc::RegionType::Unknown, source, source, byte_size);
- for (int i = 0; i < n; i += 2) {
- init_memory((char*)source + i * xbt_pagesize, xbt_pagesize);
- }
- simgrid::mc::RegionSnapshot region =
- simgrid::mc::sparse_region(simgrid::mc::RegionType::Unknown, source, source, byte_size);
-
- void* destination = mmap(nullptr, byte_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
- xbt_assert(source != MAP_FAILED, "Could not allocate destination memory");
-
- xbt_test_add("Reading whole region data for %i page(s)", n);
- const void* read = MC_region_read(®ion, destination, source, byte_size);
- xbt_test_assert(not memcmp(source, read, byte_size), "Mismatch in MC_region_read()");
-
- xbt_test_add("Reading parts of region data for %i page(s)", n);
- for (int j = 0; j != 100; ++j) {
- size_t offset = rand() % byte_size;
- size_t size = rand() % (byte_size - offset);
- const void* read = MC_region_read(®ion, destination, (const char*)source + offset, size);
- xbt_test_assert(not memcmp((char*)source + offset, read, size), "Mismatch in MC_region_read()");
- }
-
- xbt_test_add("Compare whole region data for %i page(s)", n);
-
- xbt_test_assert(MC_snapshot_region_memcmp(source, ®ion0, source, ®ion, byte_size),
- "Unexpected match in MC_snapshot_region_memcmp() with previous snapshot");
-
- xbt_test_add("Compare parts of region data for %i page(s) with itself", n);
- for (int j = 0; j != 100; ++j) {
- size_t offset = rand() % byte_size;
- size_t size = rand() % (byte_size - offset);
- xbt_test_assert(
- not MC_snapshot_region_memcmp((char*)source + offset, ®ion, (char*)source + offset, ®ion, size),
- "Mismatch in MC_snapshot_region_memcmp()");
- }
-
- if (n == 1) {
- xbt_test_add("Read pointer for %i page(s)", n);
- memcpy(source, &mc_model_checker, sizeof(void*));
- simgrid::mc::RegionSnapshot region2 =
- simgrid::mc::sparse_region(simgrid::mc::RegionType::Unknown, source, source, byte_size);
- xbt_test_assert(MC_region_read_pointer(®ion2, source) == mc_model_checker,
- "Mismtach in MC_region_read_pointer()");
- }
-
- munmap(destination, byte_size);
- munmap(source, byte_size);
- }
-
- delete mc_model_checker;
- mc_model_checker = nullptr;
-}
-
-#endif /* SIMGRID_TEST */