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