diff --git a/.gitmodules b/.gitmodules index 76472bf..10474a6 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ -[submodule "external/Unity"] - path = external/Unity - url = https://github.com/ThrowTheSwitch/Unity.git +# [submodule "external/Unity"] +# path = external/Unity +# url = https://github.com/ThrowTheSwitch/Unity.git +[submodule "external/cmocka"] + path = external/cmocka + url = https://git.cryptomilk.org/projects/cmocka.git diff --git a/CMakeLists.txt b/CMakeLists.txt index 9ad826f..b3c29b9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -40,12 +40,11 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS ON) add_subdirectory(src) -if(TARGET_GROUP STREQUAL test) - include(CTest) - - add_subdirectory(external) - add_subdirectory(test) -endif() +# Testing +enable_testing() +include(cmake/OptionsCMocka.cmake) +add_subdirectory(external/cmocka) +add_subdirectory(test) install( TARGETS zbbs-server diff --git a/cmake/OptionsCMocka.cmake b/cmake/OptionsCMocka.cmake new file mode 100644 index 0000000..fc1260c --- /dev/null +++ b/cmake/OptionsCMocka.cmake @@ -0,0 +1,7 @@ +# Disable things we don't need from CMocka +set(WITH_EXAMPLES OFF CACHE BOOL "Build examples" FORCE) +set(UNIT_TESTING OFF CACHE BOOL "Build CMocka's own tests" FORCE) +set(WITH_CMOCKERY_SUPPORT OFF CACHE BOOL "" FORCE) + +# Force static library (easier for most projects) +set(WITH_STATIC_LIB ON CACHE BOOL "Build static library" FORCE) \ No newline at end of file diff --git a/external/CMakeLists.txt b/external/CMakeLists.txt deleted file mode 100644 index 0917251..0000000 --- a/external/CMakeLists.txt +++ /dev/null @@ -1,7 +0,0 @@ -add_library(Unity STATIC - Unity/src/unity.c -) - -target_include_directories(Unity PUBLIC - Unity/src -) diff --git a/external/cmocka b/external/cmocka new file mode 160000 index 0000000..7f736f6 --- /dev/null +++ b/external/cmocka @@ -0,0 +1 @@ +Subproject commit 7f736f65dc7e21499702d531a1de84cc5308cb7a diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 8bfa26b..2c4b247 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -9,11 +9,24 @@ target_sources(zbbs-server ${M_SOURCES} ) +add_library(main INTERFACE) + +target_sources(main + PUBLIC + FILE_SET HEADERS + FILES + main.h +) + + add_subdirectory(libs) add_subdirectory(db) +add_subdirectory(components) target_link_libraries(zbbs-server PRIVATE + session + client db murmur3 OpenSSL::Crypto diff --git a/src/components/CMakeLists.txt b/src/components/CMakeLists.txt new file mode 100644 index 0000000..b57db15 --- /dev/null +++ b/src/components/CMakeLists.txt @@ -0,0 +1,2 @@ +add_subdirectory(client) +add_subdirectory(session) \ No newline at end of file diff --git a/src/components/client/CMakeLists.txt b/src/components/client/CMakeLists.txt new file mode 100644 index 0000000..382b1d1 --- /dev/null +++ b/src/components/client/CMakeLists.txt @@ -0,0 +1,18 @@ +add_library(client STATIC) + +target_link_libraries(client + PRIVATE + db + main + murmur3 + OpenSSL::Crypto +) + +target_sources(client + PRIVATE + client.c + PUBLIC + FILE_SET HEADERS + FILES + client.h +) diff --git a/src/client.c b/src/components/client/client.c similarity index 99% rename from src/client.c rename to src/components/client/client.c index 8cd7721..c78c1b3 100644 --- a/src/client.c +++ b/src/components/client/client.c @@ -3,7 +3,7 @@ #include "client.h" #include "file_p.h" -#include "main.h" +#include #include "session.h" #include "utils.h" #include diff --git a/src/client.h b/src/components/client/client.h similarity index 93% rename from src/client.h rename to src/components/client/client.h index 711f93e..8a78960 100644 --- a/src/client.h +++ b/src/components/client/client.h @@ -4,7 +4,7 @@ #ifndef CLIENT_H #define CLIENT_H -#include "main.h" +#include void process_client_command(char *line, session *sess, server_data_t *s_d); void download_confirm(char *line, session *sess, server_data_t *s_d); #endif \ No newline at end of file diff --git a/src/components/session/CMakeLists.txt b/src/components/session/CMakeLists.txt new file mode 100644 index 0000000..4fc88c6 --- /dev/null +++ b/src/components/session/CMakeLists.txt @@ -0,0 +1,18 @@ +add_library(session STATIC) + +target_link_libraries(session + PRIVATE + client + db + murmur3 + OpenSSL::Crypto +) + +target_sources(session + PRIVATE + session.c + PUBLIC + FILE_SET HEADERS + FILES + session.h +) diff --git a/src/session.c b/src/components/session/session.c similarity index 97% rename from src/session.c rename to src/components/session/session.c index 24ce2ab..a46436a 100644 --- a/src/session.c +++ b/src/components/session/session.c @@ -2,11 +2,11 @@ /* Copyright (c) 2026 Oleksandr Zhylin */ #include "session.h" -#include "client.h" -#include "file_p.h" -#include "main.h" -#include "user.h" -#include "utils.h" +#include "../../client.h" +#include "../../file_p.h" +#include "../../main.h" +#include "../../user.h" +#include "../../utils.h" #include #include #include diff --git a/src/session.h b/src/components/session/session.h similarity index 96% rename from src/session.h rename to src/components/session/session.h index a8e607c..3d992db 100644 --- a/src/session.h +++ b/src/components/session/session.h @@ -3,7 +3,7 @@ #ifndef SESSION_H #define SESSION_H -#include "main.h" +#include "../../main.h" #include int accept_client(int ls, session *connections[], char *wm); void session_send_string(struct session *sess, const char *str, ...); diff --git a/src/user.c b/src/user.c index 505c9af..9e4cc98 100644 --- a/src/user.c +++ b/src/user.c @@ -11,7 +11,6 @@ int32_t create_user(session *sess, char *line) { i_db_user_create p; - int32_t privileges; int32_t res; if (sscanf(line, "register %s %s %s", p.uname, p.pass, p.email) == 3) { res = db_user_create(&p); diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 74826c6..a5cc086 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1 +1 @@ -add_subdirectory(file_p) \ No newline at end of file +add_subdirectory(session) \ No newline at end of file diff --git a/test/file_p/CMakeLists.txt b/test/file_p/CMakeLists.txt deleted file mode 100644 index 0bd5e20..0000000 --- a/test/file_p/CMakeLists.txt +++ /dev/null @@ -1,10 +0,0 @@ -add_executable(file_p_app - file_p.c -) - -target_link_libraries(file_p_app - file_p - Unity -) - -add_test(file_p_test file_p_app) diff --git a/test/file_p/file_p.c b/test/file_p/file_p.c deleted file mode 100644 index ba98c9f..0000000 --- a/test/file_p/file_p.c +++ /dev/null @@ -1 +0,0 @@ -#include \ No newline at end of file diff --git a/test/session/CMakeLists.txt b/test/session/CMakeLists.txt new file mode 100644 index 0000000..569a53a --- /dev/null +++ b/test/session/CMakeLists.txt @@ -0,0 +1,12 @@ +add_executable(session_app + session.c +) + +target_link_libraries(session_app + cmocka + session +) + +target_link_options(session_app PRIVATE -Wl,--wrap=read) + +add_test(session_test session_app) diff --git a/test/session/session.c b/test/session/session.c new file mode 100644 index 0000000..a1bb0cf --- /dev/null +++ b/test/session/session.c @@ -0,0 +1,35 @@ +#include +#include +#include +#include +#include +#include + +#include +#include "../../src/main.h" + +#define TEST_BUF "Hello world!\n" + +int __wrap_read(int fd, void *buf, size_t nbytes) { + return sizeof TEST_BUF - 1; +} + +void test_session_do_read(void** state) { + session sess = { + .buf = TEST_BUF, + .buf_used = sizeof TEST_BUF, + .sd = 2, + }; + char *str; + session_do_read(NULL, &str); + assert_memory_equal(str, TEST_BUF, sizeof (TEST_BUF)-1); +} + +int setup(void **state) { return 0; } +int tear_down(void **state) { return 0; } + +int main(int argc, char **argv) { + const struct CMUnitTest tests[] = {cmocka_unit_test(test_session_do_read)}; + + return cmocka_run_group_tests(tests, setup, tear_down); +}