[Piglit] [PATCH] framework/backends/json: support non-piglit junit files
Dylan Baker
dylan at pnwbakers.com
Thu Oct 27 00:13:50 UTC 2016
Quoting Mark Janes (2016-10-26 17:04:49)
> Dylan Baker <dylan at pnwbakers.com> writes:
>
> > Quoting Mark Janes (2016-10-26 16:30:12)
> >> The junit loader is unnecessarily strict with the input that it
> >> accepts. It expects input generated by piglit, but can be made to
> >> handle junit from other test suites like crucible.
> >> ---
> >> framework/backends/junit.py | 28 ++++++++++++++++++++--------
> >> 1 file changed, 20 insertions(+), 8 deletions(-)
> >>
> >> diff --git a/framework/backends/junit.py b/framework/backends/junit.py
> >> index 4c9b7af..ab14074 100644
> >> --- a/framework/backends/junit.py
> >> +++ b/framework/backends/junit.py
> >> @@ -361,14 +361,17 @@ def _load(results_file):
> >> else:
> >> run_result.name = 'junit result'
> >>
> >> - tree = etree.parse(results_file).getroot().find('.//testsuite[@name="piglit"]')
> >> + tree = etree.parse(results_file).getroot().find('.//testsuite')
> >> for test in tree.iterfind('testcase'):
> >> result = results.TestResult()
> >> # Take the class name minus the 'piglit.' element, replace junit's '.'
> >> # separator with piglit's separator, and join the group and test names
> >> - name = test.attrib['classname'].split('.', 1)[1]
> >> + name = test.attrib['name']
> >> + if 'classname' in test.attrib:
> >> + name = grouptools.join(test.attrib['classname'], name)
> >> name = name.replace('.', grouptools.SEPARATOR)
> >> - name = grouptools.join(name, test.attrib['name'])
> >> + if name.startswith("piglit"):
> >> + name = name.split(grouptools.SEPARATOR, 1)[1]
> >
> > I assumed that grouptools.split could do this, but apparently not.
> >
> >>
> >> # Remove the trailing _ if they were added (such as to api and search)
> >> if name.endswith('_'):
> >> @@ -378,14 +381,23 @@ def _load(results_file):
> >>
> >> # This is the fallback path, we'll try to overwrite this with the value
> >> # in stderr
> >> - result.time = results.TimeAttribute(end=float(test.attrib['time']))
> >> - result.err = test.find('system-err').text
> >> + result.time = results.TimeAttribute()
> >> + if 'time' in test.attrib:
> >> + result.time = results.TimeAttribute(end=float(test.attrib['time']))
> >> + result.err = ""
> >
> > result.err is initialized to "", so no need to set it.
> >
> >> + syserr = test.find('system-err')
> >> + if syserr is not None:
> >> + result.err = syserr.text
> >
> >>
> >> # The command is prepended to system-out, so we need to separate those
> >> # into two separate elements
> >> - out = test.find('system-out').text.split('\n')
> >> - result.command = out[0]
> >> - result.out = '\n'.join(out[1:])
> >> + out_tag = test.find('system-out')
> >
> >> + result.out = ""
> >> + result.command = ""
> >
> > These are initialized to "" as well.
> >
> >> + if out_tag is not None:
> >> + out = out_tag.text.split('\n')
> >> + result.command = out[0]
> >
> > This isn't right, if the suite generates stdout it is assumed that the command
> > will be the first line, but that isn't true unless piglit generates it. We
> > probably need to do like we do we do with stderr and have a "command: ..." and
> > search for that.
>
> You are right. We could use the earlier check for piglit as the first
> component in the name to conditionally take the first line as the
> command. Is that acceptable?
>
> Other suites will have an empty command in the field, which is still
> usable.
Yeah, that's probably fine.
>
> >> + result.out = '\n'.join(out[1:])
> >>
> >> # Try to get the values in stderr for time and pid
> >> for line in result.err.split('\n'):
> >> --
> >> 2.9.3
> >>
> >
> > Dylan
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 455 bytes
Desc: signature
URL: <https://lists.freedesktop.org/archives/piglit/attachments/20161026/d318fb6d/attachment-0001.sig>
More information about the Piglit
mailing list