21 #define BOOST_TEST_MODULE libjmmcg_tests
22 #include <boost/test/included/unit_test.hpp>
27 #include "core/shared_mem.hpp"
32 static const std::string name(
"shared_mem_test");
33 static constexpr std::size_t size=
sizeof(
std::uint64_t)*10;
35 using namespace libjmmcg;
43 data_.exit_child=
true;
54 while (!data->subproc_started) {
55 std::this_thread::yield();
60 data->changed=!data->changed;
64 const bool old=data->changed;
65 while (data->changed==old) {
66 std::this_thread::yield();
71 BOOST_AUTO_TEST_SUITE(shared_mem_test)
73 BOOST_AUTO_TEST_CASE(ctor) {
74 BOOST_CHECK_NO_THROW(shared_mem shm(name, size));
77 BOOST_AUTO_TEST_CASE(create_shms_shared_another) {
82 BOOST_AUTO_TEST_CASE(verify_mapped_Addr_not_nullptr) {
84 BOOST_CHECK_NE(shm.get<
void>(),
nullptr);
87 BOOST_AUTO_TEST_CASE(write_word_to_memory_and_sync) {
89 std::uint64_t *mem=shm.get<
std::uint64_t>();
91 BOOST_CHECK_EQUAL(*shm.get<std::uint64_t>(), 42);
92 BOOST_CHECK_NO_THROW(shm.sync(shm.get<std::uint64_t>(),
sizeof(std::uint64_t)));
93 BOOST_CHECK_EQUAL(*shm.get<std::uint64_t>(), 42);
94 BOOST_CHECK_NO_THROW(shm.sync(shm.get<std::uint64_t>(),
sizeof(std::uint64_t), shared_mem::req_update_wait));
95 BOOST_CHECK_EQUAL(*shm.get<std::uint64_t>(), 42);
97 BOOST_CHECK_EQUAL(*shm.get<std::uint64_t>(), 68);
98 BOOST_CHECK_NO_THROW(shm.sync(shm.get<std::uint64_t>(),
sizeof(std::uint64_t)));
99 BOOST_CHECK_EQUAL(*shm.get<std::uint64_t>(), 68);
100 BOOST_CHECK_NO_THROW(shm.sync(shm.get<std::uint64_t>(),
sizeof(std::uint64_t), shared_mem::req_update_wait));
101 BOOST_CHECK_EQUAL(*shm.get<std::uint64_t>(), 68);
104 BOOST_AUTO_TEST_CASE(create_shms_shared_another_writes) {
107 std::uint64_t *mem=shm.get<
std::uint64_t>();
109 std::uint64_t *mem_shared=shm_shared.get<
std::uint64_t>();
110 BOOST_CHECK_EQUAL(*mem_shared, *mem);
112 BOOST_CHECK_EQUAL(*mem_shared, *mem);
115 BOOST_AUTO_TEST_CASE(create_shm_and_child_in_bg) {
121 BOOST_CHECK_NO_THROW(shm_and_child.wait_for_subproc_to_start());
122 shm_and_child.data->ping=
true;
123 BOOST_CHECK_NO_THROW(shm_and_child.new_data());
124 BOOST_CHECK_NO_THROW(shm_and_child.wait_for_new_data());
125 BOOST_CHECK_EQUAL(shm_and_child.data->pong,
true);
127 BOOST_CHECK_EQUAL(exit_code, 0);
130 BOOST_AUTO_TEST_CASE(create_shm_and_child_controlled_by_thread) {
132 auto get_subproc_ret_code=
std::async(
140 BOOST_CHECK_NO_THROW(shm_and_child.wait_for_subproc_to_start());
141 shm_and_child.data->ping=
true;
142 BOOST_CHECK_NO_THROW(shm_and_child.new_data());
143 BOOST_CHECK_NO_THROW(shm_and_child.wait_for_new_data());
144 BOOST_CHECK_EQUAL(shm_and_child.data->pong,
true);
148 BOOST_CHECK_EQUAL(get_subproc_ret_code.get(), 0);
150 BOOST_CHECK_EQUAL(get_subproc_ret_code.get(), 256);
154 BOOST_AUTO_TEST_SUITE_END()