From be3e4bf78ee9f672c87811d81261585d5593b3e5 Mon Sep 17 00:00:00 2001 From: Maximilian Bosch Date: Fri, 5 Dec 2025 18:32:53 +0100 Subject: [PATCH] tests/functional/output-cycles: move to functional2 Change-Id: I682f62a695ba7722e2b3063bf831fc50a19eb153 --- tests/functional/meson.build | 1 - tests/functional/output-cycles.sh | 29 ------- .../assets/test_build/output-cycles.nix} | 0 .../test_build/test_build_output_cycles.py | 78 +++++++++++++++++++ 4 files changed, 78 insertions(+), 30 deletions(-) delete mode 100644 tests/functional/output-cycles.sh rename tests/{functional/check-outputs.nix => functional2/commands/test_build/assets/test_build/output-cycles.nix} (100%) create mode 100644 tests/functional2/commands/test_build/test_build_output_cycles.py diff --git a/tests/functional/meson.build b/tests/functional/meson.build index 25d0f4933..ddf2dbb6c 100644 --- a/tests/functional/meson.build +++ b/tests/functional/meson.build @@ -160,7 +160,6 @@ functional_tests_scripts = [ 'regression-reference-checks.sh', 'redirected-filter-source.sh', 'daemon-trust.sh', - 'output-cycles.sh', ] # Plugin tests require shared libraries support. diff --git a/tests/functional/output-cycles.sh b/tests/functional/output-cycles.sh deleted file mode 100644 index 2cd4ef7b9..000000000 --- a/tests/functional/output-cycles.sh +++ /dev/null @@ -1,29 +0,0 @@ -source common.sh - -clearStore - -error="$(! nix-build check-outputs.nix -A cycle 2>&1)" -grepQuiet "cycle detected in build of '.*' in the references of output 'bar' from output 'foo'" <<<"$error" - -if [[ "$(uname -s)" = Linux ]]; then - <<<"$error" grepQuiet "/store/.*-cycle-bar" - <<<"$error" grepQuiet "└───lib/libfoo: ….*cycle-baz.*" - <<<"$error" grepQuiet " →.*/store/.*-cycle-baz" - <<<"$error" grepQuiet " └───share/lalala:.*-cycle-foo.*" -fi - -error="$(! nix-build check-outputs.nix -A as_dependency 2>&1)" - -grepQuiet "cycle detected in build of '.*' in the references of output 'bar' from output 'foo'" <<<"$error" -grepQuiet "error: 1 dependencies of derivation" <<<"$error" - -error="$(! nix-build check-outputs.nix -A cycle-with-deps 2>&1)" -grepQuiet "cycle detected in build of '.*' in the references of output 'bar' from output 'foo'" <<<"$error" - -if [[ "$(uname -s)" = Linux ]]; then - echo "$error" - <<<"$error" grepQuiet "/store/.*-cycle-with-deps-bar" - <<<"$error" grepQuiet "└───txt: ….*cycle-with-deps-foo.*" - <<<"$error" grepQuiet " →.*/store/.*-cycle-with-deps-foo" - <<<"$error" grepQuiet " └───txt:.*-cycle-with-deps-bar.*" -fi diff --git a/tests/functional/check-outputs.nix b/tests/functional2/commands/test_build/assets/test_build/output-cycles.nix similarity index 100% rename from tests/functional/check-outputs.nix rename to tests/functional2/commands/test_build/assets/test_build/output-cycles.nix diff --git a/tests/functional2/commands/test_build/test_build_output_cycles.py b/tests/functional2/commands/test_build/test_build_output_cycles.py new file mode 100644 index 000000000..348c7baaf --- /dev/null +++ b/tests/functional2/commands/test_build/test_build_output_cycles.py @@ -0,0 +1,78 @@ +import re +import sys + +from functional2.testlib.fixtures.file_helper import with_files, CopyFile +from functional2.testlib.fixtures.nix import Nix +from functional2.testlib.utils import get_global_asset_pack + +_files = { + "output-cycles.nix": CopyFile("assets/test_build/output-cycles.nix"), + **get_global_asset_pack("dependencies"), +} + + +def _assert_cycle_tree(output: str, regexes: list[str]): + lines = output.splitlines() + start = next((k for k, v in enumerate(lines) if "Shown below are the files inside" in v), None) + + assert start is not None + + for line, regex in enumerate(regexes, start=start + 1): + assert re.search(regex, lines[line]) + + +def _assert_cycle_message(err: str): + assert ( + len( + re.findall( + r"cycle detected in build of '.*' in the references of output 'bar' from output 'foo'", + err, + ) + ) + == 1 + ) + + +@with_files(_files) +def test_cycle(nix: Nix): + res = nix.nix_build(["output-cycles.nix", "-A", "cycle"]).run().expect(1) + err = res.stderr_plain + _assert_cycle_message(err) + + if sys.platform == "linux": + _assert_cycle_tree( + err, + [ + r"/store/.*-cycle-bar", + r"└───lib/libfoo: ….*cycle-baz.*", + r" →.*/store/.*-cycle-baz", + r" └───share/lalala:.*-cycle-foo.*", + ], + ) + + +@with_files(_files) +def test_cycle_in_dependency(nix: Nix): + res = nix.nix_build(["output-cycles.nix", "-A", "as_dependency"]).run().expect(1) + err = res.stderr_plain + _assert_cycle_message(err) + + assert "error: 1 dependencies of derivation" in err + + +@with_files(_files) +def test_cycle_with_deps(nix: Nix): + res = nix.nix_build(["output-cycles.nix", "-A", "cycle-with-deps"]).run().expect(1) + err = res.stderr_plain + _assert_cycle_message(err) + + if sys.platform == "linux": + _assert_cycle_tree( + err, + [ + r"/store/.*-cycle-with-deps-bar", + r"└───txt: ….*cycle-with-deps-foo.*", + r" →.*/store/.*-cycle-with-deps-foo", + r" └───txt:.*-cycle-with-deps-bar.*", + ], + )