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