Today a server rejection sends a bare STATUS_ERROR and the reason only
reaches the server log, so the client cannot say why a transfer was
refused. Add an optional, bounded server->client error-detail frame:
- Status gains STATUS_ERROR_DETAIL appended LAST so existing wire
values are unchanged.
- send_error_detail(fd, msg) sends STATUS_ERROR_DETAIL followed by the
existing length-prefixed string primitive, slicing over-long messages
to MAX_ERROR_DETAIL_BYTES (4096).
- receive_status() (and the timed/keepalive status readers) always
consume the detail body and map the status back to STATUS_ERROR,
capturing the text into a thread-local buffer exposed by
protocol_last_error(); a bare STATUS_ERROR leaves it cleared. Every
existing call site keeps working and the stream cannot desync.
- Upgrade the daemon module gate / config validation (config.c), the
final transfer failure (server.c) and receiver-side path/node
validation (file_receive.c) to send a concrete reason; surface it on
the client in client_send.c/config.c.
- Bump PROTOCOL_VERSION to 2.21.0 (CMake VERSION, CHANGELOG, docs) and
update the pinned config wire golden hash / CLI-version tests.
- Add tests/test_protocol_error.c covering mapping+capture, the
over-long bound, bare-error clearing, and thread-locality.
108 lines
2.8 KiB
C
108 lines
2.8 KiB
C
#include "test_array_list.h"
|
|
#include "test_batch.h"
|
|
#include "test_chunk.h"
|
|
#include "test_change_list.h"
|
|
#include "test_checksum.h"
|
|
#include "test_client_cli.h"
|
|
#include "test_compression.h"
|
|
#include "test_config.h"
|
|
#include "test_credentials.h"
|
|
#include "test_data.h"
|
|
#include "test_daemon_conf.h"
|
|
#include "test_daemon_limits.h"
|
|
#include "test_delay_updates.h"
|
|
#include "test_delta.h"
|
|
#include "test_file.h"
|
|
#include "test_file_list.h"
|
|
#include "test_file_sendfile.h"
|
|
#include "test_fuzz_smoke.h"
|
|
#include "test_glob.h"
|
|
#include "test_hardlink.h"
|
|
#include "test_iconv.h"
|
|
#include "test_log.h"
|
|
#include "test_metadata.h"
|
|
#include "test_motd.h"
|
|
#include "test_multiprocessing.h"
|
|
#include "test_property.h"
|
|
#include "test_protocol.h"
|
|
#include "test_protocol_error.h"
|
|
#include "test_queue.h"
|
|
#include "test_receiver_timeout.h"
|
|
#include "test_robustness.h"
|
|
#include "test_scanner.h"
|
|
#include "test_server.h"
|
|
#include "test_server_cli.h"
|
|
#include "test_shared_utils.h"
|
|
#include "test_stress.h"
|
|
#include "test_stop.h"
|
|
#include "test_transport_tcp.h"
|
|
#include "test_transport_ssh.h"
|
|
#include "test_transport_tls.h"
|
|
#include "test_utils.h"
|
|
#include "test_xattr.h"
|
|
#include <stdio.h>
|
|
#include <signal.h>
|
|
|
|
// Define global test state variables
|
|
int tests_run = 0;
|
|
int tests_failed = 0;
|
|
bool current_test_failed = false;
|
|
|
|
int main() {
|
|
signal(SIGPIPE, SIG_IGN);
|
|
printf("\033[1;36m=== RUNNING UNIT TESTS ===\033[0m\n\n");
|
|
|
|
RUN_TEST(test_queue);
|
|
RUN_TEST(test_array_list);
|
|
RUN_TEST(test_shared_utils);
|
|
RUN_TEST(test_chunk);
|
|
RUN_TEST(test_batch);
|
|
RUN_TEST(test_change_list);
|
|
RUN_TEST(test_config);
|
|
RUN_TEST(test_credentials);
|
|
RUN_TEST(test_compression);
|
|
RUN_TEST(test_scanner);
|
|
RUN_TEST(test_checksum);
|
|
RUN_TEST(test_delta);
|
|
RUN_TEST(test_data);
|
|
RUN_TEST(test_protocol);
|
|
RUN_TEST(test_protocol_error);
|
|
RUN_TEST(test_receiver_timeout);
|
|
RUN_TEST(test_metadata);
|
|
RUN_TEST(test_glob);
|
|
RUN_TEST(test_iconv);
|
|
RUN_TEST(test_file);
|
|
RUN_TEST(test_file_list);
|
|
RUN_TEST(test_trust_sender);
|
|
RUN_TEST(test_delay_updates);
|
|
RUN_TEST(test_file_sendfile);
|
|
RUN_TEST(test_multiprocessing);
|
|
RUN_TEST(test_log);
|
|
RUN_TEST(test_robustness);
|
|
RUN_TEST(test_stress);
|
|
RUN_TEST(test_stop);
|
|
RUN_TEST(test_property);
|
|
RUN_TEST(test_transport_tcp);
|
|
RUN_TEST(test_transport_ssh);
|
|
RUN_TEST(test_transport_tls);
|
|
RUN_TEST(test_client_cli);
|
|
RUN_TEST(test_server);
|
|
RUN_TEST(test_daemon_conf);
|
|
RUN_TEST(test_daemon_limits);
|
|
RUN_TEST(test_motd);
|
|
RUN_TEST(test_server_cli);
|
|
RUN_TEST(test_fuzz_smoke);
|
|
RUN_TEST(test_xattr);
|
|
RUN_TEST(test_hardlink);
|
|
|
|
printf("\n\033[1;36m=== TEST SUMMARY ===\033[0m\n");
|
|
printf("Total Tests Run: %d\n", tests_run);
|
|
if (tests_failed > 0) {
|
|
printf("Status: \033[1;31m%d FAILED\033[0m\n", tests_failed);
|
|
return 1;
|
|
} else {
|
|
printf("Status: \033[1;32mALL PASSED\033[0m\n");
|
|
return 0;
|
|
}
|
|
}
|