diff mbox series

validation: Add patterns FAIL, PASS, XPASS and XFAIL to test

Message ID 20190131084959.10639-1-uwe@kleine-koenig.org (mailing list archive)
State Superseded, archived
Headers show
Series validation: Add patterns FAIL, PASS, XPASS and XFAIL to test | expand

Commit Message

Uwe Kleine-König Jan. 31, 2019, 8:49 a.m. UTC
This simplifies finding the offending test when the build ended with

	KO: out of 584 tests, 527 passed, 57 failed
		56 of them are known to fail

Signed-off-by: Uwe Kleine-König <uwe@kleine-koenig.org>
---
 validation/test-suite | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

Comments

Uwe Kleine-König Jan. 31, 2019, 9:23 a.m. UTC | #1
On 1/31/19 9:49 AM, Uwe Kleine-König wrote:
> This simplifies finding the offending test when the build ended with
> 
> 	KO: out of 584 tests, 527 passed, 57 failed
> 		56 of them are known to fail
> 
> Signed-off-by: Uwe Kleine-König <uwe@kleine-koenig.org>
> ---
>  validation/test-suite | 11 +++++++++--
>  1 file changed, 9 insertions(+), 2 deletions(-)
> 
> diff --git a/validation/test-suite b/validation/test-suite
> index f79a9023d95a..a5572d5e6965 100755
> --- a/validation/test-suite
> +++ b/validation/test-suite
> @@ -403,9 +403,16 @@ do_test()
>  	if [ "$must_fail" -eq "1" ]; then
>  		if [ "$test_failed" -eq "1" ]; then
>  			[ -z "$vquiet" ] && \
> -			echo "info: test '$file' is known to fail"
> +			echo "info: XFAIL: test '$file' is known to fail"
>  		else
> -			echo "error: test '$file' is known to fail but succeed!"
> +			echo "error: XPASS: test '$file' is known to fail but succeed!"
> +		fi
> +	else
> +		if [ "$test_failed" -eq "1" ]; then
> +			echo "error: FAIL: test '$file' is failed"

When reading my own patch after it returned to me in my sparse folder I
noticed a fault here. We want the "is" dropped in the above line. Should
I resend for that?

Best regards
Uwe
Luc Van Oostenryck Jan. 31, 2019, 1:02 p.m. UTC | #2
On Thu, Jan 31, 2019 at 10:23:44AM +0100, Uwe Kleine-König wrote:
> On 1/31/19 9:49 AM, Uwe Kleine-König wrote:
> > This simplifies finding the offending test when the build ended with
> > 
> > 	KO: out of 584 tests, 527 passed, 57 failed
> > 		56 of them are known to fail
> > 
> > Signed-off-by: Uwe Kleine-König <uwe@kleine-koenig.org>
> > ---
> >  validation/test-suite | 11 +++++++++--
> >  1 file changed, 9 insertions(+), 2 deletions(-)
> > 
> > diff --git a/validation/test-suite b/validation/test-suite
> > index f79a9023d95a..a5572d5e6965 100755
> > --- a/validation/test-suite
> > +++ b/validation/test-suite
> > @@ -403,9 +403,16 @@ do_test()
> >  	if [ "$must_fail" -eq "1" ]; then
> >  		if [ "$test_failed" -eq "1" ]; then
> >  			[ -z "$vquiet" ] && \
> > -			echo "info: test '$file' is known to fail"
> > +			echo "info: XFAIL: test '$file' is known to fail"
> >  		else
> > -			echo "error: test '$file' is known to fail but succeed!"
> > +			echo "error: XPASS: test '$file' is known to fail but succeed!"
> > +		fi
> > +	else
> > +		if [ "$test_failed" -eq "1" ]; then
> > +			echo "error: FAIL: test '$file' is failed"
> 
> When reading my own patch after it returned to me in my sparse folder I
> noticed a fault here. We want the "is" dropped in the above line. Should
> I resend for that?

No no, a resend is not needed at all, I've directly changed it.
 
