github.com/igggame/nebulas-go@v2.1.0+incompatible/nbre/test/common/ipc/itest_session.cpp (about) 1 // Copyright (C) 2018 go-nebulas authors 2 // 3 // This file is part of the go-nebulas library. 4 // 5 // the go-nebulas library is free software: you can redistribute it and/or 6 // modify 7 // it under the terms of the GNU General Public License as published by 8 // the Free Software Foundation, either version 3 of the License, or 9 // (at your option) any later version. 10 // 11 // the go-nebulas library is distributed in the hope that it will be useful, 12 // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 // GNU General Public License for more details. 15 // 16 // You should have received a copy of the GNU General Public License 17 // along with the go-nebulas library. If not, see 18 // <http://www.gnu.org/licenses/>. 19 // 20 #include "common/ipc/shm_bookkeeper.h" 21 #include "common/ipc/shm_session.h" 22 #include "core/command.h" 23 #include "fs/util.h" 24 #include "test/common/ipc/ipc_test.h" 25 26 std::string base_name = neb::fs::get_user_name() + "test_session_simple"; 27 static std::string bk_name = base_name + ".bookkeeper"; 28 std::string sema_name = bk_name + ".test.sema"; 29 std::string quit_sema_name = bk_name + ".test.quit.sema"; 30 31 IPC_PRELUDE(test_session_simple) { 32 33 neb::ipc::internal::shm_session_util ss(base_name); 34 ss.reset(); 35 neb::ipc::internal::shm_bookkeeper sb(bk_name); 36 sb.reset(); 37 38 boost::interprocess::named_semaphore::remove(sema_name.c_str()); 39 boost::interprocess::named_semaphore::remove(quit_sema_name.c_str()); 40 boost::interprocess::shared_memory_object::remove(bk_name.c_str()); 41 } 42 43 IPC_SERVER(test_session_simple) { 44 45 LOG(INFO) << "server start "; 46 std::shared_ptr<neb::ipc::internal::shm_session_server> ss = 47 std::make_shared<neb::ipc::internal::shm_session_server>(base_name); 48 ss->start_session(); 49 LOG(INFO) << "server session started "; 50 neb::ipc::internal::shm_bookkeeper sb(bk_name); 51 auto sema = sb.acquire_named_semaphore(sema_name); 52 auto quit_sema = sb.acquire_named_semaphore(quit_sema_name); 53 sema->post(); 54 LOG(INFO) << "server to wait"; 55 quit_sema->wait(); 56 57 ss.reset(); 58 sb.release_named_semaphore(sema_name); 59 sb.release_named_semaphore(quit_sema_name); 60 LOG(INFO) << "server done"; 61 } 62 63 IPC_CLIENT(test_session_simple) { 64 65 neb::ipc::internal::shm_bookkeeper sb(bk_name); 66 auto sema = sb.acquire_named_semaphore(sema_name); 67 auto quit_sema = sb.acquire_named_semaphore(quit_sema_name); 68 LOG(INFO) << "client to wait"; 69 sema->wait(); 70 LOG(INFO) << "client session to start"; 71 std::shared_ptr<neb::ipc::internal::shm_session_client> ss = 72 std::make_shared<neb::ipc::internal::shm_session_client>(base_name); 73 ss->start_session(); 74 75 LOG(INFO) << "client session started"; 76 quit_sema->post(); 77 78 std::this_thread::sleep_for(std::chrono::seconds(3)); 79 neb::core::command_queue::instance().send_command( 80 std::make_shared<neb::core::exit_command>()); 81 ss.reset(); 82 sb.release_named_semaphore(sema_name); 83 sb.release_named_semaphore(quit_sema_name); 84 LOG(INFO) << "client done"; 85 } 86 87 IPC_PRELUDE(test_session_full) { 88 89 neb::ipc::internal::shm_session_util ss(base_name); 90 ss.reset(); 91 neb::ipc::internal::shm_bookkeeper sb(bk_name); 92 sb.reset(); 93 } 94 95 IPC_SERVER(test_session_full) { 96 97 std::shared_ptr<neb::ipc::internal::shm_session_server> ss = 98 std::make_shared<neb::ipc::internal::shm_session_server>(base_name); 99 ss->start_session(); 100 ss->wait_until_client_start(); 101 std::this_thread::sleep_for(std::chrono::seconds(3)); 102 bool ret = ss->is_client_alive(); 103 IPC_EXPECT(ret); 104 LOG(INFO) << "server done"; 105 } 106 107 IPC_CLIENT(test_session_full) { 108 std::shared_ptr<neb::ipc::internal::shm_session_client> ss = 109 std::make_shared<neb::ipc::internal::shm_session_client>(base_name); 110 LOG(INFO) << "sleep to wait server start"; 111 std::this_thread::sleep_for(std::chrono::seconds(3)); 112 LOG(INFO) << "to start session"; 113 ss->start_session(); 114 std::this_thread::sleep_for(std::chrono::seconds(3)); 115 bool ret = ss->is_server_alive(); 116 IPC_EXPECT(ret); 117 118 LOG(INFO) << "sleep to wait server got "; 119 std::this_thread::sleep_for(std::chrono::seconds(3)); 120 neb::core::command_queue::instance().send_command( 121 std::make_shared<neb::core::exit_command>()); 122 LOG(INFO) << "client done"; 123 } 124 125 #if 0 126 typedef struct session_name_t { 127 std::string base_name; 128 std::string bk_name; 129 std::string sema_name; 130 std::string quit_sema_name; 131 } session_name; 132 133 session_name get_session_name(const std::string &num) { 134 session_name sn; 135 sn.base_name = neb::fs::get_user_name() + "test_multi_session_" + num; 136 sn.bk_name = sn.base_name + ".bookkeeper"; 137 sn.sema_name = sn.bk_name + ".test.sema"; 138 sn.quit_sema_name = sn.bk_name + ".test.quit.sema"; 139 return sn; 140 } 141 142 void do_ipc_prelude(const session_name &sn) { 143 neb::ipc::internal::shm_session_util ss(sn.base_name); 144 ss.reset(); 145 neb::ipc::internal::shm_bookkeeper sb(sn.bk_name); 146 sb.reset(); 147 148 boost::interprocess::named_semaphore::remove(sn.sema_name.c_str()); 149 boost::interprocess::named_semaphore::remove(sn.quit_sema_name.c_str()); 150 boost::interprocess::shared_memory_object::remove(sn.bk_name.c_str()); 151 } 152 153 void build_server_session(const session_name &sn) { 154 std::shared_ptr<neb::ipc::internal::shm_session_server> ss = 155 std::make_shared<neb::ipc::internal::shm_session_server>(sn.base_name); 156 ss->start_session(); 157 158 LOG(INFO) << "server session started " << sn.base_name; 159 160 neb::ipc::internal::shm_bookkeeper sb(sn.bk_name); 161 auto sema = sb.acquire_named_semaphore(sn.sema_name); 162 auto quit_sema = sb.acquire_named_semaphore(sn.quit_sema_name); 163 sema->post(); 164 LOG(INFO) << "server to wait" << sn.base_name; 165 quit_sema->wait(); 166 167 ss.reset(); 168 sb.release_named_semaphore(sn.sema_name); 169 sb.release_named_semaphore(sn.quit_sema_name); 170 } 171 172 void build_client_session(const session_name &sn) { 173 neb::ipc::internal::shm_bookkeeper sb(sn.bk_name); 174 auto sema = sb.acquire_named_semaphore(sn.sema_name); 175 auto quit_sema = sb.acquire_named_semaphore(sn.quit_sema_name); 176 LOG(INFO) << "client to wait"; 177 sema->wait(); 178 LOG(INFO) << "client session to start"; 179 std::shared_ptr<neb::ipc::internal::shm_session_client> ss = 180 std::make_shared<neb::ipc::internal::shm_session_client>(sn.base_name); 181 ss->start_session(); 182 183 LOG(INFO) << "client session started"; 184 quit_sema->post(); 185 186 std::this_thread::sleep_for(std::chrono::seconds(3)); 187 neb::core::command_queue::instance().send_command( 188 std::make_shared<neb::core::exit_command>()); 189 ss.reset(); 190 sb.release_named_semaphore(sn.sema_name); 191 sb.release_named_semaphore(sn.quit_sema_name); 192 LOG(INFO) << "client done"; 193 } 194 195 IPC_PRELUDE(test_multi_session) { 196 session_name sn = get_session_name("1"); 197 do_ipc_prelude(sn); 198 } 199 200 IPC_SERVER(test_multi_session) { 201 session_name sn1 = get_session_name("1"); 202 session_name sn2 = get_session_name("2"); 203 LOG(INFO) << "server start "; 204 205 build_server_session(sn1); 206 build_server_session(sn2); 207 208 LOG(INFO) << "server done"; 209 } 210 211 IPC_CLIENT(test_multi_session) { 212 session_name sn = get_session_name("1"); 213 build_client_session(sn); 214 } 215 216 #endif