[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [OSSTEST PATCH v12 18/21] TestSupport: Implement target_cmd_subunit a subunit stream parser into substeps



Anthony PERARD writes ("[OSSTEST PATCH v12 18/21] TestSupport: Implement 
target_cmd_subunit a subunit stream parser into substeps"):
> target_cmd_subunit can be used like target_cmd, but the command would
> needs to output a subunit v1 stream, which will be parsed and turned
> into osstest substeps. The command can be `| subunit-2to1` in order to
> turn a subunit v2 stream into v1.

Thanks.

> Currently, time is not taken into account, and all substeps will have
> bogus timestamp as the output of the command is parsed after it has
> runned.

I think this is not a critical problem, but fixing it would be nice at
some point.

> +sub subunit_result_to_osstest_result ($) {
> +    my ($ret) = @_;
> +    return "pass" if $ret eq "success" or $ret eq "successful";
> +    return "fail" if $ret eq "failure";
> +    return "skip" if $ret eq "skip";
> +    return "fail" if $ret eq "error";
> +}

I think this needs to die at the end, if the input is not recognised.

> +sub subunit_sanitize ($) {
> +    my ($testname) = @_;
> +    $testname =~ s/ /_/g;
> +    return $testname;
> +}

This function should have a more specific name.  Also it needs to be a
whitelist.

> +sub target_cmd_subunit ($$;$$) {
> +    my $stdout = IO::File::new_tmpfile();
> +    my $rc = tcmd(undef,$stdout,0, 'osstest', @_);

It would be better to staxh the original subunit output.  And I would
prefer to avoid direct use of tcmd here.  So can you introduce
   target_cmd_stashed
which calls open_unique_stashfile and tcmd, and then use that in your
subunit subroutine?  (And yes this might duplicte output I think.)

I'm not sure target_cmd_subunit is quite the right name.  Maybe
target_subunit_cmd ?

> +    while (<$stdout>) {
> +        if (/^time: (\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)(\.\d+)?Z$/) {
> +            # This is the timestamp for the next events
> +        } elsif (/^test: (.+)\n/) {
> +            $logfilename = subunit_sanitize($1) . '.log';
> +            $fh = open_unique_stashfile(\$logfilename);
> +            substep_start(subunit_sanitize($1), $logfilename);
> +        } elsif (/^(success(ful)?|failure|skip|error): (.+?)( \[( 
> multipart)?)?$/) {

Please assign your $n to local variables, rather than leaving them in
$3 etc. to be used much later.  (And don't capture things if you don't
intend to, so in that case use ?:).  What does the multpart mean ?
Does this code need to care ?  Does the subunit protocol insist that
the spaces are single spaces ?  If not you need to use \s+.  You may
want to use the extended regexp syntax.

> +            if ($4) {
> +                my $test_output = "";
> +                while (<$stdout>) {
> +                    last if (/^\]$/);
> +                    $test_output .= $_;
> +                }
> +                print $fh $test_output or die $!;

Why do you bother accumulating this in $test_output rather than just
printing it ?

Does the subunit protocol not have any escaping ?  (Ie, what happens
if a thing run as part of a subunit test actually generates a line of
log output "]" ?)  If it does havve some escaping you need to
de-escape it.

> +            }
> +            close $fh or die $!;
> +            substep_finish(subunit_sanitize($3), 
> subunit_result_to_osstest_result($1));
> +        }

What are subunit v1 consumers supposed to do with 1. unknown keywords
2. syntax errors ?

I doubt that the answer to (2) is to ignore them as you do here...

Thanks,
Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.