Created
November 1, 2022 10:30
-
-
Save alzix/2f9fb93b026835eb9ba57d780966b658 to your computer and use it in GitHub Desktop.
nng reconnection test
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <gtest/gtest.h> | |
#include "nng/nng.h" | |
#include "nng/protocol/pair0/pair.h" | |
#include <iostream> | |
constexpr const char *k_url = "ipc://test_socket"; | |
int SrvSockOpen( | |
int iter, | |
nng_socket &sock, | |
nng_listener &listener) { | |
int res = nng_pair0_open(&sock); | |
if (res) { | |
std::cout << "iter=" << iter | |
<< " nng_pair0_open failed" | |
<< " res=" << res | |
<< "(" << nng_strerror(res) << ")" | |
<< std::endl; | |
return res; | |
} | |
res = nng_listen(sock, k_url, &listener, 0); | |
if (res) { | |
std::cout << "nng_listen failed" | |
<< " res=" << res << "(" << nng_strerror(res) << ")" << std::endl; | |
return res; | |
} | |
return 0; | |
} | |
int SrvSockClose(int iter, nng_socket &sock, nng_listener &listener) { | |
int res = nng_listener_close(listener); | |
if (res && res != NNG_ENOENT) { | |
std::cout << "iter=" << iter | |
<< " nng_listener_close failed" | |
<< " res=" << res | |
<< "(" << nng_strerror(res) << ")" | |
<< std::endl; | |
return res; | |
} | |
res = nng_close(sock); | |
if (res && res != NNG_ECLOSED) { | |
std::cout << "iter=" << iter | |
<< " nng_close failed" | |
<< " res=" << res | |
<< "(" << nng_strerror(res) << ")" | |
<< std::endl; | |
return res; | |
} | |
return 0; | |
} | |
int ClientSockOpen(int iter, nng_socket &sock, nng_dialer &dialer) { | |
sock = {}; | |
int res = nng_pair0_open(&sock); | |
if (res) { | |
std::cout << "iter=" << iter | |
<< " nng_pair0_open failed" | |
<< " res=" << res << "(" << nng_strerror(res) << ")" | |
<< std::endl; | |
return res; | |
} | |
dialer = {}; | |
res = nng_dial(sock, k_url, &dialer, NNG_FLAG_NONBLOCK); | |
if (res) { | |
std::cout << "iter=" << iter | |
<< " nng_dial failed" | |
<< " res=" << res << "(" << nng_strerror(res) << ")" | |
<< std::endl; | |
return res; | |
} | |
return 0; | |
} | |
int ClientSockClose(int iter, nng_socket &sock, nng_dialer &dialer) { | |
int res = nng_dialer_close(dialer); | |
if (res && res != NNG_ENOENT) { | |
std::cout << "iter=" << iter | |
<< " nng_dialer_close failed" | |
<< " res=" << res | |
<< "(" << nng_strerror(res) << ")" | |
<< std::endl; | |
return res; | |
} | |
res = nng_close(sock); | |
if (res && res != NNG_ECLOSED) { | |
std::cout << "iter=" << iter | |
<< " nng_close failed" | |
<< " res=" << res | |
<< "(" << nng_strerror(res) << ")" | |
<< std::endl; | |
return res; | |
} | |
return 0; | |
} | |
constexpr bool k_client_exit = true; | |
TEST(NNG, test_recon) { | |
constexpr auto delay = std::chrono::milliseconds(2000); | |
nng_socket srv_sock{}; | |
nng_listener listener{}; | |
ASSERT_EQ(SrvSockOpen(0, srv_sock, listener), 0); | |
nng_socket client_sock{}; | |
nng_dialer dialer{}; | |
ASSERT_EQ(ClientSockOpen(0, client_sock, dialer), 0); | |
for (int i = 1; i < 10000; i++) { | |
int status = 0; | |
//std::this_thread::sleep_for(delay); | |
int retry_count = 0; | |
do { | |
ASSERT_EQ(SrvSockClose(i, srv_sock, listener), 0); | |
status = SrvSockOpen(i, srv_sock, listener); | |
ASSERT_EQ(SrvSockClose(i, srv_sock, listener), 0); | |
if (status) { | |
std::cout << "ERR! iter=" << i | |
<< " retry_count="<< retry_count | |
<< " " << status | |
<< "(" << nng_strerror(status) << ")" | |
<< std::endl; | |
std::this_thread::sleep_for(delay); | |
if (k_client_exit) { | |
std::cout << " client_exit" << std::endl; | |
ASSERT_EQ(ClientSockClose(i, client_sock, dialer), 0); | |
// std::cout << " nng_fini" << std::endl; | |
// nng_fini(); | |
std::this_thread::sleep_for(delay); | |
ASSERT_EQ(ClientSockOpen(i, client_sock, dialer), 0); | |
} | |
} else { | |
break; | |
} | |
} while (++retry_count < 3); | |
ASSERT_EQ(status, 0); | |
} | |
ASSERT_EQ(SrvSockClose(0, srv_sock, listener), 0); | |
ASSERT_EQ(ClientSockClose(0, client_sock, dialer), 0); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment