Skip to content

Commit

Permalink
Added test cases for 2 socket connections
Browse files Browse the repository at this point in the history
Added test cases for connect and accept functions

- Added a test case for setting up an IPv4 stream connection,
  using a INADDR_ANY server and localhost client.
- Added a test case for setting an IPv4 datagram connection, although
  no real connection is set. Used connect function to set up
  peer address.

Issue: #5043

Signed-off-by: Haley Cao <[email protected]>
  • Loading branch information
Haley Cao committed Apr 28, 2020
1 parent 15ce1cc commit 96ddbbb
Showing 1 changed file with 85 additions and 5 deletions.
90 changes: 85 additions & 5 deletions fvtest/porttest/omrsockTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,18 @@
* @return 0 on success, return an error otherwise.
*/
int32_t
start_server(struct OMRPortLibrary *portLibrary, const char *addrStr, const char *port, int32_t family, omrsock_socket_t *serverSocket, omrsock_sockaddr_t serverAddr)
start_server(struct OMRPortLibrary *portLibrary, int32_t family, int32_t socktype, omrsock_socket_t *serverSocket, omrsock_sockaddr_t serverSockAddr)
{
return OMRPORT_ERROR_NOTEXIST;
OMRPORT_ACCESS_FROM_OMRPORT(portTestEnv->getPortLibrary());

EXPECT_EQ(OMRPORTLIB->sock_socket(OMRPORTLIB, serverSocket, family, socktype, OMRSOCK_IPPROTO_DEFAULT), 0);
EXPECT_EQ(OMRPORTLIB->sock_bind(OMRPORTLIB, *serverSocket, serverSockAddr), 0);

if(OMRSOCK_STREAM == socktype) {
EXPECT_EQ(OMRPORTLIB->sock_listen(OMRPORTLIB, *serverSocket, 10), 0);
}

return 0;
}

/**
Expand All @@ -59,9 +68,37 @@ start_server(struct OMRPortLibrary *portLibrary, const char *addrStr, const char
* @return 0 on success, return an error otherwise.
*/
int32_t
connect_client_to_server(struct OMRPortLibrary *portLibrary, const char *addrStr, const char *port, int32_t family, omrsock_socket_t *sessionClientSocket, omrsock_sockaddr_t sessionClientAddr)
connect_client_to_server(struct OMRPortLibrary *portLibrary, const char *addrStr, const char *port, int32_t family, int32_t socktype, omrsock_socket_t *clientSocket, omrsock_sockaddr_t clientSockAddr, omrsock_sockaddr_t serverSockAddr)
{
return OMRPORT_ERROR_NOTEXIST;
OMRPORT_ACCESS_FROM_OMRPORT(portTestEnv->getPortLibrary());

omrsock_addrinfo_t hints = NULL;
OMRAddrInfoNode result;
uint32_t length = 0;
int32_t resultFamily;
int32_t resultSocktype;
int32_t resultProtocol;

EXPECT_EQ(OMRPORTLIB->sock_getaddrinfo_create_hints(OMRPORTLIB, &hints, family, socktype, OMRSOCK_IPPROTO_DEFAULT, 0), 0);
EXPECT_EQ(OMRPORTLIB->sock_getaddrinfo(OMRPORTLIB, addrStr, port, hints, &result), 0);
EXPECT_EQ(OMRPORTLIB->sock_addrinfo_length(OMRPORTLIB, &result, &length), 0);
EXPECT_NE(length, 0);

/* Create a socket with results. */
for (uint32_t i = 0; i < length; i++) {
EXPECT_EQ(OMRPORTLIB->sock_addrinfo_family(OMRPORTLIB, &result, i, &resultFamily), 0);
EXPECT_EQ(OMRPORTLIB->sock_addrinfo_socktype(OMRPORTLIB, &result, i, &resultSocktype), 0);
EXPECT_EQ(OMRPORTLIB->sock_addrinfo_protocol(OMRPORTLIB, &result, i, &resultProtocol), 0);

if(0 == OMRPORTLIB->sock_socket(OMRPORTLIB, clientSocket, resultFamily, resultSocktype, resultProtocol)) {
EXPECT_NE(clientSocket, (void *)NULL);
EXPECT_EQ(OMRPORTLIB->sock_addrinfo_address(OMRPORTLIB, &result, i, clientSockAddr), 0);
break;
}
}
EXPECT_EQ(OMRPORTLIB->sock_connect(OMRPORTLIB, *clientSocket, serverSockAddr), 0);

return 0;
}

