Module records and aliases
Installation records what a module reports about itself. dpm_install_module opens a module once, writes its version and description to a .meta file in /var/lib/dpm/metadata/, and records the alternate names it declared in modules.aliases beside it. dpm_uninstall_module removes both, leaving the module file in place. dpm_list_modules reads those records and opens no module. A module with no record lists with a version of <uninstalled> and still loads when a caller names it. An unreadable or absent metadata directory costs the listing its detail and costs nothing else. Aliases give a module alternate names, declared through the new dpm_module_aliases contract symbol or added with dpm_add_module_alias. A name is recorded once: one already serving as an alias, or belonging to an installed module, is refused rather than repointed. dpm_require matches a name against the installed modules, then the alias table, then the module path. The metadata directory is a fifth override field and the -M flag, and [modules] metadata in core.conf. The test suite is four binaries covering context, modules, records, and aliases, each a ctest case of its own, alongside the CLI cases.
This commit is contained in:
@@ -15,40 +15,62 @@ foreach(fixture good missing_symbols bad_version)
|
||||
endforeach()
|
||||
|
||||
# ---------------------------------------------------------------------
|
||||
# API test binary — drives libdpm-core.so through its public C API
|
||||
# API test binaries — one per area of the library, each its own ctest
|
||||
# case, so a failure names the area it happened in
|
||||
# ---------------------------------------------------------------------
|
||||
add_executable(test_core test_core.cpp)
|
||||
foreach(suite context modules metadata aliases)
|
||||
add_executable(test_${suite} test_${suite}.cpp)
|
||||
|
||||
target_link_libraries(test_core PRIVATE dpm-core)
|
||||
target_link_libraries(test_${suite} PRIVATE dpm-core)
|
||||
|
||||
target_compile_definitions(test_core PRIVATE
|
||||
TEST_FIXTURE_MODULES="${DPM_TEST_FIXTURE_DIR}"
|
||||
TEST_FIXTURE_CONF="${CMAKE_CURRENT_SOURCE_DIR}/fixtures/conf"
|
||||
DPM_CORE_VERSION_EXPECTED="${PROJECT_VERSION}"
|
||||
)
|
||||
target_include_directories(test_${suite} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
|
||||
|
||||
set_target_properties(test_core PROPERTIES
|
||||
RUNTIME_OUTPUT_DIRECTORY ${DPM_TEST_DIR}
|
||||
BUILD_RPATH "$ORIGIN/../lib"
|
||||
)
|
||||
target_compile_definitions(test_${suite} PRIVATE
|
||||
TEST_FIXTURE_MODULES="${DPM_TEST_FIXTURE_DIR}"
|
||||
TEST_FIXTURE_CONF="${CMAKE_CURRENT_SOURCE_DIR}/fixtures/conf"
|
||||
TEST_FIXTURE_METADATA="${CMAKE_CURRENT_SOURCE_DIR}/fixtures/metadata"
|
||||
TEST_SCRATCH_ROOT="${DPM_TEST_DIR}/scratch"
|
||||
DPM_CORE_VERSION_EXPECTED="${PROJECT_VERSION}"
|
||||
)
|
||||
|
||||
foreach(fixture good missing_symbols bad_version)
|
||||
add_dependencies(test_core fixture_${fixture})
|
||||
set_target_properties(test_${suite} PROPERTIES
|
||||
RUNTIME_OUTPUT_DIRECTORY ${DPM_TEST_DIR}
|
||||
BUILD_RPATH "$ORIGIN/../lib"
|
||||
)
|
||||
|
||||
foreach(fixture good missing_symbols bad_version)
|
||||
add_dependencies(test_${suite} fixture_${fixture})
|
||||
endforeach()
|
||||
|
||||
add_test(NAME api_${suite} COMMAND test_${suite})
|
||||
endforeach()
|
||||
|
||||
add_test(NAME core_api COMMAND test_core)
|
||||
|
||||
# ---------------------------------------------------------------------
|
||||
# CLI end-to-end tests (the dpm binary is the cheapest full-stack client)
|
||||
# ---------------------------------------------------------------------
|
||||
set(CLI_FIXTURE_ARGS
|
||||
-c ${CMAKE_CURRENT_SOURCE_DIR}/fixtures/conf
|
||||
-m ${CMAKE_BINARY_DIR}/modules
|
||||
-M ${CMAKE_CURRENT_SOURCE_DIR}/fixtures/metadata
|
||||
)
|
||||
|
||||
add_test(NAME cli_help COMMAND dpm --help)
|
||||
set_tests_properties(cli_help PROPERTIES PASS_REGULAR_EXPRESSION "Usage: dpm")
|
||||
|
||||
add_test(NAME cli_list
|
||||
COMMAND dpm -c ${CMAKE_CURRENT_SOURCE_DIR}/fixtures/conf
|
||||
-m ${CMAKE_BINARY_DIR}/modules --list-modules)
|
||||
add_test(NAME cli_help_lists_record_flags COMMAND dpm --help)
|
||||
set_tests_properties(cli_help_lists_record_flags PROPERTIES
|
||||
PASS_REGULAR_EXPRESSION "--install-module")
|
||||
|
||||
add_test(NAME cli_list COMMAND dpm ${CLI_FIXTURE_ARGS} --list-modules)
|
||||
set_tests_properties(cli_list PROPERTIES PASS_REGULAR_EXPRESSION "info")
|
||||
|
||||
# The bundled module has no record in the fixture directory, so the
|
||||
# listing reports it as uninstalled rather than opening it.
|
||||
add_test(NAME cli_list_marks_uninstalled
|
||||
COMMAND dpm ${CLI_FIXTURE_ARGS} --list-modules)
|
||||
set_tests_properties(cli_list_marks_uninstalled PROPERTIES
|
||||
PASS_REGULAR_EXPRESSION "<uninstalled>")
|
||||
|
||||
add_test(NAME cli_info_version
|
||||
COMMAND dpm -c ${CMAKE_CURRENT_SOURCE_DIR}/fixtures/conf
|
||||
-m ${CMAKE_BINARY_DIR}/modules -L INFO info version)
|
||||
@@ -56,11 +78,59 @@ set_tests_properties(cli_info_version PROPERTIES
|
||||
PASS_REGULAR_EXPRESSION "libdpm-core\\.so Version: ${PROJECT_VERSION}")
|
||||
|
||||
add_test(NAME cli_module_not_found
|
||||
COMMAND dpm -c ${CMAKE_CURRENT_SOURCE_DIR}/fixtures/conf
|
||||
-m ${CMAKE_BINARY_DIR}/modules nonexistent)
|
||||
COMMAND dpm ${CLI_FIXTURE_ARGS} nonexistent)
|
||||
set_tests_properties(cli_module_not_found PROPERTIES WILL_FAIL TRUE)
|
||||
|
||||
add_test(NAME cli_rejects_invalid_module
|
||||
COMMAND dpm -c ${CMAKE_CURRENT_SOURCE_DIR}/fixtures/conf
|
||||
-m ${DPM_TEST_FIXTURE_DIR} missing_symbols)
|
||||
-m ${DPM_TEST_FIXTURE_DIR}
|
||||
-M ${CMAKE_CURRENT_SOURCE_DIR}/fixtures/metadata
|
||||
missing_symbols)
|
||||
set_tests_properties(cli_rejects_invalid_module PROPERTIES WILL_FAIL TRUE)
|
||||
|
||||
add_test(NAME cli_lists_aliases COMMAND dpm ${CLI_FIXTURE_ARGS} --list-aliases)
|
||||
set_tests_properties(cli_lists_aliases PROPERTIES
|
||||
PASS_REGULAR_EXPRESSION "goodie")
|
||||
|
||||
add_test(NAME cli_lists_aliases_for_module
|
||||
COMMAND dpm ${CLI_FIXTURE_ARGS} --list-aliases good)
|
||||
set_tests_properties(cli_lists_aliases_for_module PROPERTIES
|
||||
PASS_REGULAR_EXPRESSION "gd")
|
||||
|
||||
add_test(NAME cli_refuses_duplicate_alias
|
||||
COMMAND dpm ${CLI_FIXTURE_ARGS} --add-alias good goodie)
|
||||
set_tests_properties(cli_refuses_duplicate_alias PROPERTIES WILL_FAIL TRUE)
|
||||
|
||||
add_test(NAME cli_add_alias_requires_two_arguments
|
||||
COMMAND dpm ${CLI_FIXTURE_ARGS} --add-alias good)
|
||||
set_tests_properties(cli_add_alias_requires_two_arguments PROPERTIES
|
||||
WILL_FAIL TRUE)
|
||||
|
||||
add_test(NAME cli_uninstall_unrecorded_module
|
||||
COMMAND dpm ${CLI_FIXTURE_ARGS} --uninstall-module nonexistent)
|
||||
set_tests_properties(cli_uninstall_unrecorded_module PROPERTIES WILL_FAIL TRUE)
|
||||
|
||||
# The install and uninstall round trip writes, so it runs against a
|
||||
# scratch directory of its own and the two cases run in order.
|
||||
add_test(NAME cli_install_module
|
||||
COMMAND dpm -c ${CMAKE_CURRENT_SOURCE_DIR}/fixtures/conf
|
||||
-m ${CMAKE_BINARY_DIR}/modules
|
||||
-M ${DPM_TEST_DIR}/scratch/cli
|
||||
--install-module info)
|
||||
|
||||
add_test(NAME cli_lists_installed_module
|
||||
COMMAND dpm -c ${CMAKE_CURRENT_SOURCE_DIR}/fixtures/conf
|
||||
-m ${CMAKE_BINARY_DIR}/modules
|
||||
-M ${DPM_TEST_DIR}/scratch/cli
|
||||
--list-modules)
|
||||
set_tests_properties(cli_lists_installed_module PROPERTIES
|
||||
PASS_REGULAR_EXPRESSION "Reports and tests libdpm-core"
|
||||
DEPENDS cli_install_module)
|
||||
|
||||
add_test(NAME cli_uninstall_module
|
||||
COMMAND dpm -c ${CMAKE_CURRENT_SOURCE_DIR}/fixtures/conf
|
||||
-m ${CMAKE_BINARY_DIR}/modules
|
||||
-M ${DPM_TEST_DIR}/scratch/cli
|
||||
--uninstall-module info)
|
||||
set_tests_properties(cli_uninstall_module PROPERTIES
|
||||
DEPENDS cli_lists_installed_module)
|
||||
|
||||
Reference in New Issue
Block a user