Files
cKit/Foundation/c_SocketStream.t.c
T
2026-09-07 21:37:10 +08:00

82 lines
3.0 KiB
C

#include "c_Test.h"
#include "c_SocketStream.h"
#include "c_BinaryOutStream.h"
#include "c_BinaryInStream.h"
/* 模拟简单的跨平台 Socket Pair 创建逻辑 */
static void CreateLocalSocketPair(c_socket_t* listener, c_socket_t* client, c_socket_t* server) {
c_Socket_Init();
*listener = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
addr.sin_port = 0; /* 让 OS 自适应分派空闲端口 */
bind(*listener, (struct sockaddr*)&addr, sizeof(addr));
listen(*listener, 1);
int addr_len = sizeof(addr);
getsockname(*listener, (struct sockaddr*)&addr, &addr_len);
*client = socket(AF_INET, SOCK_STREAM, 0);
connect(*client, (struct sockaddr*)&addr, sizeof(addr));
*server = accept(*listener, NULL, NULL);
}
TEST_CASE(test_polymorphic_socket_streams_network_pipeline) {
c_socket_t listener, client_sock, server_sock;
CreateLocalSocketPair(&listener, &client_sock, &server_sock);
/* -------------------------------------------------------------------------------------------------------------- */
/* 发送方逻辑:构建网络流并将二进制打包器拼装到虚函数表抽象句柄上 */
c_OutStream_t* net_out = NULL;
c_err_t err = c_SocketOutStream_Create(&net_out, client_sock, NULL);
ASSERT_INT_EQ(C_SUCCESS, err);
c_BinaryOutStream_t bin_out;
c_BinaryOutStream_Init(&bin_out, net_out);
/* 写入不常规宽度的非对齐 bit 流数据 */
c_BinaryOutStream_WriteBits(&bin_out, 0x05, 3); /* 3 bits */
c_BinaryOutStream_WriteUInt32(&bin_out, 0xABCDEF12); /* 32 bits */
c_BinaryOutStream_Flush(&bin_out);
/* -------------------------------------------------------------------------------------------------------------- */
/* 接收方逻辑:接收网络多态流并解包验证 */
c_InStream_t* net_in = NULL;
err = c_SocketInStream_Create(&net_in, server_sock, NULL);
ASSERT_INT_EQ(C_SUCCESS, err);
c_BinaryInStream_t bin_in;
c_BinaryInStream_Init(&bin_in, net_in);
uint32_t val_bits = 0;
err = c_BinaryInStream_ReadBits(&bin_in, 3, &val_bits);
ASSERT_INT_EQ(C_SUCCESS, err);
ASSERT_LL_EQ(0x05, val_bits);
uint32_t val_u32 = 0;
err = c_BinaryInStream_ReadUInt32(&bin_in, &val_u32);
ASSERT_INT_EQ(C_SUCCESS, err);
ASSERT_LL_EQ(0xABCDEF12, val_u32);
/* -------------------------------------------------------------------------------------------------------------- */
/* 清理所有多态虚函数组件及底层网络套接字句柄描述符 */
c_OutStream_Destroy(net_out);
c_InStream_Destroy(net_in);
c_Socket_Close(client_sock);
c_Socket_Close(server_sock);
c_Socket_Close(listener);
c_Socket_Destroy();
}
int main(void) {
TEST_START(Polymorphic_SocketStream_Network_Pipeline_Suite);
RUN_TEST(test_polymorphic_socket_streams_network_pipeline);
TEST_REPORT();
RETURN_TEST_STATUS;
}