TcpServer/TcpReactor Framework
This commit is contained in:
@@ -0,0 +1,81 @@
|
||||
#include "c_Test.h"
|
||||
#include "c_SockAddr.h"
|
||||
#include "c_SockAddrUtil.h"
|
||||
|
||||
#if defined(_WIN32) || defined(_WIN64)
|
||||
#pragma comment(lib, "ws2_32.lib")
|
||||
#endif
|
||||
|
||||
TEST_CASE(test_sockaddr_variant_extraction_and_string) {
|
||||
c_Socket_Init();
|
||||
|
||||
c_AddrInfo_t addr;
|
||||
/* Look up explicit local target constraints loopback */
|
||||
c_err_t err = c_AddrInfo_Init(&addr, AF_INET, SOCK_STREAM, 0, "127.0.0.1", "9090");
|
||||
ASSERT_INT_EQ(C_ERR_OK, err);
|
||||
|
||||
/* 1. Extract raw byte structure layouts into our custom anonymous union container */
|
||||
c_SockAddr_t sock_addr;
|
||||
err = c_SockAddrUtil_FromAddrInfo(&sock_addr, &addr);
|
||||
ASSERT_INT_EQ(C_ERR_OK, err);
|
||||
|
||||
/* 2. Validate getter transformations */
|
||||
ASSERT_INT_EQ(AF_INET, c_SockAddr_GetFamily(&sock_addr));
|
||||
ASSERT_INT_EQ(9090, (int)c_SockAddr_GetPort(&sock_addr));
|
||||
|
||||
/* 3. Re-render structural bits to string format */
|
||||
char ip_str[64];
|
||||
err = c_SockAddr_ToString(&sock_addr, ip_str, sizeof(ip_str));
|
||||
ASSERT_INT_EQ(C_ERR_OK, err);
|
||||
ASSERT_INT_EQ(0, strcmp("127.0.0.1", ip_str));
|
||||
|
||||
c_AddrInfo_Destroy(&addr);
|
||||
|
||||
c_Socket_Destroy();
|
||||
}
|
||||
|
||||
TEST_CASE(test_sockaddr_explicit_family_initialization) {
|
||||
c_Socket_Init();
|
||||
|
||||
c_SockAddr_t addr;
|
||||
c_err_t err;
|
||||
|
||||
/* -------------------------------------------------------------------------------------------------------------- */
|
||||
/* Case A: Verify explicit IPv4 initialization and dynamic getters */
|
||||
err = c_SockAddr_Init(&addr, AF_INET, "127.0.0.1", 8080);
|
||||
ASSERT_INT_EQ(C_ERR_OK, err);
|
||||
ASSERT_INT_EQ(AF_INET, c_SockAddr_GetFamily(&addr));
|
||||
ASSERT_INT_EQ(8080, (int)c_SockAddr_GetPort(&addr));
|
||||
|
||||
char out_ip_v4[INET_ADDRSTRLEN];
|
||||
err = c_SockAddr_ToString(&addr, out_ip_v4, sizeof(out_ip_v4));
|
||||
ASSERT_INT_EQ(C_ERR_OK, err);
|
||||
ASSERT_INT_EQ(0, strcmp("127.0.0.1", out_ip_v4));
|
||||
|
||||
/* -------------------------------------------------------------------------------------------------------------- */
|
||||
/* Case B: Verify explicit IPv6 initialization and loopback string decoding */
|
||||
err = c_SockAddr_Init(&addr, AF_INET6, "::1", 9090);
|
||||
ASSERT_INT_EQ(C_ERR_OK, err);
|
||||
ASSERT_INT_EQ(AF_INET6, c_SockAddr_GetFamily(&addr));
|
||||
ASSERT_INT_EQ(9090, (int)c_SockAddr_GetPort(&addr));
|
||||
|
||||
char out_ip_v6[INET6_ADDRSTRLEN];
|
||||
err = c_SockAddr_ToString(&addr, out_ip_v6, sizeof(out_ip_v6));
|
||||
ASSERT_INT_EQ(C_ERR_OK, err);
|
||||
ASSERT_INT_EQ(0, strcmp("::1", out_ip_v6));
|
||||
|
||||
/* -------------------------------------------------------------------------------------------------------------- */
|
||||
/* Case C: Verify that incorrect cross-family inputs gracefully yield execution failures */
|
||||
err = c_SockAddr_Init(&addr, AF_INET, "::1", 80); /* Passing IPv6 loopback string to IPv4 family parser */
|
||||
ASSERT_INT_EQ(C_ERR_FAIL, err);
|
||||
|
||||
c_Socket_Destroy();
|
||||
}
|
||||
|
||||
int main(void) {
|
||||
TEST_START(SockAddr_Variant_Suite);
|
||||
RUN_TEST(test_sockaddr_variant_extraction_and_string);
|
||||
RUN_TEST(test_sockaddr_explicit_family_initialization);
|
||||
TEST_REPORT();
|
||||
RETURN_TEST_STATUS;
|
||||
}
|
||||
Reference in New Issue
Block a user