testing: server_main_loop [init]

This commit is contained in:
2026-07-07 19:11:14 +03:00
parent da362919b5
commit f31f190eed
5 changed files with 168 additions and 18 deletions
+25 -4
View File
@@ -1,4 +1,4 @@
# ---/ start_server /--------------------------------------------------
# ---/ start_server /------------------------------------------------
add_executable(start_server
start_server.c
@@ -19,7 +19,7 @@ target_link_options(start_server PRIVATE -Wl,--wrap=socket,--wrap=setsockopt,--w
add_test(NAME client_start_server_test_1 COMMAND start_server)
# ---/ prepare_start /--------------------------------------------------
# ---/ prepare_start /-----------------------------------------------
add_executable(prepare_start
prepare_start.c
@@ -36,6 +36,27 @@ target_link_libraries(prepare_start
test_utils
)
target_link_options(prepare_start PRIVATE -Wl,--wrap=print_log,--wrap=print_log,--wrap=chdir,--wrap=mkdir,--wrap=exit,--wrap=directory_exists)
target_link_options(prepare_start PRIVATE -Wl,--wrap=print_log,--wrap=chdir,--wrap=mkdir,--wrap=exit,--wrap=directory_exists)
add_test(NAME client_prepare_start_test_1 COMMAND prepare_start)
add_test(NAME client_prepare_start_test_1 COMMAND prepare_start)
# ---/ server_main_loop /--------------------------------------------
add_executable(server_main_loop
server_main_loop.c
)
target_link_libraries(server_main_loop
cmocka
client
file_p
session
utils
main
server
test_utils
)
target_link_options(server_main_loop PRIVATE -Wl,--wrap=print_log)
add_test(NAME client_server_main_loop_test_1 COMMAND server_main_loop)
+123
View File
@@ -0,0 +1,123 @@
#include <arpa/inet.h>
#include <cmocka.h>
#include <main.h>
#include <netinet/in.h>
#include <server.h>
#include <signal.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <unistd.h>
#define CLIENT_PORT PORT + 1
int sd = -1;
int lpid = -1;
int _addr;
volatile sig_atomic_t child_ready = 0;
#define WELCOME_MES "Hello everyworld!\n"
int init_client(void);
bool connect_to_server(int sd, int addr, short int port);
void _server_loop();
void usr1hdl(int n) { child_ready = true; }
int setup(void **state);
int tear_down(void **state);
/* === TESTS === */
/* TODO: better solution than sleep() */
void test__welcome(void **state) {
char str[] = WELCOME_MES "login> ";
char buf[256];
int rlen = read(sd, buf, 128);
buf[rlen] = 0;
assert_string_equal(str, buf);
}
/* === MAIN === */
int main(int argc, char **argv) {
const struct CMUnitTest tests[] = {cmocka_unit_test(test__welcome)};
return cmocka_run_group_tests(tests, setup, tear_down);
}
/* === ADDITIONAL === */
bool connect_to_server(int sd, int addr, short int port) {
struct sockaddr_in server;
server.sin_family = AF_INET;
server.sin_addr.s_addr = addr;
server.sin_port = port;
if (-1 == connect(sd, (struct sockaddr *)&server, sizeof(server))) {
return false;
}
return true;
}
int init_client(void) {
int res;
int cs = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in client;
client.sin_family = AF_INET;
client.sin_port = htons(CLIENT_PORT);
client.sin_addr.s_addr = htonl(INADDR_ANY);
int opt = 1;
setsockopt(cs, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
res = bind(cs, (struct sockaddr *)&client, sizeof(client));
if (res == -1) {
exit(1);
}
return cs;
}
void _server_loop() {
server_data_t s_d = {.ls = start_server(),
.welcome_message = WELCOME_MES};
if (s_d.ls == -1) {
kill(getppid(), SIGTERM);
exit(1);
}
kill(getppid(), SIGUSR1);
server_main_loop(&s_d);
exit(0);
}
int setup(void **state) {
sigset_t mask_usr1, mask_empty;
sigemptyset(&mask_usr1);
sigaddset(&mask_usr1, SIGUSR1);
sigemptyset(&mask_empty);
sigprocmask(SIG_SETMASK, &mask_usr1, NULL);
signal(SIGUSR1, usr1hdl);
lpid = fork();
if (lpid == 0) {
_server_loop();
}
while (!child_ready)
sigsuspend(&mask_empty);
struct sockaddr_in addr;
inet_aton("127.0.0.1", &(addr.sin_addr));
_addr = addr.sin_addr.s_addr;
sd = init_client();
int res = connect_to_server(sd, _addr, htons(PORT));
if (!res) {
perror("connect failed");
kill(lpid, SIGTERM);
exit(1);
}
return 0;
}
int tear_down(void **state) {
kill(lpid, SIGTERM);
return 0;
}