Added prototype for future socket option unit tests

This commit is contained in:
Joseph Henry
2017-09-15 19:47:31 -07:00
parent 23b615b39a
commit f7112da490

View File

@@ -555,9 +555,9 @@ void udp_client_4(UDP_UNIT_TEST_SIG_4)
*passed = false;
return;
}
struct sockaddr_storage saddr;
while(true) {
sleep(1);
// tx
if ((w = SENDTO(fd, msg.c_str(), strlen(msg.c_str()), 0, (struct sockaddr *)remote_addr, sizeof(*remote_addr))) < 0) {
DEBUG_ERROR("error sending packet, err=%d", errno);
@@ -1538,6 +1538,102 @@ void tcp_perf_rx_echo_4(TCP_UNIT_TEST_SIG_4)
/****************************************************************************/
/* OBSCURE API CALL TESTS */
/****************************************************************************/
int obscure_api_test(bool *passed)
{
DEBUG_TEST("obscure_api_test");
/*
// ---
// getpeername()
int fd, client_fd;
// after accept()
if ((fd = SOCKET(AF_INET, SOCK_STREAM, 0)) < 0)
DEBUG_ERROR("error creating ZeroTier socket");
if ((err = BIND(fd, (struct sockaddr *)addr, sizeof(struct sockaddr_in)) < 0))
DEBUG_ERROR("error binding to interface (%d)", err);
if ((err = LISTEN(fd, 100)) < 0)
printf("error placing socket in LISTENING state (%d)", err);
// accept
struct sockaddr_in client;
socklen_t client_addrlen = sizeof(sockaddr_in);
if ((client_fd = accept(fd, (struct sockaddr *)&client, &client_addrlen)) < 0)
fprintf(stderr,"error accepting connection (%d)\n", err);
fprintf(stderr, "accepted connection from %s, on port %d", inet_ntoa(client.sin_addr), ntohs(client.sin_port));
// getpeername
struct sockaddr_storage peer_addr;
struct sockaddr_in *in4 = (struct sockaddr_in*)&peer_addr;
socklen_t peer_addrlen = sizeof(peer_addr);
GETPEERNAME(fd, (struct sockaddr*)&peer_addr, &peer_addrlen);
DEBUG_TEST("getpeername() => %s : %d", inet_ntoa(in4->sin_addr), ntohs(in4->sin_port));
// compate getpeername() result to address returned by accept()
// after connect
if ((fd = SOCKET(AF_INET, SOCK_STREAM, 0)) < 0)
DEBUG_ERROR("error creating ZeroTier socket");
if ((err = CONNECT(fd, (const struct sockaddr *)addr, sizeof(*addr))) < 0)
DEBUG_ERROR("error connecting to remote host (%d)", err);
// TODO: Put this test in the general API section
struct sockaddr_storage peer_addr;
struct sockaddr_in *in4 = (struct sockaddr_in*)&peer_addr;
socklen_t peer_addrlen = sizeof(peer_addr);
GETPEERNAME(fd, (struct sockaddr*)&peer_addr, &peer_addrlen);
DEBUG_TEST("getpeername() => %s : %d", inet_ntoa(in4->sin_addr), ntohs(in4->sin_port));
// compare result of getpeername to remote address
// TODO: write an ipv6 version of the above ^^^
*/
// ---
// Disable Nagle's Algorithm on a socket (TCP_NODELAY)
int level = IPPROTO_TCP;
int optname = TCP_NODELAY;
int optval = 1;
socklen_t flag_len = sizeof(optval);
int fd = SOCKET(AF_INET, SOCK_STREAM, 0);
DEBUG_TEST("setting level=%d, optname=%d, optval=%d...", level, optname, optval);
int err = SETSOCKOPT(fd, IPPROTO_TCP, TCP_NODELAY, (char *)&optval, sizeof(int));
if (err < 0) {
DEBUG_ERROR("error while setting optval on socket");
*passed = false;
err = -1;
}
optval = -99; // set junk value to test against
if ((err = GETSOCKOPT(fd, IPPROTO_TCP, TCP_NODELAY, &optval, &flag_len)) < 0) {
DEBUG_ERROR("error while getting the optval");
*passed = false;
err = -1;
}
DEBUG_TEST("flag_len=%d", flag_len);
if (optval <= 0) {
DEBUG_ERROR("incorrect optval=%d (from getsockopt)", optval);
*passed = false;
err = -1;
} else {
DEBUG_TEST("correctly read optval=%d, now reversing it", optval);
if (optval > 0) { // TODO: what should be expected for each platform? Should this mirror them?
optval = 0;
DEBUG_TEST("setting level=%d, optname=%d, optval=%d...", level, optname, optval);
if ((err = SETSOCKOPT(fd, IPPROTO_TCP, TCP_NODELAY, (char *) &optval, (socklen_t)sizeof(int))) < 0) {
DEBUG_ERROR("error while setting on socket");
*passed = false;
err = -1;
}
else {
DEBUG_TEST("success");
*passed = true;
}
} else {
DEBUG_ERROR("the optval wasn't set correctly");
*passed = false;
err = -1;
}
}
return err;
}
/****************************************************************************/
/* SLAM API (multiple of each api call and/or plausible call sequence) */
@@ -1594,7 +1690,7 @@ int slam_api_test()
fds[i] = -1;
}
}
if (zts_nsockets() == 0)
if (zts_num_active_virt_sockets() == 0)
std::cout << "PASSED [slam open and close]" << std::endl;
else
std::cout << "FAILED [slam open and close] - sockets left unclosed" << std::endl;
@@ -1666,7 +1762,7 @@ int slam_api_test()
}
}
used_ports.clear();
if (zts_nsockets() == 0)
if (zts_num_active_virt_sockets() == 0)
std::cout << "PASSED [slam open, bind, listen, accept, close]" << std::endl;
else
std::cout << "FAILED [slam open, bind, listen, accept, close]" << std::endl;
@@ -1676,7 +1772,7 @@ int slam_api_test()
// (1) socket()
// (2) connect()
// (3) close()
int num_times = zts_maxsockets();
int num_times = zts_maxsockets(SOCK_STREAM);
std::cout << "socket/connect/close - " << num_times << " times" << std::endl;
for(int i=0;i<(SLAM_NUMBER*SLAM_REPEAT); i++) { results[i] = 0; }
if (true)
@@ -1732,7 +1828,7 @@ int slam_api_test()
}
displayResults(results, num_times);
if (zts_nsockets() == 0)
if (zts_num_active_virt_sockets() == 0)
std::cout << "PASSED [slam open, connect, close]" << std::endl;
else
std::cout << "FAILED [slam open, connect, close]" << std::endl;
@@ -1740,62 +1836,6 @@ int slam_api_test()
return 0;
}
/****************************************************************************/
/* OBSCURE API CALL TESTS */
/****************************************************************************/
int obscure_api_test()
{
/*
// getpeername()
int fd, client_fd;
// after accept()
if ((fd = SOCKET(AF_INET, SOCK_STREAM, 0)) < 0)
DEBUG_ERROR("error creating ZeroTier socket");
if ((err = BIND(fd, (struct sockaddr *)addr, sizeof(struct sockaddr_in)) < 0))
DEBUG_ERROR("error binding to interface (%d)", err);
if ((err = LISTEN(fd, 100)) < 0)
printf("error placing socket in LISTENING state (%d)", err);
// accept
struct sockaddr_in client;
socklen_t client_addrlen = sizeof(sockaddr_in);
if ((client_fd = accept(fd, (struct sockaddr *)&client, &client_addrlen)) < 0)
fprintf(stderr,"error accepting connection (%d)\n", err);
fprintf(stderr, "accepted connection from %s, on port %d", inet_ntoa(client.sin_addr), ntohs(client.sin_port));
// getpeername
struct sockaddr_storage peer_addr;
struct sockaddr_in *in4 = (struct sockaddr_in*)&peer_addr;
socklen_t peer_addrlen = sizeof(peer_addr);
GETPEERNAME(fd, (struct sockaddr*)&peer_addr, &peer_addrlen);
DEBUG_TEST("getpeername() => %s : %d", inet_ntoa(in4->sin_addr), ntohs(in4->sin_port));
// compate getpeername() result to address returned by accept()
// after connect
if ((fd = SOCKET(AF_INET, SOCK_STREAM, 0)) < 0)
DEBUG_ERROR("error creating ZeroTier socket");
if ((err = CONNECT(fd, (const struct sockaddr *)addr, sizeof(*addr))) < 0)
DEBUG_ERROR("error connecting to remote host (%d)", err);
// TODO: Put this test in the general API section
struct sockaddr_storage peer_addr;
struct sockaddr_in *in4 = (struct sockaddr_in*)&peer_addr;
socklen_t peer_addrlen = sizeof(peer_addr);
GETPEERNAME(fd, (struct sockaddr*)&peer_addr, &peer_addrlen);
DEBUG_TEST("getpeername() => %s : %d", inet_ntoa(in4->sin_addr), ntohs(in4->sin_port));
// compare result of getpeername to remote address
// TODO: write an ipv6 version of the above ^^^
*/
// Disable Nagle's Algorithm on a socket
int sock = SOCKET(AF_INET, SOCK_STREAM, 0);
int flag = 1;
int err = setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (char *) &flag, sizeof(int));
if (err < 0) {
DEBUG_ERROR("error while disabling Nagle's algorithm on socket");
}
return err;
}
void get_network_routes(char *nwid)
{
@@ -2110,7 +2150,7 @@ void bind_to_localhost_test(int port)
}
}
else {
DEBUG_ERROR("error creating socket", err);
DEBUG_ERROR("error creating socket (%d)", err);
}
port++;
@@ -2152,7 +2192,7 @@ void bind_to_localhost_test(int port)
}
}
else {
DEBUG_ERROR("error creating socket", err);
DEBUG_ERROR("error creating socket (%d)", err);
}
}
@@ -2304,7 +2344,7 @@ for(int i=0; i<num_repeats; i++)
//test_bad_args();
// OBSCURE API TEST
//obscure_api_test();
obscure_api_test(&passed);
#endif // __SELFTEST__