tests: drop standalone salvage config smoke
All checks were successful
Source release / source-package (push) Successful in 50s
All checks were successful
Source release / source-package (push) Successful in 50s
This commit is contained in:
@@ -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 $<TARGET_FILE:salvage_config_smoke>
|
||||
DEPENDS salvage_config_smoke
|
||||
COMMENT "Running salvage config smoke helper"
|
||||
VERBATIM
|
||||
)
|
||||
|
||||
@@ -1,356 +0,0 @@
|
||||
/* Smoke test for the initial nwsalvage configuration helpers. */
|
||||
#include "nwsalvage.h"
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
|
||||
|
||||
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);
|
||||
}
|
||||
Reference in New Issue
Block a user