summaryrefslogtreecommitdiff
path: root/tests/unittests/test_features.py
blob: 94c7ae13bb187cde68127155fe17d96918e0611b (plain)
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
69
70
71
72
73
# This file is part of cloud-init. See LICENSE file for license information.
# pylint: disable=no-member,no-name-in-module
"""
This file is for testing the feature flag functionality itself,
NOT for testing any individual feature flag
"""
import sys
from pathlib import Path

import pytest

import cloudinit


@pytest.fixture()
def create_override(request):
    """
    Create a feature overrides file and do some module wizardry to make
    it seem like we're importing the features file for the first time.

    After creating the override file with the values passed by the test,
    we need to reload cloudinit.features
    to get all of the current features (including the overridden ones).
    Once the test is complete, we remove the file we created and set
    features and feature_overrides modules to how they were before
    the test started
    """
    override_path = Path(cloudinit.__file__).parent / "feature_overrides.py"
    if override_path.exists():
        raise Exception(
            "feature_overrides.py unexpectedly exists! "
            "Remove it to run this test."
        )
    with override_path.open("w") as f:
        for key, value in request.param.items():
            f.write("{} = {}\n".format(key, value))

    sys.modules.pop("cloudinit.features", None)

    yield

    override_path.unlink()
    sys.modules.pop("cloudinit.feature_overrides", None)


class TestFeatures:
    """default pytest-xdist behavior may fail due to these tests"""

    @pytest.mark.serial
    def test_feature_without_override(self):
        from cloudinit.features import ERROR_ON_USER_DATA_FAILURE

        assert ERROR_ON_USER_DATA_FAILURE is True

    @pytest.mark.serial
    @pytest.mark.parametrize(
        "create_override",
        [{"ERROR_ON_USER_DATA_FAILURE": False}],
        indirect=True,
    )
    def test_feature_with_override(self, create_override):
        from cloudinit.features import ERROR_ON_USER_DATA_FAILURE

        assert ERROR_ON_USER_DATA_FAILURE is False

    @pytest.mark.serial
    @pytest.mark.parametrize(
        "create_override", [{"SPAM": True}], indirect=True
    )
    def test_feature_only_in_override(self, create_override):
        from cloudinit.features import SPAM

        assert SPAM is True