-- Luc
Luc Van Oostenryck Jan. 31, 2019, 1:45 p.m. UTC | #3
On Thu, Jan 31, 2019 at 09:49:59AM +0100, Uwe Kleine-König wrote:
> This simplifies finding the offending test when the build ended with
> 
> 	KO: out of 584 tests, 527 passed, 57 failed
> 		56 of them are known to fail
> 
> Signed-off-by: Uwe Kleine-König <uwe@kleine-koenig.org>
> ---
>  validation/test-suite | 11 +++++++++--
>  1 file changed, 9 insertions(+), 2 deletions(-)
> 
> diff --git a/validation/test-suite b/validation/test-suite
> index f79a9023d95a..a5572d5e6965 100755
> --- a/validation/test-suite
> +++ b/validation/test-suite
> @@ -403,9 +403,16 @@ do_test()
>  	if [ "$must_fail" -eq "1" ]; then
>  		if [ "$test_failed" -eq "1" ]; then
>  			[ -z "$vquiet" ] && \
> -			echo "info: test '$file' is known to fail"
> +			echo "info: XFAIL: test '$file' is known to fail"
>  		else
> -			echo "error: test '$file' is known to fail but succeed!"
> +			echo "error: XPASS: test '$file' is known to fail but succeed!"
> +		fi
> +	else
> +		if [ "$test_failed" -eq "1" ]; then
> +			echo "error: FAIL: test '$file' is failed"
> +		else
> +			[ -z "$vquiet" ] && \
> +			echo "info: PASS: test '$file' passed"
>  		fi
>  	fi

I can understand the motivation for this but with this the default
*visual* output will be even longer and more redundant:
1) The current idea was if a test doesn't output sommething
   it's that everything was OK. With the patch there will be a
   'PASS' line for each of these tests (more than 90% of them).
2) every FAIL tests have already of line displayed with
   "error: test ... failed" just before the details of the
   failure are displayed (which means that such a line can be
   displayed several time for the same test: bad) and the line
   with FAIL is displayed at the end of the test.
3) in the same message 'XFAIL' & 'is known to fail',
   'XPASS' & 'is known to fail but succeed' and 'FAIL' & 'failed'
   really mean the same (and all of them are grepable); it's just that
   one seems to for humans and the others for some script.

Point 3) doesn't bother me much.
Point 2) is easily fixable (both removing the current repetition in
case of multiple failure in the same test file and the repetion with
FAIL).
Point 1) really bothers me.

I propose to:
*) simply drop the 'PASS' part of the patch
*) add a new flag for test-suite (for example --machine-testing) to:
   -) not display the 'PASS' lines when the flag is not set
   -) display the FAIL, XFAIL, ... tags only when the flag is set
  (I suppose that these FAIL, XFAIL, XPASS ... tags will be used or
  are already used in some concrete automatic system so it wouldn't be
  a problem to launch the testsuite with a flag).
This will keep the current default output (human-)user friendly.

Any thoughts?

-- Luc
Uwe Kleine-König Jan. 31, 2019, 9:13 p.m. UTC | #4
On Thu, Jan 31, 2019 at 02:45:04PM +0100, Luc Van Oostenryck wrote:
> On Thu, Jan 31, 2019 at 09:49:59AM +0100, Uwe Kleine-König wrote:
> > This simplifies finding the offending test when the build ended with
> > 
> > 	KO: out of 584 tests, 527 passed, 57 failed
> > 		56 of them are known to fail
> > 
> > Signed-off-by: Uwe Kleine-König <uwe@kleine-koenig.org>
> > ---
> >  validation/test-suite | 11 +++++++++--
> >  1 file changed, 9 insertions(+), 2 deletions(-)
> > 
> > diff --git a/validation/test-suite b/validation/test-suite
> > index f79a9023d95a..a5572d5e6965 100755
> > --- a/validation/test-suite
> > +++ b/validation/test-suite
> > @@ -403,9 +403,16 @@ do_test()
> >  	if [ "$must_fail" -eq "1" ]; then
> >  		if [ "$test_failed" -eq "1" ]; then
> >  			[ -z "$vquiet" ] && \
> > -			echo "info: test '$file' is known to fail"
> > +			echo "info: XFAIL: test '$file' is known to fail"
> >  		else
> > -			echo "error: test '$file' is known to fail but succeed!"
> > +			echo "error: XPASS: test '$file' is known to fail but succeed!"
> > +		fi
> > +	else
> > +		if [ "$test_failed" -eq "1" ]; then
> > +			echo "error: FAIL: test '$file' is failed"
> > +		else
> > +			[ -z "$vquiet" ] && \
> > +			echo "info: PASS: test '$file' passed"
> >  		fi
> >  	fi
> 
> I can understand the motivation for this but with this the default
> *visual* output will be even longer and more redundant:
> 1) The current idea was if a test doesn't output sommething
>    it's that everything was OK. With the patch there will be a
>    'PASS' line for each of these tests (more than 90% of them).

