This adds a test and a fix for a bug in the way the Test class is implemented. Currently Test stores the value passed to it for test arguments, and mutates these. Now, since most tests currently use a string which is an immutable object (changes are actually re-assignment), this hasn't been a problem, but later in this series this will cause subtle problems.
Signed-off-by: Dylan Baker <[email protected]> --- framework/test/base.py | 3 ++- framework/tests/base_tests.py | 30 ++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/framework/test/base.py b/framework/test/base.py index 851f5f8..d92d4c8 100644 --- a/framework/test/base.py +++ b/framework/test/base.py @@ -35,6 +35,7 @@ import threading import signal import itertools import abc +import copy from framework.core import Options from framework.results import TestResult @@ -124,7 +125,7 @@ class Test(object): def __init__(self, command, run_concurrent=False): self._command = None self.run_concurrent = run_concurrent - self.command = command + self._command = copy.copy(command) self.env = {} self.result = TestResult({'result': 'fail'}) self.cwd = None diff --git a/framework/tests/base_tests.py b/framework/tests/base_tests.py index c22e1ac..c800634 100644 --- a/framework/tests/base_tests.py +++ b/framework/tests/base_tests.py @@ -125,3 +125,33 @@ def test_run_command_early(): test = Test_('foo') test.run() + + [email protected](AssertionError) +def test_no_string(): + TestTest('foo') + + +def test_mutation(): + """Test.command does not mutate the value it was provided + + There is a very subtle bug in all.py that causes the key values to be + changed before they are assigned in some cases. This is because the right + side of an assignment is evalated before the left side, so + + >>> profile = {} + >>> args = ['a', 'b'] + >>> profile[' '.join(args)] = PiglitGLTest(args) + >>> profile.keys() + ['bin/a b'] + + """ + class _Test(TestTest): + def __init__(self, *args, **kwargs): + super(_Test, self).__init__(*args, **kwargs) + self._command[0] = 'bin/' + self._command[0] + + args = ['a', 'b'] + _Test(args) + + nt.assert_list_equal(args, ['a', 'b']) -- 2.2.1 _______________________________________________ Piglit mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/piglit
