| 
 | 1 | +"""Test singularity{,-ce} & apptainer versions."""  | 
 | 2 | +import cwltool.singularity  | 
 | 3 | +from cwltool.singularity import (  | 
 | 4 | +    get_version,  | 
 | 5 | +    is_apptainer_1_or_newer,  | 
 | 6 | +    is_version_2_6,  | 
 | 7 | +    is_version_3_or_newer,  | 
 | 8 | +    is_version_3_1_or_newer,  | 
 | 9 | +    is_version_3_4_or_newer,  | 
 | 10 | +)  | 
 | 11 | + | 
 | 12 | +from subprocess import check_output  # nosec  | 
 | 13 | + | 
 | 14 | + | 
 | 15 | +def reset_singularity_version_cache() -> None:  | 
 | 16 | +    """Reset the cache for testing."""  | 
 | 17 | +    cwltool.singularity._SINGULARITY_VERSION = None  | 
 | 18 | +    cwltool.singularity._SINGULARITY_FLAVOR = ""  | 
 | 19 | + | 
 | 20 | + | 
 | 21 | +def set_dummy_check_output(name: str, version: str) -> None:  | 
 | 22 | +    """Mock out subprocess.check_output."""  | 
 | 23 | +    cwltool.singularity.check_output = (  # type: ignore[attr-defined]  | 
 | 24 | +        lambda c, universal_newlines: name + " version " + version  | 
 | 25 | +    )  | 
 | 26 | + | 
 | 27 | + | 
 | 28 | +def restore_check_output() -> None:  | 
 | 29 | +    """Undo the mock of subprocess.check_output."""  | 
 | 30 | +    cwltool.singularity.check_output = check_output  # type: ignore[attr-defined]  | 
 | 31 | + | 
 | 32 | + | 
 | 33 | +def test_get_version() -> None:  | 
 | 34 | +    """Confirm expected types of singularity.get_version()."""  | 
 | 35 | +    set_dummy_check_output("apptainer", "1.0.1")  | 
 | 36 | +    reset_singularity_version_cache()  | 
 | 37 | +    v = get_version()  | 
 | 38 | +    assert isinstance(v, tuple)  | 
 | 39 | +    assert isinstance(v[0], list)  | 
 | 40 | +    assert isinstance(v[1], str)  | 
 | 41 | +    assert (  | 
 | 42 | +        cwltool.singularity._SINGULARITY_VERSION is not None  | 
 | 43 | +    )  # pylint: disable=protected-access  | 
 | 44 | +    assert (  | 
 | 45 | +        len(cwltool.singularity._SINGULARITY_FLAVOR) > 0  | 
 | 46 | +    )  # pylint: disable=protected-access  | 
 | 47 | +    v_cached = get_version()  | 
 | 48 | +    assert v == v_cached  | 
 | 49 | + | 
 | 50 | +    assert v[0][0] == 1  | 
 | 51 | +    assert v[0][1] == 0  | 
 | 52 | +    assert v[0][2] == 1  | 
 | 53 | +    assert v[1] == "apptainer"  | 
 | 54 | + | 
 | 55 | +    set_dummy_check_output("singularity", "3.8.5")  | 
 | 56 | +    reset_singularity_version_cache()  | 
 | 57 | +    v = get_version()  | 
 | 58 | + | 
 | 59 | +    assert v[0][0] == 3  | 
 | 60 | +    assert v[0][1] == 8  | 
 | 61 | +    assert v[0][2] == 5  | 
 | 62 | +    assert v[1] == "singularity"  | 
 | 63 | +    restore_check_output()  | 
 | 64 | + | 
 | 65 | + | 
 | 66 | +def test_version_checks() -> None:  | 
 | 67 | +    """Confirm logic in the various singularity version checks."""  | 
 | 68 | +    set_dummy_check_output("apptainer", "1.0.1")  | 
 | 69 | +    reset_singularity_version_cache()  | 
 | 70 | +    assert is_apptainer_1_or_newer()  | 
 | 71 | +    assert not is_version_2_6()  | 
 | 72 | +    assert is_version_3_or_newer()  | 
 | 73 | +    assert is_version_3_1_or_newer()  | 
 | 74 | +    assert is_version_3_4_or_newer()  | 
 | 75 | + | 
 | 76 | +    set_dummy_check_output("apptainer", "0.0.1")  | 
 | 77 | +    reset_singularity_version_cache()  | 
 | 78 | +    assert not is_apptainer_1_or_newer()  | 
 | 79 | +    assert not is_version_2_6()  | 
 | 80 | +    assert not is_version_3_or_newer()  | 
 | 81 | +    assert not is_version_3_1_or_newer()  | 
 | 82 | +    assert not is_version_3_4_or_newer()  | 
 | 83 | + | 
 | 84 | +    set_dummy_check_output("singularity", "0.0.1")  | 
 | 85 | +    reset_singularity_version_cache()  | 
 | 86 | +    assert not is_apptainer_1_or_newer()  | 
 | 87 | +    assert not is_version_2_6()  | 
 | 88 | +    assert not is_version_3_or_newer()  | 
 | 89 | +    assert not is_version_3_1_or_newer()  | 
 | 90 | +    assert not is_version_3_4_or_newer()  | 
 | 91 | + | 
 | 92 | +    set_dummy_check_output("singularity", "0.1")  | 
 | 93 | +    reset_singularity_version_cache()  | 
 | 94 | +    assert not is_apptainer_1_or_newer()  | 
 | 95 | +    assert not is_version_2_6()  | 
 | 96 | +    assert not is_version_3_or_newer()  | 
 | 97 | +    assert not is_version_3_1_or_newer()  | 
 | 98 | +    assert not is_version_3_4_or_newer()  | 
 | 99 | + | 
 | 100 | +    set_dummy_check_output("singularity", "2.6")  | 
 | 101 | +    reset_singularity_version_cache()  | 
 | 102 | +    assert not is_apptainer_1_or_newer()  | 
 | 103 | +    assert is_version_2_6()  | 
 | 104 | +    assert not is_version_3_or_newer()  | 
 | 105 | +    assert not is_version_3_1_or_newer()  | 
 | 106 | +    assert not is_version_3_4_or_newer()  | 
 | 107 | + | 
 | 108 | +    set_dummy_check_output("singularity", "3.0")  | 
 | 109 | +    reset_singularity_version_cache()  | 
 | 110 | +    assert not is_apptainer_1_or_newer()  | 
 | 111 | +    assert not is_version_2_6()  | 
 | 112 | +    assert is_version_3_or_newer()  | 
 | 113 | +    assert not is_version_3_1_or_newer()  | 
 | 114 | +    assert not is_version_3_4_or_newer()  | 
 | 115 | + | 
 | 116 | +    set_dummy_check_output("singularity", "3.1")  | 
 | 117 | +    reset_singularity_version_cache()  | 
 | 118 | +    assert not is_apptainer_1_or_newer()  | 
 | 119 | +    assert not is_version_2_6()  | 
 | 120 | +    assert is_version_3_or_newer()  | 
 | 121 | +    assert is_version_3_1_or_newer()  | 
 | 122 | +    assert not is_version_3_4_or_newer()  | 
 | 123 | + | 
 | 124 | +    set_dummy_check_output("singularity", "3.4")  | 
 | 125 | +    reset_singularity_version_cache()  | 
 | 126 | +    assert not is_apptainer_1_or_newer()  | 
 | 127 | +    assert not is_version_2_6()  | 
 | 128 | +    assert is_version_3_or_newer()  | 
 | 129 | +    assert is_version_3_1_or_newer()  | 
 | 130 | +    assert is_version_3_4_or_newer()  | 
 | 131 | + | 
 | 132 | +    set_dummy_check_output("singularity", "3.6.3")  | 
 | 133 | +    reset_singularity_version_cache()  | 
 | 134 | +    assert not is_apptainer_1_or_newer()  | 
 | 135 | +    assert not is_version_2_6()  | 
 | 136 | +    assert is_version_3_or_newer()  | 
 | 137 | +    assert is_version_3_1_or_newer()  | 
 | 138 | +    assert is_version_3_4_or_newer()  | 
 | 139 | +    restore_check_output()  | 
0 commit comments