mirror of
https://github.com/ossrs/srs.git
synced 2025-02-13 11:51:57 +00:00
92 lines
2.4 KiB
C++
92 lines
2.4 KiB
C++
/* SPDX-License-Identifier: MIT */
|
|
/* Copyright (c) 2013-2023 Winlin */
|
|
|
|
#include <st_utest.hpp>
|
|
|
|
#include <st.h>
|
|
#include <assert.h>
|
|
|
|
#include <sys/socket.h>
|
|
#include <netinet/in.h>
|
|
#include <arpa/inet.h>
|
|
|
|
#define ST_UTEST_PORT 26878
|
|
#define ST_UTEST_TIMEOUT (100 * SRS_UTIME_MILLISECONDS)
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// The utest for ping-pong TCP server coroutine.
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
void* tcp_server(void* /*arg*/)
|
|
{
|
|
int fd = -1;
|
|
st_netfd_t stfd = NULL;
|
|
StFdCleanup(fd, stfd);
|
|
|
|
fd = socket(AF_INET, SOCK_STREAM, 0);
|
|
ST_ASSERT_ERROR(fd == -1, fd, "Create socket");
|
|
|
|
struct sockaddr_in addr;
|
|
addr.sin_family = AF_INET;
|
|
addr.sin_addr.s_addr = htonl(INADDR_ANY);
|
|
addr.sin_port = htons(ST_UTEST_PORT);
|
|
|
|
int v = 1;
|
|
int r0 = setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &v, sizeof(int));
|
|
ST_ASSERT_ERROR(r0, r0, "Set SO_REUSEADDR");
|
|
|
|
r0 = ::bind(fd, (const sockaddr*)&addr, sizeof(addr));
|
|
ST_ASSERT_ERROR(r0, r0, "Bind socket");
|
|
|
|
r0 = ::listen(fd, 10);
|
|
ST_ASSERT_ERROR(r0, r0, "Listen socket");
|
|
|
|
stfd = st_netfd_open_socket(fd);
|
|
ST_ASSERT_ERROR(!stfd, fd, "Open ST socket");
|
|
|
|
st_netfd_t client = NULL;
|
|
StStfdCleanup(client);
|
|
|
|
client = st_accept(stfd, NULL, NULL, ST_UTEST_TIMEOUT);
|
|
ST_ASSERT_ERROR(!client, fd, "Accept client");
|
|
|
|
return NULL;
|
|
}
|
|
|
|
void* tcp_client(void* /*arg*/)
|
|
{
|
|
int fd = -1;
|
|
st_netfd_t stfd = NULL;
|
|
StFdCleanup(fd, stfd);
|
|
|
|
fd = socket(AF_INET, SOCK_STREAM, 0);
|
|
ST_ASSERT_ERROR(fd == -1, fd, "Create socket");
|
|
|
|
struct sockaddr_in addr;
|
|
addr.sin_family = AF_INET;
|
|
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
|
|
addr.sin_port = htons(ST_UTEST_PORT);
|
|
|
|
stfd = st_netfd_open_socket(fd);
|
|
ST_ASSERT_ERROR(!stfd, fd, "Open ST socket");
|
|
|
|
int r0 = st_connect(stfd, (const sockaddr*)&addr, sizeof(addr), ST_UTEST_TIMEOUT);
|
|
ST_ASSERT_ERROR(r0, r0, "Connect to server");
|
|
|
|
return NULL;
|
|
}
|
|
|
|
VOID TEST(TcpTest, TcpConnection)
|
|
{
|
|
st_thread_t svr = st_thread_create(tcp_server, NULL, 1, 0);
|
|
EXPECT_TRUE(svr != NULL);
|
|
|
|
st_thread_t client = st_thread_create(tcp_client, NULL, 1, 0);
|
|
EXPECT_TRUE(client != NULL);
|
|
|
|
ST_COROUTINE_JOIN(svr, r0);
|
|
ST_COROUTINE_JOIN(client, r1);
|
|
|
|
ST_EXPECT_SUCCESS(r0);
|
|
ST_EXPECT_SUCCESS(r1);
|
|
}
|
|
|