For me the typical passing test looks as follows:

  TEST    extern inline function (extern-inline.c)
        Using command       : sparse $file $file
        Expecting exit value: 0

that's because the package build scripts passes V=1 to all invocations
of make; without V=1 there is only the TEST line for succeeding tests.

For a build log I think it is sensible to have it more verbose to make
eventual failures easier to understand, so passing V=1 is good. (This is
even recommended practise for Debian packages.)

The output for one of the 56 tests that fail expectedly the output looks
as follows (with V=1):

	  TEST    enum+mode (enum+mode.c)
		Using command       : sparse $file
		Expecting exit value: 0
	error: actual error text does not match expected error text.
	error: see enum+mode.c.error.* for further investigation.
	--- enum+mode.c.error.expected	2019-01-31 03:18:58.329248245 +0000
	+++ enum+mode.c.error.got	2019-01-31 03:18:58.329248245 +0000
	@@ -0,0 +1,5 @@
	+enum+mode.c:4:50: error: don't know how to apply mode to unsigned int enum e
	+enum+mode.c:5:50: error: don't know how to apply mode to unsigned int enum e
	+enum+mode.c:6:48: error: don't know how to apply mode to unsigned int enum e
	+enum+mode.c:11:28: error: static assertion failed: ""
	+enum+mode.c:13:28: error: static assertion failed: ""
	info: test 'enum+mode.c' is known to fail

which makes it hard to find the one unexpectedly failing test because
there is no pattern to look for. I need something with "error" that
isn't followd by "is known to fail".


> 2) every FAIL tests have already of line displayed with
>    "error: test ... failed" just before the details of the
>    failure are displayed (which means that such a line can be
>    displayed several time for the same test: bad) and the line
>    with FAIL is displayed at the end of the test.
> 3) in the same message 'XFAIL' & 'is known to fail',
>    'XPASS' & 'is known to fail but succeed' and 'FAIL' & 'failed'
>    really mean the same (and all of them are grepable); it's just that
>    one seems to for humans and the others for some script.

My usecase is really to check build logs (e.g.
https://buildd.debian.org/status/fetch.php?pkg=sparse&arch=mipsel&ver=0.6.0-1&stamp=1548904760&raw=0).

If I search for "failed" I get 36 matches. "error: test" yields 32.

> Point 3) doesn't bother me much.
> Point 2) is easily fixable (both removing the current repetition in
> case of multiple failure in the same test file and the repetion with
> FAIL).
> Point 1) really bothers me.
> 
> I propose to:
> *) simply drop the 'PASS' part of the patch
> *) add a new flag for test-suite (for example --machine-testing) to:
>    -) not display the 'PASS' lines when the flag is not set
>    -) display the FAIL, XFAIL, ... tags only when the flag is set
>   (I suppose that these FAIL, XFAIL, XPASS ... tags will be used or
>   are already used in some concrete automatic system so it wouldn't be
>   a problem to launch the testsuite with a flag).
> This will keep the current default output (human-)user friendly.
> 
> Any thoughts?

If you want to keep it short by default, what about dropping the line

	  TEST    extern inline function (extern-inline.c)

before starting the test and make this

	  PASS    extern inline function (extern-inline.c)

at the end of the test instead? Then instead of

	  TEST    bitfield-bool-layout (bitfield-bool-layout.c)
	info: test 'bitfield-bool-layout.c' is known to fail

we could have:

	  XFAIL   bitfield-bool-layout (bitfield-bool-layout.c)

