[Piglit] [PATCH 1/2] framework: add exception back to TestResult class

Mark Janes mark.a.janes at intel.com
Thu Oct 1 10:13:50 PDT 2015


patch 1 is

Reviewed-by: Mark Janes <mark.a.janes at intel.com>
Tested-by: Mark Janes <mark.a.janes at intel.com>

Dylan Baker <baker.dylan.c at gmail.com> writes:

> Like command, this somehow didn't get moved to the new TestResult class.
> Generally this isn't a problem since this is a very uncommon path, but
> in some cases this does get hit, and it would cause an exception in the
> runner threads. Python has very bad exception handling in threads,
> namely it doesn't have any; this results in an exception being raised
> and remaining uncaught, terminating the thread, which in turn results in
> the test result being incomplete, even though it should have been crash.
>
> This patch fixes that situation.
>
> cc: Mark Janes <mark.a.janes at intel.com>
> Signed-off-by: Dylan Baker <dylanx.c.baker at intel.com>
> ---
>
> Mark, this should fix the problem where clipflat returns an incomplete
> in jenkins. Basically what was happening is that it was returning
> invalid JSON, and then trying to write that into the TestResult, which
> it couldn't raising another exception.
>
>  framework/results.py             |  7 +++++--
>  framework/tests/results_tests.py | 10 ++++++++++
>  2 files changed, 15 insertions(+), 2 deletions(-)
>
> diff --git a/framework/results.py b/framework/results.py
> index 8d3fe17..26f4380 100644
> --- a/framework/results.py
> +++ b/framework/results.py
> @@ -106,7 +106,8 @@ class StringDescriptor(object):  # pylint: disable=too-few-public-methods
>  class TestResult(object):
>      """An object represting the result of a single test."""
>      __slots__ = ['returncode', '_err', '_out', 'time', 'command', 'traceback',
> -                 'environment', 'subtests', 'dmesg', '__result', 'images']
> +                 'environment', 'subtests', 'dmesg', '__result', 'images',
> +                 'exception']
>      err = StringDescriptor('_err')
>      out = StringDescriptor('_out')
>  
> @@ -119,6 +120,7 @@ class TestResult(object):
>          self.dmesg = str()
>          self.images = None
>          self.traceback = None
> +        self.exception = None
>          if result:
>              self.result = result
>          else:
> @@ -155,6 +157,7 @@ class TestResult(object):
>              'returncode': self.returncode,
>              'subtests': self.subtests,
>              'time': self.time,
> +            'exception': self.exception,
>          }
>          return obj
>  
> @@ -174,7 +177,7 @@ class TestResult(object):
>          inst = cls()
>  
>          # TODO: There's probably a more clever way to do this
> -        for each in ['returncode', 'time', 'command',
> +        for each in ['returncode', 'time', 'command', 'exception',
>                       'environment', 'result', 'dmesg']:
>              if each in dict_:
>                  setattr(inst, each, dict_[each])
> diff --git a/framework/tests/results_tests.py b/framework/tests/results_tests.py
> index 728d479..1b11df0 100644
> --- a/framework/tests/results_tests.py
> +++ b/framework/tests/results_tests.py
> @@ -194,6 +194,7 @@ class TestTestResult_to_json(object):
>                  'b': 'fail',
>              },
>              'result': 'crash',
> +            'exception': 'an exception',
>          }
>  
>          test = results.TestResult.from_dict(cls.dict)
> @@ -212,6 +213,10 @@ class TestTestResult_to_json(object):
>          """results.TestResult.to_json: sets the out correctly"""
>          nt.eq_(self.dict['out'], self.json['out'])
>  
> +    def test_out(self):
> +        """results.TestResult.to_json: sets the exception correctly"""
> +        nt.eq_(self.dict['exception'], self.json['exception'])
> +
>      def test_time(self):
>          """results.TestResult.to_json: sets the time correctly"""
>          nt.eq_(self.dict['time'], self.json['time'])
> @@ -244,6 +249,7 @@ class TestTestResult_from_dict(object):
>                  'b': 'fail',
>              },
>              'result': 'crash',
> +            'exception': 'an exception',
>          }
>  
>          cls.test = results.TestResult.from_dict(cls.dict)
> @@ -268,6 +274,10 @@ class TestTestResult_from_dict(object):
>          """results.TestResult.from_dict: sets environment properly"""
>          nt.eq_(self.test.environment, self.dict['environment'])
>  
> +    def test_exception(self):
> +        """results.TestResult.from_dict: sets exception properly"""
> +        nt.eq_(self.test.exception, self.dict['exception'])
> +
>      def test_subtests(self):
>          """results.TestResult.from_dict: sets subtests properly"""
>          nt.eq_(self.test.subtests, self.dict['subtests'])
> -- 
> 2.6.0


More information about the Piglit mailing list