#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; }