<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On 10 July 2015 at 19:24, Dylan Baker <span dir="ltr"><<a href="mailto:baker.dylan.c@gmail.com" target="_blank">baker.dylan.c@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Thomas,<br>
<br>
I meant to get back to you earlier on this, but I forgot yesterday when<br>
I got bogged down in Jenkins madness.<br>
<br>
Anyway, if you have a look at the (I think) 2nd patch in my python3<br>
series, you'll notice that I had the idea that we could set timeouts in<br>
classes on a per class basis. This presents a problem for using a<br>
universal test time overwrite, especially when you consider that we also<br>
may need per-test overwrites (some of the piglit tests are really long,<br>
some of them are really short).<br>
<br>
Do you want to have an igt only override, or should we try to figure out<br>
how to make something that will work universally?<br></blockquote><div><br></div><div>The idea was to allow the user to temporarily change the timeout that applied to all tests. It could include a parameter to ensure that timeout durations are only ever reduced or increased.<br><br><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Dylan<br>
<div><div><br>
On Thu, Jul 09, 2015 at 06:05:56PM +0100, Thomas Wood wrote:<br>
> Signed-off-by: Thomas Wood <<a href="mailto:thomas.wood@intel.com" target="_blank">thomas.wood@intel.com</a>><br>
> ---<br>
>  framework/core.py             | 6 +++++-<br>
>  framework/programs/run.py     | 8 ++++++--<br>
>  framework/test/base.py        | 7 +++----<br>
>  framework/tests/base_tests.py | 2 +-<br>
>  tests/igt.py                  | 3 ++-<br>
>  5 files changed, 17 insertions(+), 9 deletions(-)<br>
><br>
> diff --git a/framework/core.py b/framework/core.py<br>
> index f9cdbfe..45d2552 100644<br>
> --- a/framework/core.py<br>
> +++ b/framework/core.py<br>
> @@ -146,10 +146,13 @@ class Options(object):<br>
>      valgrind -- True if valgrind is to be used<br>
>      dmesg -- True if dmesg checking is desired. This forces concurrency off<br>
>      env -- environment variables set for each test before run<br>
> +    sync -- Sync results to disk after every test<br>
> +    timeout -- Number of seconds before a test is assumed to have failed<br>
><br>
>      """<br>
>      def __init__(self, concurrent=True, execute=True, include_filter=None,<br>
> -                 exclude_filter=None, valgrind=False, dmesg=False, sync=False):<br>
> +                 exclude_filter=None, valgrind=False, dmesg=False, sync=False,<br>
> +                 timeout=None):<br>
>          self.concurrent = concurrent<br>
>          self.execute = execute<br>
>          self.filter = \<br>
> @@ -160,6 +163,7 @@ class Options(object):<br>
>          self.valgrind = valgrind<br>
>          self.dmesg = dmesg<br>
>          self.sync = sync<br>
> +        self.timeout = int(timeout) if timeout else None<br>
><br>
>          # env is used to set some base environment variables that are not going<br>
>          # to change across runs, without sending them to os.environ which is<br>
> diff --git a/framework/programs/run.py b/framework/programs/run.py<br>
> index 2981ffa..f852ba4 100644<br>
> --- a/framework/programs/run.py<br>
> +++ b/framework/programs/run.py<br>
> @@ -179,6 +179,8 @@ def _run_parser(input_):<br>
>                              help="Set the logger verbosity level")<br>
>      parser.add_argument("--test-list",<br>
>                          help="A file containing a list of tests to run")<br>
> +    parser.add_argument("--timeout",<br>
> +                        help="Number of seconds before a test is assumed to have failed")<br>
>      parser.add_argument("test_profile",<br>
>                          metavar="<Profile path(s)>",<br>
>                          nargs='+',<br>
> @@ -257,7 +259,8 @@ def run(input_):<br>
>                          execute=args.execute,<br>
>                          valgrind=args.valgrind,<br>
>                          dmesg=args.dmesg,<br>
> -                        sync=args.sync)<br>
> +                        sync=args.sync,<br>
> +                        timeout=args.timeout)<br>
><br>
>      # Set the platform to pass to waffle<br>
>      opts.env['PIGLIT_PLATFORM'] = args.platform<br>
> @@ -325,7 +328,8 @@ def resume(input_):<br>
>                          execute=results.options['execute'],<br>
>                          valgrind=results.options['valgrind'],<br>
>                          dmesg=results.options['dmesg'],<br>
> -                        sync=results.options['sync'])<br>
> +                        sync=results.options['sync'],<br>
> +                        timeout=results.options['timeout'])<br>
><br>
>      core.get_config(args.config_file)<br>
><br>
> diff --git a/framework/test/base.py b/framework/test/base.py<br>
> index b4ee4ad..9f43673 100644<br>
> --- a/framework/test/base.py<br>
> +++ b/framework/test/base.py<br>
> @@ -146,7 +146,6 @@ class Test(object):<br>
>      __metaclass__ = abc.ABCMeta<br>
>      __slots__ = ['run_concurrent', 'env', 'result', 'cwd', '_command',<br>
>                   '_test_hook_execute_run', '__proc_timeout']<br>
> -    timeout = 0<br>
><br>
>      def __init__(self, command, run_concurrent=False):<br>
>          assert isinstance(command, list), command<br>
> @@ -244,7 +243,7 @@ class Test(object):<br>
><br>
>          if _is_crash_returncode(self.result['returncode']):<br>
>              # check if the process was terminated by the timeout<br>
> -            if self.timeout > 0 and self.__proc_timeout.join() > 0:<br>
> +            if self.OPTS.timeout > 0 and self.__proc_timeout.join() > 0:<br>
>                  self.result['result'] = 'timeout'<br>
>              else:<br>
>                  self.result['result'] = 'crash'<br>
> @@ -320,8 +319,8 @@ class Test(object):<br>
>              # process is still going after the timeout, then it will be killed<br>
>              # forcing the communicate function (which is a blocking call) to<br>
>              # return<br>
> -            if self.timeout > 0:<br>
> -                self.__proc_timeout = ProcessTimeout(self.timeout, proc)<br>
> +            if self.OPTS.timeout:<br>
> +                self.__proc_timeout = ProcessTimeout(self.OPTS.timeout, proc)<br>
>                  self.__proc_timeout.start()<br>
><br>
>              out, err = proc.communicate()<br>
> diff --git a/framework/tests/base_tests.py b/framework/tests/base_tests.py<br>
> index a9e0e88..5d73a9f 100644<br>
> --- a/framework/tests/base_tests.py<br>
> +++ b/framework/tests/base_tests.py<br>
> @@ -65,7 +65,7 @@ def test_timeout():<br>
><br>
>      test = TestTest(['sleep', '60'])<br>
>      test.test_interpret_result = helper<br>
> -    test.timeout = 1<br>
> +    test.OPTS.timeout = 1<br>
>      test.run()<br>
>      assert test.result['result'] == 'timeout'<br>
><br>
> diff --git a/tests/igt.py b/tests/igt.py<br>
> index 01531d2..f4db0d9 100644<br>
> --- a/tests/igt.py<br>
> +++ b/tests/igt.py<br>
> @@ -106,7 +106,8 @@ class IGTTest(Test):<br>
>              arguments = []<br>
>          super(IGTTest, self).__init__(<br>
>              [os.path.join(IGT_TEST_ROOT, binary)] + arguments)<br>
> -        self.timeout = 600<br>
> +        if not self.OPTS.timeout:<br>
> +            self.OPTS.timeout = 600<br>
><br>
>      def interpret_result(self):<br>
>          if self.result['returncode'] == 0:<br>
> --<br>
> 2.4.3<br>
><br>
</div></div>> _______________________________________________<br>
> Piglit mailing list<br>
> <a href="mailto:Piglit@lists.freedesktop.org" target="_blank">Piglit@lists.freedesktop.org</a><br>
> <a href="http://lists.freedesktop.org/mailman/listinfo/piglit" rel="noreferrer" target="_blank">http://lists.freedesktop.org/mailman/listinfo/piglit</a><br>
</blockquote></div><br></div></div>