[Piglit] [PATCH 1/5] framework/html: guard against errors writing individual test results

Dylan Baker dylan at pnwbakers.com
Thu May 3 17:38:42 UTC 2018


Quoting Nicolai Hähnle (2018-05-03 01:43:52)
> On 02.05.2018 22:57, Marek Ol\u0161ák wrote:
> > On Wed, May 2, 2018 at 4:51 PM, Dylan Baker <dylan at pnwbakers.com 
> > <mailto:dylan at pnwbakers.com>> wrote:
> > 
> >     Quoting Marek Ol\u0161ák (2018-05-02 13:32:43)
> >      > From: Nicolai Hähnle <nicolai.haehnle at amd.com
> >     <mailto:nicolai.haehnle at amd.com>>
> >      >
> >      > ---
> >      >  framework/summary/html_.py | 18 +++++++++++-------
> >      >  1 file changed, 11 insertions(+), 7 deletions(-)
> >      >
> >      > diff --git a/framework/summary/html_.py b/framework/summary/html_.py
> >      > index f7fdc8576..512b42c24 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,30 @@ 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:
> >      > +                    traceback.print_exc()
> > 
> >     This makes me really nervous. What are you trying to catch, and why
> >     is it
> >     a good idea to print a traceback and continue?
> > 
> > 
> > Nicolai, do you know the answer to this one?
> 
> Some test cases have *really* long names. Especially if your test runs 
> also have long names and you're writing the results in a somewhat nested 
> place on the filesystem, writing can fail with a "filename too long" 
> kind of error here.
> 
> It is super annoying when the entire summary process fails because of 
> something silly like that: most of the time, you don't really need the 
> results files anyway.
> 
> I suppose it would be better to use shorter filenames, but when I looked 
> into it it wasn't entirely trivial to do that...
> 
> Cheers,
> Nicolai

Okay, that definitely seems like a good error to handle. I'd like to avoid
catching other errors that we should stop on like ENOPERM, so could we do
something like:

import errno

...

except OSError as e:
    if e.errno == errno.ENAMETOOLONG:
        print('WARN: file "{}" too long'.format(html_name))
    else:
        raise

Dylan

> 
> 
> > 
> > Thanks,
> > Marek
> > 
> 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 228 bytes
Desc: signature
URL: <https://lists.freedesktop.org/archives/piglit/attachments/20180503/9e9434cc/attachment.sig>


More information about the Piglit mailing list