summaryrefslogtreecommitdiff
path: root/lib/spack/spack/test/concretize_errors.py
blob: 09ac4e3b93f00182937aee6a0ecea4c0ab7a95f9 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other
# Spack Project Developers. See the top-level COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)

import pytest

import spack.solver.asp
import spack.spec

pytestmark = [
    pytest.mark.not_on_windows("Windows uses old concretizer"),
    pytest.mark.only_clingo("Original concretizer does not support configuration requirements"),
]

version_error_messages = [
    "Cannot satisfy 'fftw@:1.0' and 'fftw@1.1:",
    "        required because quantum-espresso depends on fftw@:1.0",
    "          required because quantum-espresso ^fftw@1.1: requested explicitly",
    "        required because quantum-espresso ^fftw@1.1: requested explicitly",
]

external_error_messages = [
    (
        "Attempted to build package quantum-espresso which is not buildable and does not have"
        " a satisfying external"
    ),
    (
        "        'quantum-espresso~veritas' is an external constraint for quantum-espresso"
        " which was not satisfied"
    ),
    "        'quantum-espresso+veritas' required",
    "        required because quantum-espresso+veritas requested explicitly",
]

variant_error_messages = [
    "'fftw' required multiple values for single-valued variant 'mpi'",
    "    Requested '~mpi' and '+mpi'",
    "        required because quantum-espresso depends on fftw+mpi when +invino",
    "          required because quantum-espresso+invino ^fftw~mpi requested explicitly",
    "        required because quantum-espresso+invino ^fftw~mpi requested explicitly",
]

external_config = {
    "packages:quantum-espresso": {
        "buildable": False,
        "externals": [{"spec": "quantum-espresso@1.0~veritas", "prefix": "/path/to/qe"}],
    }
}


@pytest.mark.parametrize(
    "error_messages,config_set,spec",
    [
        (version_error_messages, {}, "quantum-espresso^fftw@1.1:"),
        (external_error_messages, external_config, "quantum-espresso+veritas"),
        (variant_error_messages, {}, "quantum-espresso+invino^fftw~mpi"),
    ],
)
def test_error_messages(error_messages, config_set, spec, mock_packages, mutable_config):
    for path, conf in config_set.items():
        spack.config.set(path, conf)

    with pytest.raises(spack.solver.asp.UnsatisfiableSpecError) as e:
        _ = spack.spec.Spec(spec).concretized()

    for em in error_messages:
        assert em in str(e.value)