testing: add comprehensive test suite for test-driven development

Add unit tests for previously untested modules (protocol, data, metadata,
file, glob), robustness tests for deserialization of malformed inputs,
thread safety stress tests, property-based roundtrip tests, and 6 fuzz
targets. Update CI with CTest integration, coverage reporting, and
valgrind memory checking.

New test files:
- test_data.c: Data type lifecycle (5 tests)
- test_protocol.c: Protocol I/O roundtrips and error paths (9 tests)
- test_metadata.c: Metadata serialization roundtrips (6 tests)
- test_file.c: File operations and send/receive (12 tests)
- test_glob.c: Glob pattern matching (10 tests)
- test_robustness.c: Malformed input handling for chunk/delta/protocol (11 tests)
- test_stress.c: MPMC queue stress, backpressure, rapid create/destroy (3 tests)
- test_property.c: Compress, delta, chunk, glob roundtrip properties (4 tests)
- tests/fuzz/: 6 libFuzzer targets for deserialization functions

Extended existing tests:
- test_config.c: config_send/config_receive roundtrip via fork+pipe
- test_shared_utils.c: mkdir_r, glob_match, delete_extras

Infrastructure:
- CTest integration in CMakeLists.txt
- Coverage support (-DENABLE_COVERAGE=ON)
- Fuzz target support (-DENABLE_FUZZ=ON)
- CI: coverage, valgrind, address sanitizer jobs
- Fixed MPMC stress test race condition (cnd_signal -> cnd_broadcast)
This commit is contained in:
2026-07-19 19:19:15 +02:00
parent afa5aeca37
commit 8f77395b58
25 changed files with 1581 additions and 12 deletions
+32
View File
@@ -0,0 +1,32 @@
#include "utils.h"
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
if (size < 2)
return 0;
// Split input into pattern and string at the midpoint
size_t mid = size / 2;
char* pattern = malloc(mid + 1);
char* str = malloc(size - mid + 1);
if (!pattern || !str) {
free(pattern);
free(str);
return 0;
}
memcpy(pattern, data, mid);
pattern[mid] = '\0';
memcpy(str, data + mid, size - mid);
str[size - mid] = '\0';
glob_match(pattern, str);
free(pattern);
free(str);
return 0;
}