Skip to content
Snippets Groups Projects
conftest.py 5.17 KiB
Newer Older
  • Learn to ignore specific revisions
  • """Test fixtures."""
    import copy
    import logging
    import subprocess
    
    import pytest
    import yaml
    
    import mpsd_software_manager
    
    # set loglevel to debug - useful for understanding problems.
    # (if the tests pass, pytest doesn't show any output)
    import mpsd_software_manager.utils.logging
    from mpsd_software_manager.utils.filesystem_utils import os_chdir
    
    mpsd_software_manager.utils.logging.set_up_logging(
        loglevel="debug", file_path="tests.log"
    )
    logging.debug(f"We have set up logging from {__file__}")
    
    
    @pytest.fixture
    def create_mock_git_repository():
        """
        Create a git repository in the directory `target_directory`.
    
        Arguments
        ---------
        target_directory : pathlib.Path
          - path at which the root of the repository should be located (i.e. `.git` folder)
    
        create_directory : bool
          - create `target_directory` and parent directories if True
    
        """
    
        def _create_mock_git_repository(target_directory, create_directory=True):
            # create directory first
            if create_directory:
                target_directory.mkdir(parents=True)
    
            # then create git repository:
            with os_chdir(str(target_directory)):
                subprocess.run("git init .", shell=True, check=True)
                subprocess.run("echo 'fake content' > readme.txt", shell=True, check=True)
                subprocess.run("git add readme.txt", shell=True, check=True)
                subprocess.run("pwd", shell=True)
    
                # if email and username are not available (such as on naked test container),
                # git may complain. We set a temporary user for this one commit to work
                # around that.
                user_details = "-c user.name='Tes Ta' -c user.email='tester@some-ci.org'"
                subprocess.run(
                    f'git {user_details} commit -m "first commit" readme.txt',
                    shell=True,
                    check=True,
                )
    
        return _create_mock_git_repository
    
    
    @pytest.fixture
    def simple_toolchain():
        """Return a dict for a simple toolchain."""
        dict = {
            "spack": {
                "specs": ["zlib@1.2.13"],
                "view": True,
                "concretizer": {"reuse": False, "unify": True},
            }
        }
        return dict
    
    
    @pytest.fixture
    def create_fake_environment():
        """Create a fake environment with toolchains for testing."""
    
        def _create_fake_environment(tmp_path, mpsd_release, expected_toolchain_map=None):
            if not expected_toolchain_map:
                test_microarch = (
                    mpsd_software_manager.utils.microarch.get_native_microarchitecture()
                )
                expected_toolchain_map = {test_microarch: ["foss2021a", "intel2021a"]}
    
                spe_folder = tmp_path / mpsd_release / "spack-environments"
                spe_folder.mkdir(parents=True, exist_ok=True)
            for microarch in expected_toolchain_map.keys():
                toolchain_lmod_folder = (
                    tmp_path / mpsd_release / microarch / "lmod" / "Core" / "toolchains"
                )
                toolchain_lmod_folder.mkdir(parents=True, exist_ok=True)
                spack_folder = tmp_path / mpsd_release / microarch / "spack"
                spack_folder.mkdir(parents=True, exist_ok=True)
                logs_folder = tmp_path / mpsd_release / "logs"
                logs_folder.mkdir(parents=True, exist_ok=True)
                # Simulate the creation of APEX.log
                # (which is created by the main function)
                (logs_folder / "APEX.log").touch()
                for toolchain in expected_toolchain_map[microarch]:
                    toolchain_lua_file = toolchain_lmod_folder / f"{toolchain}.lua"
                    toolchain_lua_file.touch()
    
            return expected_toolchain_map
    
        return _create_fake_environment
    
    
    @pytest.fixture
    def install_test_release(tmp_path, simple_toolchain):
        """Install a test release.
    
        with toolchain1 and toolchain2 to use for testing.
        """
    
        def _install_test_release(tmp_path, simple_toolchain):
            release_to_test = "dev-23a"
            # prepare a release directory
            mpsd_software_manager.cmds.prepare.prepare_environment(
                mpsd_release=release_to_test, root_dir=tmp_path
            )
    
            microarch = mpsd_software_manager.utils.microarch.get_native_microarchitecture()
            tmp_path / release_to_test / microarch
            spe_dir = tmp_path / release_to_test / "spack-environments"
    
            # create sample toolchains
            simple_toolchain_string = yaml.dump(simple_toolchain)
            simple_toolchain_2 = copy.deepcopy(simple_toolchain)
            simple_toolchain_2["spack"]["specs"] = ["zlib@1.2.13", "zstd@1.5.2"]
            simple_toolchain2_string = yaml.dump(simple_toolchain_2)
            toolchain1_dir = spe_dir / "toolchains" / "toolchain1"
            toolchain2_dir = spe_dir / "toolchains" / "toolchain2"
            toolchain1_dir.mkdir(parents=True)
            toolchain2_dir.mkdir(parents=True)
            (toolchain1_dir / "spack.yaml").write_text(simple_toolchain_string)
            (toolchain2_dir / "spack.yaml").write_text(simple_toolchain2_string)
    
            # install the release
            mpsd_software_manager.cmds.install.install_environment(
                mpsd_release=release_to_test,
                package_sets=["toolchain1", "toolchain2"],
                root_dir=tmp_path,
            )
    
        return _install_test_release