tests: show all the failed messages even with -silent
parent
9eb655e65c
commit
fff70368b7
|
@ -20,13 +20,28 @@ pub mut:
|
||||||
silent_mode bool
|
silent_mode bool
|
||||||
progress_mode bool
|
progress_mode bool
|
||||||
root_relative bool // used by CI runs, so that the output is stable everywhere
|
root_relative bool // used by CI runs, so that the output is stable everywhere
|
||||||
nmessages chan string // many publishers, single consumer/printer
|
nmessages chan LogMessage // many publishers, single consumer/printer
|
||||||
nmessage_idx int // currently printed message index
|
nmessage_idx int // currently printed message index
|
||||||
nprint_ended chan int // read to block till printing ends, 1:1
|
nprint_ended chan int // read to block till printing ends, 1:1
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn (mut ts TestSession) append_message(msg string) {
|
enum MessageKind {
|
||||||
ts.nmessages <- msg
|
ok
|
||||||
|
fail
|
||||||
|
skip
|
||||||
|
sentinel
|
||||||
|
}
|
||||||
|
|
||||||
|
struct LogMessage {
|
||||||
|
message string
|
||||||
|
kind MessageKind
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn (mut ts TestSession) append_message(kind MessageKind, msg string) {
|
||||||
|
ts.nmessages <- LogMessage{
|
||||||
|
message: msg
|
||||||
|
kind: kind
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn (mut ts TestSession) print_messages() {
|
pub fn (mut ts TestSession) print_messages() {
|
||||||
|
@ -35,7 +50,7 @@ pub fn (mut ts TestSession) print_messages() {
|
||||||
for {
|
for {
|
||||||
// get a message from the channel of messages to be printed:
|
// get a message from the channel of messages to be printed:
|
||||||
mut rmessage := <-ts.nmessages
|
mut rmessage := <-ts.nmessages
|
||||||
if rmessage == '' {
|
if rmessage.kind == .sentinel {
|
||||||
// a sentinel for stopping the printing thread
|
// a sentinel for stopping the printing thread
|
||||||
if !ts.silent_mode && ts.progress_mode {
|
if !ts.silent_mode && ts.progress_mode {
|
||||||
eprintln('')
|
eprintln('')
|
||||||
|
@ -44,9 +59,9 @@ pub fn (mut ts TestSession) print_messages() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
ts.nmessage_idx++
|
ts.nmessage_idx++
|
||||||
msg := rmessage.replace('TMP1', '${ts.nmessage_idx:1d}').replace('TMP2', '${ts.nmessage_idx:2d}').replace('TMP3',
|
msg := rmessage.message.replace('TMP1', '${ts.nmessage_idx:1d}').replace('TMP2',
|
||||||
'${ts.nmessage_idx:3d}')
|
'${ts.nmessage_idx:2d}').replace('TMP3', '${ts.nmessage_idx:3d}')
|
||||||
is_ok := msg.contains('OK')
|
is_ok := rmessage.kind == .ok
|
||||||
//
|
//
|
||||||
time_passed := print_msg_time.elapsed().seconds()
|
time_passed := print_msg_time.elapsed().seconds()
|
||||||
if time_passed > 10 && ts.silent_mode && is_ok {
|
if time_passed > 10 && ts.silent_mode && is_ok {
|
||||||
|
@ -80,10 +95,10 @@ pub fn new_test_session(_vargs string) TestSession {
|
||||||
mut skip_files := []string{}
|
mut skip_files := []string{}
|
||||||
skip_files << '_non_existing_'
|
skip_files << '_non_existing_'
|
||||||
$if solaris {
|
$if solaris {
|
||||||
skip_files << "examples/gg/gg2.v"
|
skip_files << 'examples/gg/gg2.v'
|
||||||
skip_files << "examples/pico/pico.v"
|
skip_files << 'examples/pico/pico.v'
|
||||||
skip_files << "examples/sokol/fonts.v"
|
skip_files << 'examples/sokol/fonts.v'
|
||||||
skip_files << "examples/sokol/drawing.v"
|
skip_files << 'examples/sokol/drawing.v'
|
||||||
}
|
}
|
||||||
vargs := _vargs.replace('-progress', '').replace('-progress', '')
|
vargs := _vargs.replace('-progress', '').replace('-progress', '')
|
||||||
vexe := pref.vexe_path()
|
vexe := pref.vexe_path()
|
||||||
|
@ -138,22 +153,24 @@ pub fn (mut ts TestSession) test() {
|
||||||
}
|
}
|
||||||
remaining_files << dot_relative_file
|
remaining_files << dot_relative_file
|
||||||
}
|
}
|
||||||
remaining_files = vtest.filter_vtest_only(remaining_files, fix_slashes: false)
|
remaining_files = vtest.filter_vtest_only(remaining_files, {
|
||||||
|
fix_slashes: false
|
||||||
|
})
|
||||||
ts.files = remaining_files
|
ts.files = remaining_files
|
||||||
ts.benchmark.set_total_expected_steps(remaining_files.len)
|
ts.benchmark.set_total_expected_steps(remaining_files.len)
|
||||||
mut pool_of_test_runners := sync.new_pool_processor({
|
mut pool_of_test_runners := sync.new_pool_processor({
|
||||||
callback: worker_trunner
|
callback: worker_trunner
|
||||||
})
|
})
|
||||||
// for handling messages across threads
|
// for handling messages across threads
|
||||||
ts.nmessages = chan string{cap: 10000}
|
ts.nmessages = chan LogMessage{cap: 10000}
|
||||||
ts.nprint_ended = chan int{cap: 0}
|
ts.nprint_ended = chan int{cap: 0}
|
||||||
ts.nmessage_idx = 0
|
ts.nmessage_idx = 0
|
||||||
go ts.print_messages()
|
go ts.print_messages()
|
||||||
pool_of_test_runners.set_shared_context(ts)
|
pool_of_test_runners.set_shared_context(ts)
|
||||||
pool_of_test_runners.work_on_pointers(remaining_files.pointers())
|
pool_of_test_runners.work_on_pointers(remaining_files.pointers())
|
||||||
ts.benchmark.stop()
|
ts.benchmark.stop()
|
||||||
ts.append_message('') // send the sentinel
|
ts.append_message(.sentinel, '') // send the sentinel
|
||||||
_ := <- ts.nprint_ended // wait for the stop of the printing thread
|
_ := <-ts.nprint_ended // wait for the stop of the printing thread
|
||||||
eprintln(term.h_divider('-'))
|
eprintln(term.h_divider('-'))
|
||||||
// cleanup generated .tmp.c files after successfull tests:
|
// cleanup generated .tmp.c files after successfull tests:
|
||||||
if ts.benchmark.nfail == 0 {
|
if ts.benchmark.nfail == 0 {
|
||||||
|
@ -182,7 +199,8 @@ fn worker_trunner(mut p sync.PoolProcessor, idx int, thread_id int) voidptr {
|
||||||
// Ensure that the generated binaries will be stored in the temporary folder.
|
// Ensure that the generated binaries will be stored in the temporary folder.
|
||||||
// Remove them after a test passes/fails.
|
// Remove them after a test passes/fails.
|
||||||
fname := os.file_name(file)
|
fname := os.file_name(file)
|
||||||
generated_binary_fname := if os.user_os() == 'windows' { fname.replace('.v', '.exe') } else { fname.replace('.v', '') }
|
generated_binary_fname := if os.user_os() == 'windows' { fname.replace('.v', '.exe') } else { fname.replace('.v',
|
||||||
|
'') }
|
||||||
generated_binary_fpath := os.join_path(tmpd, generated_binary_fname)
|
generated_binary_fpath := os.join_path(tmpd, generated_binary_fname)
|
||||||
if os.exists(generated_binary_fpath) {
|
if os.exists(generated_binary_fpath) {
|
||||||
os.rm(generated_binary_fpath)
|
os.rm(generated_binary_fpath)
|
||||||
|
@ -191,48 +209,45 @@ fn worker_trunner(mut p sync.PoolProcessor, idx int, thread_id int) voidptr {
|
||||||
if !ts.vargs.contains('fmt') {
|
if !ts.vargs.contains('fmt') {
|
||||||
cmd_options << ' -o "$generated_binary_fpath"'
|
cmd_options << ' -o "$generated_binary_fpath"'
|
||||||
}
|
}
|
||||||
cmd := '"${ts.vexe}" ' + cmd_options.join(' ') + ' "${file}"'
|
cmd := '"$ts.vexe" ' + cmd_options.join(' ') + ' "$file"'
|
||||||
// eprintln('>>> v cmd: $cmd')
|
// eprintln('>>> v cmd: $cmd')
|
||||||
ts.benchmark.step()
|
ts.benchmark.step()
|
||||||
tls_bench.step()
|
tls_bench.step()
|
||||||
if relative_file.replace('\\', '/') in ts.skip_files {
|
if relative_file.replace('\\', '/') in ts.skip_files {
|
||||||
ts.benchmark.skip()
|
ts.benchmark.skip()
|
||||||
tls_bench.skip()
|
tls_bench.skip()
|
||||||
ts.append_message(tls_bench.step_message_skip(relative_file))
|
ts.append_message(.skip, tls_bench.step_message_skip(relative_file))
|
||||||
return sync.no_result
|
return sync.no_result
|
||||||
}
|
}
|
||||||
if show_stats {
|
if show_stats {
|
||||||
ts.append_message(term.h_divider('-'))
|
ts.append_message(.ok, term.h_divider('-'))
|
||||||
status := os.system(cmd)
|
status := os.system(cmd)
|
||||||
if status == 0 {
|
if status == 0 {
|
||||||
ts.benchmark.ok()
|
ts.benchmark.ok()
|
||||||
tls_bench.ok()
|
tls_bench.ok()
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
ts.failed = true
|
ts.failed = true
|
||||||
ts.benchmark.fail()
|
ts.benchmark.fail()
|
||||||
tls_bench.fail()
|
tls_bench.fail()
|
||||||
return sync.no_result
|
return sync.no_result
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
r := os.exec(cmd) or {
|
r := os.exec(cmd) or {
|
||||||
ts.failed = true
|
ts.failed = true
|
||||||
ts.benchmark.fail()
|
ts.benchmark.fail()
|
||||||
tls_bench.fail()
|
tls_bench.fail()
|
||||||
ts.append_message(tls_bench.step_message_fail(relative_file))
|
ts.append_message(.fail, tls_bench.step_message_fail(relative_file))
|
||||||
return sync.no_result
|
return sync.no_result
|
||||||
}
|
}
|
||||||
if r.exit_code != 0 {
|
if r.exit_code != 0 {
|
||||||
ts.failed = true
|
ts.failed = true
|
||||||
ts.benchmark.fail()
|
ts.benchmark.fail()
|
||||||
tls_bench.fail()
|
tls_bench.fail()
|
||||||
ts.append_message(tls_bench.step_message_fail('${relative_file}\n$r.output\n'))
|
ts.append_message(.fail, tls_bench.step_message_fail('$relative_file\n$r.output\n'))
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
ts.benchmark.ok()
|
ts.benchmark.ok()
|
||||||
tls_bench.ok()
|
tls_bench.ok()
|
||||||
ts.append_message(tls_bench.step_message_ok(relative_file))
|
ts.append_message(.ok, tls_bench.step_message_ok(relative_file))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if os.exists(generated_binary_fpath) {
|
if os.exists(generated_binary_fpath) {
|
||||||
|
@ -242,7 +257,7 @@ fn worker_trunner(mut p sync.PoolProcessor, idx int, thread_id int) voidptr {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn vlib_should_be_present(parent_dir string) {
|
pub fn vlib_should_be_present(parent_dir string) {
|
||||||
vlib_dir := os.join_path(parent_dir,'vlib')
|
vlib_dir := os.join_path(parent_dir, 'vlib')
|
||||||
if !os.is_dir(vlib_dir) {
|
if !os.is_dir(vlib_dir) {
|
||||||
eprintln('$vlib_dir is missing, it must be next to the V executable')
|
eprintln('$vlib_dir is missing, it must be next to the V executable')
|
||||||
exit(1)
|
exit(1)
|
||||||
|
@ -270,16 +285,14 @@ pub fn v_build_failing_skipped(zargs string, folder string, oskipped []string) b
|
||||||
mut skipped := oskipped
|
mut skipped := oskipped
|
||||||
for f in files {
|
for f in files {
|
||||||
if !f.contains('modules') && !f.contains('preludes') {
|
if !f.contains('modules') && !f.contains('preludes') {
|
||||||
//$if !linux {
|
// $if !linux {
|
||||||
// run pg example only on linux
|
// run pg example only on linux
|
||||||
if f.contains('/pg/') {
|
if f.contains('/pg/') {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
//}
|
// }
|
||||||
|
|
||||||
if f.contains('life_gg') || f.contains('/graph.v') || f.contains('rune.v') {
|
if f.contains('life_gg') || f.contains('/graph.v') || f.contains('rune.v') {
|
||||||
continue
|
continue
|
||||||
|
|
||||||
}
|
}
|
||||||
$if windows {
|
$if windows {
|
||||||
// skip pico example on windows
|
// skip pico example on windows
|
||||||
|
@ -287,11 +300,13 @@ pub fn v_build_failing_skipped(zargs string, folder string, oskipped []string) b
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
c := os.read_file(f) or { panic(err) }
|
c := os.read_file(f) or {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
maxc := if c.len > 300 { 300 } else { c.len }
|
maxc := if c.len > 300 { 300 } else { c.len }
|
||||||
start := c[0..maxc]
|
start := c[0..maxc]
|
||||||
if start.contains('module ') && !start.contains('module main') {
|
if start.contains('module ') && !start.contains('module main') {
|
||||||
skipped_f := f.replace(os.join_path(parent_dir,''), '')
|
skipped_f := f.replace(os.join_path(parent_dir, ''), '')
|
||||||
skipped << skipped_f
|
skipped << skipped_f
|
||||||
}
|
}
|
||||||
mains << f
|
mains << f
|
||||||
|
@ -321,27 +336,23 @@ pub fn building_any_v_binaries_failed() bool {
|
||||||
eprintln('VFLAGS is: "' + os.getenv('VFLAGS') + '"')
|
eprintln('VFLAGS is: "' + os.getenv('VFLAGS') + '"')
|
||||||
vexe := pref.vexe_path()
|
vexe := pref.vexe_path()
|
||||||
parent_dir := os.dir(vexe)
|
parent_dir := os.dir(vexe)
|
||||||
testing.vlib_should_be_present(parent_dir)
|
vlib_should_be_present(parent_dir)
|
||||||
os.chdir(parent_dir)
|
os.chdir(parent_dir)
|
||||||
mut failed := false
|
mut failed := false
|
||||||
v_build_commands := ['$vexe -o v_g -g cmd/v',
|
v_build_commands := ['$vexe -o v_g -g cmd/v', '$vexe -o v_prod_g -prod -g cmd/v',
|
||||||
'$vexe -o v_prod_g -prod -g cmd/v',
|
'$vexe -o v_cg -cg cmd/v', '$vexe -o v_prod_cg -prod -cg cmd/v', '$vexe -o v_prod -prod cmd/v']
|
||||||
'$vexe -o v_cg -cg cmd/v',
|
|
||||||
'$vexe -o v_prod_cg -prod -cg cmd/v',
|
|
||||||
'$vexe -o v_prod -prod cmd/v',
|
|
||||||
]
|
|
||||||
mut bmark := benchmark.new_benchmark()
|
mut bmark := benchmark.new_benchmark()
|
||||||
for cmd in v_build_commands {
|
for cmd in v_build_commands {
|
||||||
bmark.step()
|
bmark.step()
|
||||||
if build_v_cmd_failed(cmd) {
|
if build_v_cmd_failed(cmd) {
|
||||||
bmark.fail()
|
bmark.fail()
|
||||||
failed = true
|
failed = true
|
||||||
eprintln(bmark.step_message_fail('command: ${cmd} . See details above ^^^^^^^'))
|
eprintln(bmark.step_message_fail('command: $cmd . See details above ^^^^^^^'))
|
||||||
eprintln('')
|
eprintln('')
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
bmark.ok()
|
bmark.ok()
|
||||||
eprintln(bmark.step_message_ok('command: ${cmd}'))
|
eprintln(bmark.step_message_ok('command: $cmd'))
|
||||||
}
|
}
|
||||||
bmark.stop()
|
bmark.stop()
|
||||||
eprintln(term.h_divider('-'))
|
eprintln(term.h_divider('-'))
|
||||||
|
|
Loading…
Reference in New Issue