which is even shorter. And a failing test could look as follows:

	error: test 'preprocessor/predef-lp64.c' failed
	error: 	Pattern 'ret\..*\$0' unexpectedly absent
	  FAIL    predefined macros for LP64 (preprocessor/predef-lp64.c)

(Maybe even drop the error: lines in non-verbose mode?)

Best regards
Uwe
Luc Van Oostenryck Jan. 31, 2019, 11:54 p.m. UTC | #5
On Thu, Jan 31, 2019 at 10:13:25PM +0100, Uwe Kleine-König wrote:
> On Thu, Jan 31, 2019 at 02:45:04PM +0100, Luc Van Oostenryck wrote:
> > On Thu, Jan 31, 2019 at 09:49:59AM +0100, Uwe Kleine-König wrote:
> > > This simplifies finding the offending test when the build ended with
> > > 
> > > 	KO: out of 584 tests, 527 passed, 57 failed
> > > 		56 of them are known to fail
> > > 
> > > Signed-off-by: Uwe Kleine-König <uwe@kleine-koenig.org>
> > > ---
> > >  validation/test-suite | 11 +++++++++--
> > >  1 file changed, 9 insertions(+), 2 deletions(-)
> > > 
> > > diff --git a/validation/test-suite b/validation/test-suite
> > > index f79a9023d95a..a5572d5e6965 100755
> > > --- a/validation/test-suite
> > > +++ b/validation/test-suite
> > > @@ -403,9 +403,16 @@ do_test()
> > >  	if [ "$must_fail" -eq "1" ]; then
> > >  		if [ "$test_failed" -eq "1" ]; then
> > >  			[ -z "$vquiet" ] && \
> > > -			echo "info: test '$file' is known to fail"
> > > +			echo "info: XFAIL: test '$file' is known to fail"
> > >  		else
> > > -			echo "error: test '$file' is known to fail but succeed!"
> > > +			echo "error: XPASS: test '$file' is known to fail but succeed!"
> > > +		fi
> > > +	else
> > > +		if [ "$test_failed" -eq "1" ]; then
> > > +			echo "error: FAIL: test '$file' is failed"
> > > +		else
> > > +			[ -z "$vquiet" ] && \
> > > +			echo "info: PASS: test '$file' passed"
> > >  		fi
> > >  	fi
> > 
> > I can understand the motivation for this but with this the default
> > *visual* output will be even longer and more redundant:
> > 1) The current idea was if a test doesn't output sommething
> >    it's that everything was OK. With the patch there will be a
> >    'PASS' line for each of these tests (more than 90% of them).
> 
> For me the typical passing test looks as follows:
> 
>   TEST    extern inline function (extern-inline.c)
>         Using command       : sparse $file $file
>         Expecting exit value: 0
> 
> that's because the package build scripts passes V=1 to all invocations
> of make; without V=1 there is only the TEST line for succeeding tests.

OK, I see.
But with your patch, doesn't it also output the PASS line?
	  TEST    extern inline function (extern-inline.c)
	        Using command       : sparse $file $file
	        Expecting exit value: 0
	info: PASS: test 'extern-inline.c' passed
 
> For a build log I think it is sensible to have it more verbose to make
> eventual failures easier to understand, so passing V=1 is good. (This is
> even recommended practise for Debian packages.)

Sure, it makes totally sense.

> The output for one of the 56 tests that fail expectedly the output looks
> as follows (with V=1):
> 
> 	  TEST    enum+mode (enum+mode.c)
> 		Using command       : sparse $file
> 		Expecting exit value: 0
> 	error: actual error text does not match expected error text.
> 	error: see enum+mode.c.error.* for further investigation.
> 	--- enum+mode.c.error.expected	2019-01-31 03:18:58.329248245 +0000
> 	+++ enum+mode.c.error.got	2019-01-31 03:18:58.329248245 +0000
> 	@@ -0,0 +1,5 @@
> 	+enum+mode.c:4:50: error: don't know how to apply mode to unsigned int enum e
> 	+enum+mode.c:5:50: error: don't know how to apply mode to unsigned int enum e
> 	+enum+mode.c:6:48: error: don't know how to apply mode to unsigned int enum e
> 	+enum+mode.c:11:28: error: static assertion failed: ""
> 	+enum+mode.c:13:28: error: static assertion failed: ""
> 	info: test 'enum+mode.c' is known to fail
> 
> which makes it hard to find the one unexpectedly failing test because
> there is no pattern to look for. I need something with "error" that
> isn't followd by "is known to fail".

