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_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 = os.getenv('VTEST_ONLY').split_any(',')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub const test_only_fn = os.getenv('VTEST_ONLY_FN').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)
 | 
								details := get_test_details(file)
 | 
				
			||||||
			os.setenv('VTEST_RETRY_MAX', '$details.retry', true)
 | 
								os.setenv('VTEST_RETRY_MAX', '$details.retry', true)
 | 
				
			||||||
			for retry := 1; retry <= details.retry; retry++ {
 | 
								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)
 | 
									os.setenv('VTEST_RETRY', '$retry', true)
 | 
				
			||||||
				status = os.system(cmd)
 | 
									status = os.system(cmd)
 | 
				
			||||||
				if status == 0 {
 | 
									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)
 | 
									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.failed = true
 | 
				
			||||||
			ts.benchmark.fail()
 | 
								ts.benchmark.fail()
 | 
				
			||||||
			tls_bench.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)
 | 
								details := get_test_details(file)
 | 
				
			||||||
			os.setenv('VTEST_RETRY_MAX', '$details.retry', true)
 | 
								os.setenv('VTEST_RETRY_MAX', '$details.retry', true)
 | 
				
			||||||
			for retry := 1; retry <= details.retry; retry++ {
 | 
								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)
 | 
									os.setenv('VTEST_RETRY', '$retry', true)
 | 
				
			||||||
				r = os.execute(cmd)
 | 
									r = os.execute(cmd)
 | 
				
			||||||
				if r.exit_code == 0 {
 | 
									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.failed = true
 | 
				
			||||||
			ts.benchmark.fail()
 | 
								ts.benchmark.fail()
 | 
				
			||||||
			tls_bench.fail()
 | 
								tls_bench.fail()
 | 
				
			||||||
| 
						 | 
					@ -562,6 +572,7 @@ pub fn setup_new_vtmp_folder() string {
 | 
				
			||||||
pub struct TestDetails {
 | 
					pub struct TestDetails {
 | 
				
			||||||
pub mut:
 | 
					pub mut:
 | 
				
			||||||
	retry int
 | 
						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 {
 | 
					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:') {
 | 
							if line.starts_with('// vtest retry:') {
 | 
				
			||||||
			res.retry = line.all_after(':').trim_space().int()
 | 
								res.retry = line.all_after(':').trim_space().int()
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							if line.starts_with('// vtest flaky:') {
 | 
				
			||||||
 | 
								res.flaky = line.all_after(':').trim_space().bool()
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return res
 | 
						return res
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,3 +1,4 @@
 | 
				
			||||||
 | 
					// vtest flaky: true
 | 
				
			||||||
// vtest retry: 3
 | 
					// vtest retry: 3
 | 
				
			||||||
import context
 | 
					import context
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,3 +1,4 @@
 | 
				
			||||||
 | 
					// vtest flaky: true
 | 
				
			||||||
// vtest retry: 8
 | 
					// vtest retry: 8
 | 
				
			||||||
import net
 | 
					import net
 | 
				
			||||||
import os
 | 
					import os
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,3 +1,4 @@
 | 
				
			||||||
 | 
					// vtest flaky: true
 | 
				
			||||||
// vtest retry: 3
 | 
					// vtest retry: 3
 | 
				
			||||||
import os
 | 
					import os
 | 
				
			||||||
import os.notify
 | 
					import os.notify
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,3 +1,4 @@
 | 
				
			||||||
 | 
					// vtest flaky: true
 | 
				
			||||||
// vtest retry: 3
 | 
					// vtest retry: 3
 | 
				
			||||||
import os
 | 
					import os
 | 
				
			||||||
import time
 | 
					import time
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,3 +1,4 @@
 | 
				
			||||||
 | 
					// vtest flaky: true
 | 
				
			||||||
// vtest retry: 15
 | 
					// vtest retry: 15
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// This test case runs concurrent 3 instances of `do_select` that
 | 
					// This test case runs concurrent 3 instances of `do_select` that
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,5 +1,6 @@
 | 
				
			||||||
module sync
 | 
					module sync
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// vtest flaky: true
 | 
				
			||||||
// vtest retry: 6
 | 
					// vtest retry: 6
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ATTENTION! Do not use this file as an example!
 | 
					// ATTENTION! Do not use this file as an example!
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,7 @@
 | 
				
			||||||
import os
 | 
					import os
 | 
				
			||||||
import time
 | 
					import time
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// vtest flaky: true
 | 
				
			||||||
// vtest retry: 4
 | 
					// vtest retry: 4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,3 +1,4 @@
 | 
				
			||||||
 | 
					// vtest flaky: true
 | 
				
			||||||
// vtest retry: 3
 | 
					// vtest retry: 3
 | 
				
			||||||
import os
 | 
					import os
 | 
				
			||||||
import time
 | 
					import time
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,3 +1,4 @@
 | 
				
			||||||
 | 
					// vtest flaky: true
 | 
				
			||||||
// vtest retry: 3
 | 
					// vtest retry: 3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn sum1(a int, b int) int {
 | 
					fn sum1(a int, b int) int {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,3 +1,4 @@
 | 
				
			||||||
 | 
					// vtest flaky: true
 | 
				
			||||||
// vtest retry: 3
 | 
					// vtest retry: 3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn f(x f64) f64 {
 | 
					fn f(x f64) f64 {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,3 +1,4 @@
 | 
				
			||||||
 | 
					// vtest flaky: true
 | 
				
			||||||
// vtest retry: 3
 | 
					// vtest retry: 3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn f(n int) ?f64 {
 | 
					fn f(n int) ?f64 {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,3 +1,4 @@
 | 
				
			||||||
 | 
					// vtest flaky: true
 | 
				
			||||||
// vtest retry: 4
 | 
					// vtest retry: 4
 | 
				
			||||||
import sync
 | 
					import sync
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,3 +1,4 @@
 | 
				
			||||||
 | 
					// vtest flaky: true
 | 
				
			||||||
// vtest retry: 4
 | 
					// vtest retry: 4
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
* To verify the effect of "[keep_args_alive]", this attribute may be commented out.
 | 
					* To verify the effect of "[keep_args_alive]", this attribute may be commented out.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,3 +1,4 @@
 | 
				
			||||||
 | 
					// vtest flaky: true
 | 
				
			||||||
// vtest retry: 3
 | 
					// vtest retry: 3
 | 
				
			||||||
import sync
 | 
					import sync
 | 
				
			||||||
import time
 | 
					import time
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue