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