-C Avoid\susing\sTcl\scommand\s[clock]\sin\stestrunner.tcl.
-D 2023-02-03T11:32:51.147
+C Have\stestrunner.tcl\srun\svarious\sbuilds\sas\spart\sof\sthe\s'release'\scommand.
+D 2023-02-03T18:47:00.141
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
F test/regexp1.test 8f2a8bc1569666e29a4cee6c1a666cd224eb6d50e2470d1dc1df995170f3e0f1
F test/regexp2.test 55ed41da802b0e284ac7e2fe944be3948f93ff25abbca0361a609acfed1368b5
F test/reindex.test cd9d6021729910ece82267b4f5e1b5ac2911a7566c43b43c176a6a4732e2118d
-F test/releasetest_data.tcl 0db8aee0c348090fd06da47020ab4ed8ec692e0723427b2f3947d4dfb806f3b0
+F test/releasetest_data.tcl 4094c9fc5c9ac544014fa3c66c791bde7d95874b26dd0fd1c058124638ea9001
F test/resetdb.test 54c06f18bc832ac6d6319e5ab23d5c8dd49fdbeec7c696d791682a8006bd5fc3
F test/resolver01.test f4022acafda7f4d40eca94dbf16bc5fc4ac30ceb
F test/returning1.test 3ef7b264598b3292be0cdb028e4acb7524c5fd409b33b78449f894dfd68db334
F test/temptable3.test d11a0974e52b347e45ee54ef1923c91ed91e4637
F test/temptrigger.test 38f0ca479b1822d3117069e014daabcaacefffcc
F test/tester.tcl 8d54d40a55e12554b4509bc12078b201b233c8e842a7543629094a21b1ba956d
-F test/testrunner.tcl ef21c2f377e4a6648252afbdd7a330256fa075eb3f1f12a4af4fffabb132cdef
-F test/testrunner_data.tcl 38e2f2b2eb3033b58b4f7428affb5d627719e97ee166c8b95296c39ffca6c849
+F test/testrunner.tcl 733f7767c0588ad0ced09c75b6a358dd610f0d6d26750be2c5323363bba124d2
+F test/testrunner_data.tcl ec3b2db9f00746b641f2e010bc4e3504f2aff60983d8786a363f66ad40e0483e
F test/thread001.test a0985c117eab62c0c65526e9fa5d1360dd1cac5b03bde223902763274ce21899
F test/thread002.test c24c83408e35ba5a952a3638b7ac03ccdf1ce4409289c54a050ac4c5f1de7502
F test/thread003.test ee4c9efc3b86a6a2767516a37bd64251272560a7
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 69d934a1bfad86f3f60dab146db539645f5735f1bdb07dfe3a3d88828a03390b
-R 2c8cdf901157932d2f3f5be2f780ac84
+P b2faf9289f6fbbcd4491e1b063da731b35aeed9ff1fc97f64798e99cac847b4a
+R da71c094a7c065812b6c827874cf66e7
U dan
-Z 4428f02730b2f2d17ac513e2b892f834
+Z bc53011b32b3964f996ff997c59940a1
# Remove this line to create a well-formed Fossil manifest.
config TEXT,
filename TEXT, -- full path to test script
slow BOOLEAN, -- true if script is "slow"
- state TEXT CHECK( state IN ('ready', 'running', 'done', 'failed') ),
+ state TEXT CHECK( state IN ('', 'ready', 'running', 'done', 'failed') ),
time INTEGER, -- Time in ms
output TEXT, -- full output of test script
- ismake AS (config='make'),
+ priority AS ((config='make') + ((config='build')*2) + (slow*4)),
+ jobtype AS (
+ CASE WHEN config IN ('build', 'make') THEN config ELSE 'script' END
+ ),
PRIMARY KEY(build, config, filename)
);
- CREATE INDEX i1 ON script(state, ismake);
- CREATE INDEX i2 ON script(state, slow DESC, ismake);
+ CREATE INDEX i1 ON script(state, jobtype);
+ CREATE INDEX i2 ON script(state, priority);
}
#-------------------------------------------------------------------------
set R(info_script) [file normalize [info script]]
set R(timeout) 10000 ;# Default busy-timeout for testrunner.db
set R(nJob) [default_njob] ;# Default number of helper processes
-set R(leaker) "" ;# Name of first script to leak memory
-
set R(patternlist) [list]
+# This script runs individual tests - tcl scripts or [make xyz] commands -
+# in directories named "testdir$N", where $N is an integer. This variable
+# contains a list of integers indicating the directories in use.
+#
+# This variable is accessed only via the following commands:
+#
+# dirs_nHelper
+# Return the number of entries currently in the list.
+#
+# dirs_freeDir IDIR
+# Remove value IDIR from the list. It is an error if it is not present.
+#
+# dirs_allocDir
+# Select a value that is not already in the list. Add it to the list
+# and return it.
+#
+set R(dirs_in_use) [list]
+
+proc dirs_nHelper {} {
+ global R
+ llength $R(dirs_in_use)
+}
+proc dirs_freeDir {iDir} {
+ global R
+ set out [list]
+ foreach d $R(dirs_in_use) {
+ if {$iDir!=$d} { lappend out $d }
+ }
+ if {[llength $out]!=[llength $R(dirs_in_use)]-1} {
+ error "dirs_freeDir could not find $iDir"
+ }
+ set R(dirs_in_use) $out
+}
+proc dirs_allocDir {} {
+ global R
+ array set inuse [list]
+ foreach d $R(dirs_in_use) {
+ set inuse($d) 1
+ }
+ for {set iRet 0} {[info exists inuse($iRet)]} {incr iRet} { }
+ lappend R(dirs_in_use) $iRet
+ return $iRet
+}
+
switch -nocase -glob -- $tcl_platform(os) {
*darwin* {
set R(platform) osx
+ set R(make) make.sh
}
*linux* {
set R(platform) linux
+ set R(make) make.sh
}
*win* {
set R(platform) win
+ set R(make) make.bat
}
default {
error "cannot determine platform!"
foreach {dirname b} $build {}
puts "Launching build \"$b\" in directory $dirname..."
- set srcdir [file dirname [file dirname $R(info_script)]]
+ set target coretestprogs
+ if {$b=="User-Auth"} { set target testfixture }
incr R(nHelperRunning)
set pwd [pwd]
cd $dirname
- set fd [open "|bash build.sh $srcdir 2>@1"]
+ set fd [open "|bash $R(make) $target 2>@1"]
cd $pwd
set O($fd) ""
# Load configuration data.
source [file join [file dirname [info script]] testrunner_data.tcl]
+ set srcdir [file dirname [file dirname $R(info_script)]]
foreach b [trd_builds $R(platform)] {
set dirname [build_to_dirname $b]
create_or_clear_dir $dirname
- set target "testprogs"
- if {$b=="Device-One"} { set target coretestprogs }
- if {$b=="User-Auth"} { set target testfixture }
+ set cmd [info nameofexec]
+ lappend cmd [file join [file dirname $R(info_script)] releasetest_data.tcl]
+ if {$R(platform)=="win"} { lappend $cmd -msvc }
+ lappend cmd script $b $srcdir
- set cmd [list \
- [info nameofexec] \
- [file join [file dirname $R(info_script)] releasetest_data.tcl] \
- script $b $target
- ]
set script [exec {*}$cmd]
- set fd [open [file join $dirname build.sh] w]
+ set fd [open [file join $dirname $R(make)] w]
puts $fd $script
close $fd
foreach c [trd_configs $platform $b] {
testset_append testset $b $c $patternlist
}
+
+ if {[llength $patternlist]==0 || $b=="User-Auth"} {
+ set target testfixture
+ } else {
+ set target coretestprogs
+ }
+ lappend testset [list $b build $target]
}
if {[llength $patternlist]==0} {
set clist [trd_all_configs]
set patternlist [lrange $patternlist 1 end]
foreach c $clist {
- testset_append testset Default $c $patternlist
+ testset_append testset "" $c $patternlist
}
} elseif {[info exists ::testspec($first)]} {
set clist $first
set patternlist [lrange $patternlist 1 end]
- testset_append testset Default $first [lrange $patternlist 1 end]
+ testset_append testset "" $first [lrange $patternlist 1 end]
} elseif { [llength $patternlist]==0 } {
- testset_append testset Default veryquick $patternlist
+ testset_append testset "" veryquick $patternlist
} else {
- testset_append testset Default full $patternlist
+ testset_append testset "" full $patternlist
}
set testset
set bMatch 0
foreach p $patternlist {
if {[string match $p [file tail $f]]} {
- set bMatch
+ set bMatch 1
break
}
}
#
proc r_get_next_job {iJob} {
- switch -- [expr $iJob%3] {
- 0 {
- set orderby "ORDER BY ismake ASC"
- }
- 1 {
- set orderby "ORDER BY slow DESC, ismake ASC"
- }
- 2 {
- set orderby "ORDER BY ismake DESC"
- }
+ if {($iJob%2)} {
+ set orderby "ORDER BY priority ASC"
+ } else {
+ set orderby "ORDER BY priority DESC"
}
r_write_db {
foreach {b c s} $t {}
set slow 0
- if {$c!="make"} {
+ if {$c!="make" && $c!="build"} {
set fd [open $s]
for {set ii 0} {$ii<100 && ![eof $fd]} {incr ii} {
set line [gets $fd]
set c "default"
}
+ set state ready
+ if {$b!="" && $c!="build"} {
+ set state ""
+ }
+
db eval {
INSERT INTO script(build, config, filename, slow, state)
- VALUES ($b, $c, $s, $slow, 'ready')
+ VALUES ($b, $c, $s, $slow, $state)
}
}
}
UPDATE script SET output = $output, state=$state, time=$tm
WHERE (build, config, filename) = ($b, $c, $f)
}
+ if {$state=="done" && $c=="build"} {
+ db eval {
+ UPDATE script SET state = 'ready' WHERE (build, state)==($b, '')
+ }
+ }
}
- launch_another_job $iJob
+ dirs_freeDir $iJob
+ launch_some_jobs
incr ::wakeup
} else {
set rc [catch { gets $fd line } res]
set T($iJob) [clock_milliseconds]
set job [r_get_next_job $iJob]
- if {$job==""} return
+ if {$job==""} { return 0 }
foreach {b c f} $job {}
- if {$c=="make"} {
+ if {$c=="build"} {
+ set srcdir [file dirname [file dirname $R(info_script)]]
+ set builddir [build_to_dirname $b]
+ create_or_clear_dir $builddir
+
+ set cmd [info nameofexec]
+ lappend cmd [file join [file dirname $R(info_script)] releasetest_data.tcl]
+ if {$R(platform)=="win"} { lappend $cmd -msvc }
+ lappend cmd script $b $srcdir
+
+ set script [exec {*}$cmd]
+ set fd [open [file join $builddir $R(make)] w]
+ puts $fd $script
+ close $fd
+
+ puts "Launching build \"$b\" in directory $builddir..."
+ set target coretestprogs
+ if {$b=="User-Auth"} { set target testfixture }
+
+ set cmd "bash $R(make) $target"
+ set dir $builddir
+
+ } elseif {$c=="make"} {
set builddir [build_to_dirname $b]
copy_dir $builddir $dir
- set cmd "make $f"
+ set cmd "bash $R(make) $f"
} else {
- if {$b=="Default"} {
+ if {$b==""} {
set testfixture [info nameofexec]
} else {
set testfixture [
fileevent $fd readable [list script_input_ready $fd $iJob $b $c $f]
incr R(nHelperRunning) +1
unset -nocomplain ::env(OMIT_MISUSE)
+
+ return 1
}
proc one_line_report {} {
set tm [format "%.2f" [expr $tm/1000.0]]
foreach s {ready running done failed} {
- set v($s,0) 0
- set v($s,1) 0
+ set v($s,build) 0
+ set v($s,make) 0
+ set v($s,script) 0
}
- set t(0) 0
- set t(1) 0
r_write_db {
db eval {
- SELECT state, ismake, count(*) AS cnt
+ SELECT state, jobtype, count(*) AS cnt
FROM script
- GROUP BY state, ismake
+ GROUP BY state, jobtype
} {
- set v($state,$ismake) $cnt
- incr t($ismake) $cnt
+ set v($state,$jobtype) $cnt
+ if {[info exists t($jobtype)]} {
+ incr t($jobtype) $cnt
+ } else {
+ set t($jobtype) $cnt
+ }
}
}
- set d0 [expr $v(done,0)+$v(failed,0)]
- set d1 [expr $v(done,1)+$v(failed,1)]
-
- puts "${tm}s: scripts: ($d0/$t(0)) $v(failed,0) failed, $v(running,0) running, makes: ($d1/$t(1)) $v(failed,1) failed, $v(running,1) running"
+ set text ""
+ foreach j [array names t] {
+ set fin [expr $v(done,$j) + $v(failed,$j)]
+ lappend text "$j: ($fin/$t($j)) f=$v(failed,$j) r=$v(running,$j)"
+ }
+ puts "${tm}s: [join $text { || }]"
after 1000 one_line_report
}
+proc launch_some_jobs {} {
+ global R
+ while {[dirs_nHelper]<$R(nJob)} {
+ set iDir [dirs_allocDir]
+ if {0==[launch_another_job $iDir]} {
+ dirs_freeDir $iDir
+ break;
+ }
+ }
+}
+
proc run_testset {} {
global R
set ii 0
set R(starttime) [clock_milliseconds]
set R(log) [open $R(logname) w]
- for {set ii 0} {$ii<$R(nJob)} {incr ii} {
- launch_another_job $ii
- }
+ launch_some_jobs
+ # launch_another_job $ii
one_line_report
while {$R(nHelperRunning)>0} {