82 lines
3.0 KiB
C
82 lines
3.0 KiB
C
#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;
|
||
|
|
}
|