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