[1/3] framework/html: guard against errors writing individual test results

Submitted by Marek Olšák on May 30, 2018, 8:04 p.m.

Details

Message ID 20180530200448.25471-1-maraeo@gmail.com
State New
Headers show
Series "Series without cover letter" ( rev: 2 1 ) in Piglit

Not browsing as part of any series.

Commit Message

Marek Olšák May 30, 2018, 8:04 p.m.
From: Nicolai Hähnle <nicolai.haehnle@amd.com>

v2: check ENAMETOOLONG
---
 framework/summary/html_.py | 21 ++++++++++++++-------
 1 file changed, 14 insertions(+), 7 deletions(-)

Patch hide | download patch | download mbox

diff --git a/framework/summary/html_.py b/framework/summary/html_.py
index f7fdc8576..14dd76fa8 100644
--- a/framework/summary/html_.py
+++ b/framework/summary/html_.py
@@ -24,20 +24,21 @@ 
 
 from __future__ import (
     absolute_import, division, print_function, unicode_literals
 )
 import errno
 import getpass
 import os
 import shutil
 import sys
 import tempfile
+import traceback
 
 import mako
 from mako.lookup import TemplateLookup
 import six
 
 # a local variable status exists, prevent accidental overloading by renaming
 # the module
 from framework import backends, exceptions, core
 
 from .common import Results, escape_filename, escape_pathname
@@ -106,27 +107,33 @@  def _make_testrun_info(results, destination, exclude=None):
 
         # Then build the individual test results
         for key, value in six.iteritems(each.tests):
             html_path = os.path.join(destination, name,
                                      escape_filename(key + ".html"))
             temp_path = os.path.dirname(html_path)
 
             if value.result not in exclude:
                 core.check_dir(temp_path)
 
-                with open(html_path, 'wb') as out:
-                    out.write(_TEMPLATES.get_template(
-                        'test_result.mako').render(
-                            testname=key,
-                            value=value,
-                            css=os.path.relpath(result_css, temp_path),
-                            index=os.path.relpath(index, temp_path)))
+                try:
+                    with open(html_path, 'wb') as out:
+                        out.write(_TEMPLATES.get_template(
+                            'test_result.mako').render(
+                                testname=key,
+                                value=value,
+                                css=os.path.relpath(result_css, temp_path),
+                                index=os.path.relpath(index, temp_path)))
+                except OSError as e:
+                    if e.errno == errno.ENAMETOOLONG:
+                        print('WARN: filename "{}" too long'.format(html_name))
+                    else:
+                        raise
 
 
 def _make_comparison_pages(results, destination, exclude):
     """Create the pages of comparisons."""
     pages = frozenset(['changes', 'problems', 'skips', 'fixes',
                        'regressions', 'enabled', 'disabled'])
 
     # Index.html is a bit of a special case since there is index, all, and
     # alltests, where the other pages all use the same name. ie,
     # changes.html, changes, and page=changes.

Comments

Reviewed-by: Dylan Baker <dylan@pnwbakers.com>

Quoting Marek Olšák (2018-05-30 13:04:46)
> From: Nicolai Hähnle <nicolai.haehnle@amd.com>
> 
> v2: check ENAMETOOLONG
> ---
>  framework/summary/html_.py | 21 ++++++++++++++-------
>  1 file changed, 14 insertions(+), 7 deletions(-)
> 
> diff --git a/framework/summary/html_.py b/framework/summary/html_.py
> index f7fdc8576..14dd76fa8 100644
> --- a/framework/summary/html_.py
> +++ b/framework/summary/html_.py
> @@ -24,20 +24,21 @@
>  
>  from __future__ import (
>      absolute_import, division, print_function, unicode_literals
>  )
>  import errno
>  import getpass
>  import os
>  import shutil
>  import sys
>  import tempfile
> +import traceback
>  
>  import mako
>  from mako.lookup import TemplateLookup
>  import six
>  
>  # a local variable status exists, prevent accidental overloading by renaming
>  # the module
>  from framework import backends, exceptions, core
>  
>  from .common import Results, escape_filename, escape_pathname
> @@ -106,27 +107,33 @@ def _make_testrun_info(results, destination, exclude=None):
>  
>          # Then build the individual test results
>          for key, value in six.iteritems(each.tests):
>              html_path = os.path.join(destination, name,
>                                       escape_filename(key + ".html"))
>              temp_path = os.path.dirname(html_path)
>  
>              if value.result not in exclude:
>                  core.check_dir(temp_path)
>  
> -                with open(html_path, 'wb') as out:
> -                    out.write(_TEMPLATES.get_template(
> -                        'test_result.mako').render(
> -                            testname=key,
> -                            value=value,
> -                            css=os.path.relpath(result_css, temp_path),
> -                            index=os.path.relpath(index, temp_path)))
> +                try:
> +                    with open(html_path, 'wb') as out:
> +                        out.write(_TEMPLATES.get_template(
> +                            'test_result.mako').render(
> +                                testname=key,
> +                                value=value,
> +                                css=os.path.relpath(result_css, temp_path),
> +                                index=os.path.relpath(index, temp_path)))
> +                except OSError as e:
> +                    if e.errno == errno.ENAMETOOLONG:
> +                        print('WARN: filename "{}" too long'.format(html_name))
> +                    else:
> +                        raise
>  
>  
>  def _make_comparison_pages(results, destination, exclude):
>      """Create the pages of comparisons."""
>      pages = frozenset(['changes', 'problems', 'skips', 'fixes',
>                         'regressions', 'enabled', 'disabled'])
>  
>      # Index.html is a bit of a special case since there is index, all, and
>      # alltests, where the other pages all use the same name. ie,
>      # changes.html, changes, and page=changes.
> -- 
> 2.17.0
> 
> _______________________________________________
> Piglit mailing list
> Piglit@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/piglit