# 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 pytest import sys from pathlib import Path import cloudinit @pytest.yield_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: 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.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.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