diff options
18 files changed, 365 insertions, 0 deletions
diff --git a/tests/format/options.py b/tests/format/options.py new file mode 100644 index 000000000..dfc2b8340 --- /dev/null +++ b/tests/format/options.py @@ -0,0 +1,228 @@ +import os +import pytest +from buildstream import _yaml +from buildstream import LoadError, LoadErrorReason +from tests.testutils.runcli import cli + +# Project directory +DATA_DIR = os.path.join( + os.path.dirname(os.path.realpath(__file__)), + 'options' +) + + +@pytest.mark.datafiles(DATA_DIR) +def test_invalid_option_type(cli, datafiles): + project = os.path.join(datafiles.dirname, datafiles.basename, 'invalid-type') + + # Test with the opt option set + result = cli.run(project=project, silent=True, args=[ + '--option', 'opt', 'funny', + 'show', + '--deps', 'none', + '--format', '%{vars}', + 'element.bst']) + assert result.exit_code != 0 + assert result.exception + assert isinstance(result.exception, LoadError) + assert result.exception.reason == LoadErrorReason.INVALID_DATA + + +@pytest.mark.datafiles(DATA_DIR) +def test_invalid_option_cli(cli, datafiles): + project = os.path.join(datafiles.dirname, datafiles.basename, 'simple-condition') + + # Test with the opt option set + result = cli.run(project=project, silent=True, args=[ + '--option', 'fart', 'funny', + 'show', + '--deps', 'none', + '--format', '%{vars}', + 'element.bst']) + assert result.exit_code != 0 + assert result.exception + assert isinstance(result.exception, LoadError) + assert result.exception.reason == LoadErrorReason.INVALID_DATA + + +@pytest.mark.datafiles(DATA_DIR) +def test_invalid_option_config(cli, datafiles): + project = os.path.join(datafiles.dirname, datafiles.basename, 'simple-condition') + cli.configure({ + 'projects': { + 'test': { + 'options': { + 'fart': 'Hello' + } + } + } + }) + result = cli.run(project=project, silent=True, args=[ + 'show', + '--deps', 'none', + '--format', '%{vars}', + 'element.bst']) + assert result.exit_code != 0 + assert result.exception + assert isinstance(result.exception, LoadError) + assert result.exception.reason == LoadErrorReason.INVALID_DATA + + +@pytest.mark.datafiles(DATA_DIR) +def test_invalid_expression(cli, datafiles): + project = os.path.join(datafiles.dirname, datafiles.basename, 'invalid-expression') + result = cli.run(project=project, silent=True, args=[ + 'show', + '--deps', 'none', + '--format', '%{vars}', + 'element.bst']) + assert result.exit_code != 0 + assert result.exception + assert isinstance(result.exception, LoadError) + assert result.exception.reason == LoadErrorReason.EXPRESSION_FAILED + + +@pytest.mark.datafiles(DATA_DIR) +def test_invalid_condition(cli, datafiles): + project = os.path.join(datafiles.dirname, datafiles.basename, 'invalid-condition') + result = cli.run(project=project, silent=True, args=[ + 'show', + '--deps', 'none', + '--format', '%{vars}', + 'element.bst']) + assert result.exit_code != 0 + assert result.exception + assert isinstance(result.exception, LoadError) + assert result.exception.reason == LoadErrorReason.INVALID_DATA + + +@pytest.mark.datafiles(DATA_DIR) +@pytest.mark.parametrize("opt_option,expected_prefix", [ + ('False', '/usr'), + ('True', '/opt'), +]) +def test_simple_conditional(cli, datafiles, opt_option, expected_prefix): + project = os.path.join(datafiles.dirname, datafiles.basename, 'simple-condition') + + # Test with the opt option set + result = cli.run(project=project, silent=True, args=[ + '--option', 'opt', opt_option, + 'show', + '--deps', 'none', + '--format', '%{vars}', + 'element.bst']) + assert result.exit_code == 0 + loaded = _yaml.load_data(result.output) + assert loaded['prefix'] == expected_prefix + + +@pytest.mark.datafiles(DATA_DIR) +@pytest.mark.parametrize("debug,logging,expected", [ + ('False', 'False', 'False'), + ('True', 'False', 'False'), + ('False', 'True', 'False'), + ('True', 'True', 'True'), +]) +def test_nested_conditional(cli, datafiles, debug, logging, expected): + project = os.path.join(datafiles.dirname, datafiles.basename, 'nested-condition') + + # Test with the opt option set + result = cli.run(project=project, silent=True, args=[ + '--option', 'debug', debug, + '--option', 'logging', logging, + 'show', + '--deps', 'none', + '--format', '%{vars}', + 'element.bst']) + assert result.exit_code == 0 + loaded = _yaml.load_data(result.output) + assert loaded['debug'] == expected + + +@pytest.mark.datafiles(DATA_DIR) +@pytest.mark.parametrize("debug,logging,expected", [ + ('False', 'False', 'False'), + ('True', 'False', 'False'), + ('False', 'True', 'False'), + ('True', 'True', 'True'), +]) +def test_compound_and_conditional(cli, datafiles, debug, logging, expected): + project = os.path.join(datafiles.dirname, datafiles.basename, 'compound-and-condition') + + # Test with the opt option set + result = cli.run(project=project, silent=True, args=[ + '--option', 'debug', debug, + '--option', 'logging', logging, + 'show', + '--deps', 'none', + '--format', '%{vars}', + 'element.bst']) + assert result.exit_code == 0 + loaded = _yaml.load_data(result.output) + assert loaded['debug'] == expected + + +@pytest.mark.datafiles(DATA_DIR) +@pytest.mark.parametrize("debug,logging,expected", [ + ('False', 'False', 'False'), + ('True', 'False', 'True'), + ('False', 'True', 'True'), + ('True', 'True', 'True'), +]) +def test_compound_or_conditional(cli, datafiles, debug, logging, expected): + project = os.path.join(datafiles.dirname, datafiles.basename, 'compound-or-condition') + + # Test with the opt option set + result = cli.run(project=project, silent=True, args=[ + '--option', 'debug', debug, + '--option', 'logging', logging, + 'show', + '--deps', 'none', + '--format', '%{vars}', + 'element.bst']) + assert result.exit_code == 0 + loaded = _yaml.load_data(result.output) + assert loaded['logging'] == expected + + +@pytest.mark.datafiles(DATA_DIR) +@pytest.mark.parametrize("option,expected", [ + ('False', 'horsy'), + ('True', 'pony'), +]) +def test_deep_nesting_level1(cli, datafiles, option, expected): + project = os.path.join(datafiles.dirname, datafiles.basename, 'deep-nesting') + result = cli.run(project=project, silent=True, args=[ + '--option', 'pony', option, + 'show', + '--deps', 'none', + '--format', '%{public}', + 'element.bst']) + assert result.exit_code == 0 + loaded = _yaml.load_data(result.output) + shallow_list = loaded['shallow-nest'] + first_dict = shallow_list[0] + + assert first_dict['animal'] == expected + + +@pytest.mark.datafiles(DATA_DIR) +@pytest.mark.parametrize("option,expected", [ + ('False', 'horsy'), + ('True', 'pony'), +]) +def test_deep_nesting_level2(cli, datafiles, option, expected): + project = os.path.join(datafiles.dirname, datafiles.basename, 'deep-nesting') + result = cli.run(project=project, silent=True, args=[ + '--option', 'pony', option, + 'show', + '--deps', 'none', + '--format', '%{public}', + 'element-deeper.bst']) + assert result.exit_code == 0 + loaded = _yaml.load_data(result.output) + shallow_list = loaded['deep-nest'] + deeper_list = shallow_list[0] + first_dict = deeper_list[0] + + assert first_dict['animal'] == expected diff --git a/tests/format/options/compound-and-condition/element.bst b/tests/format/options/compound-and-condition/element.bst new file mode 100644 index 000000000..3c29b4ea1 --- /dev/null +++ b/tests/format/options/compound-and-condition/element.bst @@ -0,0 +1 @@ +kind: autotools diff --git a/tests/format/options/compound-and-condition/project.conf b/tests/format/options/compound-and-condition/project.conf new file mode 100644 index 000000000..650d017bd --- /dev/null +++ b/tests/format/options/compound-and-condition/project.conf @@ -0,0 +1,18 @@ +name: test + +options: + debug: + type: bool + description: Whether debugging is enabled + default: False + logging: + type: bool + description: Whether logging is enabled + default: False + +variables: + debug: 'False' + (?): + # Debugging is not enabled unless logging is also enabled + - logging and debug: + debug: 'True' diff --git a/tests/format/options/compound-or-condition/element.bst b/tests/format/options/compound-or-condition/element.bst new file mode 100644 index 000000000..3c29b4ea1 --- /dev/null +++ b/tests/format/options/compound-or-condition/element.bst @@ -0,0 +1 @@ +kind: autotools diff --git a/tests/format/options/compound-or-condition/project.conf b/tests/format/options/compound-or-condition/project.conf new file mode 100644 index 000000000..c59cc64f3 --- /dev/null +++ b/tests/format/options/compound-or-condition/project.conf @@ -0,0 +1,18 @@ +name: test + +options: + debug: + type: bool + description: Whether debugging is enabled + default: False + logging: + type: bool + description: Whether logging is enabled + default: False + +variables: + logging: 'False' + (?): + # Logging is enabled if specified or if debugging is requested + - logging or debug: + logging: 'True' diff --git a/tests/format/options/deep-nesting/element-deeper.bst b/tests/format/options/deep-nesting/element-deeper.bst new file mode 100644 index 000000000..15574ad14 --- /dev/null +++ b/tests/format/options/deep-nesting/element-deeper.bst @@ -0,0 +1,11 @@ +kind: autotools + +# Yep, this is a list of lists of dictionaries. +# +public: + deep-nest: + - + - animal: horsy + (?): + - pony: + animal: pony diff --git a/tests/format/options/deep-nesting/element.bst b/tests/format/options/deep-nesting/element.bst new file mode 100644 index 000000000..fb0043ba1 --- /dev/null +++ b/tests/format/options/deep-nesting/element.bst @@ -0,0 +1,8 @@ +kind: autotools + +public: + shallow-nest: + - animal: horsy + (?): + - pony: + animal: pony diff --git a/tests/format/options/deep-nesting/project.conf b/tests/format/options/deep-nesting/project.conf new file mode 100644 index 000000000..d912cd19e --- /dev/null +++ b/tests/format/options/deep-nesting/project.conf @@ -0,0 +1,6 @@ +name: test +options: + pony: + type: bool + description: Whether a pony or not + default: False diff --git a/tests/format/options/invalid-condition/element.bst b/tests/format/options/invalid-condition/element.bst new file mode 100644 index 000000000..3c29b4ea1 --- /dev/null +++ b/tests/format/options/invalid-condition/element.bst @@ -0,0 +1 @@ +kind: autotools diff --git a/tests/format/options/invalid-condition/project.conf b/tests/format/options/invalid-condition/project.conf new file mode 100644 index 000000000..b31f35c95 --- /dev/null +++ b/tests/format/options/invalid-condition/project.conf @@ -0,0 +1,13 @@ +name: test + +options: + opt: + type: bool + description: Whether to build in an opt prefix + default: False + +variables: + (?): + - not: Allowed any adjacent keys beside the expression. + opt: + prefix: "/opt" diff --git a/tests/format/options/invalid-expression/element.bst b/tests/format/options/invalid-expression/element.bst new file mode 100644 index 000000000..3c29b4ea1 --- /dev/null +++ b/tests/format/options/invalid-expression/element.bst @@ -0,0 +1 @@ +kind: autotools diff --git a/tests/format/options/invalid-expression/project.conf b/tests/format/options/invalid-expression/project.conf new file mode 100644 index 000000000..ee0147232 --- /dev/null +++ b/tests/format/options/invalid-expression/project.conf @@ -0,0 +1,12 @@ +name: test + +options: + opt: + type: bool + description: Whether to build in an opt prefix + default: False + +variables: + (?): + - is defined pony: + prefix: "/opt" diff --git a/tests/format/options/invalid-type/element.bst b/tests/format/options/invalid-type/element.bst new file mode 100644 index 000000000..3c29b4ea1 --- /dev/null +++ b/tests/format/options/invalid-type/element.bst @@ -0,0 +1 @@ +kind: autotools diff --git a/tests/format/options/invalid-type/project.conf b/tests/format/options/invalid-type/project.conf new file mode 100644 index 000000000..b4280cdb6 --- /dev/null +++ b/tests/format/options/invalid-type/project.conf @@ -0,0 +1,12 @@ +name: test + +options: + opt: + type: funny + description: This aint really an option type + default: False + +variables: + (?): + - opt is funny: + prefix: "/opt" diff --git a/tests/format/options/nested-condition/element.bst b/tests/format/options/nested-condition/element.bst new file mode 100644 index 000000000..3c29b4ea1 --- /dev/null +++ b/tests/format/options/nested-condition/element.bst @@ -0,0 +1 @@ +kind: autotools diff --git a/tests/format/options/nested-condition/project.conf b/tests/format/options/nested-condition/project.conf new file mode 100644 index 000000000..104b89571 --- /dev/null +++ b/tests/format/options/nested-condition/project.conf @@ -0,0 +1,20 @@ +name: test + +options: + debug: + type: bool + description: Whether debugging is enabled + default: False + logging: + type: bool + description: Whether logging is enabled + default: False + +variables: + debug: 'False' + (?): + - logging: + # Debugging is not enabled unless logging is also enabled + (?): + - debug: + debug: 'True' diff --git a/tests/format/options/simple-condition/element.bst b/tests/format/options/simple-condition/element.bst new file mode 100644 index 000000000..3c29b4ea1 --- /dev/null +++ b/tests/format/options/simple-condition/element.bst @@ -0,0 +1 @@ +kind: autotools diff --git a/tests/format/options/simple-condition/project.conf b/tests/format/options/simple-condition/project.conf new file mode 100644 index 000000000..b6bd29fb4 --- /dev/null +++ b/tests/format/options/simple-condition/project.conf @@ -0,0 +1,12 @@ +name: test + +options: + opt: + type: bool + description: Whether to build in an opt prefix + default: False + +variables: + (?): + - opt: + prefix: "/opt" |