From 8fe7f985a07d44024fb7745048d24d1b7da4b1a6 Mon Sep 17 00:00:00 2001 From: Alexander Zhylin Date: Fri, 3 Jul 2026 19:17:59 +0300 Subject: [PATCH] tests: updates start_server [not finished] --- TODO.md | 1 + src/components/server/server.c | 15 +++++-- test/server/CMakeLists.txt | 3 +- test/server/start_server.c | 72 +++++++++++++++++++++++++++++----- 4 files changed, 78 insertions(+), 13 deletions(-) diff --git a/TODO.md b/TODO.md index b864360..365ac48 100644 --- a/TODO.md +++ b/TODO.md @@ -8,6 +8,7 @@ - [ ] make print_log to write a file log - [ ] Remove file when error while saving the data in DB - [ ] Colorize server messages +- [ ] Unified list of exit codes ## Features diff --git a/src/components/server/server.c b/src/components/server/server.c index 9355172..61a7f4a 100644 --- a/src/components/server/server.c +++ b/src/components/server/server.c @@ -144,24 +144,33 @@ int start_server(void) { int ls = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in s_addr; + if (ls == -1) { + print_log(stderr, pl_fatal, "starting, socket: %s\n", strerror(errno)); + exit(3); + } + s_addr.sin_family = AF_INET; s_addr.sin_port = htons(PORT); s_addr.sin_addr.s_addr = htonl(INADDR_ANY); int opt = 1; - setsockopt(ls, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); + res = setsockopt(ls, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); + if (res == -1) { + print_log(stderr, pl_fatal, "starting, setsockopt: %s\n", strerror(errno)); + exit(4); + } res = bind(ls, (struct sockaddr *)&s_addr, sizeof(s_addr)); if (res == -1) { print_log(stderr, pl_fatal, "starting, socket bind: %s\n", strerror(errno)); - exit(3); + exit(5); } res = listen(ls, LISTEN_QLEN); if (res == -1) { print_log(stderr, pl_fatal, "starting, socket listen: %s\n", strerror(errno)); - exit(4); + exit(6); } return ls; } diff --git a/test/server/CMakeLists.txt b/test/server/CMakeLists.txt index b159f32..8e030d1 100644 --- a/test/server/CMakeLists.txt +++ b/test/server/CMakeLists.txt @@ -11,9 +11,10 @@ target_link_libraries(start_server session utils main + server test_utils ) -target_link_options(start_server PRIVATE -Wl,--wrap=socket,--wrap=setsockopt,--wrap=bind,--wrap=listen,--wrap=exit) +target_link_options(start_server PRIVATE -Wl,--wrap=socket,--wrap=setsockopt,--wrap=bind,--wrap=listen,--wrap=exit,--wrap=print_log) add_test(NAME client_start_server_test_1 COMMAND start_server) \ No newline at end of file diff --git a/test/server/start_server.c b/test/server/start_server.c index 4dcf867..ed2647b 100644 --- a/test/server/start_server.c +++ b/test/server/start_server.c @@ -1,40 +1,94 @@ #include #include +#include #include #include #include #include +#include #include #include #include #include +#include + +int _errno = 0; +int _exit_code = 0; +extern void *print_str_arr; /* TODO: finish */ -int __wrap_socket(int __domain, int __type, int __protocol) { return 0; } +int __wrap_socket(int __domain, int __type, int __protocol) { + errno = _errno; + return mock_type(int); +} -int __wrap_setsockopt(int __fd, int __level, int __optname, +int __wrap_setsockopt(int __fd, int __level, int __optname, const void *__optval, socklen_t __optlen) { - return 0; + errno = _errno; + return mock_type(int); } -int __wrap_bind(int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len) { - return 0; +int __wrap_bind(int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len) { + errno = _errno; + return mock_type(int); } -int __wrap_listen(int __fd, int __n) { return 0; } +int __wrap_listen(int __fd, int __n) { + errno = _errno; + return mock_type(int); +} -void __wrap_exit(int __status) {} +void __wrap_exit(int __status) { _exit_code = __status; } -void test__start_server_success(void **state) {} +void test__start_server_success(void **state) { + will_return(__wrap_socket, 1); + will_return(__wrap_setsockopt, 0); + will_return(__wrap_bind, 0); + will_return(__wrap_listen, 0); + int ret = start_server(); + assert_int_equal(ret, 1); +} -int setup(void **state) { return 0; } +void test__start_server_err_socket(void **state) { + _errno = EACCES; + will_return(__wrap_socket, -1); + + will_return(__wrap_setsockopt, 0); + will_return(__wrap_bind, 0); + will_return(__wrap_listen, 0); + + const char *fmt_args[] = {"starting, socket: %s\n", strerror(_errno), NULL}; + print_str_arr = fmt_args; + start_server(); + assert_int_equal(_exit_code, 3); +} + +void test__start_server_err_setsockopt(void **state) { + _errno = EBADF; + will_return(__wrap_socket, 1); + will_return(__wrap_setsockopt, -1); + will_return(__wrap_bind, 0); + will_return(__wrap_listen, 0); + + const char *fmt_args[] = {"starting, setsockopt: %s\n", strerror(_errno), + NULL}; + print_str_arr = fmt_args; + start_server(); + assert_int_equal(_exit_code, 4); +} + +int setup(void **state) { + print_str_arr = NULL; + return 0; +} int tear_down(void **state) { return 0; } int main(int argc, char **argv) { const struct CMUnitTest tests[] = { cmocka_unit_test(test__start_server_success), + cmocka_unit_test(test__start_server_err_socket), }; return cmocka_run_group_tests(tests, setup, tear_down);