From 1045714018828abffdf27ce1dc0d3afea4c2f9ab Mon Sep 17 00:00:00 2001 From: Marcos Bento Date: Fri, 24 Jul 2026 09:55:47 +0100 Subject: [PATCH] Keep node test definitions alive Retain the Defs object for the fixture lifetime to prevent dangling parent references and segmentation faults during generated-variable lookup. Re ECFLOW-2110 --- .../pyext/test/py_u_TestAttributeAddDeleteError.py | 3 ++- libs/pyext/test/py_u_TestError.py | 12 ++++++++---- libs/pyext/test/py_u_TestNode.py | 14 +++++++------- libs/pyext/test/py_u_TestParent.py | 4 ++-- 4 files changed, 19 insertions(+), 14 deletions(-) diff --git a/libs/pyext/test/py_u_TestAttributeAddDeleteError.py b/libs/pyext/test/py_u_TestAttributeAddDeleteError.py index b4323be26..928234c38 100644 --- a/libs/pyext/test/py_u_TestAttributeAddDeleteError.py +++ b/libs/pyext/test/py_u_TestAttributeAddDeleteError.py @@ -20,7 +20,8 @@ @pytest.fixture def suite(): - return Defs().add_suite("s1") + defs = Defs() + yield defs.add_suite("s1") def test_suite_disallows_today_string(suite): diff --git a/libs/pyext/test/py_u_TestError.py b/libs/pyext/test/py_u_TestError.py index 60f7dad2f..2ab3c404f 100644 --- a/libs/pyext/test/py_u_TestError.py +++ b/libs/pyext/test/py_u_TestError.py @@ -545,7 +545,8 @@ def test_cannot_add_same_family_to_two_suites(): suite = defs3.add_suite("s1") family = suite.add_family("f1") with pytest.raises(RuntimeError): - new_suite = Defs().add_suite("s2") + new_defs = Defs() + new_suite = new_defs.add_suite("s2") new_suite.add_family(family) @@ -560,20 +561,23 @@ def test_cannot_add_same_task_to_two_containers(): def test_cannot_add_two_autocancel_on_same_node(): with pytest.raises(RuntimeError): - suite = Defs().add_suite("s1") + defs = Defs() + suite = defs.add_suite("s1") suite.add_autocancel(3) suite.add_autocancel(4) def test_cannot_add_autocancel_and_autoarchive_together(): with pytest.raises(RuntimeError): - suite = Defs().add_suite("s1") + defs = Defs() + suite = defs.add_suite("s1") suite.add_autoarchive(3) suite.add_autocancel(4) def test_cannot_add_two_autorestore_on_same_node(): with pytest.raises(RuntimeError): - suite = Defs().add_suite("s1") + defs = Defs() + suite = defs.add_suite("s1") suite.add_autorestore(["/s1"]) suite.add_autorestore(["/s1"]) diff --git a/libs/pyext/test/py_u_TestNode.py b/libs/pyext/test/py_u_TestNode.py index 709647850..49834c0c6 100644 --- a/libs/pyext/test/py_u_TestNode.py +++ b/libs/pyext/test/py_u_TestNode.py @@ -21,7 +21,7 @@ def suite_task(): family = suite.add_family("family") family.add_repeat(ecf.RepeatDate("REPEAT", 20010101, 20010102, 1)) task = family.add_task("task") - return suite, family, task + return defs, suite, family, task SUITE_GENERATED_VAR_NAMES = [ @@ -65,7 +65,7 @@ def suite_task(): def test_retrieve_suite_generated_variables_using_variable_list(suite_task): - suite, _, _ = suite_task + _, suite, _, _ = suite_task vars = ecf.VariableList() suite.get_generated_variables(vars) names = {v.name() for v in vars} @@ -75,7 +75,7 @@ def test_retrieve_suite_generated_variables_using_variable_list(suite_task): def test_retrieve_suite_generated_variables_using_python_list(suite_task): - suite, _, _ = suite_task + _, suite, _, _ = suite_task vars = suite.get_generated_variables() names = {v.name() for v in vars} @@ -84,7 +84,7 @@ def test_retrieve_suite_generated_variables_using_python_list(suite_task): def test_retrieve_family_generated_variables_using_variable_list(suite_task): - _, family, _ = suite_task + _, _, family, _ = suite_task vars = ecf.VariableList() family.get_generated_variables(vars) names = {v.name() for v in vars} @@ -94,7 +94,7 @@ def test_retrieve_family_generated_variables_using_variable_list(suite_task): def test_retrieve_family_generated_variables_using_python_list(suite_task): - _, family, _ = suite_task + _, _, family, _ = suite_task vars = family.get_generated_variables() names = {v.name() for v in vars} @@ -103,7 +103,7 @@ def test_retrieve_family_generated_variables_using_python_list(suite_task): def test_retrieve_task_generated_variables_using_variable_list(suite_task): - _, _, task = suite_task + _, _, _, task = suite_task vars = ecf.VariableList() task.get_generated_variables(vars) names = {v.name() for v in vars} @@ -113,7 +113,7 @@ def test_retrieve_task_generated_variables_using_variable_list(suite_task): def test_retrieve_task_generated_variables_using_python_list(suite_task): - _, _, task = suite_task + _, _, _, task = suite_task vars = task.get_generated_variables() names = {v.name() for v in vars} diff --git a/libs/pyext/test/py_u_TestParent.py b/libs/pyext/test/py_u_TestParent.py index 93fac9917..17ed5ea4e 100644 --- a/libs/pyext/test/py_u_TestParent.py +++ b/libs/pyext/test/py_u_TestParent.py @@ -42,7 +42,7 @@ def populated_definition(): defs = Defs() defs.add_suite(suite) - return suite, family, family2, task, t1 + return defs, suite, family, family2, task, t1 def test_unattached_nodes_have_no_parent_or_defs(): @@ -60,7 +60,7 @@ def test_unattached_nodes_have_no_parent_or_defs(): def test_attached_node_paths(populated_definition): - suite, family, family2, task, t1 = populated_definition + _, suite, family, family2, task, t1 = populated_definition assert t1.get_abs_node_path() == _abs_node_path(t1), ( "Expected " + t1.get_abs_node_path() + " but got " + _abs_node_path(t1)