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
