diff options
Diffstat (limited to 'tests/maint-scenarios/test_scenario_plan.py')
| -rw-r--r-- | tests/maint-scenarios/test_scenario_plan.py | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/tests/maint-scenarios/test_scenario_plan.py b/tests/maint-scenarios/test_scenario_plan.py index 9a72db2..d2dc8ea 100644 --- a/tests/maint-scenarios/test_scenario_plan.py +++ b/tests/maint-scenarios/test_scenario_plan.py @@ -213,6 +213,67 @@ class UsageTests(unittest.TestCase): NSPAWN_RUNNER = os.path.join(REPO_ROOT, "scripts", "testing", "run-maint-nspawn.sh") +SCENARIO_LIB = os.path.join(REPO_ROOT, "scripts", "testing", "lib", + "maint-scenario.sh") + + +class SharedScenarioLibraryTests(unittest.TestCase): + """Both transports share scenario parsing and execution semantics.""" + + def test_both_runners_source_the_shared_library(self): + for runner in (RUNNER, NSPAWN_RUNNER): + with open(runner) as f: + source = f.read() + self.assertIn('source "$SCRIPT_DIR/lib/maint-scenario.sh"', source) + self.assertNotRegex(source, r"(?m)^_scenario_var\(\)") + self.assertNotRegex(source, r"(?m)^_validate_scenario\(\)") + self.assertNotRegex(source, r"(?m)^run_scenario\(\)") + + def test_shared_runner_records_pass_and_cleans_contract_symbols(self): + with tempfile.TemporaryDirectory() as d: + scenario = write_scenario(d, "10-pass.sh") + script = f""" +source "{SCENARIO_LIB}" +section() {{ :; }}; step() {{ :; }}; success() {{ :; }}; error() {{ :; }} +mexec() {{ :; }}; mfix() {{ :; }} +S_FILES=("{scenario}"); S_NAMES=("pass"); S_DESCS=("works") +PASS=(); FAIL=() +run_scenario 0 +printf 'pass=%s fail=%s desc=%s fn=%s\\n' \ + "${{#PASS[@]}}" "${{#FAIL[@]}}" "${{SCENARIO_DESC-unset}}" \ + "$(declare -F scenario_break || echo unset)" +""" + proc = subprocess.run(["bash", "-c", script], capture_output=True, + text=True, cwd=REPO_ROOT) + self.assertEqual(proc.returncode, 0, proc.stderr) + self.assertIn("pass=1 fail=0 desc=unset fn=unset", proc.stdout) + + def test_shared_runner_stops_after_failed_fix(self): + with tempfile.TemporaryDirectory() as d: + scenario = write_scenario( + d, "10-fail.sh", + body=GOOD_SCENARIO.format(desc="fails", group="g", + profiles="any").replace( + "scenario_fix() { mfix some_remedy; }", + "scenario_fix() { return 1; }", + ).replace( + 'scenario_assert() { mexec "true"; }', + 'scenario_assert() { echo ASSERT_RAN; }', + ), + ) + script = f""" +source "{SCENARIO_LIB}" +section() {{ :; }}; step() {{ :; }}; success() {{ :; }}; error() {{ :; }} +S_FILES=("{scenario}"); S_NAMES=("fail"); S_DESCS=("fails") +PASS=(); FAIL=() +run_scenario 0 +printf 'pass=%s fail=%s\\n' "${{#PASS[@]}}" "${{#FAIL[@]}}" +""" + proc = subprocess.run(["bash", "-c", script], capture_output=True, + text=True, cwd=REPO_ROOT) + self.assertEqual(proc.returncode, 0, proc.stderr) + self.assertNotIn("ASSERT_RAN", proc.stdout) + self.assertIn("pass=0 fail=1", proc.stdout) class NspawnPlanTests(unittest.TestCase): |
