Skip to content

Instantly share code, notes, and snippets.

@alzix
Created November 1, 2022 10:30
Show Gist options
  • Save alzix/2f9fb93b026835eb9ba57d780966b658 to your computer and use it in GitHub Desktop.
Save alzix/2f9fb93b026835eb9ba57d780966b658 to your computer and use it in GitHub Desktop.
nng reconnection test
#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