重构代码的架构设计,增加测试单元,提高代码可靠性
This commit is contained in:
81
tests/test_p2_tcp_loopback.c
Normal file
81
tests/test_p2_tcp_loopback.c
Normal file
@@ -0,0 +1,81 @@
|
||||
#include <string.h>
|
||||
|
||||
#include "../src/TCP/tcp.h"
|
||||
#include "../src/thread_utils.h"
|
||||
#include "test_common.h"
|
||||
|
||||
typedef struct {
|
||||
int port;
|
||||
volatile int ready;
|
||||
volatile int done;
|
||||
int result;
|
||||
} loopback_ctx_t;
|
||||
|
||||
static void server_fn(void* arg)
|
||||
{
|
||||
loopback_ctx_t* ctx = (loopback_ctx_t*)arg;
|
||||
int server = TcpServer_Listen((uint16_t)ctx->port);
|
||||
char buf[32] = {0};
|
||||
int client;
|
||||
int n;
|
||||
|
||||
if (server == TCP_INVALID_SOCKET) {
|
||||
ctx->result = 1;
|
||||
ctx->done = 1;
|
||||
return;
|
||||
}
|
||||
|
||||
ctx->ready = 1;
|
||||
client = TcpServer_Accept(server);
|
||||
if (client == TCP_INVALID_SOCKET) {
|
||||
ctx->result = 2;
|
||||
TcpServer_Close(server);
|
||||
ctx->done = 1;
|
||||
return;
|
||||
}
|
||||
|
||||
n = TcpClient_Recv(client, buf, sizeof(buf));
|
||||
if (n <= 0 || strncmp(buf, "ping", 4) != 0) {
|
||||
ctx->result = 3;
|
||||
} else {
|
||||
TcpClient_Send(client, "pong", 4);
|
||||
ctx->result = 0;
|
||||
}
|
||||
|
||||
TcpClient_Close(client);
|
||||
TcpServer_Close(server);
|
||||
ctx->done = 1;
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
loopback_ctx_t ctx;
|
||||
thread_handle_t th;
|
||||
int client;
|
||||
char recv_buf[8] = {0};
|
||||
int n;
|
||||
|
||||
memset(&ctx, 0, sizeof(ctx));
|
||||
ctx.port = 7013;
|
||||
|
||||
ASSERT_EQ_INT(0, Tcp_Init());
|
||||
ASSERT_EQ_INT(0, Thread_Create(server_fn, &ctx, &th));
|
||||
|
||||
while (!ctx.ready) {
|
||||
/* wait */
|
||||
}
|
||||
|
||||
client = TcpClient_Connect("127.0.0.1", (uint16_t)ctx.port);
|
||||
ASSERT_TRUE(client != TCP_INVALID_SOCKET);
|
||||
ASSERT_EQ_INT(4, TcpClient_Send(client, "ping", 4));
|
||||
|
||||
n = TcpClient_Recv(client, recv_buf, sizeof(recv_buf));
|
||||
ASSERT_EQ_INT(4, n);
|
||||
ASSERT_TRUE(strncmp(recv_buf, "pong", 4) == 0);
|
||||
TcpClient_Close(client);
|
||||
|
||||
Thread_Join(th);
|
||||
ASSERT_EQ_INT(0, ctx.result);
|
||||
Tcp_Cleanup();
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user