/**
Expand Down Expand Up @@ -455,7 +492,50 @@ TEST(PortSockTest, create_IPv4_mapped_IPv6_Socket_Address)
*/
TEST(PortSockTest, two_socket_communication)
{
/* Unimplemented. */
OMRPORT_ACCESS_FROM_OMRPORT(portTestEnv->getPortLibrary());

/* Connection 1: IPv4 Address Stream Connection*/
OMRSockAddrStorage serverStreamSockAddr;
omrsock_socket_t serverStreamSocket = NULL;
uint16_t port = 4930;
uint8_t serverAddr[4];

// To Create a Server Socket and Address
uint32_t inaddrAny = OMRPORTLIB->sock_htonl(OMRPORTLIB, OMRSOCK_INADDR_ANY);
memcpy(serverAddr, &inaddrAny, 4);
EXPECT_EQ(OMRPORTLIB->sock_sockaddr_init(OMRPORTLIB, OMRSOCK_AF_INET, serverAddr, OMRPORTLIB->sock_htons(OMRPORTLIB, port), &serverStreamSockAddr), 0);
EXPECT_EQ(start_server(OMRPORTLIB, OMRSOCK_AF_INET, OMRSOCK_STREAM, &serverStreamSocket, &serverStreamSockAddr), 0);

// To Create a Client Socket and Address
OMRSockAddrStorage clientStreamSockAddr;
omrsock_socket_t clientStreamSocket = NULL;
EXPECT_EQ(connect_client_to_server(OMRPORTLIB, (char *)"localhost", NULL, OMRSOCK_AF_INET, OMRSOCK_STREAM, &clientStreamSocket, &clientStreamSockAddr, &serverStreamSockAddr), 0);

// Accept Connection
OMRSockAddrStorage connectedClientStreamSockAddr;
omrsock_socket_t connectedClientStreamSocket = NULL;
EXPECT_EQ(OMRPORTLIB->sock_accept(OMRPORTLIB, serverStreamSocket, &connectedClientStreamSockAddr, &connectedClientStreamSocket), 0);

EXPECT_EQ(OMRPORTLIB->sock_close(OMRPORTLIB, &connectedClientStreamSocket), 0);
EXPECT_EQ(OMRPORTLIB->sock_close(OMRPORTLIB, &clientStreamSocket), 0);
EXPECT_EQ(OMRPORTLIB->sock_close(OMRPORTLIB, &serverStreamSocket), 0);

/* Connection 2: IPv4 Address Datagram Connection*/
OMRSockAddrStorage serverDgramSockAddr;
omrsock_socket_t serverDgramSocket = NULL;

EXPECT_EQ(OMRPORTLIB->sock_sockaddr_init(OMRPORTLIB, OMRSOCK_AF_INET, serverAddr, OMRPORTLIB->sock_htons(OMRPORTLIB, port), &serverDgramSockAddr), 0);
// Datagram server sockets does not need to listen and accept
EXPECT_EQ(start_server(OMRPORTLIB, OMRSOCK_AF_INET, OMRSOCK_DGRAM, &serverDgramSocket, &serverDgramSockAddr), 0);

OMRSockAddrStorage clientDgramSockAddr;
omrsock_socket_t clientDgramSocket = NULL;
// Connect is optional for datagram clients
EXPECT_EQ(connect_client_to_server(OMRPORTLIB, (char *)"localhost", NULL, OMRSOCK_AF_INET, OMRSOCK_DGRAM, &clientDgramSocket, &clientDgramSockAddr, &serverDgramSockAddr), 0);

EXPECT_EQ(OMRPORTLIB->sock_close(OMRPORTLIB, &clientDgramSocket), 0);
EXPECT_EQ(OMRPORTLIB->sock_close(OMRPORTLIB, &serverDgramSocket), 0);

}

#endif /* defined(OMR_PORT_SOCKET_SUPPORT) */

0 comments on commit 96ddbbb

Please sign in to comment.