tests: support for marking _test.v files with `// vtest flaky: true`, to reduce false positives from the CI
							parent
							
								
									1ad84bb2d1
								
							
						
					
					
						commit
						76c67952e6
					
				| 
						 | 
				
			
			@ -19,6 +19,8 @@ pub const hide_oks = os.getenv('VTEST_HIDE_OK') == '1'
 | 
			
		|||
 | 
			
		||||
pub const fail_fast = os.getenv('VTEST_FAIL_FAST') == '1'
 | 
			
		||||
 | 
			
		||||
pub const fail_flaky = os.getenv('VTEST_FAIL_FLAKY') == '1'
 | 
			
		||||
 | 
			
		||||
pub const test_only = os.getenv('VTEST_ONLY').split_any(',')
 | 
			
		||||
 | 
			
		||||
pub const test_only_fn = os.getenv('VTEST_ONLY_FN').split_any(',')
 | 
			
		||||
| 
						 | 
				
			
			@ -362,7 +364,7 @@ fn worker_trunner(mut p pool.PoolProcessor, idx int, thread_id int) voidptr {
 | 
			
		|||
			details := get_test_details(file)
 | 
			
		||||
			os.setenv('VTEST_RETRY_MAX', '$details.retry', true)
 | 
			
		||||
			for retry := 1; retry <= details.retry; retry++ {
 | 
			
		||||
				ts.append_message(.info, '                 retrying $retry/$details.retry of $relative_file ...')
 | 
			
		||||
				ts.append_message(.info, '  [stats]        retrying $retry/$details.retry of $relative_file ; known flaky: $details.flaky ...')
 | 
			
		||||
				os.setenv('VTEST_RETRY', '$retry', true)
 | 
			
		||||
				status = os.system(cmd)
 | 
			
		||||
				if status == 0 {
 | 
			
		||||
| 
						 | 
				
			
			@ -372,6 +374,10 @@ fn worker_trunner(mut p pool.PoolProcessor, idx int, thread_id int) voidptr {
 | 
			
		|||
				}
 | 
			
		||||
				time.sleep(500 * time.millisecond)
 | 
			
		||||
			}
 | 
			
		||||
			if details.flaky && !testing.fail_flaky {
 | 
			
		||||
				ts.append_message(.info, '   *FAILURE* of the known flaky test file $relative_file is ignored, since VTEST_FAIL_FLAKY is 0 . Retry count: $details.retry .')
 | 
			
		||||
				goto test_passed_system
 | 
			
		||||
			}
 | 
			
		||||
			ts.failed = true
 | 
			
		||||
			ts.benchmark.fail()
 | 
			
		||||
			tls_bench.fail()
 | 
			
		||||
| 
						 | 
				
			
			@ -399,7 +405,7 @@ fn worker_trunner(mut p pool.PoolProcessor, idx int, thread_id int) voidptr {
 | 
			
		|||
			details := get_test_details(file)
 | 
			
		||||
			os.setenv('VTEST_RETRY_MAX', '$details.retry', true)
 | 
			
		||||
			for retry := 1; retry <= details.retry; retry++ {
 | 
			
		||||
				ts.append_message(.info, '                 retrying $retry/$details.retry of $relative_file ...')
 | 
			
		||||
				ts.append_message(.info, '                 retrying $retry/$details.retry of $relative_file ; known flaky: $details.flaky ...')
 | 
			
		||||
				os.setenv('VTEST_RETRY', '$retry', true)
 | 
			
		||||
				r = os.execute(cmd)
 | 
			
		||||
				if r.exit_code == 0 {
 | 
			
		||||
| 
						 | 
				
			
			@ -408,6 +414,10 @@ fn worker_trunner(mut p pool.PoolProcessor, idx int, thread_id int) voidptr {
 | 
			
		|||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if details.flaky && !testing.fail_flaky {
 | 
			
		||||
				ts.append_message(.info, '   *FAILURE* of the known flaky test file $relative_file is ignored, since VTEST_FAIL_FLAKY is 0 . Retry count: $details.retry .')
 | 
			
		||||
				goto test_passed_system
 | 
			
		||||
			}
 | 
			
		||||
			ts.failed = true
 | 
			
		||||
			ts.benchmark.fail()
 | 
			
		||||
			tls_bench.fail()
 | 
			
		||||
| 
						 | 
				
			
			@ -562,6 +572,7 @@ pub fn setup_new_vtmp_folder() string {
 | 
			
		|||
pub struct TestDetails {
 | 
			
		||||
pub mut:
 | 
			
		||||
	retry int
 | 
			
		||||
	flaky bool // when flaky tests fail, the whole run is still considered successfull, unless VTEST_FAIL_FLAKY is 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn get_test_details(file string) TestDetails {
 | 
			
		||||
| 
						 | 
				
			
			@ -571,6 +582,9 @@ pub fn get_test_details(file string) TestDetails {
 | 
			
		|||
		if line.starts_with('// vtest retry:') {
 | 
			
		||||
			res.retry = line.all_after(':').trim_space().int()
 | 
			
		||||
		}
 | 
			
		||||
		if line.starts_with('// vtest flaky:') {
 | 
			
		||||
			res.flaky = line.all_after(':').trim_space().bool()
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return res
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,3 +1,4 @@
 | 
			
		|||
// vtest flaky: true
 | 
			
		||||
// vtest retry: 3
 | 
			
		||||
import context
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,3 +1,4 @@
 | 
			
		|||
// vtest flaky: true
 | 
			
		||||
// vtest retry: 8
 | 
			
		||||
import net
 | 
			
		||||
import os
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,3 +1,4 @@
 | 
			
		|||
// vtest flaky: true
 | 
			
		||||
// vtest retry: 3
 | 
			
		||||
import os
 | 
			
		||||
import os.notify
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,3 +1,4 @@
 | 
			
		|||
// vtest flaky: true
 | 
			
		||||
// vtest retry: 3
 | 
			
		||||
import os
 | 
			
		||||
import time
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,3 +1,4 @@
 | 
			
		|||
// vtest flaky: true
 | 
			
		||||
// vtest retry: 15
 | 
			
		||||
 | 
			
		||||
// This test case runs concurrent 3 instances of `do_select` that
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,6 @@
 | 
			
		|||
module sync
 | 
			
		||||
 | 
			
		||||
// vtest flaky: true
 | 
			
		||||
// vtest retry: 6
 | 
			
		||||
 | 
			
		||||
// ATTENTION! Do not use this file as an example!
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,7 @@
 | 
			
		|||
import os
 | 
			
		||||
import time
 | 
			
		||||
 | 
			
		||||
// vtest flaky: true
 | 
			
		||||
// vtest retry: 4
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,3 +1,4 @@
 | 
			
		|||
// vtest flaky: true
 | 
			
		||||
// vtest retry: 3
 | 
			
		||||
import os
 | 
			
		||||
import time
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,3 +1,4 @@
 | 
			
		|||
// vtest flaky: true
 | 
			
		||||
// vtest retry: 3
 | 
			
		||||
 | 
			
		||||
fn sum1(a int, b int) int {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,3 +1,4 @@
 | 
			
		|||
// vtest flaky: true
 | 
			
		||||
// vtest retry: 3
 | 
			
		||||
 | 
			
		||||
fn f(x f64) f64 {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,3 +1,4 @@
 | 
			
		|||
// vtest flaky: true
 | 
			
		||||
// vtest retry: 3
 | 
			
		||||
 | 
			
		||||
fn f(n int) ?f64 {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,3 +1,4 @@
 | 
			
		|||
// vtest flaky: true
 | 
			
		||||
// vtest retry: 4
 | 
			
		||||
import sync
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,3 +1,4 @@
 | 
			
		|||
// vtest flaky: true
 | 
			
		||||
// vtest retry: 4
 | 
			
		||||
/*
 | 
			
		||||
* To verify the effect of "[keep_args_alive]", this attribute may be commented out.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,3 +1,4 @@
 | 
			
		|||
// vtest flaky: true
 | 
			
		||||
// vtest retry: 3
 | 
			
		||||
import sync
 | 
			
		||||
import time
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue