diff --git a/tests/salvage/CMakeLists.txt b/tests/salvage/CMakeLists.txt index 372af75..289a23b 100644 --- a/tests/salvage/CMakeLists.txt +++ b/tests/salvage/CMakeLists.txt @@ -63,29 +63,3 @@ else() "Skipping salvage NCP delete smoke helper: ncpfs/libncp headers or library not found" ) endif() - -add_executable(salvage_config_smoke - salvage_config_smoke.c - ${CMAKE_SOURCE_DIR}/src/nwsalvage.c -) - -# nwsalvage.c now also contains the server-side delete hook. The config smoke -# only exercises the standalone helper surface, so let the linker discard the -# unreferenced server hook sections instead of requiring all nwconn objects. -set_target_properties(salvage_config_smoke PROPERTIES - COMPILE_FLAGS "-ffunction-sections -fdata-sections" - LINK_FLAGS "-Wl,--gc-sections" -) - -target_include_directories(salvage_config_smoke PRIVATE - ${CMAKE_SOURCE_DIR}/include -) - -target_link_libraries(salvage_config_smoke yyjson) - -add_custom_target(run_salvage_config_smoke ALL - COMMAND $ - DEPENDS salvage_config_smoke - COMMENT "Running salvage config smoke helper" - VERBATIM -) diff --git a/tests/salvage/salvage_config_smoke.c b/tests/salvage/salvage_config_smoke.c deleted file mode 100644 index 6f8027a..0000000 --- a/tests/salvage/salvage_config_smoke.c +++ /dev/null @@ -1,356 +0,0 @@ -/* Smoke test for the initial nwsalvage configuration helpers. */ -#include "nwsalvage.h" - -#include -#include -#include -#include -#include -#include - - -struct fake_ini { - const char *enable_line; - const char *repositories_line; -}; - -static int fake_ini_getter(int entry, char *str, size_t strsize, void *data) -{ - struct fake_ini *ini = data; - const char *line = NULL; - - if (entry == NWSALVAGE_ENABLE_INI_SECTION) - line = ini->enable_line; - else if (entry == NWSALVAGE_REPOSITORY_INI_SECTION) - line = ini->repositories_line; - - if (!line) - return(0); - - if (snprintf(str, strsize, "%s", line) < 0) - return(0); - return(1); -} - - -static int file_contains(const char *path, const char *needle) -{ - FILE *fp = fopen(path, "r"); - char buffer[4096]; - size_t n; - - if (!fp) - return(0); - n = fread(buffer, 1, sizeof(buffer) - 1, fp); - fclose(fp); - buffer[n] = '\0'; - return(strstr(buffer, needle) != NULL); -} - -static void remove_test_tree(const char *root) -{ - char cmd[512]; - - if (!root || !*root) - return; - snprintf(cmd, sizeof(cmd), "rm -rf '%s'", root); - system(cmd); -} - -static int expect_true(int condition, const char *message) -{ - if (!condition) { - fprintf(stderr, "FAIL: %s\n", message); - return(1); - } - return(0); -} - -int main(void) -{ - struct nwsalvage_config config; - char path[NWSALVAGE_PATH_MAX]; - char root[NWSALVAGE_PATH_MAX]; - struct fake_ini ini; - int failures = 0; - - failures += expect_true(nwsalvage_config_defaults(&config) == 0, - "defaults are accepted"); - failures += expect_true(config.enabled == 1, - "salvage defaults to enabled"); - failures += expect_true(!strcmp(config.recycle_repository, ".recycle"), - "default recycle repository name"); - failures += expect_true(!strcmp(config.metadata_repository, ".salvage"), - "default metadata repository name"); - - failures += expect_true(nwsalvage_config_parse_repositories( - &config, " .recycle .salvage ") == 0, - "section 49 default line parses"); - failures += expect_true(!strcmp(config.recycle_repository, ".recycle"), - "parsed recycle repository name"); - failures += expect_true(!strcmp(config.metadata_repository, ".salvage"), - "parsed metadata repository name"); - - failures += expect_true(nwsalvage_config_parse_repositories( - &config, "recycle salvage") == 0, - "custom repository names parse"); - failures += expect_true(!strcmp(config.recycle_repository, "recycle"), - "custom recycle repository name"); - failures += expect_true(!strcmp(config.metadata_repository, "salvage"), - "custom metadata repository name"); - - failures += expect_true(nwsalvage_config_parse_repositories( - &config, "bad/name .salvage") < 0, - "repository names reject slash components"); - failures += expect_true(nwsalvage_config_parse_repositories( - &config, ".recycle") < 0, - "repository line requires two names"); - failures += expect_true(nwsalvage_config_parse_repositories( - &config, ".recycle .salvage extra") < 0, - "repository line rejects extra tokens"); - - failures += expect_true(nwsalvage_config_parse_enabled(&config, "0") == 0, - "section 48 parses disabled value"); - failures += expect_true(config.enabled == 0, - "section 48 disables salvage"); - failures += expect_true(nwsalvage_config_parse_enabled(&config, "1") == 0, - "section 48 parses enabled value"); - failures += expect_true(config.enabled == 1, - "section 48 enables salvage"); - failures += expect_true(nwsalvage_config_parse_enabled(&config, "bad") < 0, - "section 48 rejects invalid value"); - - ini.enable_line = "0"; - ini.repositories_line = "trash meta"; - failures += expect_true(nwsalvage_config_load_from_ini( - &config, fake_ini_getter, &ini) == 0, - "server-style ini getter loads salvage config"); - failures += expect_true(config.enabled == 0, - "ini getter applied section 48"); - failures += expect_true(!strcmp(config.recycle_repository, "trash"), - "ini getter applied section 49 recycle name"); - failures += expect_true(!strcmp(config.metadata_repository, "meta"), - "ini getter applied section 49 metadata name"); - - ini.enable_line = NULL; - ini.repositories_line = NULL; - failures += expect_true(nwsalvage_config_load_from_ini( - &config, fake_ini_getter, &ini) == 0, - "missing ini sections keep defaults"); - failures += expect_true(config.enabled == 1, - "missing section 48 keeps default enabled"); - failures += expect_true(!strcmp(config.recycle_repository, ".recycle"), - "missing section 49 keeps default recycle name"); - failures += expect_true(!strcmp(config.metadata_repository, ".salvage"), - "missing section 49 keeps default metadata name"); - - failures += expect_true(nwsalvage_config_defaults(&config) == 0, - "defaults reset after custom repository parse"); - failures += expect_true(nwsalvage_build_recycle_path( - path, sizeof(path), &config, "/srv/nw/SYS", - "SUPERVISOR/PUBLIC/PMDFLTS.INI") == 0, - "recycle path builds"); - failures += expect_true(!strcmp(path, - "/srv/nw/SYS/.recycle/SUPERVISOR/PUBLIC/PMDFLTS.INI"), - "recycle path layout"); - failures += expect_true(nwsalvage_build_metadata_path( - path, sizeof(path), &config, "/srv/nw/SYS/", - "SUPERVISOR/PUBLIC/PMDFLTS.INI") == 0, - "metadata path builds with trailing volume slash"); - failures += expect_true(!strcmp(path, - "/srv/nw/SYS/.salvage/SUPERVISOR/PUBLIC/PMDFLTS.INI.json"), - "metadata path layout"); - failures += expect_true(nwsalvage_build_recycle_relative_path( - path, sizeof(path), &config, - "SUPERVISOR/PUBLIC/PMDFLTS.INI") == 0, - "recycle relative path builds"); - failures += expect_true(!strcmp(path, - ".recycle/SUPERVISOR/PUBLIC/PMDFLTS.INI"), - "recycle relative path layout"); - failures += expect_true(nwsalvage_build_metadata_relative_path( - path, sizeof(path), &config, - "SUPERVISOR/PUBLIC/PMDFLTS.INI") == 0, - "metadata relative path builds"); - failures += expect_true(!strcmp(path, - ".salvage/SUPERVISOR/PUBLIC/PMDFLTS.INI.json"), - "metadata relative path layout"); - - failures += expect_true(nwsalvage_build_recycle_path( - path, sizeof(path), &config, "/srv/nw/SYS", - "../PMDFLTS.INI") < 0, - "relative path rejects dot-dot components"); - failures += expect_true(nwsalvage_build_recycle_path( - path, sizeof(path), &config, "/srv/nw/SYS", - "/SUPERVISOR/PUBLIC/PMDFLTS.INI") < 0, - "relative path rejects absolute input"); - failures += expect_true(nwsalvage_build_recycle_path( - path, sizeof(path), &config, "/srv/nw/SYS", - "SUPERVISOR\\PUBLIC\\PMDFLTS.INI") < 0, - "relative path rejects unnormalised backslashes"); - failures += expect_true(nwsalvage_build_metadata_path( - path, 16, &config, "/srv/nw/SYS", - "SUPERVISOR/PUBLIC/PMDFLTS.INI") < 0, - "path builder rejects too-small buffers"); - - - snprintf(root, sizeof(root), "/tmp/mars_nwe_salvage_smoke_%ld", - (long)getpid()); - remove_test_tree(root); - failures += expect_true(mkdir(root, 0700) == 0, - "temporary salvage smoke root creates"); - failures += expect_true(nwsalvage_build_metadata_path( - path, sizeof(path), &config, root, - "SUPERVISOR/PUBLIC/PMD\"FLTS.INI") == 0, - "metadata path builds for escaped JSON test"); - if (!failures) { - struct nwsalvage_deleted_entry deleted_entry; - struct nwsalvage_metadata_entry metadata_entry; - - memset(&deleted_entry, 0, sizeof(deleted_entry)); - deleted_entry.volume_name = "SYS"; - deleted_entry.deleted_by = "SUPERVISOR"; - deleted_entry.deleted_at = 1780215322; - deleted_entry.original_path = "SYS:PUBLIC/PMD\"FLTS.INI"; - deleted_entry.original_parent_entry_id = 4; - deleted_entry.original_name = "PMD\"FLTS.INI"; - deleted_entry.recycle_relative_path = ".recycle/SUPERVISOR/PUBLIC/PMD\"FLTS.INI"; - deleted_entry.salvage_relative_path = ".salvage/SUPERVISOR/PUBLIC/PMD\"FLTS.INI.json"; - deleted_entry.attributes = 8192; - deleted_entry.mode = 0100644; - deleted_entry.size = 12345; - deleted_entry.atime = 1700000000; - deleted_entry.mtime = 1700000000; - deleted_entry.ctime = 1700000000; - deleted_entry.finder_info_hex = - "0000000000000000000000000000000000000000000000000000000000000000"; - deleted_entry.afp_entry_id = "0x2cc1243d"; - deleted_entry.afp_attributes = 0x0600; - deleted_entry.resource_fork_size = 0; - deleted_entry.netware_archive_flags = 0x07; - deleted_entry.netware_archive_date = 0x5821; - deleted_entry.netware_archive_time = 0x6c40; - deleted_entry.netware_archiver_id = 0x01020304; - deleted_entry.netware_fileinfo_flags = 0x0f; - deleted_entry.netware_create_date = 0x5820; - deleted_entry.netware_create_time = 0x6b20; - deleted_entry.netware_creator_id = 0x00000001; - deleted_entry.netware_modifier_id = 0x00000002; - deleted_entry.inherited_rights_mask = 0x01ff; - deleted_entry.trustee_count = 2; - deleted_entry.trustees[0].object_id = 0x00000001; - deleted_entry.trustees[0].rights = 0x01ff; - deleted_entry.trustees[1].object_id = 0x01020304; - deleted_entry.trustees[1].rights = 0x0041; - - failures += expect_true(nwsalvage_write_metadata(path, &deleted_entry) == 0, - "metadata writer creates parent dirs and JSON"); - failures += expect_true(file_contains(path, "\"version\": 1"), - "metadata JSON contains version"); - failures += expect_true(file_contains(path, "\"source\": \"mars_nwe\""), - "metadata JSON contains source"); - failures += expect_true(file_contains(path, "\"volume\": \"SYS\""), - "metadata JSON contains volume"); - failures += expect_true(file_contains(path, "PMD\\\"FLTS.INI"), - "metadata JSON escapes quotes"); - failures += expect_true(file_contains(path, "\"original_parent_entry_id\": 4"), - "metadata JSON contains parent entry id"); - failures += expect_true(file_contains(path, "\"recycle_relative_path\":"), - "metadata JSON contains recycle relative path"); - failures += expect_true(file_contains(path, "\"finder_info_hex\":"), - "metadata JSON contains Finder info"); - failures += expect_true(file_contains(path, "\"afp_entry_id\": \"0x2cc1243d\""), - "metadata JSON contains AFP entry id"); - failures += expect_true(file_contains(path, "\"afp_attributes\": 1536"), - "metadata JSON contains AFP xattr attributes"); - failures += expect_true(file_contains(path, "\"netware_archive_flags\": 7"), - "metadata JSON contains NetWare archive xattr flags"); - failures += expect_true(file_contains(path, "\"netware_fileinfo_flags\": 15"), - "metadata JSON contains NetWare fileinfo xattr flags"); - failures += expect_true(file_contains(path, "\"inherited_rights_mask\": 511"), - "metadata JSON contains trustee inherited rights mask"); - failures += expect_true(file_contains(path, "\"trustees\":"), - "metadata JSON contains trustee rights array"); - failures += expect_true(file_contains(path, "\"object_id\": 16909060"), - "metadata JSON contains trustee object id"); - failures += expect_true(file_contains(path, "\"attributes\": 8192"), - "metadata JSON contains attributes"); - failures += expect_true(nwsalvage_read_metadata(path, &metadata_entry) == 0, - "metadata reader parses JSON"); - failures += expect_true(!strcmp(metadata_entry.volume_name, "SYS"), - "metadata reader returns volume"); - failures += expect_true(!strcmp(metadata_entry.deleted_by, "SUPERVISOR"), - "metadata reader returns deleted user"); - failures += expect_true(metadata_entry.deleted_at == 1780215322, - "metadata reader returns deleted time"); - failures += expect_true(!strcmp(metadata_entry.original_path, - "SYS:PUBLIC/PMD\"FLTS.INI"), - "metadata reader returns original path"); - failures += expect_true(metadata_entry.original_parent_entry_id == 4, - "metadata reader returns parent entry id"); - failures += expect_true(!strcmp(metadata_entry.original_name, - "PMD\"FLTS.INI"), - "metadata reader returns original name"); - failures += expect_true(!strcmp(metadata_entry.recycle_relative_path, - ".recycle/SUPERVISOR/PUBLIC/PMD\"FLTS.INI"), - "metadata reader returns recycle relative path"); - failures += expect_true(!strcmp(metadata_entry.salvage_relative_path, - ".salvage/SUPERVISOR/PUBLIC/PMD\"FLTS.INI.json"), - "metadata reader returns salvage relative path"); - failures += expect_true(metadata_entry.attributes == 8192, - "metadata reader returns attributes"); - failures += expect_true(metadata_entry.size == 12345, - "metadata reader returns size"); - failures += expect_true(metadata_entry.atime == 1700000000, - "metadata reader returns atime"); - failures += expect_true(metadata_entry.mtime == 1700000000, - "metadata reader returns mtime"); - failures += expect_true(metadata_entry.ctime == 1700000000, - "metadata reader returns ctime"); - failures += expect_true(!strcmp(metadata_entry.finder_info_hex, - "0000000000000000000000000000000000000000000000000000000000000000"), - "metadata reader returns Finder info"); - failures += expect_true(!strcmp(metadata_entry.afp_entry_id, "0x2cc1243d"), - "metadata reader returns AFP entry id"); - failures += expect_true(metadata_entry.afp_attributes == 0x0600, - "metadata reader returns AFP attributes"); - failures += expect_true(metadata_entry.resource_fork_size == 0, - "metadata reader returns resource fork size"); - failures += expect_true(metadata_entry.netware_archive_flags == 0x07, - "metadata reader returns NetWare archive flags"); - failures += expect_true(metadata_entry.netware_archive_date == 0x5821, - "metadata reader returns NetWare archive date"); - failures += expect_true(metadata_entry.netware_archive_time == 0x6c40, - "metadata reader returns NetWare archive time"); - failures += expect_true(metadata_entry.netware_archiver_id == 0x01020304, - "metadata reader returns NetWare archiver id"); - failures += expect_true(metadata_entry.netware_fileinfo_flags == 0x0f, - "metadata reader returns NetWare fileinfo flags"); - failures += expect_true(metadata_entry.netware_create_date == 0x5820, - "metadata reader returns NetWare create date"); - failures += expect_true(metadata_entry.netware_create_time == 0x6b20, - "metadata reader returns NetWare create time"); - failures += expect_true(metadata_entry.netware_creator_id == 0x00000001, - "metadata reader returns NetWare creator id"); - failures += expect_true(metadata_entry.netware_modifier_id == 0x00000002, - "metadata reader returns NetWare modifier id"); - failures += expect_true(metadata_entry.inherited_rights_mask == 0x01ff, - "metadata reader returns trustee inherited rights mask"); - failures += expect_true(metadata_entry.trustee_count == 2, - "metadata reader returns trustee count"); - failures += expect_true(metadata_entry.trustees[0].object_id == 0x00000001, - "metadata reader returns first trustee object id"); - failures += expect_true(metadata_entry.trustees[0].rights == 0x01ff, - "metadata reader returns first trustee rights"); - failures += expect_true(metadata_entry.trustees[1].object_id == 0x01020304, - "metadata reader returns second trustee object id"); - failures += expect_true(metadata_entry.trustees[1].rights == 0x0041, - "metadata reader returns second trustee rights"); - } - remove_test_tree(root); - - if (failures) - return(1); - - puts("salvage config smoke passed"); - return(0); -}