refactoring; finishing integration of CMocka; several test cases covered

This commit is contained in:
2026-06-12 18:35:33 +03:00
parent 2e33becdbf
commit 814fee67f8
35 changed files with 432 additions and 108 deletions
+2 -1
View File
@@ -1 +1,2 @@
add_subdirectory(session)
add_subdirectory(session)
add_subdirectory(user)
+22 -5
View File
@@ -1,12 +1,29 @@
add_executable(session_app
session.c
# ---/ session_do_read /---------------------------------------------
add_executable(session_do_read
session_do_read.c
)
target_link_libraries(session_app
target_link_libraries(session_do_read
cmocka
session
main
)
target_link_options(session_app PRIVATE -Wl,--wrap=read)
target_link_options(session_do_read PRIVATE -Wl,--wrap=read)
add_test(session_test session_app)
add_test(NAME session_test_1 COMMAND session_do_read)
# ---/ query_extract_from_buf /--------------------------------------
add_executable(query_extract_from_buf
query_extract_from_buf.c
)
target_link_libraries(query_extract_from_buf
cmocka
session
main
)
add_test(NAME session_test_2 COMMAND query_extract_from_buf)
+49
View File
@@ -0,0 +1,49 @@
#include <cmocka.h>
#include <setjmp.h>
#include <stdarg.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <main.h>
#include <session.h>
#include <string.h>
#define TEST_BUF "First line\nThe second line\r\nThe third line\nFourth line\0"
#define SUBSTR_NUM 4
void test_query_extract_from_buf_filled(void **state) {
session sess = {.buf = TEST_BUF, .buf_used = sizeof TEST_BUF};
char *lines[SUBSTR_NUM];
for (int i = 0; i < SUBSTR_NUM; i++) {
query_extract_from_buf(&sess, &lines[i]);
}
assert_memory_equal("First line\n", lines[0], strlen(lines[0]));
assert_memory_equal("The second line\n", lines[1], strlen(lines[1]));
assert_memory_equal("The third line\n", lines[2], strlen(lines[2]));
assert_memory_equal("Fourth line", lines[3], strlen(lines[3]));
for (int i = 0; i < SUBSTR_NUM; i++) {
free(lines[i]);
}
}
void test_query_extract_from_buf_empty(void **state) {
session sess = {.buf = "", .buf_used = 0};
char *line = NULL;
int ret = query_extract_from_buf(&sess, &line);
assert_null(line);
assert_int_equal(ret, 0);
}
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_query_extract_from_buf_filled),
cmocka_unit_test(test_query_extract_from_buf_empty)
};
return cmocka_run_group_tests(tests, setup, tear_down);
}
-35
View File
@@ -1,35 +0,0 @@
#include <cmocka.h>
#include <setjmp.h>
#include <stdarg.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <session.h>
#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);
}
+41
View File
@@ -0,0 +1,41 @@
#include <cmocka.h>
#include <setjmp.h>
#include <stdarg.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <main.h>
#include <session.h>
#include <string.h>
#define TEST_BUF_USED "Voluptas voluptate reprehenderit eum voluptatibus.\n"
#define TEST_BUF_UNUSED \
"Impedit et rerum ut aut vel nisi. Animi et vero nihil aut possimus " \
"commodi. Autem dolorem et officia provident.\n"
#define TEST_BUF TEST_BUF_USED TEST_BUF_UNUSED
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 *line;
session_do_read(&sess, &line);
assert_memory_equal(line, TEST_BUF_USED, sizeof(TEST_BUF_USED));
free(line);
}
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);
}
+33
View File
@@ -0,0 +1,33 @@
# ---/ create_user /-------------------------------------------------
add_executable(create_user
create_user.c
)
target_link_libraries(create_user
cmocka
user
main
db
)
target_link_options(create_user PRIVATE -Wl,--wrap=db_user_create,--wrap=session_send_string)
add_test(NAME user_test_1 COMMAND create_user)
# ---/ db_user_create /-------------------------------------------------
add_executable(db_user_create
db_user_create.c
)
target_link_libraries(db_user_create
cmocka
user
main
db
)
target_link_options(db_user_create PRIVATE -Wl,--wrap=db_user_create,--wrap=session_send_string)
add_test(NAME user_test_2 COMMAND db_user_create)
+55
View File
@@ -0,0 +1,55 @@
#include <cmocka.h>
#include <db/db.h>
#include <setjmp.h>
#include <stdarg.h>
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <main.h>
#include <string.h>
#include <user.h>
#define UNAME "test_user"
#define PASS "1234"
#define EMAIL "test_user@test.com"
int32_t __wrap_db_user_create(i_db_user_create *args) { return mock_type(int); }
void __wrap_session_send_string(struct session *sess, const char *fmt, ...) {}
/* TODO: divide into separate cases and check messages */
void test_create_user(void **state) {
session sess = {};
i_db_user_create p;
int32_t ret = 0;
char line[sizeof "register" + sizeof UNAME + sizeof PASS + sizeof EMAIL + 5];
sprintf(line, "register %s %s %s\n", UNAME, PASS, EMAIL);
/* Case: success */
will_return(__wrap_db_user_create, 123);
ret = create_user(&sess, line);
assert_int_equal(ret, 123);
/* Case: username exist */
will_return(__wrap_db_user_create, -2);
ret = create_user(&sess, line);
assert_int_equal(ret, -2);
/* Case: email exist */
will_return(__wrap_db_user_create, -3);
ret = create_user(&sess, line);
assert_int_equal(ret, -3);
/* Case: error */
will_return(__wrap_db_user_create, -4);
ret = create_user(&sess, line);
assert_int_equal(ret, -4);
}
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_create_user)};
return cmocka_run_group_tests(tests, setup, tear_down);
}
+45
View File
@@ -0,0 +1,45 @@
#include <cmocka.h>
#include <db/db.h>
#include <setjmp.h>
#include <stdarg.h>
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <main.h>
#include <string.h>
#include <user.h>
#define UNAME "test_user"
#define PASS "1234"
#define EMAIL "test_user@test.com"
void __wrap_session_send_string(struct session *sess, const char *fmt, ...) {}
int32_t __wrap_db_user_create(i_db_user_create *args) {
assert_memory_equal(args->uname, UNAME, strlen(args->uname));
assert_memory_equal(args->pass, PASS, strlen(args->pass));
assert_memory_equal(args->email, EMAIL, strlen(args->email));
return mock_type(int);
}
void test_create_user(void **state) {
session sess = {};
i_db_user_create p;
int32_t ret = 0;
char line[sizeof "register" + sizeof UNAME + sizeof PASS + sizeof EMAIL + 5];
sprintf(line, "register %s %s %s\n", UNAME, PASS, EMAIL);
will_return(__wrap_db_user_create, 123);
ret = create_user(&sess, line);
assert_int_equal(ret, 123);
}
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_create_user)};
return cmocka_run_group_tests(tests, setup, tear_down);
}