From 32be9a0fff19c2dd3d45ba5f58ce0c07b9068cb4 Mon Sep 17 00:00:00 2001 From: Phillip Smyth <phillip.smyth@codethink.co.uk> Date: Thu, 22 Nov 2018 14:59:59 +0000 Subject: [PATCH] tests: build checkout and completions tests buildcheckout.py: Add mandatory .bst suffix tests completions.py: Add test for fail on invalid suffix Added required files for testing integration/source-determinism.py: renamed test elements to end with .bst --- tests/completions/completions.py | 38 +++++++++++++++++++++ tests/frontend/buildcheckout.py | 25 ++++++++++++++ tests/frontend/project/elements/target.foo | 4 +++ tests/frontend/project/elements/target2.bst | 7 ++++ tests/integration/source-determinism.py | 4 +-- 5 files changed, 76 insertions(+), 2 deletions(-) create mode 100644 tests/frontend/project/elements/target.foo create mode 100644 tests/frontend/project/elements/target2.bst diff --git a/tests/completions/completions.py b/tests/completions/completions.py index 7b63e67fe7..699d2ed472 100644 --- a/tests/completions/completions.py +++ b/tests/completions/completions.py @@ -66,6 +66,13 @@ PROJECT_ELEMENTS = [ "target.bst" ] +INVALID_ELEMENTS = [ + "target.foo" + "target.bst.bar" +] + +MIXED_ELEMENTS = PROJECT_ELEMENTS + INVALID_ELEMENTS + def assert_completion(cli, cmd, word_idx, expected, cwd=None): result = cli.run(cwd=cwd, env={ @@ -85,6 +92,24 @@ def assert_completion(cli, cmd, word_idx, expected, cwd=None): assert words == expected +def assert_completion_failed(cli, cmd, word_idx, expected, cwd=None): + result = cli.run(cwd=cwd, env={ + '_BST_COMPLETION': 'complete', + 'COMP_WORDS': cmd, + 'COMP_CWORD': str(word_idx) + }) + words = [] + if result.output: + words = result.output.splitlines() + + # The order is meaningless, bash will + # take the results and order it by its + # own little heuristics + words = sorted(words) + expected = sorted(expected) + assert words != expected + + @pytest.mark.parametrize("cmd,word_idx,expected", [ ('bst', 0, []), ('bst ', 1, MAIN_COMMANDS), @@ -226,6 +251,19 @@ def test_argument_element(datafiles, cli, project, cmd, word_idx, expected, subd assert_completion(cli, cmd, word_idx, expected, cwd=cwd) +@pytest.mark.datafiles(DATA_DIR) +@pytest.mark.parametrize("project,cmd,word_idx,expected,subdir", [ + + # When element has invalid suffix + ('project', 'bst --directory ../ show ', 4, [e + ' ' for e in MIXED_ELEMENTS], 'files') +]) +def test_argument_element_invalid(datafiles, cli, project, cmd, word_idx, expected, subdir): + cwd = os.path.join(str(datafiles), project) + if subdir: + cwd = os.path.join(cwd, subdir) + assert_completion_failed(cli, cmd, word_idx, expected, cwd=cwd) + + @pytest.mark.parametrize("cmd,word_idx,expected", [ ('bst he', 1, ['help ']), ('bst help ', 2, MAIN_COMMANDS), diff --git a/tests/frontend/buildcheckout.py b/tests/frontend/buildcheckout.py index 159af2d744..8266fa9513 100644 --- a/tests/frontend/buildcheckout.py +++ b/tests/frontend/buildcheckout.py @@ -60,6 +60,31 @@ def test_build_checkout(datafiles, cli, strict, hardlinks): assert os.path.exists(filename) +@pytest.mark.datafiles(DATA_DIR) +@pytest.mark.parametrize("strict,hardlinks", [ + ("non-strict", "hardlinks"), +]) +def test_build_invalid_suffix(datafiles, cli, strict, hardlinks): + project = os.path.join(datafiles.dirname, datafiles.basename) + checkout = os.path.join(cli.directory, 'checkout') + + result = cli.run(project=project, args=strict_args(['build', 'target.foo'], strict)) + result.assert_main_error(ErrorDomain.LOAD, LoadErrorReason.INVALID_DATA) + + +@pytest.mark.datafiles(DATA_DIR) +@pytest.mark.parametrize("strict,hardlinks", [ + ("non-strict", "hardlinks"), +]) +def test_build_invalid_suffix_dep(datafiles, cli, strict, hardlinks): + project = os.path.join(datafiles.dirname, datafiles.basename) + checkout = os.path.join(cli.directory, 'checkout') + + # target2.bst depends on an element called target.foo + result = cli.run(project=project, args=strict_args(['build', 'target2.bst'], strict)) + result.assert_main_error(ErrorDomain.LOAD, LoadErrorReason.INVALID_DATA) + + @pytest.mark.datafiles(DATA_DIR) @pytest.mark.parametrize("deps", [("run"), ("none")]) def test_build_checkout_deps(datafiles, cli, deps): diff --git a/tests/frontend/project/elements/target.foo b/tests/frontend/project/elements/target.foo new file mode 100644 index 0000000000..d644c89ba9 --- /dev/null +++ b/tests/frontend/project/elements/target.foo @@ -0,0 +1,4 @@ +kind: stack +description: | + + Main stack target for the bst build test diff --git a/tests/frontend/project/elements/target2.bst b/tests/frontend/project/elements/target2.bst new file mode 100644 index 0000000000..259819f599 --- /dev/null +++ b/tests/frontend/project/elements/target2.bst @@ -0,0 +1,7 @@ +kind: stack +description: | + + Main stack target for the bst build test + +depends: +- target.foo diff --git a/tests/integration/source-determinism.py b/tests/integration/source-determinism.py index a970c7dc9c..fa12593dfc 100644 --- a/tests/integration/source-determinism.py +++ b/tests/integration/source-determinism.py @@ -33,7 +33,7 @@ def create_test_directory(*path, mode=0o644): @pytest.mark.skipif(IS_LINUX and not HAVE_BWRAP, reason='Only available with bubblewrap on Linux') def test_deterministic_source_umask(cli, tmpdir, datafiles, kind, integration_cache): project = str(datafiles) - element_name = 'list' + element_name = 'list.bst' element_path = os.path.join(project, 'elements', element_name) repodir = os.path.join(str(tmpdir), 'repo') sourcedir = os.path.join(project, 'source') @@ -108,7 +108,7 @@ def test_deterministic_source_local(cli, tmpdir, datafiles, integration_cache): """Only user rights should be considered for local source. """ project = str(datafiles) - element_name = 'test' + element_name = 'test.bst' element_path = os.path.join(project, 'elements', element_name) sourcedir = os.path.join(project, 'source') -- GitLab