tests: cleanup compiler_errors_test.v using language features (chan), instead of raw `sync.new_channel` and `unsafe { ch.push }` calls
parent
21308289ad
commit
888c85dedc
|
@ -4,7 +4,6 @@ import term
|
|||
import v.util.diff
|
||||
import v.util.vtest
|
||||
import time
|
||||
import sync
|
||||
import runtime
|
||||
import benchmark
|
||||
|
||||
|
@ -16,8 +15,12 @@ const skip_on_ubuntu_musl = [
|
|||
'vlib/v/checker/tests/vweb_tmpl_used_var.vv',
|
||||
]
|
||||
|
||||
const vexe = os.getenv('VEXE')
|
||||
|
||||
const turn_off_vcolors = os.setenv('VCOLORS', 'never', true)
|
||||
|
||||
const show_cmd = os.getenv('VTEST_SHOW_CMD') != ''
|
||||
|
||||
// This is needed, because some of the .vv files are tests, and we do need stable
|
||||
// output from them, that can be compared against their .out files:
|
||||
const turn_on_normal_test_runner = os.setenv('VTEST_RUNNER', 'normal', true)
|
||||
|
@ -26,6 +29,8 @@ const should_autofix = os.getenv('VAUTOFIX') != ''
|
|||
|
||||
const github_job = os.getenv('GITHUB_JOB')
|
||||
|
||||
const v_ci_ubuntu_musl = os.getenv('V_CI_UBUNTU_MUSL').len > 0
|
||||
|
||||
struct TaskDescription {
|
||||
vexe string
|
||||
evars string
|
||||
|
@ -54,7 +59,6 @@ mut:
|
|||
}
|
||||
|
||||
fn test_all() {
|
||||
vexe := os.getenv('VEXE')
|
||||
vroot := os.dir(vexe)
|
||||
os.chdir(vroot) or {}
|
||||
checker_dir := 'vlib/v/checker/tests'
|
||||
|
@ -162,15 +166,11 @@ fn (mut tasks Tasks) add(custom_vexe string, dir string, voptions string, result
|
|||
}
|
||||
|
||||
fn (mut tasks Tasks) add_evars(evars string, custom_vexe string, dir string, voptions string, result_extension string, tests []string, is_module bool) {
|
||||
mut vexe := tasks.vexe
|
||||
if custom_vexe != '' {
|
||||
vexe = custom_vexe
|
||||
}
|
||||
paths := vtest.filter_vtest_only(tests, basepath: dir)
|
||||
for path in paths {
|
||||
tasks.all << TaskDescription{
|
||||
evars: evars
|
||||
vexe: vexe
|
||||
vexe: if custom_vexe != '' { custom_vexe } else { tasks.vexe }
|
||||
dir: dir
|
||||
voptions: voptions
|
||||
result_extension: result_extension
|
||||
|
@ -186,14 +186,17 @@ fn bstep_message(mut bench benchmark.Benchmark, label string, msg string, sdurat
|
|||
|
||||
// process an array of tasks in parallel, using no more than vjobs worker threads
|
||||
fn (mut tasks Tasks) run() {
|
||||
tasks.show_cmd = os.getenv('VTEST_SHOW_CMD') != ''
|
||||
if tasks.all.len == 0 {
|
||||
return
|
||||
}
|
||||
tasks.show_cmd = show_cmd
|
||||
vjobs := if tasks.parallel_jobs > 0 { tasks.parallel_jobs } else { runtime.nr_jobs() }
|
||||
mut bench := benchmark.new_benchmark()
|
||||
bench.set_total_expected_steps(tasks.all.len)
|
||||
mut work := sync.new_channel<TaskDescription>(u32(tasks.all.len))
|
||||
mut results := sync.new_channel<TaskDescription>(u32(tasks.all.len))
|
||||
mut work := chan TaskDescription{cap: tasks.all.len}
|
||||
mut results := chan TaskDescription{cap: tasks.all.len}
|
||||
mut m_skip_files := skip_files.clone()
|
||||
if os.getenv('V_CI_UBUNTU_MUSL').len > 0 {
|
||||
if v_ci_ubuntu_musl {
|
||||
m_skip_files << skip_on_ubuntu_musl
|
||||
}
|
||||
$if noskip ? {
|
||||
|
@ -220,11 +223,11 @@ fn (mut tasks Tasks) run() {
|
|||
if tasks.all[i].path in m_skip_files {
|
||||
tasks.all[i].is_skipped = true
|
||||
}
|
||||
unsafe { work.push(&tasks.all[i]) }
|
||||
work <- tasks.all[i]
|
||||
}
|
||||
work.close()
|
||||
for _ in 0 .. vjobs {
|
||||
go work_processor(mut work, mut results)
|
||||
go work_processor(work, results)
|
||||
}
|
||||
if github_job == '' {
|
||||
println('')
|
||||
|
@ -233,7 +236,7 @@ fn (mut tasks Tasks) run() {
|
|||
mut total_errors := 0
|
||||
for _ in 0 .. tasks.all.len {
|
||||
mut task := TaskDescription{}
|
||||
results.pop(&task)
|
||||
task = <-results
|
||||
bench.step()
|
||||
if task.is_skipped {
|
||||
bench.skip()
|
||||
|
@ -285,16 +288,13 @@ fn (mut tasks Tasks) run() {
|
|||
|
||||
// a single worker thread spends its time getting work from the `work` channel,
|
||||
// processing the task, and then putting the task in the `results` channel
|
||||
fn work_processor(mut work sync.Channel, mut results sync.Channel) {
|
||||
fn work_processor(work chan TaskDescription, results chan TaskDescription) {
|
||||
for {
|
||||
mut task := TaskDescription{}
|
||||
if !work.pop(&task) {
|
||||
break
|
||||
}
|
||||
mut task := <-work or { break }
|
||||
sw := time.new_stopwatch()
|
||||
task.execute()
|
||||
task.took = sw.elapsed()
|
||||
results.push(&task)
|
||||
results <- task
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
> main start
|
||||
> work started
|
||||
> main ch.close called
|
||||
> work x: 0
|
||||
> work x: 1
|
||||
> work x: 2
|
||||
> work x: 3
|
||||
> work x: 4
|
||||
> work x: 5
|
||||
> work x: 6
|
||||
> work x: 7
|
||||
> work x: 8
|
||||
> work x: 9
|
||||
> work ended
|
||||
> main task was finished
|
|
@ -0,0 +1,29 @@
|
|||
import time
|
||||
|
||||
fn work(input chan u32, started chan bool) {
|
||||
println('> work started')
|
||||
started <- true
|
||||
for {
|
||||
x := <-input or { break }
|
||||
println('> work x: $x')
|
||||
time.sleep(50 * time.millisecond)
|
||||
}
|
||||
println('> work ended')
|
||||
}
|
||||
|
||||
fn main() {
|
||||
println('> main start')
|
||||
ch := chan u32{cap: 100}
|
||||
work_started := chan bool{}
|
||||
for x in 0 .. 10 {
|
||||
ch <- x
|
||||
}
|
||||
task := go work(ch, work_started)
|
||||
_ := <-work_started
|
||||
|
||||
ch.close()
|
||||
println('> main ch.close called')
|
||||
|
||||
task.wait()
|
||||
println('> main task was finished')
|
||||
}
|
Loading…
Reference in New Issue