diff --git a/CMakeLists.txt b/CMakeLists.txt index 28a2311..594f4b9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,8 +9,6 @@ find_package(Threads REQUIRED) include(cmake/build.cmake) include(cmake/develop.cmake) -message(STATUS "---->: " ${CMAKE_CURRENT_SOURCE_DIR}) - if (BUILD_UNIT_TESTS) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/tests) endif () diff --git a/tests/test_rest_rpc.cpp b/tests/test_rest_rpc.cpp index 26d5763..f67858d 100644 --- a/tests/test_rest_rpc.cpp +++ b/tests/test_rest_rpc.cpp @@ -14,6 +14,38 @@ struct dummy { } }; +TEST_CASE("test_client_default_constructor") { + rpc_server server(9000, std::thread::hardware_concurrency()); + dummy d; + server.register_handler("add", &dummy::add, &d); + server.async_run(); + std::this_thread::sleep_for(std::chrono::milliseconds(300)); + + rpc_client client; + bool r = client.connect("127.0.0.1", 9000); + CHECK(r); + auto result = client.call("add", 1, 2); + CHECK_EQ(result, 3); +} + +TEST_CASE("test_client_async_connect") { + rpc_server server(9000, std::thread::hardware_concurrency()); + dummy d; + server.register_handler("add", &dummy::add, &d); + server.async_run(); + std::this_thread::sleep_for(std::chrono::milliseconds(300)); + + rpc_client client; + client.async_connect("127.0.0.1", 9000); + + try { + auto result = client.call("add", 1, 2); + CHECK_EQ(result, 3); + } catch (const std::exception &ex) { + std::cout << ex.what() << std::endl; + } +} + TEST_CASE("test_sync_add") { rpc_server server(9000, std::thread::hardware_concurrency()); dummy d; @@ -26,4 +58,76 @@ TEST_CASE("test_sync_add") { CHECK(r); auto result = client.call("add", 1, 2); CHECK_EQ(result, 3); +} + +struct person { + int id; + std::string name; + int age; + + MSGPACK_DEFINE(id, name, age); +}; + +person get_person(rpc_conn conn) { return {1, "tom", 20}; } + +void hello(rpc_conn conn, const std::string &str) { + std::cout << "hello " << str << std::endl; +} +TEST_CASE("test_client_async_call") { + rpc_server server(9000, std::thread::hardware_concurrency()); + server.register_handler("get_person", get_person); + server.register_handler("hello", hello); + server.async_run(); + std::this_thread::sleep_for(std::chrono::milliseconds(300)); + + rpc_client client("127.0.0.1", 9000); + bool r = client.connect(); + CHECK(r); + + client.set_error_callback( + [](asio::error_code ec) { std::cout << ec.message() << std::endl; }); + + auto f = client.async_call("get_person"); + if (f.wait_for(std::chrono::milliseconds(50)) == + std::future_status::timeout) { + std::cout << "timeout" << std::endl; + } else { + auto p = f.get().as(); + CHECK_EQ(p.id, 1); + CHECK_EQ(p.age, 20); + CHECK_EQ(p.name, "tom"); + } + auto fu = client.async_call("hello", "purecpp"); + fu.get().as(); // no return +} + + +TEST_CASE("test_client_reconnect_and_heartbeat") { + + rpc_client client; + client.enable_auto_reconnect(); // automatic reconnect + client.enable_auto_heartbeat(); // automatic heartbeat + bool r = client.connect("127.0.0.1", 9000); + bool flag = false; + int cnt = 0; + rpc_server server(9000, std::thread::hardware_concurrency()); + server.register_handler("get_person", get_person); + server.async_run(); + while (true) { + if (client.has_connected()) { + flag = true; + break; + } + else { + // std::cout << "connected fail\n"; + cnt++; + } + if (cnt == 200) { + flag = false; + break; + } + + std::this_thread::sleep_for(std::chrono::seconds(1)); + } + CHECK(flag); } \ No newline at end of file