File: conftest.py

package info (click to toggle)
mkosi 14-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 1,268 kB
  • sloc: python: 8,878; sh: 95; makefile: 6
file content (66 lines) | stat: -rw-r--r-- 2,551 bytes parent folder | download
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
# SPDX-License-Identifier: LGPL-2.1+

from typing import Any, Dict, List, Set

from tests.test_config_parser import MkosiConfig


class DictDiffer:
    def __init__(self, expected_dict: Dict[str, Any], current_dict: Dict[str, Any]) -> None:
        self.current_dict = current_dict
        self.expected_dict = expected_dict
        self.set_current, self.set_past = set(current_dict.keys()), set(expected_dict.keys())
        self.intersect = self.set_current.intersection(self.set_past)

    @property
    def unexpected(self) -> List[str]:
        return [f"{k}={self.current_dict[k]}" for k in self.set_current - self.intersect]

    @property
    def missing(self) -> List[str]:
        return [str(k) for k in self.set_past - self.intersect]

    @property
    def invalid(self) -> List[str]:
        inva = {o for o in self.intersect if self.expected_dict[o] != self.current_dict[o]}
        return [f"{k}={self.current_dict[k]} (exp: {self.expected_dict[k]})" for k in inva]

    @property
    def valid(self) -> Set[str]:
        return {o for o in self.intersect if self.expected_dict[o] == self.current_dict[o]}


def pytest_assertrepr_compare(op: str, left: MkosiConfig, right: Any) -> List[str]:
    if not isinstance(right, dict):
        return []
    for r in right.values():
        if not isinstance(vars(r), dict):
            return ["Invalid datatype"]
    if op == "==":

        def compare_job_args(job: str, l_a: Dict[str, Any], r_a: Dict[str, Any]) -> None:
            ddiff = DictDiffer(l_a, r_a)
            ret.append(f'Comparing parsed configuration {job} against expected configuration:')
            ret.append("unexpected:")
            ret.extend([f'- {i}' for i in ddiff.unexpected])
            ret.append("missing:")
            ret.extend([f'- {i}' for i in ddiff.missing])
            ret.append("invalid:")
            ret.extend([f'- {i}' for i in ddiff.invalid])

        verified_keys = []
        ret = ["MkosiConfig is not equal to parsed args"]
        for right_job, right_args in right.items():
            try:
                left_args = left.reference_config[right_job]
            except KeyError:
                ret.append(f'Unexpected job: {right_job}')
                continue
            r_v = vars(right_args)
            compare_job_args(right_job, left_args, r_v)
            verified_keys.append(right_job)
        for left_job in left.reference_config:
            if not left_job in verified_keys:
                ret.append(f'Missing job: {left_job}')
        return ret
    return []