Yes, I agree. The handling of known-to-fail is quite bad in verbose mode.
> 
> > 2) every FAIL tests have already of line displayed with
> >    "error: test ... failed" just before the details of the
> >    failure are displayed (which means that such a line can be
> >    displayed several time for the same test: bad) and the line
> >    with FAIL is displayed at the end of the test.
> > 3) in the same message 'XFAIL' & 'is known to fail',
> >    'XPASS' & 'is known to fail but succeed' and 'FAIL' & 'failed'
> >    really mean the same (and all of them are grepable); it's just that
> >    one seems to for humans and the others for some script.
> 
> My usecase is really to check build logs (e.g.
> https://buildd.debian.org/status/fetch.php?pkg=sparse&arch=mipsel&ver=0.6.0-1&stamp=1548904760&raw=0).
> 
> If I search for "failed" I get 36 matches. "error: test" yields 32.
> 
> > Point 3) doesn't bother me much.
> > Point 2) is easily fixable (both removing the current repetition in
> > case of multiple failure in the same test file and the repetion with
> > FAIL).
> > Point 1) really bothers me.
> > 
> > I propose to:
> > *) simply drop the 'PASS' part of the patch
> > *) add a new flag for test-suite (for example --machine-testing) to:
> >    -) not display the 'PASS' lines when the flag is not set
> >    -) display the FAIL, XFAIL, ... tags only when the flag is set
> >   (I suppose that these FAIL, XFAIL, XPASS ... tags will be used or
> >   are already used in some concrete automatic system so it wouldn't be
> >   a problem to launch the testsuite with a flag).
> > This will keep the current default output (human-)user friendly.
> > 
> > Any thoughts?
> 
> If you want to keep it short by default, what about dropping the line
> 
> 	  TEST    extern inline function (extern-inline.c)
> 
> before starting the test and make this
> 
> 	  PASS    extern inline function (extern-inline.c)
> 
> at the end of the test instead? Then instead of
> 
> 	  TEST    bitfield-bool-layout (bitfield-bool-layout.c)
> 	info: test 'bitfield-bool-layout.c' is known to fail
> 
> we could have:
> 
> 	  XFAIL   bitfield-bool-layout (bitfield-bool-layout.c)
> 
> which is even shorter. And a failing test could look as follows:
> 
> 	error: test 'preprocessor/predef-lp64.c' failed
> 	error: 	Pattern 'ret\..*\$0' unexpectedly absent
> 	  FAIL    predefined macros for LP64 (preprocessor/predef-lp64.c)
> 
> (Maybe even drop the error: lines in non-verbose mode?)

The actual use of the 'TEST' lines is partially historical and
partially because I tend to like to have a line with the name
of the file before any details of the error.

Now that I understand your usecase and you make me remember
the problem with the output of known-to-fail test, I'll cook
something that should satisfy everybody (but I don't think that
I'll be be able to do that tomorrow, this WE is FOSDEM, ...).

Thanks for everything.
-- Luc
diff mbox series

Patch

diff --git a/validation/test-suite b/validation/test-suite
index f79a9023d95a..a5572d5e6965 100755
--- a/validation/test-suite
+++ b/validation/test-suite
@@ -403,9 +403,16 @@  do_test()
 	if [ "$must_fail" -eq "1" ]; then
 		if [ "$test_failed" -eq "1" ]; then
 			[ -z "$vquiet" ] && \
-			echo "info: test '$file' is known to fail"
+			echo "info: XFAIL: test '$file' is known to fail"
 		else
-			echo "error: test '$file' is known to fail but succeed!"
+			echo "error: XPASS: test '$file' is known to fail but succeed!"
+		fi
+	else
+		if [ "$test_failed" -eq "1" ]; then
+			echo "error: FAIL: test '$file' is failed"
+		else
+			[ -z "$vquiet" ] && \
+			echo "info: PASS: test '$file' passed"
 		fi
 	fi