Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Minor changes
[simgrid.git] / src / mc / snapshot / unitTest / PageStore_unit.cpp
1 /* Copyright (c) 2015-2018. The SimGrid Team.
2  * All rights reserved.                                                     */
3
4 /* This program is free software; you can redistribute it and/or modify it
5  * under the terms of the license (GNU LGPL) which comes with this package. */
6
7 #define BOOST_TEST_MODULE PAGESTORE
8 #define BOOST_TEST_DYN_LINK
9 #include <boost/test/unit_test.hpp>
10
11 #include <iostream>
12 #include <cstring>
13 #include <cstdint>
14
15 #include <unistd.h>
16 #include <sys/mman.h>
17
18 #include <memory>
19
20 #include "src/mc/PageStore.hpp"
21
22 using simgrid::mc::PageStore;
23
24 /***********************************/
25 // a class to hold the variable used in the test cases
26 class BOOST_tests {
27   public:
28     static std::size_t pagesize;
29     static std::unique_ptr<PageStore> store;
30     static void* data;
31     static size_t pageno1, pageno2, pageno3, pageno4;
32     static int value;
33   public: // member functions used by the test suite(s)
34     static void Init();
35     static void store_page_once();
36     static void store_same_page();
37     static void store_new_page();
38     static void unref_pages();
39     static void reallocate_page();
40
41     static void new_content(void* data, std::size_t size);
42     static void* getpage();
43 };
44
45 // static member datat initialization
46 std::size_t BOOST_tests::pagesize = 0;
47 std::unique_ptr<PageStore> BOOST_tests::store = nullptr;
48 void* BOOST_tests::data = nullptr;
49 size_t BOOST_tests::pageno1 = 0;
50 size_t BOOST_tests::pageno2 = 0;
51 size_t BOOST_tests::pageno3 = 0;
52 size_t BOOST_tests::pageno4 = 0;
53 int BOOST_tests::value = 0;
54
55 void BOOST_tests::Init() {
56   pagesize = (size_t) getpagesize();
57   store = std::unique_ptr<PageStore>(new simgrid::mc::PageStore(500));
58   data = getpage();
59   BOOST_CHECK_MESSAGE(store->size()==0, "Bad size");
60 }
61
62 void BOOST_tests::store_page_once() {
63   new_content(data, pagesize);
64   pageno1 = store->store_page(data);
65   BOOST_CHECK_MESSAGE(store->get_ref(pageno1)==1, "Bad refcount");
66   const void* copy = store->get_page(pageno1);
67   BOOST_CHECK_MESSAGE(::memcmp(data, copy, pagesize)==0, "Page data should be the same");
68   BOOST_CHECK_MESSAGE(store->size()==1, "Bad size");
69 }
70
71 void BOOST_tests::store_same_page() {
72   pageno2 = store->store_page(data);
73   BOOST_CHECK_MESSAGE(pageno1==pageno2, "Page should be the same");
74   BOOST_CHECK_MESSAGE(store->get_ref(pageno1)==2, "Bad refcount");
75   BOOST_CHECK_MESSAGE(store->size()==1, "Bad size");
76 }
77
78 void BOOST_tests::store_new_page() {
79   new_content(data, pagesize);
80   pageno3 = store->store_page(data);
81   BOOST_CHECK_MESSAGE(pageno1 != pageno3, "New page should be different");
82   BOOST_CHECK_MESSAGE(store->size()==2, "Bad size");
83 }
84
85 void BOOST_tests::unref_pages() {
86   store->unref_page(pageno1);
87   BOOST_CHECK_MESSAGE(store->get_ref(pageno1)==1, "Bad refcount");
88   BOOST_CHECK_MESSAGE(store->size()==2, "Bad size");
89   store->unref_page(pageno2);
90   BOOST_CHECK_MESSAGE(store->size()==1, "Bad size");
91 }
92
93 void BOOST_tests::reallocate_page() {
94   new_content(data, pagesize);
95   pageno4 = store->store_page(data);
96   BOOST_CHECK_MESSAGE(pageno1 == pageno4, "Page was not reused");
97   BOOST_CHECK_MESSAGE(store->get_ref(pageno4)==1, "Bad refcount");
98   BOOST_CHECK_MESSAGE(store->size()==2, "Bad size");
99 }
100
101 void BOOST_tests::new_content(void* data, std::size_t size) {
102   ::memset(data, ++value, size);
103 }
104
105 void* BOOST_tests::getpage() {
106   return mmap(nullptr, getpagesize(), PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
107 }
108
109 namespace utf = boost::unit_test; // for test case dependence
110
111 BOOST_AUTO_TEST_SUITE(PAGESTORE)
112 BOOST_AUTO_TEST_CASE(Init) {
113   BOOST_tests::Init();
114 }
115
116 BOOST_AUTO_TEST_CASE(store_page_once, * utf::depends_on("PAGESTORE/Init")) {
117   BOOST_tests::store_page_once();
118 }
119
120 BOOST_AUTO_TEST_CASE(store_same_page, * utf::depends_on("PAGESTORE/store_page_once")) {
121   BOOST_tests::store_same_page();
122 }
123
124 BOOST_AUTO_TEST_CASE(store_new_page, * utf::depends_on("PAGESTORE/store_same_page")) {
125   BOOST_tests::store_new_page();
126 }
127
128 BOOST_AUTO_TEST_CASE(unref_pages, * utf::depends_on("PAGESTORE/store_new_page")) {
129   BOOST_tests::unref_pages();
130 }
131
132 BOOST_AUTO_TEST_CASE(reallocate_page, * utf::depends_on("PAGESTORE/unref_pages")) {
133   BOOST_tests::reallocate_page();
134 }
135 BOOST_AUTO_TEST_SUITE_END()