123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256 |
- RunCMake.CPack is a test module that is intended for testing of package
- generators that can be validated from command line.
- -------------
- Adding a test
- -------------
- CPack test root directory: 'Tests/RunCMake/CPack/tests'.
- All phases are executed separately for each generator that is bound to a test.
- Tests for each generator are subtests of test 'RunCMake.CPack_<generator_name>'.
- Each test must also be added to 'RunCMakeTest.cmake' script located in CPack
- test root directory.
- Line that adds a test is:
- run_cpack_test(<test_name> "<generator_name_list>" <compile_stage>
- "<packaging_type_list>")
- <generator_name_list> may be one generator e.g. "RPM" or multiple e.g. "RPM;DEB"
- and will be run for all listed generators. In test and verification scripts
- current generator can be accessed through GENERATOR_TYPE variable.
- <compile_stage> is a boolean variable that enables or disables compile stage -
- most tests don't require compilation as a non binary file can be used for
- package content but sometimes an executable or a library has to be created
- before the packaging stage.
- <packaging_type_list> can be a list of one or more packaging types: MONOLITHIC,
- COMPONENT or GROUP - each type sets per generator default variables which can
- be overwritten in the test if needed
- (see <generator_type>/packaging_<packaging_type>_default.cmake for the variables
- that are set by default for each packaging type).
- Alternatively CUSTOM value can be set which means that default values will not
- be set and that values will be set manually in the test itself.
- Alternatively a test with subtests can be added:
- run_cpack_test_subtests(<test_name> "<subtests_list>" "<generator_name_list>"
- <compile_stage> "<packaging_type_list>")
- <subtests_list> is the only new parameter and it is a list of names that will
- be used for subtests. In test and verification scripts subtest name can be
- accessed through RunCMake_SUBTEST_SUFFIX variable.
- Also source package tests can be added:
- run_cpack_source_test(<test_name> "<generator_name_list>" true)
- Test consists of
- - test prerequirements phase (optional)
- - CMake execution phase
- - build phase (optional and not available for source package tests)
- - CPack execution phase
- - verification of generated files
- The phases are executed once per specified generator, packaging type and subtest
- combinatiion.
- test prerequirements phase (optional):
- --------------------------------------
- In some cases individual tests for certain generator need additional
- prerequirements met.
- In such cases '<test_name>/<generator_name>-Prerequirements.cmake' file
- containing 'function(get_test_prerequirements found_var config_file)' should be
- created. Function should return true in found_var if all prerequirements are
- met. config_file variable contains the location of config file generated by the
- generator so that this function can check if prerequired variable is set in the
- file.
- NOTE: All required programs should be searched for in generator prerequirements
- function and only checked for the variable in configure file in per test
- function.
- If prerequirements are not met test will be skipped outputting
- '<test_name> - SKIPPED' string. Note that this doesn't fail the entire test
- group.
- TODO: skipped tests should provide expected error string so test should fail
- if error string is not found in the output of run test (this would add
- 'EXPECTED FAIL' string on success and 'ERROR' on failure).
- CMake execution phase:
- ----------------------
- To add a new CPack test we first create a '<test_name>/test.cmake' script that
- contains CMake commands that should be used as a preparation script for
- generation of different types of packages. This script is placed into CPack
- test root directory.
- If test will be used for multiple generators but some of them require some
- generator specific commands then those commands should be added to 'test.cmake'
- script wrapped with 'if(GENERATOR_TYPE STREQUAL <name_of_the_generator>)'.
- NOTE: In some cases (for example when testing CPackComponent.cmake functions)
- the test has to run some functions after CPack.cmake is included. In such cases
- a function run_after_include_cpack can be declared in test.cmake file and that
- function will run after the inclusion of CPack.cmake.
- NOTE: During CMake configure stage developer warnings may be expected. In such
- cases an expected output regular expression can be provided by creating
- '<test_name>/configure-stdout.txt' and/or '<test_name>/configure-stderr.txt'
- file. There are also more specialized versions of the file available:
- - configure-${PACKAGING_TYPE}-${SUBTEST_SUFFIX}-std${o}.txt
- - configure-${SUBTEST_SUFFIX}-std${o}.txt
- - configure-${PACKAGING_TYPE}-std${o}.txt
- build phase (optional and not available for source package tests)
- -----------------------------------------------------------------
- This phase only runs make command.
- NOTE: By default all tests have CMAKE_BUILD_TYPE variable set to Debug.
- CPack execution phase:
- ----------------------
- Only executes CPack for content that was generated during CMake execution
- phase.
- NOTE: By default CPACK_PACKAGE_NAME variable is set to lower case test name.
- Verification of generated files:
- --------------------------------
- Verification of generated files consists of two phases
- - mandatory verification phase
- - optional verification phase
- Mandatory verification phase checks that expected files were generated and
- contain expected files.
- Mandatory verification phase also checks that no other unexpected package files
- were generated (this is executed even if EXPECTED_FILES_COUNT contains 0 in
- order to verify that no files were generated).
- CMake script '<test_name>/ExpectedFiles.cmake' is required by
- this step and must contain
- - EXPECTED_FILES_COUNT variable that contains the number of expected files that
- will be generated (0 or more)
- - EXPECTED_FILE_<file_number_starting_with_1> that contains globing expression
- that uniquely defines expected file name (will be used to find expected file)
- and should be present once for each expected file.
- NOTE: This variable should be used only as last resort as it sets generator
- specific globbing expression. Each generator can recreate file name from
- parts that are already populated by default but can always be
- overwritten if needed:
- - EXPECTED_FILE_<file_number_starting_with_1>_NAME is the name component of
- the file (by default it is set to package name that is same as test name
- in lowercase)
- - EXPECTED_FILE_<file_number_starting_with_1>_VERSION is the version of the
- package (by default it is set to '0.1.1')
- - EXPECTED_FILE_<file_number_starting_with_1>_REVISION is the revision of the
- package (by default it is set to '1')
- - EXPECTED_FILE_CONTENT_<file_number_starting_with_1> that contains regular
- expression of files that should be present in generated file and should be
- present once for each expected file
- NOTE: This variable should be used only as last resort as it sets generator
- specific regular expression.
- EXPECTED_FILE_CONTENT_<file_number_starting_with_1>_LIST should be
- preferred as it requires a list of expected files and directories that
- is later changed automatically depending on the generator so expected
- package content can be written only once per test for all generators.
- - EXPECTED_FILE_PACKAGING_PREFIX and
- EXPECTED_FILE_<file_number_starting_with_1>_PACKAGING_PREFIX variables can be
- set to explicitly specified CPACK_PACKAGING_PREFIX value. By default this
- variable does not need to be set as it is implicitly set to package generator
- specific prefix.
- Optional verification phase is generator specific and is optionally executed.
- This phase is executed if '<test_name>/VerifyResult.cmake' script exists.
- VerifyResult.cmake script also automatically prints out standard output and
- standard error from CPack execution phase that is compared with
- '<test_name>/<generator_name>-stdout.txt' regular expression and
- '<test_name>/<generator_name>-stderr.txt' regular expresson respectively.
- NOTE: For subtests generator name can also be suffixed with subtest name and/or
- packaging type (MONOLITHIC, COMPONENT, GROUP) and in such cases the
- preferences of which file will be used are as follows:
- - generator name + packaging type + subtest name
- - generator name + packaging type
- - generator name + subtest name
- - generator name
- - subtest name
- - default generator
- File name format: '<generator_name>-<packaging_type>-<subtest_name>-std<type>.txt'
- where <type> can either be 'out' or 'err'.
- File name format: '<generator_name>-<packaging_type>-std<type>.txt'
- where <type> can either be 'out' or 'err'.
- File name format: '<generator_name>-<subtest_name>-std<type>.txt' where
- <type> can either be 'out' or 'err'.
- NOTE: If none of the comparison files are present then the default generator
- file is used if present.
- ----------------------
- Adding a new generator
- ----------------------
- To add a new generator we must
- - add new generator directory (e.g. RPM for RPM generator) to CPack test root
- directory that contains 'Helpers.cmake' script.
- - In this script some functions must exist:
- - getPackageContent: This function should list files that are contained in
- a package.
- Function parameters:
- + FILE variable that will contain path to file for which the content
- should be listed
- + RESULT_VAR that will tell the function which variable in parent scope
- should contain the result (list of files inside package file)
- - getPackageNameGlobexpr: This function should generate package name
- globbing expression.
- Function parameters:
- + NAME that will contain the expected package name
- + COMPONENT that will contain the expected package component
- + VERSION that will contain the expected package version
- + REVISION that will contain the expected package revision number
- + FILE_NO that will contain the file number for which the globbing
- expression is generated
- + RESULT_VAR that will tell the function which variable in parent scope
- should contain the result (file name globbing expression)
- - getPackageContentList: This function should return a list of files and
- directories that are in the provided package.
- Function parameters:
- + FILE that will contain the package file for which the package content
- should be returned.
- + RESULT_VAR that will tell the function which variable in parent scope
- should contain the result (list of package content)
- - toExpectedContentList: This function should convert an expected package
- content list into one that is expected for the
- generator (e.g. rpm packages have install/relocate
- path prefixes which aren't part of the package so
- those paths have to be removed from the expected
- content list).
- Function parameters:
- + FILE_NO that will contain the file number for which the conversion
- should be performed
- + CONTENT_VAR that will contain the input list and is also the variable
- in parent scope which should contain the result (converted content list)
- - add 'Prerequirements.cmake' script to generator directory. In this script a
- function named 'get_test_prerequirements' must exist. This function should
- set a variable in parent scope (name of the variable is the first parameter)
- that tells if prerequirements for test execution are met (certain programs,
- OS specifics, ...) and create a config file (name of the variable which
- contains file name and path is provided with the second parameter) that
- should contain 'set' commands for variables that will later be used in tests
- (e.g. location of dpkg program for DEB packages)
- - add tests the same way as described above
- - add generator to 'add_RunCMake_test_group' function call that is located in
- RunCMake CMakeLists.txt file
- - if needed add 'packaging_<packaging_type>_default.cmake' scripts that define
- default variables that will be set for each packaging type (MONOLITHIC,
- COMPONENT and GROUP)
- - if needed add 'default_expected_std<type>.txt' files where <type> is either
- 'out' or 'err' which will contain default expected output of package
- generation regular expression.
- - add generator to list of other CPack generators in RunCMake/CMakeLists.txt
|