- u_async.c: process immediate_queue BEFORE epoll_wait in uasync_poll - stcp_link.c: defensive NULL etcp_conn/etcp_link in stcp_link_close - utun_instance.c: move stcp_server_list_destroy_all to Phase J (before ETCP), add deferred drain in both Phase J and L - stcp.h/c: STCP_HS_ENC_CLIENT 6→38, STCP_HS_ENC_SERVER 7→39, exchange ed25519_pubkey in both handshake directions - etcp_connections.c: copy peer_ed25519 from STCP to ETCP_CONN in etcp_link_enter_ready_tcp; guard link->etcp in tcp_link_close_cb - chat_sync.c: fix lk->conn NULL dereference for TCP links - test_stcp.c: update stcp_server_create/stcp_client_connect callsites - tools/chat_tcp_test: change transport udp→tcp
138 lines
5.7 KiB
C
138 lines
5.7 KiB
C
/**
|
|
* Тест загрузки debug настроек из конфигурационного файла
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include "../lib/platform_compat.h"
|
|
#include "test_utils.h"
|
|
#ifdef _WIN32
|
|
#include <windows.h>
|
|
#include <direct.h>
|
|
#else
|
|
#include <unistd.h>
|
|
#endif
|
|
#include <sys/stat.h>
|
|
#include "../lib/debug_config.h"
|
|
#include "../lib/socket_compat.h"
|
|
#include "../src/config_parser.h"
|
|
|
|
// Temp config file path
|
|
static char temp_dir[] = "/tmp/utun_test_XXXXXX";
|
|
static char config_path[256];
|
|
|
|
// Config content
|
|
static const char* config_content =
|
|
"[global]\n"
|
|
"my_node_id=0x1111111111111111\n"
|
|
"my_private_key=38240cb82199e504686507f11f6eaa4f740fde6f0c425c495e49a523019a5d68\n"
|
|
"my_public_key=ce8871f07fa056c636d297115f231b08c29cdf94e0d440fce83a07c34416d36a\n"
|
|
"tun_ip=10.99.0.1/24\n"
|
|
"tun_ifname=tun99\n"
|
|
"# Debug and logging configuration\n"
|
|
"log_file=/tmp/utun_debug.log\n"
|
|
"debug_level=debug\n"
|
|
"debug_categories=etcp,ll_queue,memory,traffic\n"
|
|
"enable_timestamp=1\n"
|
|
"enable_function_names=1\n"
|
|
"enable_file_lines=1\n"
|
|
"enable_colors=1\n"
|
|
"\n"
|
|
"[server: test]\n"
|
|
"addr=127.0.0.1:9001\n"
|
|
"type=public\n";
|
|
|
|
// Create temp config file
|
|
static int create_temp_config(void) {
|
|
if (test_mkdtemp(temp_dir) != 0) {
|
|
fprintf(stderr, "Failed to create temp directory\n");
|
|
return -1;
|
|
}
|
|
|
|
snprintf(config_path, sizeof(config_path), "%s/test.conf", temp_dir);
|
|
|
|
FILE* f = fopen(config_path, "w");
|
|
if (!f) {
|
|
fprintf(stderr, "Failed to create config file\n");
|
|
return -1;
|
|
}
|
|
fprintf(f, "%s", config_content);
|
|
fclose(f);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Cleanup temp config file
|
|
static void cleanup_temp_config(void) {
|
|
if (config_path[0]) test_unlink(config_path);
|
|
if (temp_dir[0]) test_rmdir(temp_dir);
|
|
}
|
|
|
|
int main() {
|
|
// Initialize socket platform (required for getaddrinfo on Windows)
|
|
if (socket_platform_init() != 0) {
|
|
fprintf(stderr, "Failed to initialize socket platform\n");
|
|
return 1;
|
|
}
|
|
|
|
// Create temp config file first
|
|
if (create_temp_config() != 0) {
|
|
fprintf(stderr, "Failed to create temporary config file\n");
|
|
socket_platform_cleanup();
|
|
return 1;
|
|
}
|
|
|
|
DEBUG_ERROR(DEBUG_CATEGORY_CONFIG, "=== Тест загрузки debug настроек из конфигурационного файла ===");
|
|
|
|
// Инициализация отладки по умолчанию
|
|
debug_config_init();
|
|
debug_set_level(DEBUG_LEVEL_ERROR); // Начальный уровень
|
|
|
|
DEBUG_ERROR(DEBUG_CATEGORY_CONFIG, "1. До загрузки конфигурации:");
|
|
DEBUG_ERROR(DEBUG_CATEGORY_CONFIG, "ERROR сообщение до загрузки конфигурации");
|
|
DEBUG_INFO(DEBUG_CATEGORY_CONFIG, "INFO сообщение до загрузки конфигурации (не должно выводиться)");
|
|
|
|
// Загрузка конфигурации из файла
|
|
DEBUG_ERROR(DEBUG_CATEGORY_CONFIG, "2. Загрузка конфигурации из файла: %s", config_path);
|
|
struct utun_config *config = parse_config(config_path);
|
|
|
|
if (!config) {
|
|
DEBUG_ERROR(DEBUG_CATEGORY_CONFIG, "❌ Ошибка загрузки конфигурации");
|
|
return 1;
|
|
}
|
|
|
|
DEBUG_ERROR(DEBUG_CATEGORY_CONFIG, "✅ Конфигурация загружена успешно");
|
|
DEBUG_ERROR(DEBUG_CATEGORY_CONFIG, " Log file: %s", config->global.log_file[0] ? config->global.log_file : "(none)");
|
|
DEBUG_ERROR(DEBUG_CATEGORY_CONFIG, " Debug level: %s", config->global.debug_level[0] ? config->global.debug_level : "(none)");
|
|
DEBUG_ERROR(DEBUG_CATEGORY_CONFIG, " Enable timestamp: %d", config->global.enable_timestamp);
|
|
DEBUG_ERROR(DEBUG_CATEGORY_CONFIG, " Enable colors: %d", config->global.enable_colors);
|
|
|
|
// Тестирование новых настроек
|
|
DEBUG_ERROR(DEBUG_CATEGORY_CONFIG, "4. Тестирование после применения настроек:");
|
|
DEBUG_ERROR(DEBUG_CATEGORY_ETCP, "ERROR от ETCP (должен выводиться)");
|
|
DEBUG_INFO(DEBUG_CATEGORY_ETCP, "INFO от ETCP (должен выводиться - уровень debug)");
|
|
DEBUG_DEBUG(DEBUG_CATEGORY_ETCP, "DEBUG от ETCP (должен выводиться - уровень debug)");
|
|
DEBUG_INFO(DEBUG_CATEGORY_SYS, "INFO от LL_QUEUE (должен выводиться)");
|
|
DEBUG_INFO(DEBUG_CATEGORY_SYS, "INFO от MEMORY (должен выводиться)");
|
|
DEBUG_INFO(DEBUG_CATEGORY_TRAFFIC, "INFO от TRAFFIC (должен выводиться)");
|
|
DEBUG_DEBUG(DEBUG_CATEGORY_TRAFFIC, "DEBUG от TRAFFIC (должен выводиться - уровень debug)");
|
|
DEBUG_INFO(DEBUG_CATEGORY_CONNECTION, "INFO от CONNECTION (НЕ должен выводиться - категория не включена)");
|
|
DEBUG_INFO(DEBUG_CATEGORY_CRYPTO, "INFO от CRYPTO (НЕ должен выводиться - категория не включена)");
|
|
|
|
// Проверка работы с файлом
|
|
DEBUG_ERROR(DEBUG_CATEGORY_CONFIG, "5. Проверка вывода в файл:");
|
|
DEBUG_INFO(DEBUG_CATEGORY_CONFIG, "Это сообщение должно быть записано в файл: /tmp/utun_debug.log");
|
|
|
|
// Освобождение ресурсов
|
|
free_config(config);
|
|
|
|
// Cleanup temp config file
|
|
cleanup_temp_config();
|
|
|
|
DEBUG_ERROR(DEBUG_CATEGORY_CONFIG, "=== Тест завершен ===");
|
|
DEBUG_ERROR(DEBUG_CATEGORY_CONFIG, "Проверьте файл /tmp/utun_debug.log для записанных сообщений");
|
|
|
|
socket_platform_cleanup();
|
|
return 0;
|
|
} |