/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 3090239c59379d41e1a0644feb6683082fdb86edfab0c668973f8003f22c0e5d:


0000: 23 21 2f 62 69 6e 2f 73 68 0a 23 20 5c 0a 65 78  #!/bin/sh.# \.ex
0010: 65 63 20 77 61 70 70 74 63 6c 73 68 20 22 24 30  ec wapptclsh "$0
0020: 22 20 24 7b 31 2b 22 24 40 22 7d 0a 0a 23 20 70  " ${1+"$@"}..# p
0030: 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 64 20  ackage required 
0040: 77 61 70 70 0a 73 6f 75 72 63 65 20 5b 66 69 6c  wapp.source [fil
0050: 65 20 6a 6f 69 6e 20 5b 66 69 6c 65 20 64 69 72  e join [file dir
0060: 6e 61 6d 65 20 5b 69 6e 66 6f 20 73 63 72 69 70  name [info scrip
0070: 74 5d 5d 20 77 61 70 70 2e 74 63 6c 5d 0a 0a 23  t]] wapp.tcl]..#
0080: 20 56 61 72 69 61 62 6c 65 73 20 73 65 74 20 62   Variables set b
0090: 79 20 74 68 65 20 22 63 6f 6e 74 72 6f 6c 22 20  y the "control" 
00a0: 66 6f 72 6d 3a 0a 23 0a 23 20 20 20 47 28 70 6c  form:.#.#   G(pl
00b0: 61 74 66 6f 72 6d 29 20 2d 20 55 73 65 72 20 73  atform) - User s
00c0: 65 6c 65 63 74 65 64 20 70 6c 61 74 66 6f 72 6d  elected platform
00d0: 2e 0a 23 20 20 20 47 28 74 65 73 74 29 20 20 20  ..#   G(test)   
00e0: 20 20 2d 20 53 65 74 20 74 6f 20 22 4e 6f 72 6d    - Set to "Norm
00f0: 61 6c 22 2c 20 22 56 65 72 79 71 75 69 63 6b 22  al", "Veryquick"
0100: 2c 20 22 53 6d 6f 6b 65 74 65 73 74 22 20 6f 72  , "Smoketest" or
0110: 20 22 42 75 69 6c 64 2d 4f 6e 6c 79 22 2e 0a 23   "Build-Only"..#
0120: 20 20 20 47 28 6b 65 65 70 29 20 20 20 20 20 2d     G(keep)     -
0130: 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20 74   Boolean. True t
0140: 6f 20 64 65 6c 65 74 65 20 6e 6f 20 66 69 6c 65  o delete no file
0150: 73 20 61 66 74 65 72 20 65 61 63 68 20 74 65 73  s after each tes
0160: 74 2e 0a 23 20 20 20 47 28 6d 73 76 63 29 20 20  t..#   G(msvc)  
0170: 20 20 20 2d 20 42 6f 6f 6c 65 61 6e 2e 20 54 72     - Boolean. Tr
0180: 75 65 20 74 6f 20 75 73 65 20 4d 53 56 43 20 61  ue to use MSVC a
0190: 73 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 0a  s the compiler..
01a0: 23 20 20 20 47 28 74 63 6c 29 20 20 20 20 20 20  #   G(tcl)      
01b0: 2d 20 55 73 65 20 54 63 6c 20 66 72 6f 6d 20 74  - Use Tcl from t
01c0: 68 69 73 20 64 69 72 65 63 74 6f 72 79 20 66 6f  his directory fo
01d0: 72 20 62 75 69 6c 64 73 2e 0a 23 20 20 20 47 28  r builds..#   G(
01e0: 6a 6f 62 73 29 20 20 20 20 20 2d 20 48 6f 77 20  jobs)     - How 
01f0: 6d 61 6e 79 20 73 75 62 2d 70 72 6f 63 65 73 73  many sub-process
0200: 65 73 20 74 6f 20 72 75 6e 20 73 69 6d 75 6c 74  es to run simult
0210: 61 6e 65 6f 75 73 6c 79 2e 0a 23 0a 73 65 74 20  aneously..#.set 
0220: 47 28 70 6c 61 74 66 6f 72 6d 29 20 24 3a 3a 74  G(platform) $::t
0230: 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6f 73 29 2d  cl_platform(os)-
0240: 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28  $::tcl_platform(
0250: 6d 61 63 68 69 6e 65 29 0a 73 65 74 20 47 28 74  machine).set G(t
0260: 65 73 74 29 20 20 20 20 20 4e 6f 72 6d 61 6c 0a  est)     Normal.
0270: 73 65 74 20 47 28 6b 65 65 70 29 20 20 20 20 20  set G(keep)     
0280: 31 0a 73 65 74 20 47 28 6d 73 76 63 29 20 20 20  1.set G(msvc)   
0290: 20 20 30 0a 73 65 74 20 47 28 74 63 6c 29 20 20    0.set G(tcl)  
02a0: 20 20 20 20 5b 3a 3a 74 63 6c 3a 3a 70 6b 67 63      [::tcl::pkgc
02b0: 6f 6e 66 69 67 20 67 65 74 20 6c 69 62 64 69 72  onfig get libdir
02c0: 2c 69 6e 73 74 61 6c 6c 5d 0a 73 65 74 20 47 28  ,install].set G(
02d0: 6a 6f 62 73 29 20 20 20 20 20 33 0a 73 65 74 20  jobs)     3.set 
02e0: 47 28 64 65 62 75 67 29 20 20 20 20 30 0a 0a 73  G(debug)    0..s
02f0: 65 74 20 47 28 6e 6f 75 69 29 20 20 20 20 20 30  et G(noui)     0
0300: 0a 73 65 74 20 47 28 73 74 64 6f 75 74 29 20 20  .set G(stdout)  
0310: 20 30 0a 0a 0a 70 72 6f 63 20 77 61 70 70 74 65   0...proc wappte
0320: 73 74 5f 69 6e 69 74 20 7b 7d 20 7b 0a 20 20 67  st_init {} {.  g
0330: 6c 6f 62 61 6c 20 47 0a 0a 20 20 73 65 74 20 6c  lobal G..  set l
0340: 53 61 76 65 20 5b 6c 69 73 74 20 70 6c 61 74 66  Save [list platf
0350: 6f 72 6d 20 74 65 73 74 20 6b 65 65 70 20 6d 73  orm test keep ms
0360: 76 63 20 74 63 6c 20 6a 6f 62 73 20 64 65 62 75  vc tcl jobs debu
0370: 67 20 6e 6f 75 69 20 73 74 64 6f 75 74 5d 20 0a  g noui stdout] .
0380: 20 20 66 6f 72 65 61 63 68 20 6b 20 24 6c 53 61    foreach k $lSa
0390: 76 65 20 7b 20 73 65 74 20 41 28 24 6b 29 20 24  ve { set A($k) $
03a0: 47 28 24 6b 29 20 7d 0a 20 20 61 72 72 61 79 20  G($k) }.  array 
03b0: 75 6e 73 65 74 20 47 0a 20 20 66 6f 72 65 61 63  unset G.  foreac
03c0: 68 20 6b 20 24 6c 53 61 76 65 20 7b 20 73 65 74  h k $lSave { set
03d0: 20 47 28 24 6b 29 20 24 41 28 24 6b 29 20 7d 0a   G($k) $A($k) }.
03e0: 0a 20 20 23 20 54 68 65 20 72 6f 6f 74 20 6f 66  .  # The root of
03f0: 20 74 68 65 20 53 51 4c 69 74 65 20 73 6f 75 72   the SQLite sour
0400: 63 65 20 74 72 65 65 2e 0a 20 20 73 65 74 20 47  ce tree..  set G
0410: 28 73 72 63 64 69 72 29 20 20 20 5b 66 69 6c 65  (srcdir)   [file
0420: 20 64 69 72 6e 61 6d 65 20 5b 66 69 6c 65 20 64   dirname [file d
0430: 69 72 6e 61 6d 65 20 5b 69 6e 66 6f 20 73 63 72  irname [info scr
0440: 69 70 74 5d 5d 5d 0a 0a 20 20 73 65 74 20 47 28  ipt]]]..  set G(
0450: 73 71 6c 69 74 65 5f 76 65 72 73 69 6f 6e 29 20  sqlite_version) 
0460: 22 75 6e 6b 6e 6f 77 6e 22 0a 0a 20 20 23 20 45  "unknown"..  # E
0470: 69 74 68 65 72 20 22 63 6f 6e 66 69 67 22 2c 20  ither "config", 
0480: 22 72 75 6e 6e 69 6e 67 22 20 6f 72 20 22 73 74  "running" or "st
0490: 6f 70 70 65 64 22 3a 0a 20 20 73 65 74 20 47 28  opped":.  set G(
04a0: 73 74 61 74 65 29 20 22 63 6f 6e 66 69 67 22 0a  state) "config".
04b0: 0a 20 20 73 65 74 20 47 28 68 6f 73 74 6e 61 6d  .  set G(hostnam
04c0: 65 29 20 22 28 75 6e 6b 6e 6f 77 6e 20 68 6f 73  e) "(unknown hos
04d0: 74 29 22 0a 20 20 63 61 74 63 68 20 7b 20 73 65  t)".  catch { se
04e0: 74 20 47 28 68 6f 73 74 6e 61 6d 65 29 20 5b 65  t G(hostname) [e
04f0: 78 65 63 20 68 6f 73 74 6e 61 6d 65 5d 20 7d 20  xec hostname] } 
0500: 0a 20 20 73 65 74 20 47 28 68 6f 73 74 29 20 24  .  set G(host) $
0510: 47 28 68 6f 73 74 6e 61 6d 65 29 0a 20 20 61 70  G(hostname).  ap
0520: 70 65 6e 64 20 47 28 68 6f 73 74 29 20 22 20 24  pend G(host) " $
0530: 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6f  ::tcl_platform(o
0540: 73 29 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f  s) $::tcl_platfo
0550: 72 6d 28 6f 73 56 65 72 73 69 6f 6e 29 22 0a 20  rm(osVersion)". 
0560: 20 61 70 70 65 6e 64 20 47 28 68 6f 73 74 29 20   append G(host) 
0570: 22 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72  " $::tcl_platfor
0580: 6d 28 6d 61 63 68 69 6e 65 29 20 24 3a 3a 74 63  m(machine) $::tc
0590: 6c 5f 70 6c 61 74 66 6f 72 6d 28 62 79 74 65 4f  l_platform(byteO
05a0: 72 64 65 72 29 22 0a 7d 0a 0a 70 72 6f 63 20 77  rder)".}..proc w
05b0: 61 70 70 74 65 73 74 5f 72 75 6e 20 7b 7d 20 7b  apptest_run {} {
05c0: 0a 20 20 67 6c 6f 62 61 6c 20 47 0a 20 20 73 65  .  global G.  se
05d0: 74 5f 74 65 73 74 5f 61 72 72 61 79 0a 20 20 73  t_test_array.  s
05e0: 65 74 20 47 28 73 74 61 74 65 29 20 22 72 75 6e  et G(state) "run
05f0: 6e 69 6e 67 22 0a 0a 20 20 77 61 70 70 74 65 73  ning"..  wapptes
0600: 74 5f 6f 70 65 6e 6c 6f 67 0a 0a 20 20 77 61 70  t_openlog..  wap
0610: 70 74 65 73 74 5f 6f 75 74 70 75 74 20 22 52 75  ptest_output "Ru
0620: 6e 6e 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  nning the follow
0630: 69 6e 67 20 66 6f 72 20 24 47 28 70 6c 61 74 66  ing for $G(platf
0640: 6f 72 6d 29 2e 20 24 47 28 6a 6f 62 73 29 20 6a  orm). $G(jobs) j
0650: 6f 62 73 2e 22 0a 20 20 66 6f 72 65 61 63 68 20  obs.".  foreach 
0660: 74 20 24 47 28 74 65 73 74 5f 61 72 72 61 79 29  t $G(test_array)
0670: 20 7b 0a 20 20 20 20 73 65 74 20 63 6f 6e 66 69   {.    set confi
0680: 67 20 5b 64 69 63 74 20 67 65 74 20 24 74 20 63  g [dict get $t c
0690: 6f 6e 66 69 67 5d 0a 20 20 20 20 73 65 74 20 74  onfig].    set t
06a0: 61 72 67 65 74 20 5b 64 69 63 74 20 67 65 74 20  arget [dict get 
06b0: 24 74 20 74 61 72 67 65 74 5d 0a 20 20 20 20 77  $t target].    w
06c0: 61 70 70 74 65 73 74 5f 6f 75 74 70 75 74 20 5b  apptest_output [
06d0: 66 6f 72 6d 61 74 20 22 20 20 20 20 25 2d 32 35  format "    %-25
06e0: 73 25 73 22 20 24 63 6f 6e 66 69 67 20 24 74 61  s%s" $config $ta
06f0: 72 67 65 74 5d 0a 20 20 7d 0a 20 20 77 61 70 70  rget].  }.  wapp
0700: 74 65 73 74 5f 6f 75 74 70 75 74 20 5b 73 74 72  test_output [str
0710: 69 6e 67 20 72 65 70 65 61 74 20 2a 20 37 30 5d  ing repeat * 70]
0720: 0a 7d 0a 0a 70 72 6f 63 20 72 65 6c 65 61 73 65  .}..proc release
0730: 74 65 73 74 5f 64 61 74 61 20 7b 61 72 67 73 7d  test_data {args}
0740: 20 7b 0a 20 20 67 6c 6f 62 61 6c 20 47 0a 20 20   {.  global G.  
0750: 73 65 74 20 72 74 64 20 5b 66 69 6c 65 20 6a 6f  set rtd [file jo
0760: 69 6e 20 24 47 28 73 72 63 64 69 72 29 20 74 65  in $G(srcdir) te
0770: 73 74 20 72 65 6c 65 61 73 65 74 65 73 74 5f 64  st releasetest_d
0780: 61 74 61 2e 74 63 6c 5d 0a 20 20 73 65 74 20 66  ata.tcl].  set f
0790: 64 20 5b 6f 70 65 6e 20 22 7c 5b 69 6e 66 6f 20  d [open "|[info 
07a0: 6e 61 6d 65 6f 66 65 78 65 63 75 74 61 62 6c 65  nameofexecutable
07b0: 5d 20 24 72 74 64 20 24 61 72 67 73 22 20 72 2b  ] $rtd $args" r+
07c0: 5d 0a 20 20 73 65 74 20 72 65 74 20 5b 72 65 61  ].  set ret [rea
07d0: 64 20 24 66 64 5d 0a 20 20 63 6c 6f 73 65 20 24  d $fd].  close $
07e0: 66 64 0a 20 20 72 65 74 75 72 6e 20 24 72 65 74  fd.  return $ret
07f0: 0a 7d 0a 0a 23 20 47 65 6e 65 72 61 74 65 20 74  .}..# Generate t
0800: 68 65 20 74 65 78 74 20 66 6f 72 20 74 68 65 20  he text for the 
0810: 62 6f 78 20 61 74 20 74 68 65 20 74 6f 70 20 6f  box at the top o
0820: 66 20 74 68 65 20 55 49 2e 20 54 68 65 20 63 75  f the UI. The cu
0830: 72 72 65 6e 74 20 53 51 4c 69 74 65 0a 23 20 76  rrent SQLite.# v
0840: 65 72 73 69 6f 6e 2c 20 61 63 63 6f 72 64 69 6e  ersion, accordin
0850: 67 20 74 6f 20 66 6f 73 73 69 6c 2c 20 61 6c 6f  g to fossil, alo
0860: 6e 67 20 77 69 74 68 20 61 20 77 61 72 6e 69 6e  ng with a warnin
0870: 67 20 69 66 20 74 68 65 72 65 20 61 72 65 20 0a  g if there are .
0880: 23 20 75 6e 63 6f 6d 6d 69 74 74 65 64 20 63 68  # uncommitted ch
0890: 61 6e 67 65 73 20 69 6e 20 74 68 65 20 63 68 65  anges in the che
08a0: 63 6b 6f 75 74 2e 0a 23 0a 70 72 6f 63 20 67 65  ckout..#.proc ge
08b0: 6e 65 72 61 74 65 5f 66 6f 73 73 69 6c 5f 69 6e  nerate_fossil_in
08c0: 66 6f 20 7b 7d 20 7b 0a 20 20 67 6c 6f 62 61 6c  fo {} {.  global
08d0: 20 47 0a 20 20 73 65 74 20 70 77 64 20 5b 70 77   G.  set pwd [pw
08e0: 64 5d 0a 20 20 63 64 20 24 47 28 73 72 63 64 69  d].  cd $G(srcdi
08f0: 72 29 0a 20 20 73 65 74 20 72 63 20 5b 63 61 74  r).  set rc [cat
0900: 63 68 20 7b 0a 20 20 20 20 73 65 74 20 72 31 20  ch {.    set r1 
0910: 5b 65 78 65 63 20 66 6f 73 73 69 6c 20 69 6e 66  [exec fossil inf
0920: 6f 5d 0a 20 20 20 20 73 65 74 20 72 32 20 5b 65  o].    set r2 [e
0930: 78 65 63 20 66 6f 73 73 69 6c 20 63 68 61 6e 67  xec fossil chang
0940: 65 73 5d 0a 20 20 7d 5d 0a 20 20 63 64 20 24 70  es].  }].  cd $p
0950: 77 64 0a 20 20 69 66 20 7b 24 72 63 7d 20 72 65  wd.  if {$rc} re
0960: 74 75 72 6e 0a 0a 20 20 66 6f 72 65 61 63 68 20  turn..  foreach 
0970: 6c 69 6e 65 20 5b 73 70 6c 69 74 20 24 72 31 20  line [split $r1 
0980: 22 5c 6e 22 5d 20 7b 0a 20 20 20 20 69 66 20 7b  "\n"] {.    if {
0990: 5b 72 65 67 65 78 70 20 7b 5e 63 68 65 63 6b 6f  [regexp {^checko
09a0: 75 74 3a 20 2a 28 2e 2a 29 24 7d 20 24 6c 69 6e  ut: *(.*)$} $lin
09b0: 65 20 2d 3e 20 63 6f 5d 7d 20 7b 0a 20 20 20 20  e -> co]} {.    
09c0: 20 20 77 61 70 70 2d 74 72 69 6d 20 7b 20 3c 62    wapp-trim { <b
09d0: 72 3e 20 25 68 74 6d 6c 28 24 63 6f 29 20 7d 0a  r> %html($co) }.
09e0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 20      }.  }..  if 
09f0: 7b 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 24 72  {[string trim $r
0a00: 32 5d 21 3d 22 22 7d 20 7b 0a 20 20 20 20 77 61  2]!=""} {.    wa
0a10: 70 70 2d 74 72 69 6d 20 7b 20 0a 20 20 20 20 20  pp-trim { .     
0a20: 20 3c 62 72 3e 3c 73 70 61 6e 20 63 6c 61 73 73   <br><span class
0a30: 3d 77 61 72 6e 69 6e 67 3e 20 0a 20 20 20 20 20  =warning> .     
0a40: 20 57 41 52 4e 49 4e 47 3a 20 55 6e 63 6f 6d 6d   WARNING: Uncomm
0a50: 69 74 74 65 64 20 63 68 61 6e 67 65 73 20 69 6e  itted changes in
0a60: 20 63 68 65 63 6b 6f 75 74 0a 20 20 20 20 20 20   checkout.      
0a70: 3c 2f 73 70 61 6e 3e 0a 20 20 20 20 7d 0a 20 20  </span>.    }.  
0a80: 7d 0a 7d 0a 0a 23 20 49 66 20 74 68 65 20 61 70  }.}..# If the ap
0a90: 70 6c 69 63 61 74 69 6f 6e 20 69 73 20 69 6e 20  plication is in 
0aa0: 22 63 6f 6e 66 69 67 22 20 73 74 61 74 65 2c 20  "config" state, 
0ab0: 73 65 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  set the contents
0ac0: 20 6f 66 20 74 68 65 20 0a 23 20 3a 3a 47 28 74   of the .# ::G(t
0ad0: 65 73 74 5f 61 72 72 61 79 29 20 67 6c 6f 62 61  est_array) globa
0ae0: 6c 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68 65  l to reflect the
0af0: 20 74 65 73 74 73 20 74 68 61 74 20 77 69 6c 6c   tests that will
0b00: 20 62 65 20 72 75 6e 2e 20 49 66 20 74 68 65 0a   be run. If the.
0b10: 23 20 61 70 70 20 69 73 20 69 6e 20 73 6f 6d 65  # app is in some
0b20: 20 6f 74 68 65 72 20 73 74 61 74 65 20 28 22 72   other state ("r
0b30: 75 6e 6e 69 6e 67 22 20 6f 72 20 22 73 74 6f 70  unning" or "stop
0b40: 70 65 64 22 29 2c 20 74 68 69 73 20 63 6f 6d 6d  ped"), this comm
0b50: 61 6e 64 0a 23 20 69 73 20 61 20 6e 6f 2d 6f 70  and.# is a no-op
0b60: 2e 0a 23 0a 70 72 6f 63 20 73 65 74 5f 74 65 73  ..#.proc set_tes
0b70: 74 5f 61 72 72 61 79 20 7b 7d 20 7b 0a 20 20 67  t_array {} {.  g
0b80: 6c 6f 62 61 6c 20 47 0a 20 20 69 66 20 7b 20 24  lobal G.  if { $
0b90: 47 28 73 74 61 74 65 29 3d 3d 22 63 6f 6e 66 69  G(state)=="confi
0ba0: 67 22 20 7d 20 7b 0a 20 20 20 20 73 65 74 20 47  g" } {.    set G
0bb0: 28 74 65 73 74 5f 61 72 72 61 79 29 20 5b 6c 69  (test_array) [li
0bc0: 73 74 5d 0a 20 20 20 20 73 65 74 20 64 65 62 75  st].    set debu
0bd0: 67 20 22 2d 64 65 62 75 67 22 0a 20 20 20 20 69  g "-debug".    i
0be0: 66 20 7b 24 47 28 64 65 62 75 67 29 3d 3d 30 7d  f {$G(debug)==0}
0bf0: 20 7b 20 73 65 74 20 64 65 62 75 67 20 22 2d 6e   { set debug "-n
0c00: 6f 64 65 62 75 67 22 7d 0a 20 20 20 20 66 6f 72  odebug"}.    for
0c10: 65 61 63 68 20 7b 63 6f 6e 66 69 67 20 74 61 72  each {config tar
0c20: 67 65 74 7d 20 5b 72 65 6c 65 61 73 65 74 65 73  get} [releasetes
0c30: 74 5f 64 61 74 61 20 74 65 73 74 73 20 24 64 65  t_data tests $de
0c40: 62 75 67 20 24 47 28 70 6c 61 74 66 6f 72 6d 29  bug $G(platform)
0c50: 5d 20 7b 0a 0a 20 20 20 20 20 20 23 20 49 66 20  ] {..      # If 
0c60: 75 73 69 6e 67 20 4d 53 56 43 2c 20 64 6f 20 6e  using MSVC, do n
0c70: 6f 74 20 72 75 6e 20 73 61 6e 69 74 69 7a 65 20  ot run sanitize 
0c80: 6f 72 20 76 61 6c 67 72 69 6e 64 20 74 65 73 74  or valgrind test
0c90: 73 2e 20 4f 72 20 74 68 65 0a 20 20 20 20 20 20  s. Or the.      
0ca0: 23 20 63 68 65 63 6b 73 79 6d 62 6f 6c 73 20 74  # checksymbols t
0cb0: 65 73 74 2e 0a 20 20 20 20 20 20 69 66 20 7b 24  est..      if {$
0cc0: 47 28 6d 73 76 63 29 20 26 26 20 28 0a 20 20 20  G(msvc) && (.   
0cd0: 20 20 20 20 20 20 20 22 53 61 6e 69 74 69 7a 65         "Sanitize
0ce0: 22 20 3d 3d 20 24 63 6f 6e 66 69 67 20 0a 20 20  " == $config .  
0cf0: 20 20 20 20 20 7c 7c 20 22 63 68 65 63 6b 73 79       || "checksy
0d00: 6d 62 6f 6c 73 22 20 69 6e 20 24 74 61 72 67 65  mbols" in $targe
0d10: 74 0a 20 20 20 20 20 20 20 7c 7c 20 22 76 61 6c  t.       || "val
0d20: 67 72 69 6e 64 74 65 73 74 22 20 69 6e 20 24 74  grindtest" in $t
0d30: 61 72 67 65 74 0a 20 20 20 20 20 20 29 7d 20 7b  arget.      )} {
0d40: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
0d50: 65 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  e.      }..     
0d60: 20 23 20 49 66 20 74 68 65 20 74 65 73 74 20 6d   # If the test m
0d70: 6f 64 65 20 69 73 20 6e 6f 74 20 22 4e 6f 72 6d  ode is not "Norm
0d80: 61 6c 22 2c 20 6f 76 65 72 72 69 64 65 20 74 68  al", override th
0d90: 65 20 74 61 72 67 65 74 2e 0a 20 20 20 20 20 20  e target..      
0da0: 23 0a 20 20 20 20 20 20 69 66 20 7b 24 74 61 72  #.      if {$tar
0db0: 67 65 74 21 3d 22 63 68 65 63 6b 73 79 6d 62 6f  get!="checksymbo
0dc0: 6c 73 22 20 26 26 20 24 47 28 70 6c 61 74 66 6f  ls" && $G(platfo
0dd0: 72 6d 29 21 3d 22 46 61 69 6c 75 72 65 2d 44 65  rm)!="Failure-De
0de0: 74 65 63 74 69 6f 6e 22 7d 20 7b 0a 20 20 20 20  tection"} {.    
0df0: 20 20 20 20 73 77 69 74 63 68 20 2d 2d 20 24 47      switch -- $G
0e00: 28 74 65 73 74 29 20 7b 0a 20 20 20 20 20 20 20  (test) {.       
0e10: 20 20 20 56 65 72 79 71 75 69 63 6b 20 7b 20 73     Veryquick { s
0e20: 65 74 20 74 61 72 67 65 74 20 71 75 69 63 6b 74  et target quickt
0e30: 65 73 74 20 7d 0a 20 20 20 20 20 20 20 20 20 20  est }.          
0e40: 53 6d 6f 6b 65 74 65 73 74 20 7b 20 73 65 74 20  Smoketest { set 
0e50: 74 61 72 67 65 74 20 73 6d 6f 6b 65 74 65 73 74  target smoketest
0e60: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 42 75 69   }.          Bui
0e70: 6c 64 2d 4f 6e 6c 79 20 7b 0a 20 20 20 20 20 20  ld-Only {.      
0e80: 20 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74        set target
0e90: 20 74 65 73 74 66 69 78 74 75 72 65 0a 20 20 20   testfixture.   
0ea0: 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 3a 3a           if {$::
0eb0: 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 6c 61  tcl_platform(pla
0ec0: 74 66 6f 72 6d 29 3d 3d 22 77 69 6e 64 6f 77 73  tform)=="windows
0ed0: 22 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  "} {.           
0ee0: 20 20 20 73 65 74 20 74 61 72 67 65 74 20 74 65     set target te
0ef0: 73 74 66 69 78 74 75 72 65 2e 65 78 65 0a 20 20  stfixture.exe.  
0f00: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
0f10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
0f20: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
0f30: 20 6c 61 70 70 65 6e 64 20 47 28 74 65 73 74 5f   lappend G(test_
0f40: 61 72 72 61 79 29 20 5b 64 69 63 74 20 63 72 65  array) [dict cre
0f50: 61 74 65 20 63 6f 6e 66 69 67 20 24 63 6f 6e 66  ate config $conf
0f60: 69 67 20 74 61 72 67 65 74 20 24 74 61 72 67 65  ig target $targe
0f70: 74 5d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  t].    }.  }.}..
0f80: 70 72 6f 63 20 63 6f 75 6e 74 5f 74 65 73 74 73  proc count_tests
0f90: 5f 61 6e 64 5f 65 72 72 6f 72 73 20 7b 6e 61 6d  _and_errors {nam
0fa0: 65 20 6c 6f 67 66 69 6c 65 7d 20 7b 0a 20 20 67  e logfile} {.  g
0fb0: 6c 6f 62 61 6c 20 47 0a 0a 20 20 73 65 74 20 66  lobal G..  set f
0fc0: 64 20 5b 6f 70 65 6e 20 24 6c 6f 67 66 69 6c 65  d [open $logfile
0fd0: 20 72 62 5d 0a 20 20 73 65 74 20 73 65 65 6e 20   rb].  set seen 
0fe0: 30 0a 20 20 77 68 69 6c 65 20 7b 21 5b 65 6f 66  0.  while {![eof
0ff0: 20 24 66 64 5d 7d 20 7b 0a 20 20 20 20 73 65 74   $fd]} {.    set
1000: 20 6c 69 6e 65 20 5b 67 65 74 73 20 24 66 64 5d   line [gets $fd]
1010: 0a 20 20 20 20 69 66 20 7b 5b 72 65 67 65 78 70  .    if {[regexp
1020: 20 7b 28 5c 64 2b 29 20 65 72 72 6f 72 73 20 6f   {(\d+) errors o
1030: 75 74 20 6f 66 20 28 5c 64 2b 29 20 74 65 73 74  ut of (\d+) test
1040: 73 7d 20 24 6c 69 6e 65 20 61 6c 6c 20 6e 65 72  s} $line all ner
1050: 72 20 6e 74 65 73 74 5d 7d 20 7b 0a 20 20 20 20  r ntest]} {.    
1060: 20 20 69 6e 63 72 20 47 28 74 65 73 74 2e 24 6e    incr G(test.$n
1070: 61 6d 65 2e 6e 45 72 72 6f 72 29 20 24 6e 65 72  ame.nError) $ner
1080: 72 0a 20 20 20 20 20 20 69 6e 63 72 20 47 28 74  r.      incr G(t
1090: 65 73 74 2e 24 6e 61 6d 65 2e 6e 54 65 73 74 29  est.$name.nTest)
10a0: 20 24 6e 74 65 73 74 0a 20 20 20 20 20 20 73 65   $ntest.      se
10b0: 74 20 73 65 65 6e 20 31 0a 20 20 20 20 20 20 69  t seen 1.      i
10c0: 66 20 7b 24 6e 65 72 72 3e 30 7d 20 7b 0a 20 20  f {$nerr>0} {.  
10d0: 20 20 20 20 20 20 73 65 74 20 47 28 74 65 73 74        set G(test
10e0: 2e 24 6e 61 6d 65 2e 65 72 72 6d 73 67 29 20 24  .$name.errmsg) $
10f0: 6c 69 6e 65 0a 20 20 20 20 20 20 7d 0a 20 20 20  line.      }.   
1100: 20 7d 0a 20 20 20 20 69 66 20 7b 5b 72 65 67 65   }.    if {[rege
1110: 78 70 20 7b 72 75 6e 74 69 6d 65 20 65 72 72 6f  xp {runtime erro
1120: 72 3a 20 2b 28 2e 2a 29 7d 20 24 6c 69 6e 65 20  r: +(.*)} $line 
1130: 61 6c 6c 20 6d 73 67 5d 7d 20 7b 0a 20 20 20 20  all msg]} {.    
1140: 20 20 23 20 73 6b 69 70 20 6f 76 65 72 20 22 76    # skip over "v
1150: 61 6c 75 65 20 69 73 20 6f 75 74 73 69 64 65 20  alue is outside 
1160: 72 61 6e 67 65 22 20 65 72 72 6f 72 73 0a 20 20  range" errors.  
1170: 20 20 20 20 69 66 20 7b 5b 72 65 67 65 78 70 20      if {[regexp 
1180: 7b 76 61 6c 75 65 20 2e 2a 20 69 73 20 6f 75 74  {value .* is out
1190: 73 69 64 65 20 74 68 65 20 72 61 6e 67 65 20 6f  side the range o
11a0: 66 20 72 65 70 72 65 73 65 6e 74 61 62 6c 65 7d  f representable}
11b0: 20 24 6c 69 6e 65 5d 7d 20 7b 0a 20 20 20 20 20   $line]} {.     
11c0: 20 20 20 20 23 20 6e 6f 6f 70 0a 20 20 20 20 20      # noop.     
11d0: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
11e0: 20 20 69 6e 63 72 20 47 28 74 65 73 74 2e 24 6e    incr G(test.$n
11f0: 61 6d 65 2e 6e 45 72 72 6f 72 29 0a 20 20 20 20  ame.nError).    
1200: 20 20 20 20 69 66 20 7b 24 47 28 74 65 73 74 2e      if {$G(test.
1210: 24 6e 61 6d 65 2e 65 72 72 6d 73 67 29 3d 3d 22  $name.errmsg)=="
1220: 22 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 73  "} {.          s
1230: 65 74 20 47 28 74 65 73 74 2e 24 6e 61 6d 65 2e  et G(test.$name.
1240: 65 72 72 6d 73 67 29 20 24 6d 73 67 0a 20 20 20  errmsg) $msg.   
1250: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1260: 20 20 20 7d 0a 20 20 20 20 69 66 20 7b 5b 72 65     }.    if {[re
1270: 67 65 78 70 20 7b 66 61 74 61 6c 20 65 72 72 6f  gexp {fatal erro
1280: 72 20 2b 28 2e 2a 29 7d 20 24 6c 69 6e 65 20 61  r +(.*)} $line a
1290: 6c 6c 20 6d 73 67 5d 7d 20 7b 0a 20 20 20 20 20  ll msg]} {.     
12a0: 20 69 6e 63 72 20 47 28 74 65 73 74 2e 24 6e 61   incr G(test.$na
12b0: 6d 65 2e 6e 45 72 72 6f 72 29 0a 20 20 20 20 20  me.nError).     
12c0: 20 69 66 20 7b 24 47 28 74 65 73 74 2e 24 6e 61   if {$G(test.$na
12d0: 6d 65 2e 65 72 72 6d 73 67 29 3d 3d 22 22 7d 20  me.errmsg)==""} 
12e0: 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20 47 28  {.        set G(
12f0: 74 65 73 74 2e 24 6e 61 6d 65 2e 65 72 72 6d 73  test.$name.errms
1300: 67 29 20 24 6d 73 67 0a 20 20 20 20 20 20 7d 0a  g) $msg.      }.
1310: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 7b 5b 72      }.    if {[r
1320: 65 67 65 78 70 20 7b 45 52 52 4f 52 20 53 55 4d  egexp {ERROR SUM
1330: 4d 41 52 59 3a 20 28 5c 64 2b 29 20 65 72 72 6f  MARY: (\d+) erro
1340: 72 73 2e 2a 7d 20 24 6c 69 6e 65 20 61 6c 6c 20  rs.*} $line all 
1350: 63 6e 74 5d 20 26 26 20 24 63 6e 74 3e 30 7d 20  cnt] && $cnt>0} 
1360: 7b 0a 20 20 20 20 20 20 69 6e 63 72 20 47 28 74  {.      incr G(t
1370: 65 73 74 2e 24 6e 61 6d 65 2e 6e 45 72 72 6f 72  est.$name.nError
1380: 29 0a 20 20 20 20 20 20 69 66 20 7b 24 47 28 74  ).      if {$G(t
1390: 65 73 74 2e 24 6e 61 6d 65 2e 65 72 72 6d 73 67  est.$name.errmsg
13a0: 29 3d 3d 22 22 7d 20 7b 0a 20 20 20 20 20 20 20  )==""} {.       
13b0: 20 73 65 74 20 47 28 74 65 73 74 2e 24 6e 61 6d   set G(test.$nam
13c0: 65 2e 65 72 72 6d 73 67 29 20 24 61 6c 6c 0a 20  e.errmsg) $all. 
13d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
13e0: 20 69 66 20 7b 5b 72 65 67 65 78 70 20 7b 5e 56   if {[regexp {^V
13f0: 45 52 53 49 4f 4e 3a 20 33 5c 2e 5c 64 2b 2e 5c  ERSION: 3\.\d+.\
1400: 64 2b 7d 20 24 6c 69 6e 65 5d 7d 20 7b 0a 20 20  d+} $line]} {.  
1410: 20 20 20 20 73 65 74 20 76 20 5b 73 74 72 69 6e      set v [strin
1420: 67 20 72 61 6e 67 65 20 24 6c 69 6e 65 20 39 20  g range $line 9 
1430: 65 6e 64 5d 0a 20 20 20 20 20 20 69 66 20 7b 24  end].      if {$
1440: 47 28 73 71 6c 69 74 65 5f 76 65 72 73 69 6f 6e  G(sqlite_version
1450: 29 20 65 71 20 22 75 6e 6b 6e 6f 77 6e 22 7d 20  ) eq "unknown"} 
1460: 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20 47 28  {.        set G(
1470: 73 71 6c 69 74 65 5f 76 65 72 73 69 6f 6e 29 20  sqlite_version) 
1480: 24 76 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69  $v.      } elsei
1490: 66 20 7b 24 47 28 73 71 6c 69 74 65 5f 76 65 72  f {$G(sqlite_ver
14a0: 73 69 6f 6e 29 20 6e 65 20 24 76 7d 20 7b 0a 20  sion) ne $v} {. 
14b0: 20 20 20 20 20 20 20 73 65 74 20 47 28 74 65 73         set G(tes
14c0: 74 2e 24 6e 61 6d 65 2e 65 72 72 6d 73 67 29 20  t.$name.errmsg) 
14d0: 22 76 65 72 73 69 6f 6e 20 63 6f 6e 66 6c 69 63  "version conflic
14e0: 74 3a 20 7b 24 47 28 73 71 6c 69 74 65 5f 76 65  t: {$G(sqlite_ve
14f0: 72 73 69 6f 6e 29 7d 20 76 73 2e 20 7b 24 76 7d  rsion)} vs. {$v}
1500: 22 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ".      }.    }.
1510: 20 20 7d 0a 20 20 63 6c 6f 73 65 20 24 66 64 0a    }.  close $fd.
1520: 20 20 69 66 20 7b 24 47 28 74 65 73 74 29 20 3d    if {$G(test) =
1530: 3d 20 22 42 75 69 6c 64 2d 4f 6e 6c 79 22 7d 20  = "Build-Only"} 
1540: 7b 0a 20 20 20 20 69 6e 63 72 20 47 28 74 65 73  {.    incr G(tes
1550: 74 2e 24 6e 61 6d 65 2e 6e 54 65 73 74 29 0a 20  t.$name.nTest). 
1560: 20 20 20 69 66 20 7b 24 47 28 74 65 73 74 2e 24     if {$G(test.$
1570: 6e 61 6d 65 2e 6e 45 72 72 6f 72 29 3e 30 7d 20  name.nError)>0} 
1580: 7b 0a 20 20 20 20 20 20 73 65 74 20 65 72 72 6d  {.      set errm
1590: 73 67 20 22 42 75 69 6c 64 20 66 61 69 6c 65 64  sg "Build failed
15a0: 22 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65  ".    }.  } else
15b0: 69 66 20 7b 21 24 73 65 65 6e 7d 20 7b 0a 20 20  if {!$seen} {.  
15c0: 20 20 73 65 74 20 47 28 74 65 73 74 2e 24 6e 61    set G(test.$na
15d0: 6d 65 2e 65 72 72 6d 73 67 29 20 22 54 65 73 74  me.errmsg) "Test
15e0: 20 64 69 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74   did not complet
15f0: 65 22 0a 20 20 20 20 69 66 20 7b 5b 66 69 6c 65  e".    if {[file
1600: 20 72 65 61 64 61 62 6c 65 20 63 6f 72 65 5d 7d   readable core]}
1610: 20 7b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 20   {.      append 
1620: 47 28 74 65 73 74 2e 24 6e 61 6d 65 2e 65 72 72  G(test.$name.err
1630: 6d 73 67 29 20 22 20 2d 20 63 6f 72 65 20 66 69  msg) " - core fi
1640: 6c 65 20 65 78 69 73 74 73 22 0a 20 20 20 20 7d  le exists".    }
1650: 0a 20 20 7d 0a 7d 0a 0a 70 72 6f 63 20 77 61 70  .  }.}..proc wap
1660: 70 74 65 73 74 5f 6f 75 74 70 75 74 20 7b 73 74  ptest_output {st
1670: 72 7d 20 7b 0a 20 20 67 6c 6f 62 61 6c 20 47 0a  r} {.  global G.
1680: 20 20 69 66 20 7b 24 47 28 73 74 64 6f 75 74 29    if {$G(stdout)
1690: 7d 20 7b 20 70 75 74 73 20 24 73 74 72 20 7d 0a  } { puts $str }.
16a0: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
16b0: 74 73 20 47 28 6c 6f 67 29 5d 7d 20 7b 20 0a 20  ts G(log)]} { . 
16c0: 20 20 20 70 75 74 73 20 24 47 28 6c 6f 67 29 20     puts $G(log) 
16d0: 24 73 74 72 20 0a 20 20 20 20 66 6c 75 73 68 20  $str .    flush 
16e0: 24 47 28 6c 6f 67 29 0a 20 20 7d 0a 7d 0a 70 72  $G(log).  }.}.pr
16f0: 6f 63 20 77 61 70 70 74 65 73 74 5f 6f 70 65 6e  oc wapptest_open
1700: 6c 6f 67 20 7b 7d 20 7b 0a 20 20 67 6c 6f 62 61  log {} {.  globa
1710: 6c 20 47 0a 20 20 73 65 74 20 47 28 6c 6f 67 29  l G.  set G(log)
1720: 20 5b 6f 70 65 6e 20 77 61 70 70 74 65 73 74 2d   [open wapptest-
1730: 6f 75 74 2e 74 78 74 20 77 2b 5d 0a 7d 0a 70 72  out.txt w+].}.pr
1740: 6f 63 20 77 61 70 70 74 65 73 74 5f 63 6c 6f 73  oc wapptest_clos
1750: 65 6c 6f 67 20 7b 7d 20 7b 0a 20 20 67 6c 6f 62  elog {} {.  glob
1760: 61 6c 20 47 0a 20 20 63 6c 6f 73 65 20 24 47 28  al G.  close $G(
1770: 6c 6f 67 29 0a 20 20 75 6e 73 65 74 20 47 28 6c  log).  unset G(l
1780: 6f 67 29 0a 7d 0a 0a 70 72 6f 63 20 66 6f 72 6d  og).}..proc form
1790: 61 74 5f 73 65 63 6f 6e 64 73 20 7b 73 65 63 6f  at_seconds {seco
17a0: 6e 64 73 7d 20 7b 0a 20 20 73 65 74 20 6d 69 6e  nds} {.  set min
17b0: 20 5b 66 6f 72 6d 61 74 20 25 2e 32 64 20 5b 65   [format %.2d [e
17c0: 78 70 72 20 28 24 73 65 63 6f 6e 64 73 20 2f 20  xpr ($seconds / 
17d0: 36 30 29 20 25 20 36 30 5d 5d 0a 20 20 73 65 74  60) % 60]].  set
17e0: 20 20 68 72 20 5b 66 6f 72 6d 61 74 20 25 2e 32    hr [format %.2
17f0: 64 20 5b 65 78 70 72 20 24 73 65 63 6f 6e 64 73  d [expr $seconds
1800: 20 2f 20 33 36 30 30 5d 5d 0a 20 20 73 65 74 20   / 3600]].  set 
1810: 73 65 63 20 5b 66 6f 72 6d 61 74 20 25 2e 32 64  sec [format %.2d
1820: 20 5b 65 78 70 72 20 24 73 65 63 6f 6e 64 73 20   [expr $seconds 
1830: 25 20 36 30 5d 5d 0a 20 20 72 65 74 75 72 6e 20  % 60]].  return 
1840: 22 24 68 72 3a 24 6d 69 6e 3a 24 73 65 63 22 0a  "$hr:$min:$sec".
1850: 7d 0a 0a 23 20 54 68 69 73 20 63 6f 6d 6d 61 6e  }..# This comman
1860: 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63  d is invoked onc
1870: 65 20 61 20 73 6c 61 76 65 20 70 72 6f 63 65 73  e a slave proces
1880: 73 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 72  s has finished r
1890: 75 6e 6e 69 6e 67 20 69 74 73 0a 23 20 74 65 73  unning its.# tes
18a0: 74 73 2c 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ts, successfully
18b0: 20 6f 72 20 6f 74 68 65 72 77 69 73 65 2e 20 50   or otherwise. P
18c0: 61 72 61 6d 65 74 65 72 20 24 6e 61 6d 65 20 69  arameter $name i
18d0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
18e0: 65 20 0a 23 20 74 65 73 74 2c 20 24 72 63 20 74  e .# test, $rc t
18f0: 68 65 20 65 78 69 74 20 63 6f 64 65 20 72 65 74  he exit code ret
1900: 75 72 6e 65 64 20 62 79 20 74 68 65 20 73 6c 61  urned by the sla
1910: 76 65 20 70 72 6f 63 65 73 73 2e 0a 23 0a 70 72  ve process..#.pr
1920: 6f 63 20 73 6c 61 76 65 5f 74 65 73 74 5f 64 6f  oc slave_test_do
1930: 6e 65 20 7b 6e 61 6d 65 20 72 63 7d 20 7b 0a 20  ne {name rc} {. 
1940: 20 67 6c 6f 62 61 6c 20 47 0a 20 20 73 65 74 20   global G.  set 
1950: 47 28 74 65 73 74 2e 24 6e 61 6d 65 2e 64 6f 6e  G(test.$name.don
1960: 65 29 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64  e) [clock second
1970: 73 5d 0a 20 20 73 65 74 20 47 28 74 65 73 74 2e  s].  set G(test.
1980: 24 6e 61 6d 65 2e 6e 45 72 72 6f 72 29 20 30 0a  $name.nError) 0.
1990: 20 20 73 65 74 20 47 28 74 65 73 74 2e 24 6e 61    set G(test.$na
19a0: 6d 65 2e 6e 54 65 73 74 29 20 30 0a 20 20 73 65  me.nTest) 0.  se
19b0: 74 20 47 28 74 65 73 74 2e 24 6e 61 6d 65 2e 65  t G(test.$name.e
19c0: 72 72 6d 73 67 29 20 22 22 0a 20 20 69 66 20 7b  rrmsg) "".  if {
19d0: 24 72 63 7d 20 7b 0a 20 20 20 20 69 6e 63 72 20  $rc} {.    incr 
19e0: 47 28 74 65 73 74 2e 24 6e 61 6d 65 2e 6e 45 72  G(test.$name.nEr
19f0: 72 6f 72 29 0a 20 20 7d 0a 20 20 69 66 20 7b 5b  ror).  }.  if {[
1a00: 66 69 6c 65 20 65 78 69 73 74 73 20 24 47 28 74  file exists $G(t
1a10: 65 73 74 2e 24 6e 61 6d 65 2e 6c 6f 67 29 5d 7d  est.$name.log)]}
1a20: 20 7b 0a 20 20 20 20 63 6f 75 6e 74 5f 74 65 73   {.    count_tes
1a30: 74 73 5f 61 6e 64 5f 65 72 72 6f 72 73 20 24 6e  ts_and_errors $n
1a40: 61 6d 65 20 24 47 28 74 65 73 74 2e 24 6e 61 6d  ame $G(test.$nam
1a50: 65 2e 6c 6f 67 29 0a 20 20 7d 0a 0a 20 20 23 20  e.log).  }..  # 
1a60: 49 66 20 74 68 65 20 22 6b 65 65 70 20 66 69 6c  If the "keep fil
1a70: 65 73 22 20 63 68 65 63 6b 62 6f 78 20 69 73 20  es" checkbox is 
1a80: 63 6c 65 61 72 2c 20 64 65 6c 65 74 65 20 61 6c  clear, delete al
1a90: 6c 20 66 69 6c 65 73 20 65 78 63 65 70 74 20 66  l files except f
1aa0: 6f 72 0a 20 20 23 20 74 68 65 20 65 78 65 63 75  or.  # the execu
1ab0: 74 61 62 6c 65 73 20 61 6e 64 20 74 65 73 74 20  tables and test 
1ac0: 6c 6f 67 73 2e 20 41 6e 64 20 61 6e 79 20 63 6f  logs. And any co
1ad0: 72 65 20 66 69 6c 65 20 74 68 61 74 20 69 73 20  re file that is 
1ae0: 70 72 65 73 65 6e 74 2e 0a 20 20 69 66 20 7b 24  present..  if {$
1af0: 47 28 6b 65 65 70 29 3d 3d 30 7d 20 7b 0a 20 20  G(keep)==0} {.  
1b00: 20 20 73 65 74 20 6b 65 65 70 6c 69 73 74 20 7b    set keeplist {
1b10: 0a 20 20 20 20 20 20 74 65 73 74 66 69 78 74 75  .      testfixtu
1b20: 72 65 20 74 65 73 74 66 69 78 74 75 72 65 2e 65  re testfixture.e
1b30: 78 65 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  xe.      sqlite3
1b40: 20 73 71 6c 69 74 65 33 2e 65 78 65 0a 20 20 20   sqlite3.exe.   
1b50: 20 20 20 74 65 73 74 2e 6c 6f 67 20 74 65 73 74     test.log test
1b60: 2d 6f 75 74 2e 74 78 74 0a 20 20 20 20 20 20 63  -out.txt.      c
1b70: 6f 72 65 0a 20 20 20 20 20 20 77 61 70 70 74 65  ore.      wappte
1b80: 73 74 5f 6d 61 6b 65 2e 73 68 0a 20 20 20 20 20  st_make.sh.     
1b90: 20 77 61 70 70 74 65 73 74 5f 63 6f 6e 66 69 67   wapptest_config
1ba0: 75 72 65 2e 73 68 0a 20 20 20 20 20 20 77 61 70  ure.sh.      wap
1bb0: 70 74 65 73 74 5f 72 75 6e 2e 74 63 6c 0a 20 20  ptest_run.tcl.  
1bc0: 20 20 7d 0a 20 20 20 20 66 6f 72 65 61 63 68 20    }.    foreach 
1bd0: 66 20 5b 67 6c 6f 62 20 2d 6e 6f 63 6f 6d 70 6c  f [glob -nocompl
1be0: 61 69 6e 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24  ain [file join $
1bf0: 47 28 74 65 73 74 2e 24 6e 61 6d 65 2e 64 69 72  G(test.$name.dir
1c00: 29 20 2a 5d 5d 20 7b 0a 20 20 20 20 20 20 73 65  ) *]] {.      se
1c10: 74 20 74 20 5b 66 69 6c 65 20 74 61 69 6c 20 24  t t [file tail $
1c20: 66 5d 0a 20 20 20 20 20 20 69 66 20 7b 5b 6c 73  f].      if {[ls
1c30: 65 61 72 63 68 20 24 6b 65 65 70 6c 69 73 74 20  earch $keeplist 
1c40: 24 74 5d 3c 30 7d 20 7b 0a 20 20 20 20 20 20 20  $t]<0} {.       
1c50: 20 63 61 74 63 68 20 7b 20 66 69 6c 65 20 64 65   catch { file de
1c60: 6c 65 74 65 20 2d 66 6f 72 63 65 20 24 66 20 7d  lete -force $f }
1c70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1c80: 20 7d 0a 0a 20 20 23 20 46 6f 72 6d 61 74 20 61   }..  # Format a
1c90: 20 6d 65 73 73 61 67 65 20 72 65 67 61 72 64 69   message regardi
1ca0: 6e 67 20 74 68 65 20 73 75 63 63 65 73 73 20 6f  ng the success o
1cb0: 72 20 66 61 69 6c 75 72 65 20 6f 66 20 68 74 65  r failure of hte
1cc0: 20 74 65 73 74 2e 0a 20 20 73 65 74 20 74 20 5b   test..  set t [
1cd0: 66 6f 72 6d 61 74 5f 73 65 63 6f 6e 64 73 20 5b  format_seconds [
1ce0: 65 78 70 72 20 24 47 28 74 65 73 74 2e 24 6e 61  expr $G(test.$na
1cf0: 6d 65 2e 64 6f 6e 65 29 20 2d 20 24 47 28 74 65  me.done) - $G(te
1d00: 73 74 2e 24 6e 61 6d 65 2e 73 74 61 72 74 29 5d  st.$name.start)]
1d10: 5d 0a 20 20 73 65 74 20 72 65 73 20 22 4f 4b 22  ].  set res "OK"
1d20: 0a 20 20 69 66 20 7b 24 47 28 74 65 73 74 2e 24  .  if {$G(test.$
1d30: 6e 61 6d 65 2e 6e 45 72 72 6f 72 29 7d 20 7b 20  name.nError)} { 
1d40: 73 65 74 20 72 65 73 20 22 46 41 49 4c 45 44 22  set res "FAILED"
1d50: 20 7d 0a 20 20 73 65 74 20 64 6f 74 73 20 5b 73   }.  set dots [s
1d60: 74 72 69 6e 67 20 72 65 70 65 61 74 20 2e 20 5b  tring repeat . [
1d70: 65 78 70 72 20 36 30 20 2d 20 5b 73 74 72 69 6e  expr 60 - [strin
1d80: 67 20 6c 65 6e 67 74 68 20 24 6e 61 6d 65 5d 5d  g length $name]]
1d90: 5d 0a 20 20 73 65 74 20 6d 73 67 20 22 24 6e 61  ].  set msg "$na
1da0: 6d 65 20 24 64 6f 74 73 20 24 72 65 73 20 28 24  me $dots $res ($
1db0: 74 29 22 0a 0a 20 20 77 61 70 70 74 65 73 74 5f  t)"..  wapptest_
1dc0: 6f 75 74 70 75 74 20 24 6d 73 67 0a 20 20 69 66  output $msg.  if
1dd0: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 47   {[info exists G
1de0: 28 74 65 73 74 2e 24 6e 61 6d 65 2e 65 72 72 6d  (test.$name.errm
1df0: 73 67 29 5d 20 26 26 20 24 47 28 74 65 73 74 2e  sg)] && $G(test.
1e00: 24 6e 61 6d 65 2e 65 72 72 6d 73 67 29 21 3d 22  $name.errmsg)!="
1e10: 22 7d 20 7b 0a 20 20 20 20 77 61 70 70 74 65 73  "} {.    wapptes
1e20: 74 5f 6f 75 74 70 75 74 20 22 20 20 20 20 24 47  t_output "    $G
1e30: 28 74 65 73 74 2e 24 6e 61 6d 65 2e 65 72 72 6d  (test.$name.errm
1e40: 73 67 29 22 0a 20 20 7d 0a 7d 0a 0a 23 20 54 68  sg)".  }.}..# Th
1e50: 69 73 20 69 73 20 61 20 66 69 6c 65 65 76 65 6e  is is a fileeven
1e60: 74 20 63 61 6c 6c 62 61 63 6b 20 69 6e 76 6f 6b  t callback invok
1e70: 65 64 20 65 61 63 68 20 74 69 6d 65 20 61 20 66  ed each time a f
1e80: 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 74  ile-descriptor t
1e90: 68 61 74 0a 23 20 63 6f 6e 6e 65 63 74 73 20 74  hat.# connects t
1ea0: 68 69 73 20 70 72 6f 63 65 73 73 20 74 6f 20 61  his process to a
1eb0: 20 73 6c 61 76 65 20 70 72 6f 63 65 73 73 20 69   slave process i
1ec0: 73 20 72 65 61 64 61 62 6c 65 2e 0a 23 0a 70 72  s readable..#.pr
1ed0: 6f 63 20 73 6c 61 76 65 5f 66 69 6c 65 65 76 65  oc slave_fileeve
1ee0: 6e 74 20 7b 6e 61 6d 65 7d 20 7b 0a 20 20 67 6c  nt {name} {.  gl
1ef0: 6f 62 61 6c 20 47 0a 20 20 73 65 74 20 66 64 20  obal G.  set fd 
1f00: 24 47 28 74 65 73 74 2e 24 6e 61 6d 65 2e 63 68  $G(test.$name.ch
1f10: 61 6e 6e 65 6c 29 0a 0a 20 20 69 66 20 7b 5b 65  annel)..  if {[e
1f20: 6f 66 20 24 66 64 5d 7d 20 7b 0a 20 20 20 20 66  of $fd]} {.    f
1f30: 63 6f 6e 66 69 67 75 72 65 20 24 66 64 20 2d 62  configure $fd -b
1f40: 6c 6f 63 6b 69 6e 67 20 31 0a 20 20 20 20 73 65  locking 1.    se
1f50: 74 20 72 63 20 5b 63 61 74 63 68 20 7b 20 63 6c  t rc [catch { cl
1f60: 6f 73 65 20 24 66 64 20 7d 5d 0a 20 20 20 20 75  ose $fd }].    u
1f70: 6e 73 65 74 20 47 28 74 65 73 74 2e 24 6e 61 6d  nset G(test.$nam
1f80: 65 2e 63 68 61 6e 6e 65 6c 29 0a 20 20 20 20 73  e.channel).    s
1f90: 6c 61 76 65 5f 74 65 73 74 5f 64 6f 6e 65 20 24  lave_test_done $
1fa0: 6e 61 6d 65 20 24 72 63 0a 20 20 7d 20 65 6c 73  name $rc.  } els
1fb0: 65 20 7b 0a 20 20 20 20 73 65 74 20 6c 69 6e 65  e {.    set line
1fc0: 20 5b 67 65 74 73 20 24 66 64 5d 0a 20 20 20 20   [gets $fd].    
1fd0: 69 66 20 7b 5b 73 74 72 69 6e 67 20 74 72 69 6d  if {[string trim
1fe0: 20 24 6c 69 6e 65 5d 20 21 3d 20 22 22 7d 20 7b   $line] != ""} {
1ff0: 20 70 75 74 73 20 22 54 72 61 63 65 20 20 20 3a   puts "Trace   :
2000: 20 24 6e 61 6d 65 20 2d 20 5c 22 24 6c 69 6e 65   $name - \"$line
2010: 5c 22 22 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 5f  \"" }.  }..  do_
2020: 73 6f 6d 65 5f 73 74 75 66 66 0a 7d 0a 0a 23 20  some_stuff.}..# 
2030: 52 65 74 75 72 6e 20 74 68 65 20 63 6f 6e 74 65  Return the conte
2040: 6e 74 73 20 6f 66 20 74 68 65 20 22 73 6c 61 76  nts of the "slav
2050: 65 20 73 63 72 69 70 74 22 20 2d 20 74 68 65 20  e script" - the 
2060: 73 63 72 69 70 74 20 72 75 6e 20 62 79 20 73 6c  script run by sl
2070: 61 76 65 20 0a 23 20 70 72 6f 63 65 73 73 65 73  ave .# processes
2080: 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 70 65 72   to actually per
2090: 66 6f 72 6d 20 74 68 65 20 74 65 73 74 2e 20 41  form the test. A
20a0: 6c 6c 20 69 74 20 64 6f 65 73 20 69 73 20 65 78  ll it does is ex
20b0: 65 63 75 74 65 20 74 68 65 0a 23 20 74 65 73 74  ecute the.# test
20c0: 20 73 63 72 69 70 74 20 61 6c 72 65 61 64 79 20   script already 
20d0: 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 20  written to disk 
20e0: 28 77 61 70 70 74 65 73 74 5f 63 6d 64 2e 73 68  (wapptest_cmd.sh
20f0: 20 6f 72 20 77 61 70 70 74 65 73 74 5f 63 6d 64   or wapptest_cmd
2100: 2e 62 61 74 29 2e 0a 23 0a 70 72 6f 63 20 77 61  .bat)..#.proc wa
2110: 70 70 74 65 73 74 5f 73 6c 61 76 65 5f 73 63 72  pptest_slave_scr
2120: 69 70 74 20 7b 7d 20 7b 0a 20 20 67 6c 6f 62 61  ipt {} {.  globa
2130: 6c 20 47 0a 20 20 69 66 20 7b 24 47 28 6d 73 76  l G.  if {$G(msv
2140: 63 29 3d 3d 30 7d 20 7b 0a 20 20 20 20 73 65 74  c)==0} {.    set
2150: 20 64 69 72 20 5b 66 69 6c 65 20 6a 6f 69 6e 20   dir [file join 
2160: 2e 2e 20 24 47 28 73 72 63 64 69 72 29 5d 0a 20  .. $G(srcdir)]. 
2170: 20 20 20 73 65 74 20 72 65 73 20 5b 73 75 62 73     set res [subs
2180: 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20 7b 0a  t -nocommands {.
2190: 20 20 20 20 20 20 73 65 74 20 72 63 20 5b 63 61        set rc [ca
21a0: 74 63 68 20 22 65 78 65 63 20 73 68 20 77 61 70  tch "exec sh wap
21b0: 70 74 65 73 74 5f 63 6d 64 2e 73 68 20 7b 24 64  ptest_cmd.sh {$d
21c0: 69 72 7d 20 3e 3e 26 20 74 65 73 74 2e 6c 6f 67  ir} >>& test.log
21d0: 22 20 5d 0a 20 20 20 20 20 20 65 78 69 74 20 5b  " ].      exit [
21e0: 73 65 74 20 72 63 5d 0a 20 20 20 20 7d 5d 0a 20  set rc].    }]. 
21f0: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 73 65   } else {.    se
2200: 74 20 64 69 72 20 5b 66 69 6c 65 20 6e 61 74 69  t dir [file nati
2210: 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6e 6f 72  vename [file nor
2220: 6d 61 6c 69 7a 65 20 24 47 28 73 72 63 64 69 72  malize $G(srcdir
2230: 29 5d 5d 0a 20 20 20 20 73 65 74 20 64 69 72 20  )]].    set dir 
2240: 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73  [string map [lis
2250: 74 20 22 5c 5c 22 20 22 5c 5c 5c 5c 22 5d 20 24  t "\\" "\\\\"] $
2260: 64 69 72 5d 0a 20 20 20 20 73 65 74 20 72 65 73  dir].    set res
2270: 20 5b 73 75 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61   [subst -nocomma
2280: 6e 64 73 20 7b 0a 20 20 20 20 20 20 73 65 74 20  nds {.      set 
2290: 72 63 20 5b 63 61 74 63 68 20 22 65 78 65 63 20  rc [catch "exec 
22a0: 77 61 70 70 74 65 73 74 5f 63 6d 64 2e 62 61 74  wapptest_cmd.bat
22b0: 20 7b 24 64 69 72 7d 20 3e 3e 26 20 74 65 73 74   {$dir} >>& test
22c0: 2e 6c 6f 67 22 20 5d 0a 20 20 20 20 20 20 65 78  .log" ].      ex
22d0: 69 74 20 5b 73 65 74 20 72 63 5d 0a 20 20 20 20  it [set rc].    
22e0: 7d 5d 0a 20 20 7d 0a 0a 20 20 73 65 74 20 72 65  }].  }..  set re
22f0: 73 0a 7d 0a 0a 0a 23 20 4c 61 75 6e 63 68 20 61  s.}...# Launch a
2300: 20 73 6c 61 76 65 20 70 72 6f 63 65 73 73 20 74   slave process t
2310: 6f 20 72 75 6e 20 61 20 74 65 73 74 2e 0a 23 0a  o run a test..#.
2320: 70 72 6f 63 20 73 6c 61 76 65 5f 6c 61 75 6e 63  proc slave_launc
2330: 68 20 7b 6e 61 6d 65 20 74 61 72 67 65 74 20 64  h {name target d
2340: 69 72 7d 20 7b 0a 20 20 67 6c 6f 62 61 6c 20 47  ir} {.  global G
2350: 0a 0a 20 20 63 61 74 63 68 20 7b 20 66 69 6c 65  ..  catch { file
2360: 20 6d 6b 64 69 72 20 24 64 69 72 20 7d 20 6d 73   mkdir $dir } ms
2370: 67 0a 20 20 66 6f 72 65 61 63 68 20 66 20 5b 67  g.  foreach f [g
2380: 6c 6f 62 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20  lob -nocomplain 
2390: 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 20  [file join $dir 
23a0: 2a 5d 5d 20 7b 0a 20 20 20 20 63 61 74 63 68 20  *]] {.    catch 
23b0: 7b 20 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66  { file delete -f
23c0: 6f 72 63 65 20 24 66 20 7d 0a 20 20 7d 0a 20 20  orce $f }.  }.  
23d0: 73 65 74 20 47 28 74 65 73 74 2e 24 6e 61 6d 65  set G(test.$name
23e0: 2e 64 69 72 29 20 24 64 69 72 0a 0a 20 20 23 20  .dir) $dir..  # 
23f0: 57 72 69 74 65 20 74 68 65 20 74 65 73 74 20 63  Write the test c
2400: 6f 6d 6d 61 6e 64 20 74 6f 20 77 61 70 70 74 65  ommand to wappte
2410: 73 74 5f 63 6d 64 2e 73 68 7c 62 61 74 2e 0a 20  st_cmd.sh|bat.. 
2420: 20 23 0a 20 20 73 65 74 20 65 78 74 20 73 68 0a   #.  set ext sh.
2430: 20 20 69 66 20 7b 24 47 28 6d 73 76 63 29 7d 20    if {$G(msvc)} 
2440: 7b 20 73 65 74 20 65 78 74 20 62 61 74 20 7d 0a  { set ext bat }.
2450: 20 20 73 65 74 20 66 64 31 20 5b 6f 70 65 6e 20    set fd1 [open 
2460: 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 20  [file join $dir 
2470: 77 61 70 70 74 65 73 74 5f 63 6d 64 2e 24 65 78  wapptest_cmd.$ex
2480: 74 5d 20 77 5d 0a 20 20 69 66 20 7b 24 47 28 6d  t] w].  if {$G(m
2490: 73 76 63 29 7d 20 7b 0a 20 20 20 20 70 75 74 73  svc)} {.    puts
24a0: 20 24 66 64 31 20 5b 72 65 6c 65 61 73 65 74 65   $fd1 [releasete
24b0: 73 74 5f 64 61 74 61 20 73 63 72 69 70 74 20 2d  st_data script -
24c0: 6d 73 76 63 20 24 6e 61 6d 65 20 24 74 61 72 67  msvc $name $targ
24d0: 65 74 5d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  et].  } else {. 
24e0: 20 20 20 70 75 74 73 20 24 66 64 31 20 5b 72 65     puts $fd1 [re
24f0: 6c 65 61 73 65 74 65 73 74 5f 64 61 74 61 20 73  leasetest_data s
2500: 63 72 69 70 74 20 24 6e 61 6d 65 20 24 74 61 72  cript $name $tar
2510: 67 65 74 5d 0a 20 20 7d 0a 20 20 63 6c 6f 73 65  get].  }.  close
2520: 20 24 66 64 31 0a 0a 20 20 23 20 57 72 69 74 65   $fd1..  # Write
2530: 20 74 68 65 20 77 61 70 70 74 65 73 74 5f 72 75   the wapptest_ru
2540: 6e 2e 74 63 6c 20 73 63 72 69 70 74 20 74 6f 20  n.tcl script to 
2550: 74 68 65 20 74 65 73 74 20 64 69 72 65 63 74 6f  the test directo
2560: 72 79 2e 20 54 6f 20 72 75 6e 20 74 68 65 0a 20  ry. To run the. 
2570: 20 23 20 63 6f 6d 6d 61 6e 64 73 20 69 6e 20 74   # commands in t
2580: 68 65 20 6f 74 68 65 72 20 74 77 6f 20 66 69 6c  he other two fil
2590: 65 73 2e 0a 20 20 23 0a 20 20 73 65 74 20 66 64  es..  #.  set fd
25a0: 33 20 5b 6f 70 65 6e 20 5b 66 69 6c 65 20 6a 6f  3 [open [file jo
25b0: 69 6e 20 24 64 69 72 20 77 61 70 70 74 65 73 74  in $dir wapptest
25c0: 5f 72 75 6e 2e 74 63 6c 5d 20 77 5d 0a 20 20 70  _run.tcl] w].  p
25d0: 75 74 73 20 24 66 64 33 20 5b 77 61 70 70 74 65  uts $fd3 [wappte
25e0: 73 74 5f 73 6c 61 76 65 5f 73 63 72 69 70 74 5d  st_slave_script]
25f0: 0a 20 20 63 6c 6f 73 65 20 24 66 64 33 0a 0a 20  .  close $fd3.. 
2600: 20 73 65 74 20 70 77 64 20 5b 70 77 64 5d 0a 20   set pwd [pwd]. 
2610: 20 63 64 20 24 64 69 72 0a 20 20 73 65 74 20 66   cd $dir.  set f
2620: 64 20 5b 6f 70 65 6e 20 22 7c 5b 69 6e 66 6f 20  d [open "|[info 
2630: 6e 61 6d 65 6f 66 65 78 65 63 75 74 61 62 6c 65  nameofexecutable
2640: 5d 20 77 61 70 70 74 65 73 74 5f 72 75 6e 2e 74  ] wapptest_run.t
2650: 63 6c 22 20 72 2b 5d 0a 20 20 63 64 20 24 70 77  cl" r+].  cd $pw
2660: 64 0a 0a 20 20 73 65 74 20 47 28 74 65 73 74 2e  d..  set G(test.
2670: 24 6e 61 6d 65 2e 63 68 61 6e 6e 65 6c 29 20 24  $name.channel) $
2680: 66 64 0a 20 20 66 63 6f 6e 66 69 67 75 72 65 20  fd.  fconfigure 
2690: 24 66 64 20 2d 62 6c 6f 63 6b 69 6e 67 20 30 0a  $fd -blocking 0.
26a0: 20 20 66 69 6c 65 65 76 65 6e 74 20 24 66 64 20    fileevent $fd 
26b0: 72 65 61 64 61 62 6c 65 20 5b 6c 69 73 74 20 73  readable [list s
26c0: 6c 61 76 65 5f 66 69 6c 65 65 76 65 6e 74 20 24  lave_fileevent $
26d0: 6e 61 6d 65 5d 0a 7d 0a 0a 70 72 6f 63 20 64 6f  name].}..proc do
26e0: 5f 73 6f 6d 65 5f 73 74 75 66 66 20 7b 7d 20 7b  _some_stuff {} {
26f0: 0a 20 20 67 6c 6f 62 61 6c 20 47 0a 0a 20 20 23  .  global G..  #
2700: 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
2710: 72 20 6f 66 20 72 75 6e 6e 69 6e 67 20 6a 6f 62  r of running job
2720: 73 2e 20 41 20 72 75 6e 6e 69 6e 67 20 6a 6f 62  s. A running job
2730: 20 68 61 73 20 61 6e 20 65 6e 74 72 79 20 6e 61   has an entry na
2740: 6d 65 64 0a 20 20 23 20 22 63 68 61 6e 6e 65 6c  med.  # "channel
2750: 22 20 69 6e 20 69 74 73 20 64 69 63 74 69 6f 6e  " in its diction
2760: 61 72 79 2e 0a 20 20 73 65 74 20 6e 52 75 6e 6e  ary..  set nRunn
2770: 69 6e 67 20 30 0a 20 20 73 65 74 20 62 46 69 6e  ing 0.  set bFin
2780: 69 73 68 65 64 20 31 0a 20 20 66 6f 72 65 61 63  ished 1.  foreac
2790: 68 20 6a 20 24 47 28 74 65 73 74 5f 61 72 72 61  h j $G(test_arra
27a0: 79 29 20 7b 0a 20 20 20 20 73 65 74 20 6e 61 6d  y) {.    set nam
27b0: 65 20 5b 64 69 63 74 20 67 65 74 20 24 6a 20 63  e [dict get $j c
27c0: 6f 6e 66 69 67 5d 0a 20 20 20 20 69 66 20 7b 20  onfig].    if { 
27d0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 47 28 74  [info exists G(t
27e0: 65 73 74 2e 24 6e 61 6d 65 2e 63 68 61 6e 6e 65  est.$name.channe
27f0: 6c 29 5d 7d 20 7b 20 69 6e 63 72 20 6e 52 75 6e  l)]} { incr nRun
2800: 6e 69 6e 67 20 20 20 7d 0a 20 20 20 20 69 66 20  ning   }.    if 
2810: 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 47  {![info exists G
2820: 28 74 65 73 74 2e 24 6e 61 6d 65 2e 64 6f 6e 65  (test.$name.done
2830: 29 5d 7d 20 20 20 20 7b 20 73 65 74 20 62 46 69  )]}    { set bFi
2840: 6e 69 73 68 65 64 20 30 20 7d 0a 20 20 7d 0a 0a  nished 0 }.  }..
2850: 20 20 69 66 20 7b 24 62 46 69 6e 69 73 68 65 64    if {$bFinished
2860: 7d 20 7b 0a 20 20 20 20 73 65 74 20 6e 45 72 72  } {.    set nErr
2870: 6f 72 20 30 0a 20 20 20 20 73 65 74 20 6e 54 65  or 0.    set nTe
2880: 73 74 20 30 0a 20 20 20 20 73 65 74 20 6e 43 6f  st 0.    set nCo
2890: 6e 66 69 67 20 30 0a 20 20 20 20 66 6f 72 65 61  nfig 0.    forea
28a0: 63 68 20 6a 20 24 47 28 74 65 73 74 5f 61 72 72  ch j $G(test_arr
28b0: 61 79 29 20 7b 0a 20 20 20 20 20 20 73 65 74 20  ay) {.      set 
28c0: 6e 61 6d 65 20 5b 64 69 63 74 20 67 65 74 20 24  name [dict get $
28d0: 6a 20 63 6f 6e 66 69 67 5d 0a 20 20 20 20 20 20  j config].      
28e0: 69 6e 63 72 20 6e 45 72 72 6f 72 20 24 47 28 74  incr nError $G(t
28f0: 65 73 74 2e 24 6e 61 6d 65 2e 6e 45 72 72 6f 72  est.$name.nError
2900: 29 0a 20 20 20 20 20 20 69 6e 63 72 20 6e 54 65  ).      incr nTe
2910: 73 74 20 24 47 28 74 65 73 74 2e 24 6e 61 6d 65  st $G(test.$name
2920: 2e 6e 54 65 73 74 29 0a 20 20 20 20 20 20 69 6e  .nTest).      in
2930: 63 72 20 6e 43 6f 6e 66 69 67 20 0a 20 20 20 20  cr nConfig .    
2940: 7d 0a 20 20 20 20 73 65 74 20 47 28 72 65 73 75  }.    set G(resu
2950: 6c 74 29 20 22 24 6e 45 72 72 6f 72 20 65 72 72  lt) "$nError err
2960: 6f 72 73 20 66 72 6f 6d 20 24 6e 54 65 73 74 20  ors from $nTest 
2970: 74 65 73 74 73 20 69 6e 20 24 6e 43 6f 6e 66 69  tests in $nConfi
2980: 67 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  g configurations
2990: 2e 22 0a 20 20 20 20 77 61 70 70 74 65 73 74 5f  .".    wapptest_
29a0: 6f 75 74 70 75 74 20 5b 73 74 72 69 6e 67 20 72  output [string r
29b0: 65 70 65 61 74 20 2a 20 37 30 5d 0a 20 20 20 20  epeat * 70].    
29c0: 77 61 70 70 74 65 73 74 5f 6f 75 74 70 75 74 20  wapptest_output 
29d0: 24 47 28 72 65 73 75 6c 74 29 0a 20 20 20 20 63  $G(result).    c
29e0: 61 74 63 68 20 7b 0a 20 20 20 20 20 20 61 70 70  atch {.      app
29f0: 65 6e 64 20 47 28 72 65 73 75 6c 74 29 20 22 20  end G(result) " 
2a00: 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 24  SQLite version $
2a10: 47 28 73 71 6c 69 74 65 5f 76 65 72 73 69 6f 6e  G(sqlite_version
2a20: 29 22 0a 20 20 20 20 20 20 77 61 70 70 74 65 73  )".      wapptes
2a30: 74 5f 6f 75 74 70 75 74 20 22 20 53 51 4c 69 74  t_output " SQLit
2a40: 65 20 76 65 72 73 69 6f 6e 20 24 47 28 73 71 6c  e version $G(sql
2a50: 69 74 65 5f 76 65 72 73 69 6f 6e 29 22 0a 20 20  ite_version)".  
2a60: 20 20 7d 0a 20 20 20 20 73 65 74 20 47 28 73 74    }.    set G(st
2a70: 61 74 65 29 20 22 73 74 6f 70 70 65 64 22 0a 20  ate) "stopped". 
2a80: 20 20 20 77 61 70 70 74 65 73 74 5f 63 6c 6f 73     wapptest_clos
2a90: 65 6c 6f 67 0a 20 20 20 20 69 66 20 7b 24 47 28  elog.    if {$G(
2aa0: 6e 6f 75 69 29 7d 20 7b 20 65 78 69 74 20 30 20  noui)} { exit 0 
2ab0: 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  }.  } else {.   
2ac0: 20 73 65 74 20 6e 4c 61 75 6e 63 68 20 5b 65 78   set nLaunch [ex
2ad0: 70 72 20 24 47 28 6a 6f 62 73 29 20 2d 20 24 6e  pr $G(jobs) - $n
2ae0: 52 75 6e 6e 69 6e 67 5d 0a 20 20 20 20 66 6f 72  Running].    for
2af0: 65 61 63 68 20 6a 20 24 47 28 74 65 73 74 5f 61  each j $G(test_a
2b00: 72 72 61 79 29 20 7b 0a 20 20 20 20 20 20 69 66  rray) {.      if
2b10: 20 7b 24 6e 4c 61 75 6e 63 68 3c 3d 30 7d 20 62   {$nLaunch<=0} b
2b20: 72 65 61 6b 0a 20 20 20 20 20 20 73 65 74 20 6e  reak.      set n
2b30: 61 6d 65 20 5b 64 69 63 74 20 67 65 74 20 24 6a  ame [dict get $j
2b40: 20 63 6f 6e 66 69 67 5d 0a 20 20 20 20 20 20 69   config].      i
2b50: 66 20 7b 20 21 5b 69 6e 66 6f 20 65 78 69 73 74  f { ![info exist
2b60: 73 20 47 28 74 65 73 74 2e 24 6e 61 6d 65 2e 63  s G(test.$name.c
2b70: 68 61 6e 6e 65 6c 29 5d 0a 20 20 20 20 20 20 20  hannel)].       
2b80: 20 26 26 20 21 5b 69 6e 66 6f 20 65 78 69 73 74   && ![info exist
2b90: 73 20 47 28 74 65 73 74 2e 24 6e 61 6d 65 2e 64  s G(test.$name.d
2ba0: 6f 6e 65 29 5d 0a 20 20 20 20 20 20 7d 20 7b 0a  one)].      } {.
2bb0: 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 61 72  .        set tar
2bc0: 67 65 74 20 5b 64 69 63 74 20 67 65 74 20 24 6a  get [dict get $j
2bd0: 20 74 61 72 67 65 74 5d 0a 20 20 20 20 20 20 20   target].       
2be0: 20 73 65 74 20 64 69 72 20 5b 73 74 72 69 6e 67   set dir [string
2bf0: 20 74 6f 6c 6f 77 65 72 20 5b 73 74 72 69 6e 67   tolower [string
2c00: 20 6d 61 70 20 7b 22 20 22 20 5f 20 22 2d 22 20   map {" " _ "-" 
2c10: 5f 7d 20 24 6e 61 6d 65 5d 5d 0a 20 20 20 20 20  _} $name]].     
2c20: 20 20 20 73 65 74 20 47 28 74 65 73 74 2e 24 6e     set G(test.$n
2c30: 61 6d 65 2e 73 74 61 72 74 29 20 5b 63 6c 6f 63  ame.start) [cloc
2c40: 6b 20 73 65 63 6f 6e 64 73 5d 0a 20 20 20 20 20  k seconds].     
2c50: 20 20 20 73 65 74 20 47 28 74 65 73 74 2e 24 6e     set G(test.$n
2c60: 61 6d 65 2e 6c 6f 67 29 20 5b 66 69 6c 65 20 6a  ame.log) [file j
2c70: 6f 69 6e 20 24 64 69 72 20 74 65 73 74 2e 6c 6f  oin $dir test.lo
2c80: 67 5d 0a 0a 20 20 20 20 20 20 20 20 73 6c 61 76  g]..        slav
2c90: 65 5f 6c 61 75 6e 63 68 20 24 6e 61 6d 65 20 24  e_launch $name $
2ca0: 74 61 72 67 65 74 20 24 64 69 72 0a 0a 20 20 20  target $dir..   
2cb0: 20 20 20 20 20 69 6e 63 72 20 6e 4c 61 75 6e 63       incr nLaunc
2cc0: 68 20 2d 31 0a 20 20 20 20 20 20 7d 0a 20 20 20  h -1.      }.   
2cd0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 70 72 6f 63 20 67   }.  }.}..proc g
2ce0: 65 6e 65 72 61 74 65 5f 73 65 6c 65 63 74 5f 77  enerate_select_w
2cf0: 69 64 67 65 74 20 7b 6c 61 62 65 6c 20 69 64 20  idget {label id 
2d00: 6c 4f 70 74 20 6f 70 74 7d 20 7b 0a 20 20 77 61  lOpt opt} {.  wa
2d10: 70 70 2d 74 72 69 6d 20 7b 0a 20 20 20 20 3c 6c  pp-trim {.    <l
2d20: 61 62 65 6c 3e 20 25 73 74 72 69 6e 67 28 24 6c  abel> %string($l
2d30: 61 62 65 6c 29 20 3c 2f 6c 61 62 65 6c 3e 0a 20  abel) </label>. 
2d40: 20 20 20 3c 73 65 6c 65 63 74 20 69 64 3d 25 73     <select id=%s
2d50: 74 72 69 6e 67 28 24 69 64 29 20 6e 61 6d 65 3d  tring($id) name=
2d60: 25 73 74 72 69 6e 67 28 24 69 64 29 3e 0a 20 20  %string($id)>.  
2d70: 7d 0a 20 20 66 6f 72 65 61 63 68 20 6f 20 24 6c  }.  foreach o $l
2d80: 4f 70 74 20 7b 0a 20 20 20 20 73 65 74 20 73 65  Opt {.    set se
2d90: 6c 65 63 74 65 64 20 22 22 0a 20 20 20 20 69 66  lected "".    if
2da0: 20 7b 24 6f 3d 3d 24 6f 70 74 7d 20 7b 20 73 65   {$o==$opt} { se
2db0: 74 20 73 65 6c 65 63 74 65 64 20 22 20 73 65 6c  t selected " sel
2dc0: 65 63 74 65 64 3d 31 22 20 7d 0a 20 20 20 20 77  ected=1" }.    w
2dd0: 61 70 70 2d 73 75 62 73 74 20 22 3c 6f 70 74 69  app-subst "<opti
2de0: 6f 6e 20 24 73 65 6c 65 63 74 65 64 3e 24 6f 3c  on $selected>$o<
2df0: 2f 6f 70 74 69 6f 6e 3e 22 0a 20 20 7d 0a 20 20  /option>".  }.  
2e00: 77 61 70 70 2d 74 72 69 6d 20 7b 20 3c 2f 73 65  wapp-trim { </se
2e10: 6c 65 63 74 3e 20 7d 0a 7d 0a 0a 70 72 6f 63 20  lect> }.}..proc 
2e20: 67 65 6e 65 72 61 74 65 5f 6d 61 69 6e 5f 70 61  generate_main_pa
2e30: 67 65 20 7b 7b 65 78 74 72 61 20 7b 7d 7d 7d 20  ge {{extra {}}} 
2e40: 7b 0a 20 20 67 6c 6f 62 61 6c 20 47 0a 20 20 73  {.  global G.  s
2e50: 65 74 5f 74 65 73 74 5f 61 72 72 61 79 0a 0a 20  et_test_array.. 
2e60: 20 73 65 74 20 68 6f 73 74 6e 61 6d 65 20 24 47   set hostname $G
2e70: 28 68 6f 73 74 6e 61 6d 65 29 0a 20 20 77 61 70  (hostname).  wap
2e80: 70 2d 74 72 69 6d 20 7b 0a 20 20 20 20 3c 68 74  p-trim {.    <ht
2e90: 6d 6c 3e 0a 20 20 20 20 3c 68 65 61 64 3e 0a 20  ml>.    <head>. 
2ea0: 20 20 20 20 20 3c 74 69 74 6c 65 3e 20 25 68 74       <title> %ht
2eb0: 6d 6c 28 24 68 6f 73 74 6e 61 6d 65 29 3a 20 77  ml($hostname): w
2ec0: 61 70 70 74 65 73 74 2e 74 63 6c 20 3c 2f 74 69  apptest.tcl </ti
2ed0: 74 6c 65 3e 0a 20 20 20 20 20 20 3c 6c 69 6e 6b  tle>.      <link
2ee0: 20 72 65 6c 3d 22 73 74 79 6c 65 73 68 65 65 74   rel="stylesheet
2ef0: 22 20 74 79 70 65 3d 22 74 65 78 74 2f 63 73 73  " type="text/css
2f00: 22 20 68 72 65 66 3d 22 73 74 79 6c 65 2e 63 73  " href="style.cs
2f10: 73 22 2f 3e 0a 20 20 20 20 3c 2f 68 65 61 64 3e  s"/>.    </head>
2f20: 0a 20 20 20 20 3c 62 6f 64 79 3e 0a 20 20 7d 0a  .    <body>.  }.
2f30: 0a 20 20 73 65 74 20 68 6f 73 74 20 24 47 28 68  .  set host $G(h
2f40: 6f 73 74 29 0a 20 20 77 61 70 70 2d 74 72 69 6d  ost).  wapp-trim
2f50: 20 7b 0a 20 20 20 20 3c 64 69 76 20 63 6c 61 73   {.    <div clas
2f60: 73 3d 22 62 6f 72 64 65 72 22 3e 25 73 74 72 69  s="border">%stri
2f70: 6e 67 28 24 68 6f 73 74 29 0a 20 20 7d 0a 20 20  ng($host).  }.  
2f80: 67 65 6e 65 72 61 74 65 5f 66 6f 73 73 69 6c 5f  generate_fossil_
2f90: 69 6e 66 6f 0a 20 20 77 61 70 70 2d 74 72 69 6d  info.  wapp-trim
2fa0: 20 7b 0a 20 20 20 20 3c 2f 64 69 76 3e 0a 20 20   {.    </div>.  
2fb0: 20 20 3c 64 69 76 20 63 6c 61 73 73 3d 22 62 6f    <div class="bo
2fc0: 72 64 65 72 22 20 69 64 3d 63 6f 6e 74 72 6f 6c  rder" id=control
2fd0: 73 3e 20 0a 20 20 20 20 3c 66 6f 72 6d 20 61 63  s> .    <form ac
2fe0: 74 69 6f 6e 3d 22 63 6f 6e 74 72 6f 6c 22 20 6d  tion="control" m
2ff0: 65 74 68 6f 64 3d 22 70 6f 73 74 22 20 6e 61 6d  ethod="post" nam
3000: 65 3d 22 63 6f 6e 74 72 6f 6c 22 3e 0a 20 20 7d  e="control">.  }
3010: 0a 0a 20 20 23 20 42 75 69 6c 64 20 74 68 65 20  ..  # Build the 
3020: 22 70 6c 61 74 66 6f 72 6d 22 20 73 65 6c 65 63  "platform" selec
3030: 74 20 77 69 64 67 65 74 2e 20 0a 20 20 73 65 74  t widget. .  set
3040: 20 6c 4f 70 74 20 5b 72 65 6c 65 61 73 65 74 65   lOpt [releasete
3050: 73 74 5f 64 61 74 61 20 70 6c 61 74 66 6f 72 6d  st_data platform
3060: 73 5d 0a 20 20 67 65 6e 65 72 61 74 65 5f 73 65  s].  generate_se
3070: 6c 65 63 74 5f 77 69 64 67 65 74 20 50 6c 61 74  lect_widget Plat
3080: 66 6f 72 6d 20 63 6f 6e 74 72 6f 6c 5f 70 6c 61  form control_pla
3090: 74 66 6f 72 6d 20 24 6c 4f 70 74 20 24 47 28 70  tform $lOpt $G(p
30a0: 6c 61 74 66 6f 72 6d 29 0a 0a 20 20 23 20 42 75  latform)..  # Bu
30b0: 69 6c 64 20 74 68 65 20 22 74 65 73 74 22 20 73  ild the "test" s
30c0: 65 6c 65 63 74 20 77 69 64 67 65 74 2e 20 0a 20  elect widget. . 
30d0: 20 73 65 74 20 6c 4f 70 74 20 5b 6c 69 73 74 20   set lOpt [list 
30e0: 4e 6f 72 6d 61 6c 20 56 65 72 79 71 75 69 63 6b  Normal Veryquick
30f0: 20 53 6d 6f 6b 65 74 65 73 74 20 42 75 69 6c 64   Smoketest Build
3100: 2d 4f 6e 6c 79 5d 20 0a 20 20 67 65 6e 65 72 61  -Only] .  genera
3110: 74 65 5f 73 65 6c 65 63 74 5f 77 69 64 67 65 74  te_select_widget
3120: 20 54 65 73 74 20 63 6f 6e 74 72 6f 6c 5f 74 65   Test control_te
3130: 73 74 20 24 6c 4f 70 74 20 24 47 28 74 65 73 74  st $lOpt $G(test
3140: 29 0a 0a 20 20 23 20 42 75 69 6c 64 20 74 68 65  )..  # Build the
3150: 20 22 6a 6f 62 73 22 20 73 65 6c 65 63 74 20 77   "jobs" select w
3160: 69 64 67 65 74 2e 20 4f 70 74 69 6f 6e 73 20 61  idget. Options a
3170: 72 65 20 31 20 74 6f 20 38 2e 0a 20 20 67 65 6e  re 1 to 8..  gen
3180: 65 72 61 74 65 5f 73 65 6c 65 63 74 5f 77 69 64  erate_select_wid
3190: 67 65 74 20 4a 6f 62 73 20 63 6f 6e 74 72 6f 6c  get Jobs control
31a0: 5f 6a 6f 62 73 20 7b 31 20 32 20 33 20 34 20 35  _jobs {1 2 3 4 5
31b0: 20 36 20 37 20 38 7d 20 24 47 28 6a 6f 62 73 29   6 7 8} $G(jobs)
31c0: 0a 0a 20 20 73 77 69 74 63 68 20 24 47 28 73 74  ..  switch $G(st
31d0: 61 74 65 29 20 7b 0a 20 20 20 20 63 6f 6e 66 69  ate) {.    confi
31e0: 67 20 7b 0a 20 20 20 20 20 20 73 65 74 20 74 78  g {.      set tx
31f0: 74 20 22 52 75 6e 20 54 65 73 74 73 21 22 0a 20  t "Run Tests!". 
3200: 20 20 20 20 20 73 65 74 20 69 64 20 63 6f 6e 74       set id cont
3210: 72 6f 6c 5f 72 75 6e 0a 20 20 20 20 7d 0a 20 20  rol_run.    }.  
3220: 20 20 72 75 6e 6e 69 6e 67 20 7b 0a 20 20 20 20    running {.    
3230: 20 20 73 65 74 20 74 78 74 20 22 53 54 4f 50 20    set txt "STOP 
3240: 54 65 73 74 73 21 22 0a 20 20 20 20 20 20 73 65  Tests!".      se
3250: 74 20 69 64 20 63 6f 6e 74 72 6f 6c 5f 73 74 6f  t id control_sto
3260: 70 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 6f 70  p.    }.    stop
3270: 70 65 64 20 7b 0a 20 20 20 20 20 20 73 65 74 20  ped {.      set 
3280: 74 78 74 20 22 52 65 73 65 74 21 22 0a 20 20 20  txt "Reset!".   
3290: 20 20 20 73 65 74 20 69 64 20 63 6f 6e 74 72 6f     set id contro
32a0: 6c 5f 72 65 73 65 74 0a 20 20 20 20 7d 0a 20 20  l_reset.    }.  
32b0: 7d 0a 20 20 77 61 70 70 2d 74 72 69 6d 20 7b 0a  }.  wapp-trim {.
32c0: 20 20 20 20 3c 64 69 76 20 63 6c 61 73 73 3d 72      <div class=r
32d0: 69 67 68 74 3e 0a 20 20 20 20 3c 69 6e 70 75 74  ight>.    <input
32e0: 20 69 64 3d 25 73 74 72 69 6e 67 28 24 69 64 29   id=%string($id)
32f0: 20 6e 61 6d 65 3d 25 73 74 72 69 6e 67 28 24 69   name=%string($i
3300: 64 29 20 74 79 70 65 3d 73 75 62 6d 69 74 20 76  d) type=submit v
3310: 61 6c 75 65 3d 22 25 73 74 72 69 6e 67 28 24 74  alue="%string($t
3320: 78 74 29 22 3e 0a 20 20 20 20 3c 2f 69 6e 70 75  xt)">.    </inpu
3330: 74 3e 0a 20 20 20 20 3c 2f 64 69 76 3e 0a 20 20  t>.    </div>.  
3340: 7d 0a 0a 20 20 77 61 70 70 2d 74 72 69 6d 20 7b  }..  wapp-trim {
3350: 0a 20 20 3c 62 72 3e 3c 62 72 3e 0a 20 20 20 20  .  <br><br>.    
3360: 20 20 20 20 3c 6c 61 62 65 6c 3e 20 54 63 6c 3a      <label> Tcl:
3370: 20 3c 2f 6c 61 62 65 6c 3e 0a 20 20 20 20 20 20   </label>.      
3380: 20 20 3c 69 6e 70 75 74 20 69 64 3d 22 63 6f 6e    <input id="con
3390: 74 72 6f 6c 5f 74 63 6c 22 20 6e 61 6d 65 3d 22  trol_tcl" name="
33a0: 63 6f 6e 74 72 6f 6c 5f 74 63 6c 22 3e 3c 2f 69  control_tcl"></i
33b0: 6e 70 75 74 3e 0a 20 20 20 20 20 20 20 20 3c 6c  nput>.        <l
33c0: 61 62 65 6c 3e 20 4b 65 65 70 20 66 69 6c 65 73  abel> Keep files
33d0: 3a 20 3c 2f 6c 61 62 65 6c 3e 0a 20 20 20 20 20  : </label>.     
33e0: 20 20 20 3c 69 6e 70 75 74 20 69 64 3d 22 63 6f     <input id="co
33f0: 6e 74 72 6f 6c 5f 6b 65 65 70 22 20 6e 61 6d 65  ntrol_keep" name
3400: 3d 22 63 6f 6e 74 72 6f 6c 5f 6b 65 65 70 22 20  ="control_keep" 
3410: 74 79 70 65 3d 63 68 65 63 6b 62 6f 78 20 76 61  type=checkbox va
3420: 6c 75 65 3d 31 3e 0a 20 20 20 20 20 20 20 20 3c  lue=1>.        <
3430: 2f 69 6e 70 75 74 3e 0a 20 20 20 20 20 20 20 20  /input>.        
3440: 3c 6c 61 62 65 6c 3e 20 55 73 65 20 4d 53 56 43  <label> Use MSVC
3450: 3a 20 3c 2f 6c 61 62 65 6c 3e 0a 20 20 20 20 20  : </label>.     
3460: 20 20 20 3c 69 6e 70 75 74 20 69 64 3d 22 63 6f     <input id="co
3470: 6e 74 72 6f 6c 5f 6d 73 76 63 22 20 6e 61 6d 65  ntrol_msvc" name
3480: 3d 22 63 6f 6e 74 72 6f 6c 5f 6d 73 76 63 22 20  ="control_msvc" 
3490: 74 79 70 65 3d 63 68 65 63 6b 62 6f 78 20 76 61  type=checkbox va
34a0: 6c 75 65 3d 31 3e 0a 20 20 20 20 20 20 20 20 3c  lue=1>.        <
34b0: 6c 61 62 65 6c 3e 20 44 65 62 75 67 20 74 65 73  label> Debug tes
34c0: 74 73 3a 20 3c 2f 6c 61 62 65 6c 3e 0a 20 20 20  ts: </label>.   
34d0: 20 20 20 20 20 3c 69 6e 70 75 74 20 69 64 3d 22       <input id="
34e0: 63 6f 6e 74 72 6f 6c 5f 64 65 62 75 67 22 20 6e  control_debug" n
34f0: 61 6d 65 3d 22 63 6f 6e 74 72 6f 6c 5f 64 65 62  ame="control_deb
3500: 75 67 22 20 74 79 70 65 3d 63 68 65 63 6b 62 6f  ug" type=checkbo
3510: 78 20 76 61 6c 75 65 3d 31 3e 0a 20 20 20 20 20  x value=1>.     
3520: 20 20 20 3c 2f 69 6e 70 75 74 3e 0a 20 20 7d 0a     </input>.  }.
3530: 20 20 77 61 70 70 2d 74 72 69 6d 20 7b 0a 20 20    wapp-trim {.  
3540: 20 20 20 3c 2f 66 6f 72 6d 3e 0a 20 20 7d 0a 20     </form>.  }. 
3550: 20 77 61 70 70 2d 74 72 69 6d 20 7b 0a 20 20 20   wapp-trim {.   
3560: 20 20 3c 2f 64 69 76 3e 0a 20 20 20 20 20 3c 64    </div>.     <d
3570: 69 76 20 69 64 3d 74 65 73 74 73 3e 0a 20 20 7d  iv id=tests>.  }
3580: 0a 20 20 77 61 70 70 2d 70 61 67 65 2d 74 65 73  .  wapp-page-tes
3590: 74 73 0a 0a 20 20 73 65 74 20 73 63 72 69 70 74  ts..  set script
35a0: 20 22 73 63 72 69 70 74 2f 24 47 28 73 74 61 74   "script/$G(stat
35b0: 65 29 2e 6a 73 22 0a 20 20 77 61 70 70 2d 74 72  e).js".  wapp-tr
35c0: 69 6d 20 7b 0a 20 20 20 20 3c 2f 64 69 76 3e 0a  im {.    </div>.
35d0: 20 20 20 20 20 20 3c 73 63 72 69 70 74 20 73 72        <script sr
35e0: 63 3d 25 73 74 72 69 6e 67 28 24 73 63 72 69 70  c=%string($scrip
35f0: 74 29 3e 3c 2f 73 63 72 69 70 74 3e 0a 20 20 20  t)></script>.   
3600: 20 3c 2f 62 6f 64 79 3e 0a 20 20 20 20 3c 2f 68   </body>.    </h
3610: 74 6d 6c 3e 0a 20 20 7d 0a 7d 0a 0a 70 72 6f 63  tml>.  }.}..proc
3620: 20 77 61 70 70 2d 64 65 66 61 75 6c 74 20 7b 7d   wapp-default {}
3630: 20 7b 0a 20 20 67 65 6e 65 72 61 74 65 5f 6d 61   {.  generate_ma
3640: 69 6e 5f 70 61 67 65 0a 7d 0a 0a 70 72 6f 63 20  in_page.}..proc 
3650: 77 61 70 70 2d 70 61 67 65 2d 74 65 73 74 73 20  wapp-page-tests 
3660: 7b 7d 20 7b 0a 20 20 67 6c 6f 62 61 6c 20 47 0a  {} {.  global G.
3670: 20 20 77 61 70 70 2d 74 72 69 6d 20 7b 20 3c 74    wapp-trim { <t
3680: 61 62 6c 65 20 63 6c 61 73 73 3d 22 62 6f 72 64  able class="bord
3690: 65 72 22 20 77 69 64 74 68 3d 31 30 30 25 3e 20  er" width=100%> 
36a0: 7d 0a 20 20 66 6f 72 65 61 63 68 20 74 20 24 47  }.  foreach t $G
36b0: 28 74 65 73 74 5f 61 72 72 61 79 29 20 7b 0a 20  (test_array) {. 
36c0: 20 20 20 73 65 74 20 63 6f 6e 66 69 67 20 5b 64     set config [d
36d0: 69 63 74 20 67 65 74 20 24 74 20 63 6f 6e 66 69  ict get $t confi
36e0: 67 5d 0a 20 20 20 20 73 65 74 20 74 61 72 67 65  g].    set targe
36f0: 74 20 5b 64 69 63 74 20 67 65 74 20 24 74 20 74  t [dict get $t t
3700: 61 72 67 65 74 5d 0a 0a 20 20 20 20 73 65 74 20  arget]..    set 
3710: 63 6c 61 73 73 20 22 74 65 73 74 77 61 69 74 22  class "testwait"
3720: 0a 20 20 20 20 73 65 74 20 73 65 63 6f 6e 64 73  .    set seconds
3730: 20 22 22 0a 0a 20 20 20 20 69 66 20 7b 5b 69 6e   ""..    if {[in
3740: 66 6f 20 65 78 69 73 74 73 20 47 28 74 65 73 74  fo exists G(test
3750: 2e 24 63 6f 6e 66 69 67 2e 6c 6f 67 29 5d 7d 20  .$config.log)]} 
3760: 7b 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  {.      if {[inf
3770: 6f 20 65 78 69 73 74 73 20 47 28 74 65 73 74 2e  o exists G(test.
3780: 24 63 6f 6e 66 69 67 2e 63 68 61 6e 6e 65 6c 29  $config.channel)
3790: 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74  ]} {.        set
37a0: 20 63 6c 61 73 73 20 22 74 65 73 74 72 75 6e 6e   class "testrunn
37b0: 69 6e 67 22 0a 20 20 20 20 20 20 20 20 73 65 74  ing".        set
37c0: 20 73 65 63 6f 6e 64 73 20 5b 65 78 70 72 20 5b   seconds [expr [
37d0: 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 20 2d  clock seconds] -
37e0: 20 24 47 28 74 65 73 74 2e 24 63 6f 6e 66 69 67   $G(test.$config
37f0: 2e 73 74 61 72 74 29 5d 0a 20 20 20 20 20 20 7d  .start)].      }
3800: 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65   elseif {[info e
3810: 78 69 73 74 73 20 47 28 74 65 73 74 2e 24 63 6f  xists G(test.$co
3820: 6e 66 69 67 2e 64 6f 6e 65 29 5d 7d 20 7b 0a 20  nfig.done)]} {. 
3830: 20 20 20 20 20 20 20 69 66 20 7b 24 47 28 74 65         if {$G(te
3840: 73 74 2e 24 63 6f 6e 66 69 67 2e 6e 45 72 72 6f  st.$config.nErro
3850: 72 29 3e 30 7d 20 7b 0a 20 20 20 20 20 20 20 20  r)>0} {.        
3860: 20 20 73 65 74 20 63 6c 61 73 73 20 22 74 65 73    set class "tes
3870: 74 66 61 69 6c 22 20 0a 20 20 20 20 20 20 20 20  tfail" .        
3880: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
3890: 20 20 20 73 65 74 20 63 6c 61 73 73 20 22 74 65     set class "te
38a0: 73 74 64 6f 6e 65 22 0a 20 20 20 20 20 20 20 20  stdone".        
38b0: 7d 0a 20 20 20 20 20 20 20 20 73 65 74 20 73 65  }.        set se
38c0: 63 6f 6e 64 73 20 5b 65 78 70 72 20 24 47 28 74  conds [expr $G(t
38d0: 65 73 74 2e 24 63 6f 6e 66 69 67 2e 64 6f 6e 65  est.$config.done
38e0: 29 20 2d 20 24 47 28 74 65 73 74 2e 24 63 6f 6e  ) - $G(test.$con
38f0: 66 69 67 2e 73 74 61 72 74 29 5d 0a 20 20 20 20  fig.start)].    
3900: 20 20 7d 0a 20 20 20 20 20 20 73 65 74 20 73 65    }.      set se
3910: 63 6f 6e 64 73 20 5b 66 6f 72 6d 61 74 5f 73 65  conds [format_se
3920: 63 6f 6e 64 73 20 24 73 65 63 6f 6e 64 73 5d 0a  conds $seconds].
3930: 20 20 20 20 7d 0a 0a 20 20 20 20 77 61 70 70 2d      }..    wapp-
3940: 74 72 69 6d 20 7b 0a 20 20 20 20 20 20 3c 74 72  trim {.      <tr
3950: 20 63 6c 61 73 73 3d 25 73 74 72 69 6e 67 28 24   class=%string($
3960: 63 6c 61 73 73 29 3e 0a 20 20 20 20 20 20 3c 74  class)>.      <t
3970: 64 20 63 6c 61 73 73 3d 22 6e 6f 77 72 61 70 22  d class="nowrap"
3980: 3e 20 25 68 74 6d 6c 28 24 63 6f 6e 66 69 67 29  > %html($config)
3990: 20 0a 20 20 20 20 20 20 3c 74 64 20 63 6c 61 73   .      <td clas
39a0: 73 3d 22 70 61 64 6c 65 66 74 20 6e 6f 77 72 61  s="padleft nowra
39b0: 70 22 3e 20 25 68 74 6d 6c 28 24 74 61 72 67 65  p"> %html($targe
39c0: 74 29 0a 20 20 20 20 20 20 3c 74 64 20 63 6c 61  t).      <td cla
39d0: 73 73 3d 22 70 61 64 6c 65 66 74 20 6e 6f 77 72  ss="padleft nowr
39e0: 61 70 22 3e 20 25 68 74 6d 6c 28 24 73 65 63 6f  ap"> %html($seco
39f0: 6e 64 73 29 0a 20 20 20 20 20 20 3c 74 64 20 63  nds).      <td c
3a00: 6c 61 73 73 3d 22 70 61 64 6c 65 66 74 20 6e 6f  lass="padleft no
3a10: 77 72 61 70 22 3e 0a 20 20 20 20 7d 0a 20 20 20  wrap">.    }.   
3a20: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
3a30: 73 20 47 28 74 65 73 74 2e 24 63 6f 6e 66 69 67  s G(test.$config
3a40: 2e 6c 6f 67 29 5d 7d 20 7b 0a 20 20 20 20 20 20  .log)]} {.      
3a50: 73 65 74 20 6c 6f 67 20 24 47 28 74 65 73 74 2e  set log $G(test.
3a60: 24 63 6f 6e 66 69 67 2e 6c 6f 67 29 0a 20 20 20  $config.log).   
3a70: 20 20 20 73 65 74 20 75 72 69 20 22 6c 6f 67 2f     set uri "log/
3a80: 24 6c 6f 67 22 0a 20 20 20 20 20 20 77 61 70 70  $log".      wapp
3a90: 2d 74 72 69 6d 20 7b 0a 20 20 20 20 20 20 20 20  -trim {.        
3aa0: 3c 61 20 68 72 65 66 3d 25 75 72 6c 28 24 75 72  <a href=%url($ur
3ab0: 69 29 3e 20 25 68 74 6d 6c 28 24 6c 6f 67 29 20  i)> %html($log) 
3ac0: 3c 2f 61 3e 0a 20 20 20 20 20 20 7d 0a 20 20 20  </a>.      }.   
3ad0: 20 7d 0a 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f   }.    if {[info
3ae0: 20 65 78 69 73 74 73 20 47 28 74 65 73 74 2e 24   exists G(test.$
3af0: 63 6f 6e 66 69 67 2e 65 72 72 6d 73 67 29 5d 20  config.errmsg)] 
3b00: 26 26 20 24 47 28 74 65 73 74 2e 24 63 6f 6e 66  && $G(test.$conf
3b10: 69 67 2e 65 72 72 6d 73 67 29 21 3d 22 22 7d 20  ig.errmsg)!=""} 
3b20: 7b 0a 20 20 20 20 20 20 73 65 74 20 65 72 72 6d  {.      set errm
3b30: 73 67 20 24 47 28 74 65 73 74 2e 24 63 6f 6e 66  sg $G(test.$conf
3b40: 69 67 2e 65 72 72 6d 73 67 29 0a 20 20 20 20 20  ig.errmsg).     
3b50: 20 77 61 70 70 2d 74 72 69 6d 20 7b 0a 20 20 20   wapp-trim {.   
3b60: 20 20 20 20 20 3c 74 72 20 63 6c 61 73 73 3d 74       <tr class=t
3b70: 65 73 74 66 61 69 6c 3e 0a 20 20 20 20 20 20 20  estfail>.       
3b80: 20 3c 74 64 3e 20 3c 74 64 20 63 6c 61 73 73 3d   <td> <td class=
3b90: 22 70 61 64 6c 65 66 74 22 20 63 6f 6c 73 70 61  "padleft" colspa
3ba0: 6e 3d 33 3e 20 25 68 74 6d 6c 28 24 65 72 72 6d  n=3> %html($errm
3bb0: 73 67 29 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  sg).      }.    
3bc0: 7d 0a 20 20 7d 0a 0a 20 20 77 61 70 70 2d 74 72  }.  }..  wapp-tr
3bd0: 69 6d 20 7b 20 3c 2f 74 61 62 6c 65 3e 20 7d 0a  im { </table> }.
3be0: 0a 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69  .  if {[info exi
3bf0: 73 74 73 20 47 28 72 65 73 75 6c 74 29 5d 7d 20  sts G(result)]} 
3c00: 7b 0a 20 20 20 20 73 65 74 20 72 65 73 20 24 47  {.    set res $G
3c10: 28 72 65 73 75 6c 74 29 0a 20 20 20 20 77 61 70  (result).    wap
3c20: 70 2d 74 72 69 6d 20 7b 0a 20 20 20 20 20 20 3c  p-trim {.      <
3c30: 64 69 76 20 63 6c 61 73 73 3d 62 6f 72 64 65 72  div class=border
3c40: 20 69 64 3d 72 65 73 75 6c 74 3e 20 25 73 74 72   id=result> %str
3c50: 69 6e 67 28 24 72 65 73 29 20 3c 2f 64 69 76 3e  ing($res) </div>
3c60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 20  .    }.  }.}..# 
3c70: 55 52 49 3a 20 2f 63 6f 6e 74 72 6f 6c 0a 23 0a  URI: /control.#.
3c80: 23 20 57 68 65 6e 65 76 65 72 20 74 68 65 20 66  # Whenever the f
3c90: 6f 72 6d 20 61 74 20 74 68 65 20 74 6f 70 20 6f  orm at the top o
3ca0: 66 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f  f the applicatio
3cb0: 6e 20 70 61 67 65 20 69 73 20 73 75 62 6d 69 74  n page is submit
3cc0: 74 65 64 2c 20 69 74 0a 23 20 69 73 20 73 75 62  ted, it.# is sub
3cd0: 6d 69 74 74 65 64 20 68 65 72 65 2e 0a 23 0a 70  mitted here..#.p
3ce0: 72 6f 63 20 77 61 70 70 2d 70 61 67 65 2d 63 6f  roc wapp-page-co
3cf0: 6e 74 72 6f 6c 20 7b 7d 20 7b 0a 20 20 67 6c 6f  ntrol {} {.  glo
3d00: 62 61 6c 20 47 0a 20 20 69 66 20 7b 24 3a 3a 47  bal G.  if {$::G
3d10: 28 73 74 61 74 65 29 3d 3d 22 63 6f 6e 66 69 67  (state)=="config
3d20: 22 7d 20 7b 0a 20 20 20 20 73 65 74 20 6c 43 6f  "} {.    set lCo
3d30: 6e 74 72 6f 6c 73 20 5b 6c 69 73 74 20 70 6c 61  ntrols [list pla
3d40: 74 66 6f 72 6d 20 74 65 73 74 20 74 63 6c 20 6a  tform test tcl j
3d50: 6f 62 73 20 6b 65 65 70 20 6d 73 76 63 20 64 65  obs keep msvc de
3d60: 62 75 67 5d 0a 20 20 20 20 73 65 74 20 47 28 6d  bug].    set G(m
3d70: 73 76 63 29 20 30 0a 20 20 20 20 73 65 74 20 47  svc) 0.    set G
3d80: 28 6b 65 65 70 29 20 30 0a 20 20 20 20 73 65 74  (keep) 0.    set
3d90: 20 47 28 64 65 62 75 67 29 20 30 0a 20 20 7d 20   G(debug) 0.  } 
3da0: 65 6c 73 65 20 7b 0a 20 20 20 20 73 65 74 20 6c  else {.    set l
3db0: 43 6f 6e 74 72 6f 6c 73 20 5b 6c 69 73 74 20 6a  Controls [list j
3dc0: 6f 62 73 5d 0a 20 20 7d 0a 20 20 66 6f 72 65 61  obs].  }.  forea
3dd0: 63 68 20 76 20 24 6c 43 6f 6e 74 72 6f 6c 73 20  ch v $lControls 
3de0: 7b 0a 20 20 20 20 69 66 20 7b 5b 77 61 70 70 2d  {.    if {[wapp-
3df0: 70 61 72 61 6d 2d 65 78 69 73 74 73 20 63 6f 6e  param-exists con
3e00: 74 72 6f 6c 5f 24 76 5d 7d 20 7b 0a 20 20 20 20  trol_$v]} {.    
3e10: 20 20 73 65 74 20 47 28 24 76 29 20 5b 77 61 70    set G($v) [wap
3e20: 70 2d 70 61 72 61 6d 20 63 6f 6e 74 72 6f 6c 5f  p-param control_
3e30: 24 76 5d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  $v].    }.  }.. 
3e40: 20 69 66 20 7b 5b 77 61 70 70 2d 70 61 72 61 6d   if {[wapp-param
3e50: 2d 65 78 69 73 74 73 20 63 6f 6e 74 72 6f 6c 5f  -exists control_
3e60: 72 75 6e 5d 7d 20 7b 0a 20 20 20 20 23 20 54 68  run]} {.    # Th
3e70: 69 73 20 69 73 20 61 20 22 72 75 6e 20 74 65 73  is is a "run tes
3e80: 74 22 20 63 6f 6d 6d 61 6e 64 2e 0a 20 20 20 20  t" command..    
3e90: 77 61 70 70 74 65 73 74 5f 72 75 6e 0a 20 20 7d  wapptest_run.  }
3ea0: 0a 0a 20 20 69 66 20 7b 5b 77 61 70 70 2d 70 61  ..  if {[wapp-pa
3eb0: 72 61 6d 2d 65 78 69 73 74 73 20 63 6f 6e 74 72  ram-exists contr
3ec0: 6f 6c 5f 73 74 6f 70 5d 7d 20 7b 0a 20 20 20 20  ol_stop]} {.    
3ed0: 23 20 41 20 22 53 54 4f 50 20 74 65 73 74 73 22  # A "STOP tests"
3ee0: 20 63 6f 6d 6d 61 6e 64 2e 0a 20 20 20 20 73 65   command..    se
3ef0: 74 20 47 28 73 74 61 74 65 29 20 22 73 74 6f 70  t G(state) "stop
3f00: 70 65 64 22 0a 20 20 20 20 73 65 74 20 47 28 72  ped".    set G(r
3f10: 65 73 75 6c 74 29 20 22 54 65 73 74 20 68 61 6c  esult) "Test hal
3f20: 74 65 64 20 62 79 20 75 73 65 72 22 0a 20 20 20  ted by user".   
3f30: 20 66 6f 72 65 61 63 68 20 6a 20 24 47 28 74 65   foreach j $G(te
3f40: 73 74 5f 61 72 72 61 79 29 20 7b 0a 20 20 20 20  st_array) {.    
3f50: 20 20 73 65 74 20 6e 61 6d 65 20 5b 64 69 63 74    set name [dict
3f60: 20 67 65 74 20 24 6a 20 63 6f 6e 66 69 67 5d 0a   get $j config].
3f70: 20 20 20 20 20 20 69 66 20 7b 20 5b 69 6e 66 6f        if { [info
3f80: 20 65 78 69 73 74 73 20 47 28 74 65 73 74 2e 24   exists G(test.$
3f90: 6e 61 6d 65 2e 63 68 61 6e 6e 65 6c 29 5d 20 7d  name.channel)] }
3fa0: 20 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65   {.        close
3fb0: 20 24 47 28 74 65 73 74 2e 24 6e 61 6d 65 2e 63   $G(test.$name.c
3fc0: 68 61 6e 6e 65 6c 29 0a 20 20 20 20 20 20 20 20  hannel).        
3fd0: 75 6e 73 65 74 20 47 28 74 65 73 74 2e 24 6e 61  unset G(test.$na
3fe0: 6d 65 2e 63 68 61 6e 6e 65 6c 29 0a 20 20 20 20  me.channel).    
3ff0: 20 20 20 20 73 6c 61 76 65 5f 74 65 73 74 5f 64      slave_test_d
4000: 6f 6e 65 20 24 6e 61 6d 65 20 31 0a 20 20 20 20  one $name 1.    
4010: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 77 61    }.    }.    wa
4020: 70 70 74 65 73 74 5f 63 6c 6f 73 65 6c 6f 67 0a  pptest_closelog.
4030: 20 20 7d 0a 0a 20 20 69 66 20 7b 5b 77 61 70 70    }..  if {[wapp
4040: 2d 70 61 72 61 6d 2d 65 78 69 73 74 73 20 63 6f  -param-exists co
4050: 6e 74 72 6f 6c 5f 72 65 73 65 74 5d 7d 20 7b 0a  ntrol_reset]} {.
4060: 20 20 20 20 23 20 41 20 22 72 65 73 65 74 20 61      # A "reset a
4070: 70 70 22 20 63 6f 6d 6d 61 6e 64 2e 0a 20 20 20  pp" command..   
4080: 20 73 65 74 20 47 28 73 74 61 74 65 29 20 22 63   set G(state) "c
4090: 6f 6e 66 69 67 22 0a 20 20 20 20 77 61 70 70 74  onfig".    wappt
40a0: 65 73 74 5f 69 6e 69 74 0a 20 20 7d 0a 0a 20 20  est_init.  }..  
40b0: 69 66 20 7b 24 3a 3a 47 28 73 74 61 74 65 29 20  if {$::G(state) 
40c0: 3d 3d 20 22 72 75 6e 6e 69 6e 67 22 7d 20 7b 0a  == "running"} {.
40d0: 20 20 20 20 64 6f 5f 73 6f 6d 65 5f 73 74 75 66      do_some_stuf
40e0: 66 0a 20 20 7d 0a 20 20 77 61 70 70 2d 72 65 64  f.  }.  wapp-red
40f0: 69 72 65 63 74 20 2f 0a 7d 0a 0a 23 20 55 52 49  irect /.}..# URI
4100: 3a 20 2f 73 74 79 6c 65 2e 63 73 73 0a 23 0a 23  : /style.css.#.#
4110: 20 52 65 74 75 72 6e 20 74 68 65 20 73 74 79 6c   Return the styl
4120: 65 73 68 65 65 74 20 66 6f 72 20 74 68 65 20 61  esheet for the a
4130: 70 70 6c 69 63 61 74 69 6f 6e 20 6d 61 69 6e 20  pplication main 
4140: 70 61 67 65 2e 0a 23 0a 70 72 6f 63 20 77 61 70  page..#.proc wap
4150: 70 2d 70 61 67 65 2d 73 74 79 6c 65 2e 63 73 73  p-page-style.css
4160: 20 7b 7d 20 7b 0a 20 20 77 61 70 70 2d 73 75 62   {} {.  wapp-sub
4170: 73 74 20 7b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  st {..    /* The
4180: 20 62 6f 78 65 73 20 77 69 74 68 20 62 6c 61 63   boxes with blac
4190: 6b 20 62 6f 72 64 65 72 73 20 75 73 65 20 74 68  k borders use th
41a0: 69 73 20 63 6c 61 73 73 20 2a 2f 0a 20 20 20 20  is class */.    
41b0: 2e 62 6f 72 64 65 72 20 7b 0a 20 20 20 20 20 20  .border {.      
41c0: 62 6f 72 64 65 72 3a 20 33 70 78 20 67 72 6f 6f  border: 3px groo
41d0: 76 65 20 23 34 34 34 34 34 34 3b 0a 20 20 20 20  ve #444444;.    
41e0: 20 20 70 61 64 64 69 6e 67 3a 20 31 65 6d 3b 0a    padding: 1em;.
41f0: 20 20 20 20 20 20 6d 61 72 67 69 6e 2d 74 6f 70        margin-top
4200: 3a 20 31 65 6d 3b 0a 20 20 20 20 20 20 6d 61 72  : 1em;.      mar
4210: 67 69 6e 2d 62 6f 74 74 6f 6d 3a 20 31 65 6d 3b  gin-bottom: 1em;
4220: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46  .    }..    /* F
4230: 6c 6f 61 74 20 74 6f 20 74 68 65 20 72 69 67 68  loat to the righ
4240: 74 20 28 75 73 65 64 20 66 6f 72 20 74 68 65 20  t (used for the 
4250: 52 75 6e 2f 53 74 6f 70 2f 52 65 73 65 74 20 62  Run/Stop/Reset b
4260: 75 74 74 6f 6e 29 20 2a 2f 0a 20 20 20 20 2e 72  utton) */.    .r
4270: 69 67 68 74 20 7b 20 66 6c 6f 61 74 3a 20 72 69  ight { float: ri
4280: 67 68 74 3b 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  ght; }..    /* S
4290: 74 79 6c 65 20 66 6f 72 20 74 68 65 20 6c 61 72  tyle for the lar
42a0: 67 65 20 72 65 64 20 77 61 72 6e 69 6e 67 20 61  ge red warning a
42b0: 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  t the top of the
42c0: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 2e 77 61   page */.    .wa
42d0: 72 6e 69 6e 67 20 7b 0a 20 20 20 20 20 20 63 6f  rning {.      co
42e0: 6c 6f 72 3a 20 72 65 64 3b 0a 20 20 20 20 20 20  lor: red;.      
42f0: 66 6f 6e 74 2d 77 65 69 67 68 74 3a 20 62 6f 6c  font-weight: bol
4300: 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  d;.    }..    /*
4310: 20 53 74 79 6c 65 73 20 75 73 65 64 20 62 79 20   Styles used by 
4320: 63 65 6c 6c 73 20 69 6e 20 74 68 65 20 74 65 73  cells in the tes
4330: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 2e  t table */.    .
4340: 70 61 64 6c 65 66 74 20 7b 20 70 61 64 64 69 6e  padleft { paddin
4350: 67 2d 6c 65 66 74 3a 20 35 65 78 3b 20 7d 0a 20  g-left: 5ex; }. 
4360: 20 20 20 2e 6e 6f 77 72 61 70 20 20 7b 20 77 68     .nowrap  { wh
4370: 69 74 65 2d 73 70 61 63 65 3a 20 6e 6f 77 72 61  ite-space: nowra
4380: 70 3b 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 74 79  p; }..    /* Sty
4390: 6c 65 73 20 66 6f 72 20 69 6e 64 69 76 69 64 75  les for individu
43a0: 61 6c 20 74 65 73 74 73 2c 20 64 65 70 65 6e 64  al tests, depend
43b0: 69 6e 67 20 6f 6e 20 74 68 65 20 6f 75 74 63 6f  ing on the outco
43c0: 6d 65 20 2a 2f 0a 20 20 20 20 2e 74 65 73 74 77  me */.    .testw
43d0: 61 69 74 20 20 20 20 7b 20 20 20 20 20 20 20 20  ait    {        
43e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 2e 74 65 73        }.    .tes
43f0: 74 72 75 6e 6e 69 6e 67 20 7b 20 63 6f 6c 6f 72  trunning { color
4400: 3a 20 62 6c 75 65 20 20 7d 0a 20 20 20 20 2e 74  : blue  }.    .t
4410: 65 73 74 64 6f 6e 65 20 20 20 20 7b 20 63 6f 6c  estdone    { col
4420: 6f 72 3a 20 67 72 65 65 6e 20 7d 0a 20 20 20 20  or: green }.    
4430: 2e 74 65 73 74 66 61 69 6c 20 20 20 20 7b 20 63  .testfail    { c
4440: 6f 6c 6f 72 3a 20 72 65 64 20 20 20 7d 0a 20 20  olor: red   }.  
4450: 7d 0a 7d 0a 0a 23 20 55 52 49 3a 20 2f 73 63 72  }.}..# URI: /scr
4460: 69 70 74 2f 24 7b 73 74 61 74 65 7d 2e 6a 73 0a  ipt/${state}.js.
4470: 23 0a 23 20 54 68 65 20 6c 61 73 74 20 70 61 72  #.# The last par
4480: 74 20 6f 66 20 74 68 69 73 20 55 52 49 20 69 73  t of this URI is
4490: 20 61 6c 77 61 79 73 20 22 63 6f 6e 66 69 67 2e   always "config.
44a0: 6a 73 22 2c 20 22 72 75 6e 6e 69 6e 67 2e 6a 73  js", "running.js
44b0: 22 20 6f 72 20 0a 23 20 22 73 74 6f 70 70 65 64  " or .# "stopped
44c0: 2e 6a 73 22 2c 20 64 65 70 65 6e 64 69 6e 67 20  .js", depending 
44d0: 6f 6e 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  on the state of 
44e0: 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 2e  the application.
44f0: 20 49 74 20 72 65 74 75 72 6e 73 0a 23 20 74 68   It returns.# th
4500: 65 20 6a 61 76 61 73 63 72 69 70 74 20 70 61 72  e javascript par
4510: 74 20 6f 66 20 74 68 65 20 66 72 6f 6e 74 2d 65  t of the front-e
4520: 6e 64 20 66 6f 72 20 74 68 65 20 72 65 71 75 65  nd for the reque
4530: 73 74 65 64 20 73 74 61 74 65 20 74 6f 20 74 68  sted state to th
4540: 65 0a 23 20 62 72 6f 77 73 65 72 2e 0a 23 0a 70  e.# browser..#.p
4550: 72 6f 63 20 77 61 70 70 2d 70 61 67 65 2d 73 63  roc wapp-page-sc
4560: 72 69 70 74 20 7b 7d 20 7b 0a 20 20 72 65 67 65  ript {} {.  rege
4570: 78 70 20 7b 5b 5e 2f 5d 2a 24 7d 20 5b 77 61 70  xp {[^/]*$} [wap
4580: 70 2d 70 61 72 61 6d 20 52 45 51 55 45 53 54 5f  p-param REQUEST_
4590: 55 52 49 5d 20 73 63 72 69 70 74 0a 0a 20 20 73  URI] script..  s
45a0: 65 74 20 74 63 6c 20 24 3a 3a 47 28 74 63 6c 29  et tcl $::G(tcl)
45b0: 0a 20 20 73 65 74 20 6b 65 65 70 20 24 3a 3a 47  .  set keep $::G
45c0: 28 6b 65 65 70 29 0a 20 20 73 65 74 20 6d 73 76  (keep).  set msv
45d0: 63 20 24 3a 3a 47 28 6d 73 76 63 29 0a 20 20 73  c $::G(msvc).  s
45e0: 65 74 20 64 65 62 75 67 20 24 3a 3a 47 28 64 65  et debug $::G(de
45f0: 62 75 67 29 0a 20 20 0a 20 20 77 61 70 70 2d 73  bug).  .  wapp-s
4600: 75 62 73 74 20 7b 0a 20 20 20 20 76 61 72 20 6c  ubst {.    var l
4610: 45 6c 65 6d 20 3d 20 5c 5b 22 63 6f 6e 74 72 6f  Elem = \["contro
4620: 6c 5f 70 6c 61 74 66 6f 72 6d 22 2c 20 22 63 6f  l_platform", "co
4630: 6e 74 72 6f 6c 5f 74 65 73 74 22 2c 20 22 63 6f  ntrol_test", "co
4640: 6e 74 72 6f 6c 5f 6d 73 76 63 22 2c 20 0a 20 20  ntrol_msvc", .  
4650: 20 20 20 20 20 20 22 63 6f 6e 74 72 6f 6c 5f 6a        "control_j
4660: 6f 62 73 22 2c 20 22 63 6f 6e 74 72 6f 6c 5f 64  obs", "control_d
4670: 65 62 75 67 22 0a 20 20 20 20 5c 5d 3b 0a 20 20  ebug".    \];.  
4680: 20 20 6c 45 6c 65 6d 2e 66 6f 72 45 61 63 68 28    lElem.forEach(
4690: 66 75 6e 63 74 69 6f 6e 28 65 29 20 7b 0a 20 20  function(e) {.  
46a0: 20 20 20 20 76 61 72 20 65 6c 65 6d 20 3d 20 64      var elem = d
46b0: 6f 63 75 6d 65 6e 74 2e 67 65 74 45 6c 65 6d 65  ocument.getEleme
46c0: 6e 74 42 79 49 64 28 65 29 3b 0a 20 20 20 20 20  ntById(e);.     
46d0: 20 65 6c 65 6d 2e 61 64 64 45 76 65 6e 74 4c 69   elem.addEventLi
46e0: 73 74 65 6e 65 72 28 22 63 68 61 6e 67 65 22 2c  stener("change",
46f0: 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b 20 63 6f   function() { co
4700: 6e 74 72 6f 6c 2e 73 75 62 6d 69 74 28 29 20 7d  ntrol.submit() }
4710: 20 29 3b 0a 20 20 20 20 7d 29 0a 0a 20 20 20 20   );.    })..    
4720: 65 6c 65 6d 20 3d 20 64 6f 63 75 6d 65 6e 74 2e  elem = document.
4730: 67 65 74 45 6c 65 6d 65 6e 74 42 79 49 64 28 22  getElementById("
4740: 63 6f 6e 74 72 6f 6c 5f 74 63 6c 22 29 3b 0a 20  control_tcl");. 
4750: 20 20 20 65 6c 65 6d 2e 76 61 6c 75 65 20 3d 20     elem.value = 
4760: 22 25 73 74 72 69 6e 67 28 24 74 63 6c 29 22 0a  "%string($tcl)".
4770: 0a 20 20 20 20 65 6c 65 6d 20 3d 20 64 6f 63 75  .    elem = docu
4780: 6d 65 6e 74 2e 67 65 74 45 6c 65 6d 65 6e 74 42  ment.getElementB
4790: 79 49 64 28 22 63 6f 6e 74 72 6f 6c 5f 6b 65 65  yId("control_kee
47a0: 70 22 29 3b 0a 20 20 20 20 65 6c 65 6d 2e 63 68  p");.    elem.ch
47b0: 65 63 6b 65 64 20 3d 20 25 73 74 72 69 6e 67 28  ecked = %string(
47c0: 24 6b 65 65 70 29 3b 0a 0a 20 20 20 20 65 6c 65  $keep);..    ele
47d0: 6d 20 3d 20 64 6f 63 75 6d 65 6e 74 2e 67 65 74  m = document.get
47e0: 45 6c 65 6d 65 6e 74 42 79 49 64 28 22 63 6f 6e  ElementById("con
47f0: 74 72 6f 6c 5f 6d 73 76 63 22 29 3b 0a 20 20 20  trol_msvc");.   
4800: 20 65 6c 65 6d 2e 63 68 65 63 6b 65 64 20 3d 20   elem.checked = 
4810: 25 73 74 72 69 6e 67 28 24 6d 73 76 63 29 3b 0a  %string($msvc);.
4820: 0a 20 20 20 20 65 6c 65 6d 20 3d 20 64 6f 63 75  .    elem = docu
4830: 6d 65 6e 74 2e 67 65 74 45 6c 65 6d 65 6e 74 42  ment.getElementB
4840: 79 49 64 28 22 63 6f 6e 74 72 6f 6c 5f 64 65 62  yId("control_deb
4850: 75 67 22 29 3b 0a 20 20 20 20 65 6c 65 6d 2e 63  ug");.    elem.c
4860: 68 65 63 6b 65 64 20 3d 20 25 73 74 72 69 6e 67  hecked = %string
4870: 28 24 64 65 62 75 67 29 3b 0a 20 20 7d 0a 0a 20  ($debug);.  }.. 
4880: 20 69 66 20 7b 24 73 63 72 69 70 74 20 21 3d 20   if {$script != 
4890: 22 63 6f 6e 66 69 67 2e 6a 73 22 7d 20 7b 0a 20  "config.js"} {. 
48a0: 20 20 20 77 61 70 70 2d 73 75 62 73 74 20 7b 0a     wapp-subst {.
48b0: 20 20 20 20 20 20 76 61 72 20 6c 45 6c 65 6d 20        var lElem 
48c0: 3d 20 5c 5b 22 63 6f 6e 74 72 6f 6c 5f 70 6c 61  = \["control_pla
48d0: 74 66 6f 72 6d 22 2c 20 22 63 6f 6e 74 72 6f 6c  tform", "control
48e0: 5f 74 65 73 74 22 2c 20 0a 20 20 20 20 20 20 20  _test", .       
48f0: 20 20 20 22 63 6f 6e 74 72 6f 6c 5f 74 63 6c 22     "control_tcl"
4900: 2c 20 22 63 6f 6e 74 72 6f 6c 5f 6b 65 65 70 22  , "control_keep"
4910: 2c 20 22 63 6f 6e 74 72 6f 6c 5f 6d 73 76 63 22  , "control_msvc"
4920: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 63 6f  , .          "co
4930: 6e 74 72 6f 6c 5f 64 65 62 75 67 22 0a 20 20 20  ntrol_debug".   
4940: 20 20 20 5c 5d 3b 0a 20 20 20 20 20 20 6c 45 6c     \];.      lEl
4950: 65 6d 2e 66 6f 72 45 61 63 68 28 66 75 6e 63 74  em.forEach(funct
4960: 69 6f 6e 28 65 29 20 7b 0a 20 20 20 20 20 20 20  ion(e) {.       
4970: 20 76 61 72 20 65 6c 65 6d 20 3d 20 64 6f 63 75   var elem = docu
4980: 6d 65 6e 74 2e 67 65 74 45 6c 65 6d 65 6e 74 42  ment.getElementB
4990: 79 49 64 28 65 29 3b 0a 20 20 20 20 20 20 20 20  yId(e);.        
49a0: 65 6c 65 6d 2e 64 69 73 61 62 6c 65 64 20 3d 20  elem.disabled = 
49b0: 74 72 75 65 3b 0a 20 20 20 20 20 20 7d 29 0a 20  true;.      }). 
49c0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 20 7b     }.  }..  if {
49d0: 24 73 63 72 69 70 74 20 3d 3d 20 22 72 75 6e 6e  $script == "runn
49e0: 69 6e 67 2e 6a 73 22 7d 20 7b 0a 20 20 20 20 77  ing.js"} {.    w
49f0: 61 70 70 2d 73 75 62 73 74 20 7b 0a 20 20 20 20  app-subst {.    
4a00: 20 20 66 75 6e 63 74 69 6f 6e 20 72 65 6c 6f 61    function reloa
4a10: 64 5f 74 65 73 74 73 28 29 20 7b 0a 20 20 20 20  d_tests() {.    
4a20: 20 20 20 20 66 65 74 63 68 28 27 74 65 73 74 73      fetch('tests
4a30: 27 29 0a 20 20 20 20 20 20 20 20 20 20 2e 74 68  ').          .th
4a40: 65 6e 28 20 64 61 74 61 20 3d 3e 20 64 61 74 61  en( data => data
4a50: 2e 74 65 78 74 28 29 20 29 0a 20 20 20 20 20 20  .text() ).      
4a60: 20 20 20 20 2e 74 68 65 6e 28 20 64 61 74 61 20      .then( data 
4a70: 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  => {.           
4a80: 20 64 6f 63 75 6d 65 6e 74 2e 67 65 74 45 6c 65   document.getEle
4a90: 6d 65 6e 74 42 79 49 64 28 22 74 65 73 74 73 22  mentById("tests"
4aa0: 29 2e 69 6e 6e 65 72 48 54 4d 4c 20 3d 20 64 61  ).innerHTML = da
4ab0: 74 61 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 29  ta;.          })
4ac0: 0a 20 20 20 20 20 20 20 20 20 20 2e 74 68 65 6e  .          .then
4ad0: 28 20 64 61 74 61 20 3d 3e 20 7b 0a 20 20 20 20  ( data => {.    
4ae0: 20 20 20 20 20 20 20 20 69 66 28 20 64 6f 63 75          if( docu
4af0: 6d 65 6e 74 2e 67 65 74 45 6c 65 6d 65 6e 74 42  ment.getElementB
4b00: 79 49 64 28 22 72 65 73 75 6c 74 22 29 20 29 7b  yId("result") ){
4b10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  .              d
4b20: 6f 63 75 6d 65 6e 74 2e 6c 6f 63 61 74 69 6f 6e  ocument.location
4b30: 20 3d 20 64 6f 63 75 6d 65 6e 74 2e 6c 6f 63 61   = document.loca
4b40: 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  tion;.          
4b50: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
4b60: 20 20 20 20 20 20 20 20 20 73 65 74 54 69 6d 65           setTime
4b70: 6f 75 74 28 72 65 6c 6f 61 64 5f 74 65 73 74 73  out(reload_tests
4b80: 2c 20 31 30 30 30 29 0a 20 20 20 20 20 20 20 20  , 1000).        
4b90: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
4ba0: 7d 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  });.      }..   
4bb0: 20 20 20 73 65 74 54 69 6d 65 6f 75 74 28 72 65     setTimeout(re
4bc0: 6c 6f 61 64 5f 74 65 73 74 73 2c 20 31 30 30 30  load_tests, 1000
4bd0: 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23  ).    }.  }.}..#
4be0: 20 55 52 49 3a 20 2f 65 6e 76 0a 23 0a 23 20 54   URI: /env.#.# T
4bf0: 68 69 73 20 69 73 20 66 6f 72 20 64 65 62 75 67  his is for debug
4c00: 67 69 6e 67 20 6f 6e 6c 79 2e 20 53 65 72 76 65  ging only. Serve
4c10: 73 20 6e 6f 20 6f 74 68 65 72 20 70 75 72 70 6f  s no other purpo
4c20: 73 65 2e 0a 23 0a 70 72 6f 63 20 77 61 70 70 2d  se..#.proc wapp-
4c30: 70 61 67 65 2d 65 6e 76 20 7b 7d 20 7b 0a 20 20  page-env {} {.  
4c40: 77 61 70 70 2d 61 6c 6c 6f 77 2d 78 6f 72 69 67  wapp-allow-xorig
4c50: 69 6e 2d 70 61 72 61 6d 73 0a 20 20 77 61 70 70  in-params.  wapp
4c60: 2d 74 72 69 6d 20 7b 0a 20 20 20 20 3c 68 31 3e  -trim {.    <h1>
4c70: 57 61 70 70 20 45 6e 76 69 72 6f 6e 6d 65 6e 74  Wapp Environment
4c80: 3c 2f 68 31 3e 5c 6e 3c 70 72 65 3e 0a 20 20 20  </h1>\n<pre>.   
4c90: 20 3c 70 72 65 3e 25 68 74 6d 6c 28 5b 77 61 70   <pre>%html([wap
4ca0: 70 2d 64 65 62 75 67 2d 65 6e 76 5d 29 3c 2f 70  p-debug-env])</p
4cb0: 72 65 3e 0a 20 20 7d 0a 7d 0a 0a 23 20 55 52 49  re>.  }.}..# URI
4cc0: 3a 20 2f 6c 6f 67 2f 64 69 72 6e 61 6d 65 2f 74  : /log/dirname/t
4cd0: 65 73 74 2e 6c 6f 67 0a 23 0a 23 20 54 68 69 73  est.log.#.# This
4ce0: 20 55 52 49 20 72 65 61 64 73 20 66 69 6c 65 20   URI reads file 
4cf0: 22 64 69 72 6e 61 6d 65 2f 74 65 73 74 2e 6c 6f  "dirname/test.lo
4d00: 67 22 20 66 72 6f 6d 20 64 69 73 6b 2c 20 77 72  g" from disk, wr
4d10: 61 70 73 20 69 74 20 69 6e 20 61 20 3c 70 72 65  aps it in a <pre
4d20: 3e 0a 23 20 62 6c 6f 63 6b 2c 20 61 6e 64 20 72  >.# block, and r
4d30: 65 74 75 72 6e 73 20 69 74 20 74 6f 20 74 68 65  eturns it to the
4d40: 20 62 72 6f 77 73 65 72 2e 20 55 73 65 20 66 6f   browser. Use fo
4d50: 72 20 76 69 65 77 69 6e 67 20 6c 6f 67 20 66 69  r viewing log fi
4d60: 6c 65 73 2e 0a 23 0a 70 72 6f 63 20 77 61 70 70  les..#.proc wapp
4d70: 2d 70 61 67 65 2d 6c 6f 67 20 7b 7d 20 7b 0a 20  -page-log {} {. 
4d80: 20 73 65 74 20 6c 6f 67 20 5b 73 74 72 69 6e 67   set log [string
4d90: 20 72 61 6e 67 65 20 5b 77 61 70 70 2d 70 61 72   range [wapp-par
4da0: 61 6d 20 52 45 51 55 45 53 54 5f 55 52 49 5d 20  am REQUEST_URI] 
4db0: 35 20 65 6e 64 5d 0a 20 20 73 65 74 20 66 64 20  5 end].  set fd 
4dc0: 5b 6f 70 65 6e 20 24 6c 6f 67 5d 0a 20 20 73 65  [open $log].  se
4dd0: 74 20 64 61 74 61 20 5b 72 65 61 64 20 24 66 64  t data [read $fd
4de0: 5d 0a 20 20 63 6c 6f 73 65 20 24 66 64 0a 20 20  ].  close $fd.  
4df0: 77 61 70 70 2d 74 72 69 6d 20 7b 0a 20 20 20 20  wapp-trim {.    
4e00: 3c 70 72 65 3e 0a 20 20 20 20 25 68 74 6d 6c 28  <pre>.    %html(
4e10: 24 64 61 74 61 29 0a 20 20 20 20 3c 2f 70 72 65  $data).    </pre
4e20: 3e 0a 20 20 7d 0a 7d 0a 0a 23 20 50 72 69 6e 74  >.  }.}..# Print
4e30: 20 6f 75 74 20 61 20 75 73 61 67 65 20 6d 65 73   out a usage mes
4e40: 73 61 67 65 2e 20 54 68 65 6e 20 64 6f 20 5b 65  sage. Then do [e
4e50: 78 69 74 20 31 5d 2e 0a 23 0a 70 72 6f 63 20 77  xit 1]..#.proc w
4e60: 61 70 70 74 65 73 74 5f 75 73 61 67 65 20 7b 7d  apptest_usage {}
4e70: 20 7b 0a 20 20 70 75 74 73 20 73 74 64 65 72 72   {.  puts stderr
4e80: 20 7b 0a 54 68 69 73 20 54 63 6c 20 73 63 72 69   {.This Tcl scri
4e90: 70 74 20 69 73 20 75 73 65 64 20 74 6f 20 74 65  pt is used to te
4ea0: 73 74 20 76 61 72 69 6f 75 73 20 63 6f 6e 66 69  st various confi
4eb0: 67 75 72 61 74 69 6f 6e 73 20 6f 66 20 53 51 4c  gurations of SQL
4ec0: 69 74 65 2e 20 42 79 0a 64 65 66 61 75 6c 74 20  ite. By.default 
4ed0: 69 74 20 75 73 65 73 20 22 77 61 70 70 22 20 74  it uses "wapp" t
4ee0: 6f 20 70 72 6f 76 69 64 65 20 61 6e 20 69 6e 74  o provide an int
4ef0: 65 72 61 63 74 69 76 65 20 69 6e 74 65 72 66 61  eractive interfa
4f00: 63 65 2e 20 53 75 70 70 6f 72 74 65 64 20 0a 63  ce. Supported .c
4f10: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 6f 70 74 69  ommand line opti
4f20: 6f 6e 73 20 28 61 6c 6c 20 6f 70 74 69 6f 6e 61  ons (all optiona
4f30: 6c 29 20 61 72 65 3a 0a 0a 20 20 20 20 2d 2d 70  l) are:..    --p
4f40: 6c 61 74 66 6f 72 6d 20 20 20 20 50 4c 41 54 46  latform    PLATF
4f50: 4f 52 4d 20 20 20 20 20 20 20 20 20 28 77 68 69  ORM         (whi
4f60: 63 68 20 74 65 73 74 73 20 74 6f 20 72 75 6e 29  ch tests to run)
4f70: 0a 20 20 20 20 2d 2d 73 6d 6f 6b 65 74 65 73 74  .    --smoketest
4f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f90: 20 20 20 20 28 72 75 6e 20 22 6d 61 6b 65 20 73      (run "make s
4fa0: 6d 6f 6b 65 74 65 73 74 22 20 6f 6e 6c 79 29 0a  moketest" only).
4fb0: 20 20 20 20 2d 2d 76 65 72 79 71 75 69 63 6b 20      --veryquick 
4fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fd0: 20 20 20 28 72 75 6e 20 76 65 72 79 71 75 69 63     (run veryquic
4fe0: 6b 2e 74 65 73 74 20 6f 6e 6c 79 29 0a 20 20 20  k.test only).   
4ff0: 20 2d 2d 62 75 69 6c 64 6f 6e 6c 79 20 20 20 20   --buildonly    
5000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5010: 28 62 75 69 6c 64 20 65 78 65 63 75 74 61 62 6c  (build executabl
5020: 65 73 2c 20 64 6f 20 6e 6f 74 20 72 75 6e 20 74  es, do not run t
5030: 65 73 74 73 29 0a 20 20 20 20 2d 2d 6a 6f 62 73  ests).    --jobs
5040: 20 20 20 20 20 20 20 20 4e 20 20 20 20 20 20 20          N       
5050: 20 20 20 20 20 20 20 20 20 28 6e 75 6d 62 65 72           (number
5060: 20 6f 66 20 63 6f 6e 63 75 72 72 65 6e 74 20 6a   of concurrent j
5070: 6f 62 73 29 0a 20 20 20 20 2d 2d 74 63 6c 20 20  obs).    --tcl  
5080: 20 20 20 20 20 20 20 44 49 52 20 20 20 20 20 20         DIR      
5090: 20 20 20 20 20 20 20 20 28 77 68 65 72 65 20 74          (where t
50a0: 6f 20 66 69 6e 64 20 74 63 6c 43 6f 6e 66 69 67  o find tclConfig
50b0: 2e 73 68 29 0a 20 20 20 20 2d 2d 64 65 6c 65 74  .sh).    --delet
50c0: 65 66 69 6c 65 73 20 20 20 20 20 20 20 20 20 20  efiles          
50d0: 20 20 20 20 20 20 20 20 28 64 65 6c 65 74 65 20          (delete 
50e0: 65 78 74 72 61 20 66 69 6c 65 73 20 61 66 74 65  extra files afte
50f0: 72 20 65 61 63 68 20 74 65 73 74 29 0a 20 20 20  r each test).   
5100: 20 2d 2d 6d 73 76 63 20 20 20 20 20 20 20 20 20   --msvc         
5110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5120: 28 55 73 65 20 4d 53 20 56 69 73 75 61 6c 20 43  (Use MS Visual C
5130: 29 0a 20 20 20 20 2d 2d 64 65 62 75 67 20 20 20  ).    --debug   
5140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5150: 20 20 20 20 20 28 41 6c 73 6f 20 72 75 6e 20 5b       (Also run [
5160: 6e 5d 64 65 62 75 67 67 69 6e 67 20 76 65 72 73  n]debugging vers
5170: 69 6f 6e 73 20 6f 66 20 74 65 73 74 73 29 0a 20  ions of tests). 
5180: 20 20 20 2d 2d 6e 6f 75 69 20 20 20 20 20 20 20     --noui       
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51a0: 20 20 28 64 6f 20 6e 6f 74 20 75 73 65 20 77 61    (do not use wa
51b0: 70 70 29 0a 20 20 7d 0a 20 20 65 78 69 74 20 31  pp).  }.  exit 1
51c0: 0a 7d 0a 0a 23 20 53 6f 72 74 20 63 6f 6d 6d 61  .}..# Sort comma
51d0: 6e 64 20 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74  nd line argument
51e0: 73 20 69 6e 74 6f 20 74 77 6f 20 67 72 6f 75 70  s into two group
51f0: 73 3a 20 74 68 6f 73 65 20 74 68 61 74 20 62 65  s: those that be
5200: 6c 6f 6e 67 20 74 6f 20 77 61 70 70 2c 0a 23 20  long to wapp,.# 
5210: 61 6e 64 20 74 68 6f 73 65 20 74 68 61 74 20 62  and those that b
5220: 65 6c 6f 6e 67 20 74 6f 20 74 68 65 20 61 70 70  elong to the app
5230: 6c 69 63 61 74 69 6f 6e 2e 0a 73 65 74 20 57 41  lication..set WA
5240: 50 50 41 52 47 28 2d 73 65 72 76 65 72 29 20 20  PPARG(-server)  
5250: 20 20 20 20 31 0a 73 65 74 20 57 41 50 50 41 52      1.set WAPPAR
5260: 47 28 2d 6c 6f 63 61 6c 29 20 20 20 20 20 20 20  G(-local)       
5270: 31 0a 73 65 74 20 57 41 50 50 41 52 47 28 2d 73  1.set WAPPARG(-s
5280: 63 67 69 29 20 20 20 20 20 20 20 20 31 0a 73 65  cgi)        1.se
5290: 74 20 57 41 50 50 41 52 47 28 2d 72 65 6d 6f 74  t WAPPARG(-remot
52a0: 65 2d 73 63 67 69 29 20 31 0a 73 65 74 20 57 41  e-scgi) 1.set WA
52b0: 50 50 41 52 47 28 2d 66 72 6f 6d 69 70 29 20 20  PPARG(-fromip)  
52c0: 20 20 20 20 31 0a 73 65 74 20 57 41 50 50 41 52      1.set WAPPAR
52d0: 47 28 2d 6e 6f 77 61 69 74 29 20 20 20 20 20 20  G(-nowait)      
52e0: 30 0a 73 65 74 20 57 41 50 50 41 52 47 28 2d 63  0.set WAPPARG(-c
52f0: 67 69 29 20 20 20 20 20 20 20 20 20 30 0a 73 65  gi)         0.se
5300: 74 20 6c 57 61 70 70 41 72 67 20 5b 6c 69 73 74  t lWappArg [list
5310: 5d 0a 73 65 74 20 6c 54 65 73 74 41 72 67 20 5b  ].set lTestArg [
5320: 6c 69 73 74 5d 0a 66 6f 72 20 7b 73 65 74 20 69  list].for {set i
5330: 20 30 7d 20 7b 24 69 20 3c 20 5b 6c 6c 65 6e 67   0} {$i < [lleng
5340: 74 68 20 24 61 72 67 76 5d 7d 20 7b 69 6e 63 72  th $argv]} {incr
5350: 20 69 7d 20 7b 0a 20 20 73 65 74 20 61 72 67 20   i} {.  set arg 
5360: 5b 6c 69 6e 64 65 78 20 24 61 72 67 76 20 24 69  [lindex $argv $i
5370: 5d 0a 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20  ].  if {[string 
5380: 72 61 6e 67 65 20 24 61 72 67 20 30 20 31 5d 3d  range $arg 0 1]=
5390: 3d 22 2d 2d 22 7d 20 7b 0a 20 20 20 20 73 65 74  ="--"} {.    set
53a0: 20 61 72 67 20 5b 73 74 72 69 6e 67 20 72 61 6e   arg [string ran
53b0: 67 65 20 24 61 72 67 20 31 20 65 6e 64 5d 0a 20  ge $arg 1 end]. 
53c0: 20 7d 0a 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65   }.  if {[info e
53d0: 78 69 73 74 73 20 57 41 50 50 41 52 47 28 24 61  xists WAPPARG($a
53e0: 72 67 29 5d 7d 20 7b 0a 20 20 20 20 6c 61 70 70  rg)]} {.    lapp
53f0: 65 6e 64 20 6c 57 61 70 70 41 72 67 20 24 61 72  end lWappArg $ar
5400: 67 0a 20 20 20 20 69 66 20 7b 24 57 41 50 50 41  g.    if {$WAPPA
5410: 52 47 28 24 61 72 67 29 7d 20 7b 0a 20 20 20 20  RG($arg)} {.    
5420: 20 20 69 6e 63 72 20 69 0a 20 20 20 20 20 20 6c    incr i.      l
5430: 61 70 70 65 6e 64 20 6c 57 61 70 70 41 72 67 20  append lWappArg 
5440: 5b 6c 69 6e 64 65 78 20 24 61 72 67 76 20 24 69  [lindex $argv $i
5450: 5d 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65  ].    }.  } else
5460: 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 6c   {.    lappend l
5470: 54 65 73 74 41 72 67 20 24 61 72 67 0a 20 20 7d  TestArg $arg.  }
5480: 0a 7d 0a 0a 66 6f 72 20 7b 73 65 74 20 69 20 30  .}..for {set i 0
5490: 7d 20 7b 24 69 20 3c 20 5b 6c 6c 65 6e 67 74 68  } {$i < [llength
54a0: 20 24 6c 54 65 73 74 41 72 67 5d 7d 20 7b 69 6e   $lTestArg]} {in
54b0: 63 72 20 69 7d 20 7b 0a 20 20 73 77 69 74 63 68  cr i} {.  switch
54c0: 20 2d 2d 20 5b 6c 69 6e 64 65 78 20 24 6c 54 65   -- [lindex $lTe
54d0: 73 74 41 72 67 20 24 69 5d 20 7b 0a 20 20 20 20  stArg $i] {.    
54e0: 2d 70 6c 61 74 66 6f 72 6d 20 7b 0a 20 20 20 20  -platform {.    
54f0: 20 20 69 66 20 7b 24 69 3d 3d 5b 6c 6c 65 6e 67    if {$i==[lleng
5500: 74 68 20 24 6c 54 65 73 74 41 72 67 5d 2d 31 7d  th $lTestArg]-1}
5510: 20 7b 20 77 61 70 70 74 65 73 74 5f 75 73 61 67   { wapptest_usag
5520: 65 20 7d 0a 20 20 20 20 20 20 69 6e 63 72 20 69  e }.      incr i
5530: 0a 20 20 20 20 20 20 73 65 74 20 61 72 67 20 5b  .      set arg [
5540: 6c 69 6e 64 65 78 20 24 6c 54 65 73 74 41 72 67  lindex $lTestArg
5550: 20 24 69 5d 0a 20 20 20 20 20 20 73 65 74 20 6c   $i].      set l
5560: 50 6c 61 74 66 6f 72 6d 20 5b 72 65 6c 65 61 73  Platform [releas
5570: 65 74 65 73 74 5f 64 61 74 61 20 70 6c 61 74 66  etest_data platf
5580: 6f 72 6d 73 5d 0a 20 20 20 20 20 20 69 66 20 7b  orms].      if {
5590: 5b 6c 73 65 61 72 63 68 20 24 6c 50 6c 61 74 66  [lsearch $lPlatf
55a0: 6f 72 6d 20 24 61 72 67 5d 3c 30 7d 20 7b 0a 20  orm $arg]<0} {. 
55b0: 20 20 20 20 20 20 20 70 75 74 73 20 73 74 64 65         puts stde
55c0: 72 72 20 22 4e 6f 20 73 75 63 68 20 70 6c 61 74  rr "No such plat
55d0: 66 6f 72 6d 3a 20 24 61 72 67 2e 20 50 6c 61 74  form: $arg. Plat
55e0: 66 6f 72 6d 73 20 61 72 65 3a 20 24 6c 50 6c 61  forms are: $lPla
55f0: 74 66 6f 72 6d 22 0a 20 20 20 20 20 20 20 20 65  tform".        e
5600: 78 69 74 20 2d 31 0a 20 20 20 20 20 20 7d 0a 20  xit -1.      }. 
5610: 20 20 20 20 20 73 65 74 20 47 28 70 6c 61 74 66       set G(platf
5620: 6f 72 6d 29 20 24 61 72 67 0a 20 20 20 20 7d 0a  orm) $arg.    }.
5630: 0a 20 20 20 20 2d 73 6d 6f 6b 65 74 65 73 74 20  .    -smoketest 
5640: 7b 20 73 65 74 20 47 28 74 65 73 74 29 20 53 6d  { set G(test) Sm
5650: 6f 6b 65 74 65 73 74 20 7d 0a 20 20 20 20 2d 76  oketest }.    -v
5660: 65 72 79 71 75 69 63 6b 20 7b 20 73 65 74 20 47  eryquick { set G
5670: 28 74 65 73 74 29 20 56 65 72 79 71 75 69 63 6b  (test) Veryquick
5680: 20 7d 0a 20 20 20 20 2d 62 75 69 6c 64 6f 6e 6c   }.    -buildonl
5690: 79 20 7b 20 73 65 74 20 47 28 74 65 73 74 29 20  y { set G(test) 
56a0: 42 75 69 6c 64 2d 4f 6e 6c 79 20 7d 0a 20 20 20  Build-Only }.   
56b0: 20 2d 6a 6f 62 73 20 7b 0a 20 20 20 20 20 20 69   -jobs {.      i
56c0: 66 20 7b 24 69 3d 3d 5b 6c 6c 65 6e 67 74 68 20  f {$i==[llength 
56d0: 24 6c 54 65 73 74 41 72 67 5d 2d 31 7d 20 7b 20  $lTestArg]-1} { 
56e0: 77 61 70 70 74 65 73 74 5f 75 73 61 67 65 20 7d  wapptest_usage }
56f0: 0a 20 20 20 20 20 20 69 6e 63 72 20 69 0a 20 20  .      incr i.  
5700: 20 20 20 20 73 65 74 20 47 28 6a 6f 62 73 29 20      set G(jobs) 
5710: 5b 6c 69 6e 64 65 78 20 24 6c 54 65 73 74 41 72  [lindex $lTestAr
5720: 67 20 24 69 5d 0a 20 20 20 20 7d 0a 0a 20 20 20  g $i].    }..   
5730: 20 2d 74 63 6c 20 7b 0a 20 20 20 20 20 20 69 66   -tcl {.      if
5740: 20 7b 24 69 3d 3d 5b 6c 6c 65 6e 67 74 68 20 24   {$i==[llength $
5750: 6c 54 65 73 74 41 72 67 5d 2d 31 7d 20 7b 20 77  lTestArg]-1} { w
5760: 61 70 70 74 65 73 74 5f 75 73 61 67 65 20 7d 0a  apptest_usage }.
5770: 20 20 20 20 20 20 69 6e 63 72 20 69 0a 20 20 20        incr i.   
5780: 20 20 20 73 65 74 20 47 28 74 63 6c 29 20 5b 6c     set G(tcl) [l
5790: 69 6e 64 65 78 20 24 6c 54 65 73 74 41 72 67 20  index $lTestArg 
57a0: 24 69 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2d  $i].    }..    -
57b0: 64 65 6c 65 74 65 66 69 6c 65 73 20 7b 0a 20 20  deletefiles {.  
57c0: 20 20 20 20 73 65 74 20 47 28 6b 65 65 70 29 20      set G(keep) 
57d0: 30 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2d 6d 73  0.    }..    -ms
57e0: 76 63 20 7b 0a 20 20 20 20 20 20 73 65 74 20 47  vc {.      set G
57f0: 28 6d 73 76 63 29 20 31 0a 20 20 20 20 7d 0a 0a  (msvc) 1.    }..
5800: 20 20 20 20 2d 64 65 62 75 67 20 7b 0a 20 20 20      -debug {.   
5810: 20 20 20 73 65 74 20 47 28 64 65 62 75 67 29 20     set G(debug) 
5820: 31 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2d 6e 6f  1.    }..    -no
5830: 75 69 20 7b 0a 20 20 20 20 20 20 73 65 74 20 47  ui {.      set G
5840: 28 6e 6f 75 69 29 20 31 0a 20 20 20 20 20 20 73  (noui) 1.      s
5850: 65 74 20 47 28 73 74 64 6f 75 74 29 20 31 0a 20  et G(stdout) 1. 
5860: 20 20 20 7d 0a 0a 20 20 20 20 2d 73 74 64 6f 75     }..    -stdou
5870: 74 20 7b 0a 20 20 20 20 20 20 73 65 74 20 47 28  t {.      set G(
5880: 73 74 64 6f 75 74 29 20 31 0a 20 20 20 20 7d 0a  stdout) 1.    }.
5890: 0a 20 20 20 20 64 65 66 61 75 6c 74 20 7b 0a 20  .    default {. 
58a0: 20 20 20 20 20 70 75 74 73 20 73 74 64 65 72 72       puts stderr
58b0: 20 22 55 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6f   "Unrecognized o
58c0: 70 74 69 6f 6e 3a 20 5b 6c 69 6e 64 65 78 20 24  ption: [lindex $
58d0: 6c 54 65 73 74 41 72 67 20 24 69 5d 22 0a 20 20  lTestArg $i]".  
58e0: 20 20 20 20 77 61 70 70 74 65 73 74 5f 75 73 61      wapptest_usa
58f0: 67 65 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  ge.    }.  }.}..
5900: 77 61 70 70 74 65 73 74 5f 69 6e 69 74 0a 69 66  wapptest_init.if
5910: 20 7b 24 47 28 6e 6f 75 69 29 3d 3d 30 7d 20 7b   {$G(noui)==0} {
5920: 0a 20 20 77 61 70 70 2d 73 74 61 72 74 20 24 6c  .  wapp-start $l
5930: 57 61 70 70 41 72 67 0a 7d 20 65 6c 73 65 20 7b  WappArg.} else {
5940: 0a 20 20 77 61 70 70 74 65 73 74 5f 72 75 6e 0a  .  wapptest_run.
5950: 20 20 64 6f 5f 73 6f 6d 65 5f 73 74 75 66 66 0a    do_some_stuff.
5960: 20 20 76 77 61 69 74 20 66 6f 72 65 76 65 72 0a    vwait forever.
5970: 7d 0a 0a                                         }..