Megatest

Hex Artifact Content
Login

Artifact 35c75741ff3076dfd2b3cc07eaa8bee04de5d77d:


0000: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;;==============
0010: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0020: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0030: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0040: 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 43 6f 70 79  ========.;; Copy
0050: 72 69 67 68 74 20 32 30 30 36 2d 32 30 31 32 2c  right 2006-2012,
0060: 20 4d 61 74 74 68 65 77 20 57 65 6c 6c 61 6e 64   Matthew Welland
0070: 2e 0a 3b 3b 20 0a 3b 3b 20 20 54 68 69 73 20 70  ..;; .;;  This p
0080: 72 6f 67 72 61 6d 20 69 73 20 6d 61 64 65 20 61  rogram is made a
0090: 76 61 69 6c 61 62 6c 65 20 75 6e 64 65 72 20 74  vailable under t
00a0: 68 65 20 47 4e 55 20 47 50 4c 20 76 65 72 73 69  he GNU GPL versi
00b0: 6f 6e 20 32 2e 30 20 6f 72 0a 3b 3b 20 20 67 72  on 2.0 or.;;  gr
00c0: 65 61 74 65 72 2e 20 53 65 65 20 74 68 65 20 61  eater. See the a
00d0: 63 63 6f 6d 70 61 6e 79 69 6e 67 20 66 69 6c 65  ccompanying file
00e0: 20 43 4f 50 59 49 4e 47 20 66 6f 72 20 64 65 74   COPYING for det
00f0: 61 69 6c 73 2e 0a 3b 3b 20 0a 3b 3b 20 20 54 68  ails..;; .;;  Th
0100: 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69  is program is di
0110: 73 74 72 69 62 75 74 65 64 20 57 49 54 48 4f 55  stributed WITHOU
0120: 54 20 41 4e 59 20 57 41 52 52 41 4e 54 59 3b 20  T ANY WARRANTY; 
0130: 77 69 74 68 6f 75 74 20 65 76 65 6e 20 74 68 65  without even the
0140: 0a 3b 3b 20 20 69 6d 70 6c 69 65 64 20 77 61 72  .;;  implied war
0150: 72 61 6e 74 79 20 6f 66 20 4d 45 52 43 48 41 4e  ranty of MERCHAN
0160: 54 41 42 49 4c 49 54 59 20 6f 72 20 46 49 54 4e  TABILITY or FITN
0170: 45 53 53 20 46 4f 52 20 41 20 50 41 52 54 49 43  ESS FOR A PARTIC
0180: 55 4c 41 52 0a 3b 3b 20 20 50 55 52 50 4f 53 45  ULAR.;;  PURPOSE
0190: 2e 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ..;;============
01a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 3d 3d  ==========..;;==
01e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0200: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0210: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0220: 3d 3d 3d 3d 0a 3b 3b 20 54 65 73 74 73 0a 3b 3b  ====.;; Tests.;;
0230: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0240: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0250: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0260: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0270: 3d 3d 3d 3d 3d 3d 0a 0a 28 75 73 65 20 73 71 6c  ======..(use sql
0280: 69 74 65 33 20 73 72 66 69 2d 31 20 70 6f 73 69  ite3 srfi-1 posi
0290: 78 20 72 65 67 65 78 20 72 65 67 65 78 2d 63 61  x regex regex-ca
02a0: 73 65 20 73 72 66 69 2d 36 39 20 64 6f 74 2d 6c  se srfi-69 dot-l
02b0: 6f 63 6b 69 6e 67 20 74 63 70 20 72 70 63 29 0a  ocking tcp rpc).
02c0: 28 69 6d 70 6f 72 74 20 28 70 72 65 66 69 78 20  (import (prefix 
02d0: 73 71 6c 69 74 65 33 20 73 71 6c 69 74 65 33 3a  sqlite3 sqlite3:
02e0: 29 29 0a 28 69 6d 70 6f 72 74 20 28 70 72 65 66  )).(import (pref
02f0: 69 78 20 72 70 63 20 72 70 63 3a 29 29 0a 0a 28  ix rpc rpc:))..(
0300: 64 65 63 6c 61 72 65 20 28 75 6e 69 74 20 74 65  declare (unit te
0310: 73 74 73 29 29 0a 28 64 65 63 6c 61 72 65 20 28  sts)).(declare (
0320: 75 73 65 73 20 64 62 29 29 0a 28 64 65 63 6c 61  uses db)).(decla
0330: 72 65 20 28 75 73 65 73 20 63 6f 6d 6d 6f 6e 29  re (uses common)
0340: 29 0a 28 64 65 63 6c 61 72 65 20 28 75 73 65 73  ).(declare (uses
0350: 20 69 74 65 6d 73 29 29 0a 28 64 65 63 6c 61 72   items)).(declar
0360: 65 20 28 75 73 65 73 20 72 75 6e 63 6f 6e 66 69  e (uses runconfi
0370: 67 29 29 0a 0a 28 69 6e 63 6c 75 64 65 20 22 63  g))..(include "c
0380: 6f 6d 6d 6f 6e 5f 72 65 63 6f 72 64 73 2e 73 63  ommon_records.sc
0390: 6d 22 29 0a 28 69 6e 63 6c 75 64 65 20 22 6b 65  m").(include "ke
03a0: 79 5f 72 65 63 6f 72 64 73 2e 73 63 6d 22 29 0a  y_records.scm").
03b0: 28 69 6e 63 6c 75 64 65 20 22 64 62 5f 72 65 63  (include "db_rec
03c0: 6f 72 64 73 2e 73 63 6d 22 29 0a 28 69 6e 63 6c  ords.scm").(incl
03d0: 75 64 65 20 22 72 75 6e 5f 72 65 63 6f 72 64 73  ude "run_records
03e0: 2e 73 63 6d 22 29 0a 28 69 6e 63 6c 75 64 65 20  .scm").(include 
03f0: 22 74 65 73 74 5f 72 65 63 6f 72 64 73 2e 73 63  "test_records.sc
0400: 6d 22 29 0a 0a 3b 3b 20 67 65 74 20 74 68 65 20  m")..;; get the 
0410: 70 72 65 76 69 6f 75 73 20 72 65 63 6f 72 64 20  previous record 
0420: 66 6f 72 20 77 68 65 6e 20 74 68 69 73 20 74 65  for when this te
0430: 73 74 20 77 61 73 20 72 75 6e 20 77 68 65 72 65  st was run where
0440: 20 61 6c 6c 20 6b 65 79 73 20 6d 61 74 63 68 20   all keys match 
0450: 62 75 74 20 72 75 6e 6e 61 6d 65 0a 3b 3b 20 72  but runname.;; r
0460: 65 74 75 72 6e 73 20 23 66 20 69 66 20 6e 6f 20  eturns #f if no 
0470: 73 75 63 68 20 74 65 73 74 20 66 6f 75 6e 64 2c  such test found,
0480: 20 72 65 74 75 72 6e 73 20 61 20 73 69 6e 67 6c   returns a singl
0490: 65 20 74 65 73 74 20 72 65 63 6f 72 64 20 69 66  e test record if
04a0: 20 66 6f 75 6e 64 0a 28 64 65 66 69 6e 65 20 28   found.(define (
04b0: 74 65 73 74 3a 67 65 74 2d 70 72 65 76 69 6f 75  test:get-previou
04c0: 73 2d 74 65 73 74 2d 72 75 6e 2d 72 65 63 6f 72  s-test-run-recor
04d0: 64 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74  d db run-id test
04e0: 2d 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 29  -name item-path)
04f0: 0a 20 20 28 6c 65 74 2a 20 28 28 6b 65 79 73 20  .  (let* ((keys 
0500: 20 20 20 28 64 62 3a 67 65 74 2d 6b 65 79 73 20     (db:get-keys 
0510: 64 62 29 29 0a 09 20 28 73 65 6c 73 74 72 20 20  db)).. (selstr  
0520: 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65  (string-interspe
0530: 72 73 65 20 28 6d 61 70 20 28 6c 61 6d 62 64 61  rse (map (lambda
0540: 20 28 78 29 28 76 65 63 74 6f 72 2d 72 65 66 20   (x)(vector-ref 
0550: 78 20 30 29 29 20 6b 65 79 73 29 20 22 2c 22 29  x 0)) keys) ",")
0560: 29 0a 09 20 28 71 72 79 73 74 72 20 20 28 73 74  ).. (qrystr  (st
0570: 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65  ring-intersperse
0580: 20 28 6d 61 70 20 28 6c 61 6d 62 64 61 20 28 78   (map (lambda (x
0590: 29 28 63 6f 6e 63 20 28 76 65 63 74 6f 72 2d 72  )(conc (vector-r
05a0: 65 66 20 78 20 30 29 20 22 3d 3f 22 29 29 20 6b  ef x 0) "=?")) k
05b0: 65 79 73 29 20 22 20 41 4e 44 20 22 29 29 0a 09  eys) " AND "))..
05c0: 20 28 6b 65 79 76 61 6c 73 20 23 66 29 29 0a 20   (keyvals #f)). 
05d0: 20 20 20 3b 3b 20 66 69 72 73 74 20 6c 6f 6f 6b     ;; first look
05e0: 20 75 70 20 74 68 65 20 6b 65 79 20 76 61 6c 75   up the key valu
05f0: 65 73 20 66 72 6f 6d 20 74 68 65 20 72 75 6e 20  es from the run 
0600: 73 65 6c 65 63 74 65 64 20 62 79 20 72 75 6e 2d  selected by run-
0610: 69 64 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a  id.    (sqlite3:
0620: 66 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a 20 20  for-each-row .  
0630: 20 20 20 28 6c 61 6d 62 64 61 20 28 61 20 2e 20     (lambda (a . 
0640: 62 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 20  b).       (set! 
0650: 6b 65 79 76 61 6c 73 20 28 63 6f 6e 73 20 61 20  keyvals (cons a 
0660: 62 29 29 29 0a 20 20 20 20 20 64 62 0a 20 20 20  b))).     db.   
0670: 20 20 28 63 6f 6e 63 20 22 53 45 4c 45 43 54 20    (conc "SELECT 
0680: 22 20 73 65 6c 73 74 72 20 22 20 46 52 4f 4d 20  " selstr " FROM 
0690: 72 75 6e 73 20 57 48 45 52 45 20 69 64 3d 3f 20  runs WHERE id=? 
06a0: 4f 52 44 45 52 20 42 59 20 65 76 65 6e 74 5f 74  ORDER BY event_t
06b0: 69 6d 65 20 44 45 53 43 3b 22 29 20 72 75 6e 2d  ime DESC;") run-
06c0: 69 64 29 0a 20 20 20 20 28 69 66 20 28 6e 6f 74  id).    (if (not
06d0: 20 6b 65 79 76 61 6c 73 29 0a 09 23 66 0a 09 28   keyvals)..#f..(
06e0: 6c 65 74 20 28 28 70 72 65 76 2d 72 75 6e 2d 69  let ((prev-run-i
06f0: 64 73 20 27 28 29 29 29 0a 09 20 20 28 61 70 70  ds '()))..  (app
0700: 6c 79 20 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65  ly sqlite3:for-e
0710: 61 63 68 2d 72 6f 77 0a 09 09 20 28 6c 61 6d 62  ach-row... (lamb
0720: 64 61 20 28 69 64 29 0a 09 09 20 20 20 28 73 65  da (id)...   (se
0730: 74 21 20 70 72 65 76 2d 72 75 6e 2d 69 64 73 20  t! prev-run-ids 
0740: 28 63 6f 6e 73 20 69 64 20 70 72 65 76 2d 72 75  (cons id prev-ru
0750: 6e 2d 69 64 73 29 29 29 0a 09 09 20 64 62 0a 09  n-ids)))... db..
0760: 09 20 28 63 6f 6e 63 20 22 53 45 4c 45 43 54 20  . (conc "SELECT 
0770: 69 64 20 46 52 4f 4d 20 72 75 6e 73 20 57 48 45  id FROM runs WHE
0780: 52 45 20 22 20 71 72 79 73 74 72 20 22 20 41 4e  RE " qrystr " AN
0790: 44 20 69 64 20 21 3d 20 3f 3b 22 29 20 28 61 70  D id != ?;") (ap
07a0: 70 65 6e 64 20 6b 65 79 76 61 6c 73 20 28 6c 69  pend keyvals (li
07b0: 73 74 20 72 75 6e 2d 69 64 29 29 29 0a 09 20 20  st run-id)))..  
07c0: 3b 3b 20 66 6f 72 20 65 61 63 68 20 72 75 6e 20  ;; for each run 
07d0: 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 74 68  starting with th
07e0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 6c 6f  e most recent lo
07f0: 6f 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ok to see if the
0800: 72 65 20 69 73 20 61 20 6d 61 74 63 68 69 6e 67  re is a matching
0810: 20 74 65 73 74 0a 09 20 20 3b 3b 20 69 66 20 66   test..  ;; if f
0820: 6f 75 6e 64 20 74 68 65 6e 20 72 65 74 75 72 6e  ound then return
0830: 20 74 68 61 74 20 6d 61 74 63 68 69 6e 67 20 74   that matching t
0840: 65 73 74 20 72 65 63 6f 72 64 0a 09 20 20 28 64  est record..  (d
0850: 65 62 75 67 3a 70 72 69 6e 74 20 34 20 22 73 65  ebug:print 4 "se
0860: 6c 73 74 72 3a 20 22 20 73 65 6c 73 74 72 20 22  lstr: " selstr "
0870: 2c 20 71 72 79 73 74 72 3a 20 22 20 71 72 79 73  , qrystr: " qrys
0880: 74 72 20 22 2c 20 6b 65 79 76 61 6c 73 3a 20 22  tr ", keyvals: "
0890: 20 6b 65 79 76 61 6c 73 20 22 2c 20 70 72 65 76   keyvals ", prev
08a0: 69 6f 75 73 20 72 75 6e 20 69 64 73 20 66 6f 75  ious run ids fou
08b0: 6e 64 3a 20 22 20 70 72 65 76 2d 72 75 6e 2d 69  nd: " prev-run-i
08c0: 64 73 29 0a 09 20 20 28 69 66 20 28 6e 75 6c 6c  ds)..  (if (null
08d0: 3f 20 70 72 65 76 2d 72 75 6e 2d 69 64 73 29 20  ? prev-run-ids) 
08e0: 23 66 0a 09 20 20 20 20 20 20 28 6c 65 74 20 6c  #f..      (let l
08f0: 6f 6f 70 20 28 28 68 65 64 20 28 63 61 72 20 70  oop ((hed (car p
0900: 72 65 76 2d 72 75 6e 2d 69 64 73 29 29 0a 09 09  rev-run-ids))...
0910: 09 20 28 74 61 6c 20 28 63 64 72 20 70 72 65 76  . (tal (cdr prev
0920: 2d 72 75 6e 2d 69 64 73 29 29 29 0a 09 09 28 6c  -run-ids)))...(l
0930: 65 74 20 28 28 72 65 73 75 6c 74 73 20 28 64 62  et ((results (db
0940: 3a 67 65 74 2d 74 65 73 74 73 2d 66 6f 72 2d 72  :get-tests-for-r
0950: 75 6e 20 64 62 20 68 65 64 20 74 65 73 74 2d 6e  un db hed test-n
0960: 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 27 28  ame item-path '(
0970: 29 20 27 28 29 29 29 29 0a 09 09 20 20 28 64 65  ) '())))...  (de
0980: 62 75 67 3a 70 72 69 6e 74 20 34 20 22 47 6f 74  bug:print 4 "Got
0990: 20 74 65 73 74 73 20 66 6f 72 20 72 75 6e 2d 69   tests for run-i
09a0: 64 20 22 20 72 75 6e 2d 69 64 20 22 2c 20 74 65  d " run-id ", te
09b0: 73 74 2d 6e 61 6d 65 20 22 20 74 65 73 74 2d 6e  st-name " test-n
09c0: 61 6d 65 20 22 2c 20 69 74 65 6d 2d 70 61 74 68  ame ", item-path
09d0: 20 22 20 69 74 65 6d 2d 70 61 74 68 20 22 3a 20   " item-path ": 
09e0: 22 20 72 65 73 75 6c 74 73 29 0a 09 09 20 20 28  " results)...  (
09f0: 69 66 20 28 61 6e 64 20 28 6e 75 6c 6c 3f 20 72  if (and (null? r
0a00: 65 73 75 6c 74 73 29 0a 09 09 09 20 20 20 28 6e  esults)....   (n
0a10: 6f 74 20 28 6e 75 6c 6c 3f 20 74 61 6c 29 29 29  ot (null? tal)))
0a20: 0a 09 09 20 20 20 20 20 20 28 6c 6f 6f 70 20 28  ...      (loop (
0a30: 63 61 72 20 74 61 6c 29 28 63 64 72 20 74 61 6c  car tal)(cdr tal
0a40: 29 29 0a 09 09 20 20 20 20 20 20 28 69 66 20 28  ))...      (if (
0a50: 6e 75 6c 6c 3f 20 72 65 73 75 6c 74 73 29 20 23  null? results) #
0a60: 66 0a 09 09 09 20 20 28 63 61 72 20 72 65 73 75  f....  (car resu
0a70: 6c 74 73 29 29 29 29 29 29 29 29 29 29 0a 20 20  lts)))))))))).  
0a80: 20 20 0a 3b 3b 20 67 65 74 20 74 68 65 20 70 72    .;; get the pr
0a90: 65 76 69 6f 75 73 20 72 65 63 6f 72 64 73 20 66  evious records f
0aa0: 6f 72 20 77 68 65 6e 20 74 68 65 73 65 20 74 65  or when these te
0ab0: 73 74 73 20 77 65 72 65 20 72 75 6e 20 77 68 65  sts were run whe
0ac0: 72 65 20 61 6c 6c 20 6b 65 79 73 20 6d 61 74 63  re all keys matc
0ad0: 68 20 62 75 74 20 72 75 6e 6e 61 6d 65 0a 3b 3b  h but runname.;;
0ae0: 20 4e 42 2f 2f 20 4d 65 72 67 65 20 74 68 69 73   NB// Merge this
0af0: 20 77 69 74 68 20 74 65 73 74 3a 67 65 74 2d 70   with test:get-p
0b00: 72 65 76 69 6f 75 73 2d 74 65 73 74 2d 72 75 6e  revious-test-run
0b10: 2d 72 65 63 6f 72 64 73 3f 20 54 68 69 73 20 6f  -records? This o
0b20: 6e 65 20 6c 6f 6f 6b 73 20 66 6f 72 20 61 6c 6c  ne looks for all
0b30: 20 6d 61 74 63 68 69 6e 67 20 74 65 73 74 73 0a   matching tests.
0b40: 3b 3b 20 63 61 6e 20 75 73 65 20 77 69 6c 64 63  ;; can use wildc
0b50: 61 72 64 73 2e 20 41 6c 73 6f 20 63 61 6e 20 6c  ards. Also can l
0b60: 69 6b 65 6c 79 20 62 65 20 66 61 63 74 6f 72 65  ikely be factore
0b70: 64 20 69 6e 20 77 69 74 68 20 67 65 74 20 74 65  d in with get te
0b80: 73 74 20 70 61 74 68 73 3f 0a 28 64 65 66 69 6e  st paths?.(defin
0b90: 65 20 28 74 65 73 74 3a 67 65 74 2d 6d 61 74 63  e (test:get-matc
0ba0: 68 69 6e 67 2d 70 72 65 76 69 6f 75 73 2d 74 65  hing-previous-te
0bb0: 73 74 2d 72 75 6e 2d 72 65 63 6f 72 64 73 20 64  st-run-records d
0bc0: 62 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61  b run-id test-na
0bd0: 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 0a 20 20  me item-path).  
0be0: 28 6c 65 74 2a 20 28 28 6b 65 79 73 20 20 20 20  (let* ((keys    
0bf0: 28 64 62 3a 67 65 74 2d 6b 65 79 73 20 64 62 29  (db:get-keys db)
0c00: 29 0a 09 20 28 73 65 6c 73 74 72 20 20 28 73 74  ).. (selstr  (st
0c10: 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65  ring-intersperse
0c20: 20 28 6d 61 70 20 28 6c 61 6d 62 64 61 20 28 78   (map (lambda (x
0c30: 29 28 76 65 63 74 6f 72 2d 72 65 66 20 78 20 30  )(vector-ref x 0
0c40: 29 29 20 6b 65 79 73 29 20 22 2c 22 29 29 0a 09  )) keys) ","))..
0c50: 20 28 71 72 79 73 74 72 20 20 28 73 74 72 69 6e   (qrystr  (strin
0c60: 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20 28 6d  g-intersperse (m
0c70: 61 70 20 28 6c 61 6d 62 64 61 20 28 78 29 28 63  ap (lambda (x)(c
0c80: 6f 6e 63 20 28 76 65 63 74 6f 72 2d 72 65 66 20  onc (vector-ref 
0c90: 78 20 30 29 20 22 3d 3f 22 29 29 20 6b 65 79 73  x 0) "=?")) keys
0ca0: 29 20 22 20 41 4e 44 20 22 29 29 0a 09 20 28 6b  ) " AND ")).. (k
0cb0: 65 79 76 61 6c 73 20 23 66 29 0a 09 20 28 74 65  eyvals #f).. (te
0cc0: 73 74 73 2d 68 61 73 68 20 28 6d 61 6b 65 2d 68  sts-hash (make-h
0cd0: 61 73 68 2d 74 61 62 6c 65 29 29 29 0a 20 20 20  ash-table))).   
0ce0: 20 3b 3b 20 66 69 72 73 74 20 6c 6f 6f 6b 20 75   ;; first look u
0cf0: 70 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 73  p the key values
0d00: 20 66 72 6f 6d 20 74 68 65 20 72 75 6e 20 73 65   from the run se
0d10: 6c 65 63 74 65 64 20 62 79 20 72 75 6e 2d 69 64  lected by run-id
0d20: 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f  .    (sqlite3:fo
0d30: 72 2d 65 61 63 68 2d 72 6f 77 20 0a 20 20 20 20  r-each-row .    
0d40: 20 28 6c 61 6d 62 64 61 20 28 61 20 2e 20 62 29   (lambda (a . b)
0d50: 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 6b 65  .       (set! ke
0d60: 79 76 61 6c 73 20 28 63 6f 6e 73 20 61 20 62 29  yvals (cons a b)
0d70: 29 29 0a 20 20 20 20 20 64 62 0a 20 20 20 20 20  )).     db.     
0d80: 28 63 6f 6e 63 20 22 53 45 4c 45 43 54 20 22 20  (conc "SELECT " 
0d90: 73 65 6c 73 74 72 20 22 20 46 52 4f 4d 20 72 75  selstr " FROM ru
0da0: 6e 73 20 57 48 45 52 45 20 69 64 3d 3f 20 4f 52  ns WHERE id=? OR
0db0: 44 45 52 20 42 59 20 65 76 65 6e 74 5f 74 69 6d  DER BY event_tim
0dc0: 65 20 44 45 53 43 3b 22 29 20 72 75 6e 2d 69 64  e DESC;") run-id
0dd0: 29 0a 20 20 20 20 28 69 66 20 28 6e 6f 74 20 6b  ).    (if (not k
0de0: 65 79 76 61 6c 73 29 0a 09 27 28 29 0a 09 28 6c  eyvals)..'()..(l
0df0: 65 74 20 28 28 70 72 65 76 2d 72 75 6e 2d 69 64  et ((prev-run-id
0e00: 73 20 27 28 29 29 29 0a 09 20 20 28 61 70 70 6c  s '()))..  (appl
0e10: 79 20 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61  y sqlite3:for-ea
0e20: 63 68 2d 72 6f 77 0a 09 09 20 28 6c 61 6d 62 64  ch-row... (lambd
0e30: 61 20 28 69 64 29 0a 09 09 20 20 20 28 73 65 74  a (id)...   (set
0e40: 21 20 70 72 65 76 2d 72 75 6e 2d 69 64 73 20 28  ! prev-run-ids (
0e50: 63 6f 6e 73 20 69 64 20 70 72 65 76 2d 72 75 6e  cons id prev-run
0e60: 2d 69 64 73 29 29 29 0a 09 09 20 64 62 0a 09 09  -ids)))... db...
0e70: 20 28 63 6f 6e 63 20 22 53 45 4c 45 43 54 20 69   (conc "SELECT i
0e80: 64 20 46 52 4f 4d 20 72 75 6e 73 20 57 48 45 52  d FROM runs WHER
0e90: 45 20 22 20 71 72 79 73 74 72 20 22 20 41 4e 44  E " qrystr " AND
0ea0: 20 69 64 20 21 3d 20 3f 3b 22 29 20 28 61 70 70   id != ?;") (app
0eb0: 65 6e 64 20 6b 65 79 76 61 6c 73 20 28 6c 69 73  end keyvals (lis
0ec0: 74 20 72 75 6e 2d 69 64 29 29 29 0a 09 20 20 3b  t run-id)))..  ;
0ed0: 3b 20 63 6f 6c 6c 65 63 74 20 61 6c 6c 20 6d 61  ; collect all ma
0ee0: 74 63 68 69 6e 67 20 74 65 73 74 73 20 66 6f 72  tching tests for
0ef0: 20 74 68 65 20 72 75 6e 73 20 74 68 65 6e 0a 09   the runs then..
0f00: 20 20 3b 3b 20 65 78 74 72 61 63 74 20 74 68 65    ;; extract the
0f10: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 74 65 73   most recent tes
0f20: 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 61  t and return tha
0f30: 74 2e 0a 09 20 20 28 64 65 62 75 67 3a 70 72 69  t...  (debug:pri
0f40: 6e 74 20 34 20 22 73 65 6c 73 74 72 3a 20 22 20  nt 4 "selstr: " 
0f50: 73 65 6c 73 74 72 20 22 2c 20 71 72 79 73 74 72  selstr ", qrystr
0f60: 3a 20 22 20 71 72 79 73 74 72 20 22 2c 20 6b 65  : " qrystr ", ke
0f70: 79 76 61 6c 73 3a 20 22 20 6b 65 79 76 61 6c 73  yvals: " keyvals
0f80: 20 0a 09 09 20 20 20 20 20 20 20 22 2c 20 70 72   ...       ", pr
0f90: 65 76 69 6f 75 73 20 72 75 6e 20 69 64 73 20 66  evious run ids f
0fa0: 6f 75 6e 64 3a 20 22 20 70 72 65 76 2d 72 75 6e  ound: " prev-run
0fb0: 2d 69 64 73 29 0a 09 20 20 28 69 66 20 28 6e 75  -ids)..  (if (nu
0fc0: 6c 6c 3f 20 70 72 65 76 2d 72 75 6e 2d 69 64 73  ll? prev-run-ids
0fd0: 29 20 27 28 29 20 20 3b 3b 20 6e 6f 20 70 72 65  ) '()  ;; no pre
0fe0: 76 69 6f 75 73 20 72 75 6e 73 3f 20 72 65 74 75  vious runs? retu
0ff0: 72 6e 20 6e 75 6c 6c 0a 09 20 20 20 20 20 20 28  rn null..      (
1000: 6c 65 74 20 6c 6f 6f 70 20 28 28 68 65 64 20 28  let loop ((hed (
1010: 63 61 72 20 70 72 65 76 2d 72 75 6e 2d 69 64 73  car prev-run-ids
1020: 29 29 0a 09 09 09 20 28 74 61 6c 20 28 63 64 72  )).... (tal (cdr
1030: 20 70 72 65 76 2d 72 75 6e 2d 69 64 73 29 29 29   prev-run-ids)))
1040: 0a 09 09 28 6c 65 74 20 28 28 72 65 73 75 6c 74  ...(let ((result
1050: 73 20 28 64 62 3a 67 65 74 2d 74 65 73 74 73 2d  s (db:get-tests-
1060: 66 6f 72 2d 72 75 6e 20 64 62 20 68 65 64 20 74  for-run db hed t
1070: 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70 61  est-name item-pa
1080: 74 68 20 27 28 29 20 27 28 29 29 29 29 0a 09 09  th '() '())))...
1090: 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34    (debug:print 4
10a0: 20 22 47 6f 74 20 74 65 73 74 73 20 66 6f 72 20   "Got tests for 
10b0: 72 75 6e 2d 69 64 20 22 20 72 75 6e 2d 69 64 20  run-id " run-id 
10c0: 22 2c 20 74 65 73 74 2d 6e 61 6d 65 20 22 20 74  ", test-name " t
10d0: 65 73 74 2d 6e 61 6d 65 20 0a 09 09 09 20 20 20  est-name ....   
10e0: 20 20 20 20 22 2c 20 69 74 65 6d 2d 70 61 74 68      ", item-path
10f0: 20 22 20 69 74 65 6d 2d 70 61 74 68 20 22 20 72   " item-path " r
1100: 65 73 75 6c 74 73 3a 20 22 20 28 69 6e 74 65 72  esults: " (inter
1110: 73 70 65 72 73 65 20 72 65 73 75 6c 74 73 20 22  sperse results "
1120: 5c 6e 22 29 29 0a 09 09 20 20 3b 3b 20 4b 65 65  \n"))...  ;; Kee
1130: 70 20 6f 6e 6c 79 20 74 68 65 20 79 6f 75 6e 67  p only the young
1140: 65 73 74 20 6f 66 20 61 6e 79 20 74 65 73 74 2f  est of any test/
1150: 69 74 65 6d 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  item combination
1160: 0a 09 09 20 20 28 66 6f 72 2d 65 61 63 68 20 0a  ...  (for-each .
1170: 09 09 20 20 20 28 6c 61 6d 62 64 61 20 28 74 65  ..   (lambda (te
1180: 73 74 64 61 74 29 0a 09 09 20 20 20 20 20 28 6c  stdat)...     (l
1190: 65 74 2a 20 28 28 66 75 6c 6c 2d 74 65 73 74 6e  et* ((full-testn
11a0: 61 6d 65 20 28 63 6f 6e 63 20 28 64 62 3a 74 65  ame (conc (db:te
11b0: 73 74 2d 67 65 74 2d 74 65 73 74 6e 61 6d 65 20  st-get-testname 
11c0: 74 65 73 74 64 61 74 29 20 22 2f 22 20 28 64 62  testdat) "/" (db
11d0: 3a 74 65 73 74 2d 67 65 74 2d 69 74 65 6d 2d 70  :test-get-item-p
11e0: 61 74 68 20 74 65 73 74 64 61 74 29 29 29 0a 09  ath testdat)))..
11f0: 09 09 20 20 20 20 28 73 74 6f 72 65 64 2d 74 65  ..    (stored-te
1200: 73 74 20 20 20 28 68 61 73 68 2d 74 61 62 6c 65  st   (hash-table
1210: 2d 72 65 66 2f 64 65 66 61 75 6c 74 20 74 65 73  -ref/default tes
1220: 74 73 2d 68 61 73 68 20 66 75 6c 6c 2d 74 65 73  ts-hash full-tes
1230: 74 6e 61 6d 65 20 23 66 29 29 29 0a 09 09 20 20  tname #f)))...  
1240: 20 20 20 20 20 28 69 66 20 28 6f 72 20 28 6e 6f       (if (or (no
1250: 74 20 73 74 6f 72 65 64 2d 74 65 73 74 29 0a 09  t stored-test)..
1260: 09 09 20 20 20 20 20 20 20 28 61 6e 64 20 73 74  ..       (and st
1270: 6f 72 65 64 2d 74 65 73 74 0a 09 09 09 09 20 20  ored-test.....  
1280: 20 20 28 3e 20 28 64 62 3a 74 65 73 74 2d 67 65    (> (db:test-ge
1290: 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 74 65 73  t-event_time tes
12a0: 74 64 61 74 29 28 64 62 3a 74 65 73 74 2d 67 65  tdat)(db:test-ge
12b0: 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 73 74 6f  t-event_time sto
12c0: 72 65 64 2d 74 65 73 74 29 29 29 29 0a 09 09 09  red-test))))....
12d0: 20 20 20 3b 3b 20 74 68 69 73 20 74 65 73 74 20     ;; this test 
12e0: 69 73 20 79 6f 75 6e 67 65 72 2c 20 73 74 6f 72  is younger, stor
12f0: 65 20 69 74 20 69 6e 20 74 68 65 20 68 61 73 68  e it in the hash
1300: 0a 09 09 09 20 20 20 28 68 61 73 68 2d 74 61 62  ....   (hash-tab
1310: 6c 65 2d 73 65 74 21 20 74 65 73 74 73 2d 68 61  le-set! tests-ha
1320: 73 68 20 66 75 6c 6c 2d 74 65 73 74 6e 61 6d 65  sh full-testname
1330: 20 74 65 73 74 64 61 74 29 29 29 29 0a 09 09 20   testdat))))... 
1340: 20 20 72 65 73 75 6c 74 73 29 0a 09 09 20 20 28    results)...  (
1350: 69 66 20 28 6e 75 6c 6c 3f 20 74 61 6c 29 0a 09  if (null? tal)..
1360: 09 20 20 20 20 20 20 28 6d 61 70 20 63 64 72 20  .      (map cdr 
1370: 28 68 61 73 68 2d 74 61 62 6c 65 2d 3e 61 6c 69  (hash-table->ali
1380: 73 74 20 74 65 73 74 73 2d 68 61 73 68 29 29 20  st tests-hash)) 
1390: 3b 3b 20 72 65 74 75 72 6e 20 61 20 6c 69 73 74  ;; return a list
13a0: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
13b0: 65 6e 74 20 74 65 73 74 73 0a 09 09 20 20 20 20  ent tests...    
13c0: 20 20 28 6c 6f 6f 70 20 28 63 61 72 20 74 61 6c    (loop (car tal
13d0: 29 28 63 64 72 20 74 61 6c 29 29 29 29 29 29 29  )(cdr tal)))))))
13e0: 29 29 29 0a 0a 3b 3b 20 44 6f 20 6e 6f 74 20 72  )))..;; Do not r
13f0: 70 63 20 74 68 69 73 20 6f 6e 65 2c 20 64 6f 20  pc this one, do 
1400: 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 63  the underlying c
1410: 61 6c 6c 73 21 21 21 0a 28 64 65 66 69 6e 65 20  alls!!!.(define 
1420: 28 74 65 73 74 73 3a 74 65 73 74 2d 73 65 74 2d  (tests:test-set-
1430: 73 74 61 74 75 73 21 20 64 62 20 74 65 73 74 2d  status! db test-
1440: 69 64 20 73 74 61 74 65 20 73 74 61 74 75 73 20  id state status 
1450: 63 6f 6d 6d 65 6e 74 20 64 61 74 29 0a 20 20 28  comment dat).  (
1460: 6c 65 74 2a 20 28 28 72 65 61 6c 2d 73 74 61 74  let* ((real-stat
1470: 75 73 20 73 74 61 74 75 73 29 0a 09 20 28 6f 74  us status).. (ot
1480: 68 65 72 64 61 74 20 20 20 20 28 69 66 20 64 61  herdat    (if da
1490: 74 20 64 61 74 20 28 6d 61 6b 65 2d 68 61 73 68  t dat (make-hash
14a0: 2d 74 61 62 6c 65 29 29 29 0a 09 20 28 74 65 73  -table))).. (tes
14b0: 74 64 61 74 20 20 20 20 20 28 6f 70 65 6e 2d 72  tdat     (open-r
14c0: 75 6e 2d 63 6c 6f 73 65 20 64 62 3a 67 65 74 2d  un-close db:get-
14d0: 74 65 73 74 2d 69 6e 66 6f 2d 62 79 2d 69 64 20  test-info-by-id 
14e0: 64 62 20 74 65 73 74 2d 69 64 29 29 0a 09 20 28  db test-id)).. (
14f0: 72 75 6e 2d 69 64 20 20 20 20 20 20 28 64 62 3a  run-id      (db:
1500: 74 65 73 74 2d 67 65 74 2d 72 75 6e 5f 69 64 20  test-get-run_id 
1510: 74 65 73 74 64 61 74 29 29 0a 09 20 28 74 65 73  testdat)).. (tes
1520: 74 2d 6e 61 6d 65 20 20 20 28 64 62 3a 74 65 73  t-name   (db:tes
1530: 74 2d 67 65 74 2d 74 65 73 74 6e 61 6d 65 20 20  t-get-testname  
1540: 20 74 65 73 74 64 61 74 29 29 0a 09 20 28 69 74   testdat)).. (it
1550: 65 6d 2d 70 61 74 68 20 20 20 28 64 62 3a 74 65  em-path   (db:te
1560: 73 74 2d 67 65 74 2d 69 74 65 6d 2d 70 61 74 68  st-get-item-path
1570: 20 74 65 73 74 64 61 74 29 29 0a 09 20 3b 3b 20   testdat)).. ;; 
1580: 62 65 66 6f 72 65 20 70 72 6f 63 65 65 64 69 6e  before proceedin
1590: 67 20 77 65 20 6d 75 73 74 20 66 69 6e 64 20 6f  g we must find o
15a0: 75 74 20 69 66 20 74 68 65 20 70 72 65 76 69 6f  ut if the previo
15b0: 75 73 20 74 65 73 74 20 28 77 68 65 72 65 20 61  us test (where a
15c0: 6c 6c 20 6b 65 79 73 20 6d 61 74 63 68 65 64 20  ll keys matched 
15d0: 65 78 63 65 70 74 20 72 75 6e 6e 61 6d 65 29 0a  except runname).
15e0: 09 20 3b 3b 20 77 61 73 20 57 41 49 56 45 44 20  . ;; was WAIVED 
15f0: 69 66 20 74 68 69 73 20 74 65 73 74 20 69 73 20  if this test is 
1600: 46 41 49 4c 0a 09 20 28 77 61 69 76 65 64 20 20  FAIL.. (waived  
1610: 20 28 69 66 20 28 65 71 75 61 6c 3f 20 73 74 61   (if (equal? sta
1620: 74 75 73 20 22 46 41 49 4c 22 29 0a 09 09 20 20  tus "FAIL")...  
1630: 20 20 20 20 20 28 6c 65 74 20 28 28 70 72 65 76       (let ((prev
1640: 2d 74 65 73 74 20 28 74 65 73 74 3a 67 65 74 2d  -test (test:get-
1650: 70 72 65 76 69 6f 75 73 2d 74 65 73 74 2d 72 75  previous-test-ru
1660: 6e 2d 72 65 63 6f 72 64 20 64 62 20 72 75 6e 2d  n-record db run-
1670: 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 65  id test-name ite
1680: 6d 2d 70 61 74 68 29 29 29 0a 09 09 09 20 28 69  m-path))).... (i
1690: 66 20 70 72 65 76 2d 74 65 73 74 20 3b 3b 20 74  f prev-test ;; t
16a0: 72 75 65 20 69 66 20 77 65 20 66 6f 75 6e 64 20  rue if we found 
16b0: 61 20 70 72 65 76 69 6f 75 73 20 74 65 73 74 20  a previous test 
16c0: 69 6e 20 74 68 69 73 20 72 75 6e 20 73 65 72 69  in this run seri
16d0: 65 73 0a 09 09 09 20 20 20 20 20 28 6c 65 74 20  es....     (let 
16e0: 28 28 70 72 65 76 2d 73 74 61 74 75 73 20 28 64  ((prev-status (d
16f0: 62 3a 74 65 73 74 2d 67 65 74 2d 73 74 61 74 75  b:test-get-statu
1700: 73 20 20 20 70 72 65 76 2d 74 65 73 74 29 29 0a  s   prev-test)).
1710: 09 09 09 09 20 20 20 28 70 72 65 76 2d 73 74 61  ....   (prev-sta
1720: 74 65 20 20 28 64 62 3a 74 65 73 74 2d 67 65 74  te  (db:test-get
1730: 2d 73 74 61 74 65 20 20 20 20 70 72 65 76 2d 74  -state    prev-t
1740: 65 73 74 29 29 0a 09 09 09 09 20 20 20 28 70 72  est)).....   (pr
1750: 65 76 2d 63 6f 6d 6d 65 6e 74 20 28 64 62 3a 74  ev-comment (db:t
1760: 65 73 74 2d 67 65 74 2d 63 6f 6d 6d 65 6e 74 20  est-get-comment 
1770: 70 72 65 76 2d 74 65 73 74 29 29 29 0a 09 09 09  prev-test)))....
1780: 20 20 20 20 20 20 20 28 64 65 62 75 67 3a 70 72         (debug:pr
1790: 69 6e 74 20 34 20 22 70 72 65 76 2d 73 74 61 74  int 4 "prev-stat
17a0: 75 73 20 22 20 70 72 65 76 2d 73 74 61 74 75 73  us " prev-status
17b0: 20 22 2c 20 70 72 65 76 2d 73 74 61 74 65 20 22   ", prev-state "
17c0: 20 70 72 65 76 2d 73 74 61 74 65 20 22 2c 20 70   prev-state ", p
17d0: 72 65 76 2d 63 6f 6d 6d 65 6e 74 20 22 20 70 72  rev-comment " pr
17e0: 65 76 2d 63 6f 6d 6d 65 6e 74 29 0a 09 09 09 20  ev-comment).... 
17f0: 20 20 20 20 20 20 28 69 66 20 28 61 6e 64 20 28        (if (and (
1800: 65 71 75 61 6c 3f 20 70 72 65 76 2d 73 74 61 74  equal? prev-stat
1810: 65 20 20 22 43 4f 4d 50 4c 45 54 45 44 22 29 0a  e  "COMPLETED").
1820: 09 09 09 09 09 28 65 71 75 61 6c 3f 20 70 72 65  .....(equal? pre
1830: 76 2d 73 74 61 74 75 73 20 22 57 41 49 56 45 44  v-status "WAIVED
1840: 22 29 29 0a 09 09 09 09 20 20 20 70 72 65 76 2d  ")).....   prev-
1850: 63 6f 6d 6d 65 6e 74 20 3b 3b 20 77 61 69 76 65  comment ;; waive
1860: 64 20 69 73 20 65 69 74 68 65 72 20 74 68 65 20  d is either the 
1870: 63 6f 6d 6d 65 6e 74 20 6f 72 20 23 66 0a 09 09  comment or #f...
1880: 09 09 20 20 20 23 66 29 29 0a 09 09 09 20 20 20  ..   #f))....   
1890: 20 20 23 66 29 29 0a 09 09 20 20 20 20 20 20 20    #f))...       
18a0: 23 66 29 29 29 0a 20 20 20 20 28 69 66 20 77 61  #f))).    (if wa
18b0: 69 76 65 64 20 28 73 65 74 21 20 72 65 61 6c 2d  ived (set! real-
18c0: 73 74 61 74 75 73 20 22 57 41 49 56 45 44 22 29  status "WAIVED")
18d0: 29 0a 20 20 20 20 28 64 65 62 75 67 3a 70 72 69  ).    (debug:pri
18e0: 6e 74 20 34 20 22 72 65 61 6c 2d 73 74 61 74 75  nt 4 "real-statu
18f0: 73 20 22 20 72 65 61 6c 2d 73 74 61 74 75 73 20  s " real-status 
1900: 22 2c 20 77 61 69 76 65 64 20 22 20 77 61 69 76  ", waived " waiv
1910: 65 64 20 22 2c 20 73 74 61 74 75 73 20 22 20 73  ed ", status " s
1920: 74 61 74 75 73 29 0a 0a 20 20 20 20 3b 3b 20 75  tatus)..    ;; u
1930: 70 64 61 74 65 20 74 68 65 20 70 72 69 6d 61 72  pdate the primar
1940: 79 20 72 65 63 6f 72 64 20 49 46 20 73 74 61 74  y record IF stat
1950: 65 20 41 4e 44 20 73 74 61 74 75 73 20 61 72 65  e AND status are
1960: 20 64 65 66 69 6e 65 64 0a 20 20 20 20 28 69 66   defined.    (if
1970: 20 28 61 6e 64 20 73 74 61 74 65 20 73 74 61 74   (and state stat
1980: 75 73 29 0a 09 3b 3b 20 28 72 64 62 3a 6f 70 65  us)..;; (rdb:ope
1990: 6e 2d 72 75 6e 2d 63 6c 6f 73 65 20 27 63 64 62  n-run-close 'cdb
19a0: 3a 74 65 73 74 2d 73 65 74 2d 73 74 61 74 65 2d  :test-set-state-
19b0: 73 74 61 74 75 73 20 23 66 20 74 65 73 74 2d 69  status #f test-i
19c0: 64 20 72 65 61 6c 2d 73 74 61 74 75 73 20 73 74  d real-status st
19d0: 61 74 65 29 29 20 3b 3b 20 74 68 69 73 20 6f 6e  ate)) ;; this on
19e0: 65 20 77 6f 72 6b 73 0a 09 28 63 64 62 3a 74 65  e works..(cdb:te
19f0: 73 74 2d 73 65 74 2d 73 74 61 74 65 2d 73 74 61  st-set-state-sta
1a00: 74 75 73 20 74 65 73 74 2d 69 64 20 72 65 61 6c  tus test-id real
1a10: 2d 73 74 61 74 75 73 20 73 74 61 74 65 29 29 0a  -status state)).
1a20: 20 20 20 20 0a 20 20 20 20 3b 3b 20 69 66 20 73      .    ;; if s
1a30: 74 61 74 75 73 20 69 73 20 22 41 55 54 4f 22 20  tatus is "AUTO" 
1a40: 74 68 65 6e 20 63 61 6c 6c 20 72 6f 6c 6c 75 70  then call rollup
1a50: 20 28 6e 6f 74 65 2c 20 74 68 69 73 20 6f 6e 65   (note, this one
1a60: 20 6d 6f 64 69 66 69 65 73 20 64 61 74 61 20 69   modifies data i
1a70: 6e 20 74 65 73 74 0a 20 20 20 20 3b 3b 20 72 75  n test.    ;; ru
1a80: 6e 20 61 72 65 61 2c 20 64 6f 20 6e 6f 74 20 72  n area, do not r
1a90: 70 63 20 69 74 20 28 79 65 74 29 0a 20 20 20 20  pc it (yet).    
1aa0: 28 69 66 20 28 61 6e 64 20 74 65 73 74 2d 69 64  (if (and test-id
1ab0: 20 73 74 61 74 65 20 73 74 61 74 75 73 20 28 65   state status (e
1ac0: 71 75 61 6c 3f 20 73 74 61 74 75 73 20 22 41 55  qual? status "AU
1ad0: 54 4f 22 29 29 20 0a 09 28 6f 70 65 6e 2d 72 75  TO")) ..(open-ru
1ae0: 6e 2d 63 6c 6f 73 65 20 64 62 3a 74 65 73 74 2d  n-close db:test-
1af0: 64 61 74 61 2d 72 6f 6c 6c 75 70 20 64 62 20 74  data-rollup db t
1b00: 65 73 74 2d 69 64 20 73 74 61 74 75 73 29 29 0a  est-id status)).
1b10: 0a 20 20 20 20 3b 3b 20 61 64 64 20 6d 65 74 61  .    ;; add meta
1b20: 64 61 74 61 20 28 6e 65 65 64 20 74 6f 20 64 6f  data (need to do
1b30: 20 74 68 69 73 20 77 61 79 20 74 6f 20 61 76 6f   this way to avo
1b40: 69 64 20 53 51 4c 20 69 6e 6a 65 63 74 69 6f 6e  id SQL injection
1b50: 20 69 73 73 75 65 73 29 0a 0a 20 20 20 20 3b 3b   issues)..    ;;
1b60: 20 3a 66 69 72 73 74 5f 65 72 72 0a 20 20 20 20   :first_err.    
1b70: 3b 3b 20 28 6c 65 74 20 28 28 76 61 6c 20 28 68  ;; (let ((val (h
1b80: 61 73 68 2d 74 61 62 6c 65 2d 72 65 66 2f 64 65  ash-table-ref/de
1b90: 66 61 75 6c 74 20 6f 74 68 65 72 64 61 74 20 22  fault otherdat "
1ba0: 3a 66 69 72 73 74 5f 65 72 72 22 20 23 66 29 29  :first_err" #f))
1bb0: 29 0a 20 20 20 20 3b 3b 20 20 20 28 69 66 20 76  ).    ;;   (if v
1bc0: 61 6c 0a 20 20 20 20 3b 3b 20 20 20 20 20 20 20  al.    ;;       
1bd0: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65  (sqlite3:execute
1be0: 20 64 62 20 22 55 50 44 41 54 45 20 74 65 73 74   db "UPDATE test
1bf0: 73 20 53 45 54 20 66 69 72 73 74 5f 65 72 72 3d  s SET first_err=
1c00: 3f 20 57 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f  ? WHERE run_id=?
1c10: 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d 3f 20   AND testname=? 
1c20: 41 4e 44 20 69 74 65 6d 5f 70 61 74 68 3d 3f 3b  AND item_path=?;
1c30: 22 20 76 61 6c 20 72 75 6e 2d 69 64 20 74 65 73  " val run-id tes
1c40: 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68  t-name item-path
1c50: 29 29 29 0a 20 20 20 20 3b 3b 20 0a 20 20 20 20  ))).    ;; .    
1c60: 3b 3b 20 3b 3b 20 3a 66 69 72 73 74 5f 77 61 72  ;; ;; :first_war
1c70: 6e 0a 20 20 20 20 3b 3b 20 28 6c 65 74 20 28 28  n.    ;; (let ((
1c80: 76 61 6c 20 28 68 61 73 68 2d 74 61 62 6c 65 2d  val (hash-table-
1c90: 72 65 66 2f 64 65 66 61 75 6c 74 20 6f 74 68 65  ref/default othe
1ca0: 72 64 61 74 20 22 3a 66 69 72 73 74 5f 77 61 72  rdat ":first_war
1cb0: 6e 22 20 23 66 29 29 29 0a 20 20 20 20 3b 3b 20  n" #f))).    ;; 
1cc0: 20 20 28 69 66 20 76 61 6c 0a 20 20 20 20 3b 3b    (if val.    ;;
1cd0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a         (sqlite3:
1ce0: 65 78 65 63 75 74 65 20 64 62 20 22 55 50 44 41  execute db "UPDA
1cf0: 54 45 20 74 65 73 74 73 20 53 45 54 20 66 69 72  TE tests SET fir
1d00: 73 74 5f 77 61 72 6e 3d 3f 20 57 48 45 52 45 20  st_warn=? WHERE 
1d10: 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73  run_id=? AND tes
1d20: 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d  tname=? AND item
1d30: 5f 70 61 74 68 3d 3f 3b 22 20 76 61 6c 20 72 75  _path=?;" val ru
1d40: 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69  n-id test-name i
1d50: 74 65 6d 2d 70 61 74 68 29 29 29 0a 0a 20 20 20  tem-path)))..   
1d60: 20 28 6c 65 74 20 28 28 63 61 74 65 67 6f 72 79   (let ((category
1d70: 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 72 65 66   (hash-table-ref
1d80: 2f 64 65 66 61 75 6c 74 20 6f 74 68 65 72 64 61  /default otherda
1d90: 74 20 22 3a 63 61 74 65 67 6f 72 79 22 20 22 22  t ":category" ""
1da0: 29 29 0a 09 20 20 28 76 61 72 69 61 62 6c 65 20  ))..  (variable 
1db0: 28 68 61 73 68 2d 74 61 62 6c 65 2d 72 65 66 2f  (hash-table-ref/
1dc0: 64 65 66 61 75 6c 74 20 6f 74 68 65 72 64 61 74  default otherdat
1dd0: 20 22 3a 76 61 72 69 61 62 6c 65 22 20 22 22 29   ":variable" "")
1de0: 29 0a 09 20 20 28 76 61 6c 75 65 20 20 20 20 28  )..  (value    (
1df0: 68 61 73 68 2d 74 61 62 6c 65 2d 72 65 66 2f 64  hash-table-ref/d
1e00: 65 66 61 75 6c 74 20 6f 74 68 65 72 64 61 74 20  efault otherdat 
1e10: 22 3a 76 61 6c 75 65 22 20 20 20 20 23 66 29 29  ":value"    #f))
1e20: 0a 09 20 20 28 65 78 70 65 63 74 65 64 20 28 68  ..  (expected (h
1e30: 61 73 68 2d 74 61 62 6c 65 2d 72 65 66 2f 64 65  ash-table-ref/de
1e40: 66 61 75 6c 74 20 6f 74 68 65 72 64 61 74 20 22  fault otherdat "
1e50: 3a 65 78 70 65 63 74 65 64 22 20 23 66 29 29 0a  :expected" #f)).
1e60: 09 20 20 28 74 6f 6c 20 20 20 20 20 20 28 68 61  .  (tol      (ha
1e70: 73 68 2d 74 61 62 6c 65 2d 72 65 66 2f 64 65 66  sh-table-ref/def
1e80: 61 75 6c 74 20 6f 74 68 65 72 64 61 74 20 22 3a  ault otherdat ":
1e90: 74 6f 6c 22 20 20 20 20 20 20 23 66 29 29 0a 09  tol"      #f))..
1ea0: 20 20 28 75 6e 69 74 73 20 20 20 20 28 68 61 73    (units    (has
1eb0: 68 2d 74 61 62 6c 65 2d 72 65 66 2f 64 65 66 61  h-table-ref/defa
1ec0: 75 6c 74 20 6f 74 68 65 72 64 61 74 20 22 3a 75  ult otherdat ":u
1ed0: 6e 69 74 73 22 20 20 20 20 22 22 29 29 0a 09 20  nits"    "")).. 
1ee0: 20 28 74 79 70 65 20 20 20 20 20 28 68 61 73 68   (type     (hash
1ef0: 2d 74 61 62 6c 65 2d 72 65 66 2f 64 65 66 61 75  -table-ref/defau
1f00: 6c 74 20 6f 74 68 65 72 64 61 74 20 22 3a 74 79  lt otherdat ":ty
1f10: 70 65 22 20 20 20 20 20 22 22 29 29 0a 09 20 20  pe"     ""))..  
1f20: 28 64 63 6f 6d 6d 65 6e 74 20 28 68 61 73 68 2d  (dcomment (hash-
1f30: 74 61 62 6c 65 2d 72 65 66 2f 64 65 66 61 75 6c  table-ref/defaul
1f40: 74 20 6f 74 68 65 72 64 61 74 20 22 3a 63 6f 6d  t otherdat ":com
1f50: 6d 65 6e 74 22 20 20 22 22 29 29 29 0a 20 20 20  ment"  ""))).   
1f60: 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20     (debug:print 
1f70: 34 20 0a 09 09 20 20 20 22 63 61 74 65 67 6f 72  4 ...   "categor
1f80: 79 3a 20 22 20 63 61 74 65 67 6f 72 79 20 22 2c  y: " category ",
1f90: 20 76 61 72 69 61 62 6c 65 3a 20 22 20 76 61 72   variable: " var
1fa0: 69 61 62 6c 65 20 22 2c 20 76 61 6c 75 65 3a 20  iable ", value: 
1fb0: 22 20 76 61 6c 75 65 0a 09 09 20 20 20 22 2c 20  " value...   ", 
1fc0: 65 78 70 65 63 74 65 64 3a 20 22 20 65 78 70 65  expected: " expe
1fd0: 63 74 65 64 20 22 2c 20 74 6f 6c 3a 20 22 20 74  cted ", tol: " t
1fe0: 6f 6c 20 22 2c 20 75 6e 69 74 73 3a 20 22 20 75  ol ", units: " u
1ff0: 6e 69 74 73 29 0a 20 20 20 20 20 20 28 69 66 20  nits).      (if 
2000: 28 61 6e 64 20 76 61 6c 75 65 20 65 78 70 65 63  (and value expec
2010: 74 65 64 20 74 6f 6c 29 20 3b 3b 20 61 6c 6c 20  ted tol) ;; all 
2020: 74 68 72 65 65 20 72 65 71 75 69 72 65 64 0a 09  three required..
2030: 20 20 28 6c 65 74 20 28 28 64 61 74 20 28 63 6f    (let ((dat (co
2040: 6e 63 20 63 61 74 65 67 6f 72 79 20 22 2c 22 0a  nc category ",".
2050: 09 09 09 20 20 20 76 61 72 69 61 62 6c 65 20 22  ...   variable "
2060: 2c 22 0a 09 09 09 20 20 20 76 61 6c 75 65 20 20  ,"....   value  
2070: 20 20 22 2c 22 0a 09 09 09 20 20 20 65 78 70 65    ","....   expe
2080: 63 74 65 64 20 22 2c 22 0a 09 09 09 20 20 20 74  cted ","....   t
2090: 6f 6c 20 20 20 20 20 20 22 2c 22 0a 09 09 09 20  ol      ",".... 
20a0: 20 20 75 6e 69 74 73 20 20 20 20 22 2c 22 0a 09    units    ","..
20b0: 09 09 20 20 20 64 63 6f 6d 6d 65 6e 74 20 22 2c  ..   dcomment ",
20c0: 2c 22 20 3b 3b 20 65 78 74 72 61 20 63 6f 6d 6d  ," ;; extra comm
20d0: 61 20 66 6f 72 20 73 74 61 74 75 73 0a 09 09 09  a for status....
20e0: 20 20 20 74 79 70 65 20 20 20 20 20 29 29 29 0a     type     ))).
20f0: 09 20 20 20 20 28 6f 70 65 6e 2d 72 75 6e 2d 63  .    (open-run-c
2100: 6c 6f 73 65 20 64 62 3a 63 73 76 2d 3e 74 65 73  lose db:csv->tes
2110: 74 2d 64 61 74 61 20 64 62 20 74 65 73 74 2d 69  t-data db test-i
2120: 64 0a 09 09 09 09 64 61 74 29 29 29 29 0a 20 20  d.....dat)))).  
2130: 20 20 20 20 0a 20 20 20 20 3b 3b 20 6e 65 65 64      .    ;; need
2140: 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 74   to update the t
2150: 6f 70 20 74 65 73 74 20 72 65 63 6f 72 64 20 69  op test record i
2160: 66 20 50 41 53 53 20 6f 72 20 46 41 49 4c 20 61  f PASS or FAIL a
2170: 6e 64 20 74 68 69 73 20 69 73 20 61 20 73 75 62  nd this is a sub
2180: 74 65 73 74 0a 20 20 20 20 28 6f 70 65 6e 2d 72  test.    (open-r
2190: 75 6e 2d 63 6c 6f 73 65 20 64 62 3a 72 6f 6c 6c  un-close db:roll
21a0: 2d 75 70 2d 70 61 73 73 2d 66 61 69 6c 2d 63 6f  -up-pass-fail-co
21b0: 75 6e 74 73 20 64 62 20 72 75 6e 2d 69 64 20 74  unts db run-id t
21c0: 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70 61  est-name item-pa
21d0: 74 68 20 73 74 61 74 75 73 29 0a 0a 20 20 20 20  th status)..    
21e0: 28 69 66 20 28 6f 72 20 28 61 6e 64 20 28 73 74  (if (or (and (st
21f0: 72 69 6e 67 3f 20 63 6f 6d 6d 65 6e 74 29 0a 09  ring? comment)..
2200: 09 20 28 73 74 72 69 6e 67 2d 6d 61 74 63 68 20  . (string-match 
2210: 28 72 65 67 65 78 70 20 22 5c 5c 53 2b 22 29 20  (regexp "\\S+") 
2220: 63 6f 6d 6d 65 6e 74 29 29 0a 09 20 20 20 20 77  comment))..    w
2230: 61 69 76 65 64 29 0a 09 28 6c 65 74 20 28 28 63  aived)..(let ((c
2240: 6d 74 20 20 28 69 66 20 77 61 69 76 65 64 20 77  mt  (if waived w
2250: 61 69 76 65 64 20 63 6f 6d 6d 65 6e 74 29 29 29  aived comment)))
2260: 0a 09 20 20 28 6f 70 65 6e 2d 72 75 6e 2d 63 6c  ..  (open-run-cl
2270: 6f 73 65 20 64 62 3a 74 65 73 74 2d 73 65 74 2d  ose db:test-set-
2280: 63 6f 6d 6d 65 6e 74 20 64 62 20 74 65 73 74 2d  comment db test-
2290: 69 64 20 63 6d 74 29 29 29 0a 20 20 20 20 29 29  id cmt))).    ))
22a0: 0a 0a 28 64 65 66 69 6e 65 20 28 74 65 73 74 73  ..(define (tests
22b0: 3a 74 65 73 74 2d 73 65 74 2d 74 6f 70 6c 6f 67  :test-set-toplog
22c0: 21 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74  ! db run-id test
22d0: 2d 6e 61 6d 65 20 6c 6f 67 66 29 20 0a 20 20 28  -name logf) .  (
22e0: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20  sqlite3:execute 
22f0: 64 62 20 22 55 50 44 41 54 45 20 74 65 73 74 73  db "UPDATE tests
2300: 20 53 45 54 20 66 69 6e 61 6c 5f 6c 6f 67 66 3d   SET final_logf=
2310: 3f 20 57 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f  ? WHERE run_id=?
2320: 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d 3f 20   AND testname=? 
2330: 41 4e 44 20 69 74 65 6d 5f 70 61 74 68 3d 27 27  AND item_path=''
2340: 3b 22 20 0a 09 09 20 20 20 6c 6f 67 66 20 72 75  ;" ...   logf ru
2350: 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 29 29  n-id test-name))
2360: 0a 0a 28 64 65 66 69 6e 65 20 28 74 65 73 74 73  ..(define (tests
2370: 3a 73 75 6d 6d 61 72 69 7a 65 2d 69 74 65 6d 73  :summarize-items
2380: 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 2d   db run-id test-
2390: 6e 61 6d 65 20 66 6f 72 63 65 29 0a 20 20 3b 3b  name force).  ;;
23a0: 20 69 66 20 6e 6f 74 20 66 6f 72 63 65 20 74 68   if not force th
23b0: 65 6e 20 6f 6e 6c 79 20 75 70 64 61 74 65 20 74  en only update t
23c0: 68 65 20 72 65 63 6f 72 64 20 69 66 20 6f 6e 65  he record if one
23d0: 20 6f 66 20 74 68 65 73 65 20 69 73 20 74 72 75   of these is tru
23e0: 65 3a 0a 20 20 3b 3b 20 20 20 31 2e 20 6c 6f 67  e:.  ;;   1. log
23f0: 66 20 69 73 20 22 6c 6f 67 2f 66 69 6e 61 6c 2e  f is "log/final.
2400: 6c 6f 67 0a 20 20 3b 3b 20 20 20 32 2e 20 6c 6f  log.  ;;   2. lo
2410: 67 66 20 69 73 20 73 61 6d 65 20 61 73 20 6f 75  gf is same as ou
2420: 74 70 75 74 66 69 6c 65 6e 61 6d 65 0a 20 20 28  tputfilename.  (
2430: 6c 65 74 20 28 28 6f 75 74 70 75 74 66 69 6c 65  let ((outputfile
2440: 6e 61 6d 65 20 28 63 6f 6e 63 20 22 6d 65 67 61  name (conc "mega
2450: 74 65 73 74 2d 72 6f 6c 6c 75 70 2d 22 20 74 65  test-rollup-" te
2460: 73 74 2d 6e 61 6d 65 20 22 2e 68 74 6d 6c 22 29  st-name ".html")
2470: 29 0a 09 28 6f 72 69 67 2d 64 69 72 20 20 20 20  )..(orig-dir    
2480: 20 20 20 28 63 75 72 72 65 6e 74 2d 64 69 72 65     (current-dire
2490: 63 74 6f 72 79 29 29 0a 09 28 6c 6f 67 66 20 20  ctory))..(logf  
24a0: 20 20 20 20 20 20 20 20 20 23 66 29 29 0a 20 20           #f)).  
24b0: 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65    (sqlite3:for-e
24c0: 61 63 68 2d 72 6f 77 20 0a 20 20 20 20 20 28 6c  ach-row .     (l
24d0: 61 6d 62 64 61 20 28 70 61 74 68 20 66 69 6e 61  ambda (path fina
24e0: 6c 5f 6c 6f 67 66 29 0a 20 20 20 20 20 20 20 28  l_logf).       (
24f0: 73 65 74 21 20 6c 6f 67 66 20 66 69 6e 61 6c 5f  set! logf final_
2500: 6c 6f 67 66 29 0a 20 20 20 20 20 20 20 28 69 66  logf).       (if
2510: 20 28 64 69 72 65 63 74 6f 72 79 3f 20 70 61 74   (directory? pat
2520: 68 29 0a 09 20 20 20 28 62 65 67 69 6e 0a 09 20  h)..   (begin.. 
2530: 20 20 20 20 28 70 72 69 6e 74 20 22 46 6f 75 6e      (print "Foun
2540: 64 20 70 61 74 68 3a 20 22 20 70 61 74 68 29 0a  d path: " path).
2550: 09 20 20 20 20 20 28 63 68 61 6e 67 65 2d 64 69  .     (change-di
2560: 72 65 63 74 6f 72 79 20 70 61 74 68 29 29 0a 09  rectory path))..
2570: 20 20 20 20 20 3b 3b 20 28 73 65 74 21 20 6f 75       ;; (set! ou
2580: 74 70 75 74 66 69 6c 65 6e 61 6d 65 20 28 63 6f  tputfilename (co
2590: 6e 63 20 70 61 74 68 20 22 2f 22 20 6f 75 74 70  nc path "/" outp
25a0: 75 74 66 69 6c 65 6e 61 6d 65 29 29 29 0a 09 20  utfilename))).. 
25b0: 20 20 28 70 72 69 6e 74 20 22 4e 6f 20 73 75 63    (print "No suc
25c0: 68 20 70 61 74 68 3a 20 22 20 70 61 74 68 29 29  h path: " path))
25d0: 29 0a 20 20 20 20 20 64 62 20 0a 20 20 20 20 20  ).     db .     
25e0: 22 53 45 4c 45 43 54 20 72 75 6e 64 69 72 2c 66  "SELECT rundir,f
25f0: 69 6e 61 6c 5f 6c 6f 67 66 20 46 52 4f 4d 20 74  inal_logf FROM t
2600: 65 73 74 73 20 57 48 45 52 45 20 72 75 6e 5f 69  ests WHERE run_i
2610: 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d 65  d=? AND testname
2620: 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 68  =? AND item_path
2630: 3d 27 27 3b 22 0a 20 20 20 20 20 72 75 6e 2d 69  ='';".     run-i
2640: 64 20 74 65 73 74 2d 6e 61 6d 65 29 0a 20 20 20  d test-name).   
2650: 20 28 70 72 69 6e 74 20 22 73 75 6d 6d 61 72 69   (print "summari
2660: 7a 65 2d 69 74 65 6d 73 20 77 69 74 68 20 6c 6f  ze-items with lo
2670: 67 66 20 22 20 6c 6f 67 66 29 0a 20 20 20 20 28  gf " logf).    (
2680: 69 66 20 28 6f 72 20 28 65 71 75 61 6c 3f 20 6c  if (or (equal? l
2690: 6f 67 66 20 22 6c 6f 67 73 2f 66 69 6e 61 6c 2e  ogf "logs/final.
26a0: 6c 6f 67 22 29 0a 09 20 20 20 20 28 65 71 75 61  log")..    (equa
26b0: 6c 3f 20 6c 6f 67 66 20 6f 75 74 70 75 74 66 69  l? logf outputfi
26c0: 6c 65 6e 61 6d 65 29 0a 09 20 20 20 20 66 6f 72  lename)..    for
26d0: 63 65 29 0a 09 28 62 65 67 69 6e 0a 09 20 20 28  ce)..(begin..  (
26e0: 69 66 20 28 6f 62 74 61 69 6e 2d 64 6f 74 2d 6c  if (obtain-dot-l
26f0: 6f 63 6b 20 6f 75 74 70 75 74 66 69 6c 65 6e 61  ock outputfilena
2700: 6d 65 20 31 20 32 30 20 33 30 29 20 3b 3b 20 72  me 1 20 30) ;; r
2710: 65 74 72 79 20 65 76 65 72 79 20 73 65 63 6f 6e  etry every secon
2720: 64 20 66 6f 72 20 32 30 20 73 65 63 6f 6e 64 73  d for 20 seconds
2730: 2c 20 63 61 6c 6c 20 69 74 20 64 65 61 64 20 61  , call it dead a
2740: 66 74 65 72 20 33 30 20 73 65 63 6f 6e 64 73 20  fter 30 seconds 
2750: 61 6e 64 20 73 74 65 61 6c 20 74 68 65 20 6c 6f  and steal the lo
2760: 63 6b 0a 09 20 20 20 20 20 20 28 70 72 69 6e 74  ck..      (print
2770: 20 22 4f 62 74 61 69 6e 65 64 20 6c 6f 63 6b 20   "Obtained lock 
2780: 66 6f 72 20 22 20 6f 75 74 70 75 74 66 69 6c 65  for " outputfile
2790: 6e 61 6d 65 29 0a 09 20 20 20 20 20 20 28 70 72  name)..      (pr
27a0: 69 6e 74 20 22 46 61 69 6c 65 64 20 74 6f 20 6f  int "Failed to o
27b0: 62 74 61 69 6e 20 6c 6f 63 6b 20 66 6f 72 20 22  btain lock for "
27c0: 20 6f 75 74 70 75 74 66 69 6c 65 6e 61 6d 65 29   outputfilename)
27d0: 29 0a 09 20 20 28 6c 65 74 20 28 28 6f 75 70 20  )..  (let ((oup 
27e0: 20 20 20 28 6f 70 65 6e 2d 6f 75 74 70 75 74 2d     (open-output-
27f0: 66 69 6c 65 20 6f 75 74 70 75 74 66 69 6c 65 6e  file outputfilen
2800: 61 6d 65 29 29 0a 09 09 28 63 6f 75 6e 74 73 20  ame))...(counts 
2810: 28 6d 61 6b 65 2d 68 61 73 68 2d 74 61 62 6c 65  (make-hash-table
2820: 29 29 0a 09 09 28 73 74 61 74 65 63 6f 75 6e 74  ))...(statecount
2830: 73 20 28 6d 61 6b 65 2d 68 61 73 68 2d 74 61 62  s (make-hash-tab
2840: 6c 65 29 29 0a 09 09 28 6f 75 74 74 78 74 20 22  le))...(outtxt "
2850: 22 29 0a 09 09 28 74 6f 74 20 20 20 20 30 29 29  ")...(tot    0))
2860: 0a 09 20 20 20 20 28 77 69 74 68 2d 6f 75 74 70  ..    (with-outp
2870: 75 74 2d 74 6f 2d 70 6f 72 74 0a 09 09 6f 75 70  ut-to-port...oup
2880: 0a 09 20 20 20 20 20 20 28 6c 61 6d 62 64 61 20  ..      (lambda 
2890: 28 29 0a 09 09 28 73 65 74 21 20 6f 75 74 74 78  ()...(set! outtx
28a0: 74 20 28 63 6f 6e 63 20 6f 75 74 74 78 74 20 22  t (conc outtxt "
28b0: 3c 68 74 6d 6c 3e 3c 74 69 74 6c 65 3e 53 75 6d  <html><title>Sum
28c0: 6d 61 72 79 3a 20 22 20 74 65 73 74 2d 6e 61 6d  mary: " test-nam
28d0: 65 20 0a 09 09 09 09 20 20 20 22 3c 2f 74 69 74  e .....   "</tit
28e0: 6c 65 3e 3c 62 6f 64 79 3e 3c 68 32 3e 53 75 6d  le><body><h2>Sum
28f0: 6d 61 72 79 20 66 6f 72 20 22 20 74 65 73 74 2d  mary for " test-
2900: 6e 61 6d 65 20 22 3c 2f 68 32 3e 22 29 29 0a 09  name "</h2>"))..
2910: 09 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61  .(sqlite3:for-ea
2920: 63 68 2d 72 6f 77 20 0a 09 09 20 28 6c 61 6d 62  ch-row ... (lamb
2930: 64 61 20 28 69 64 20 69 74 65 6d 70 61 74 68 20  da (id itempath 
2940: 73 74 61 74 65 20 73 74 61 74 75 73 20 72 75 6e  state status run
2950: 5f 64 75 72 61 74 69 6f 6e 20 6c 6f 67 66 20 63  _duration logf c
2960: 6f 6d 6d 65 6e 74 29 0a 09 09 20 20 20 28 68 61  omment)...   (ha
2970: 73 68 2d 74 61 62 6c 65 2d 73 65 74 21 20 63 6f  sh-table-set! co
2980: 75 6e 74 73 20 73 74 61 74 75 73 20 28 2b 20 31  unts status (+ 1
2990: 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 72 65 66   (hash-table-ref
29a0: 2f 64 65 66 61 75 6c 74 20 63 6f 75 6e 74 73 20  /default counts 
29b0: 73 74 61 74 75 73 20 30 29 29 29 0a 09 09 20 20  status 0)))...  
29c0: 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 73 65 74   (hash-table-set
29d0: 21 20 73 74 61 74 65 63 6f 75 6e 74 73 20 73 74  ! statecounts st
29e0: 61 74 65 20 28 2b 20 31 20 28 68 61 73 68 2d 74  ate (+ 1 (hash-t
29f0: 61 62 6c 65 2d 72 65 66 2f 64 65 66 61 75 6c 74  able-ref/default
2a00: 20 73 74 61 74 65 63 6f 75 6e 74 73 20 73 74 61   statecounts sta
2a10: 74 65 20 30 29 29 29 0a 09 09 20 20 20 28 73 65  te 0)))...   (se
2a20: 74 21 20 6f 75 74 74 78 74 20 28 63 6f 6e 63 20  t! outtxt (conc 
2a30: 6f 75 74 74 78 74 20 22 3c 74 72 3e 22 0a 09 09  outtxt "<tr>"...
2a40: 09 09 20 20 20 20 20 20 22 3c 74 64 3e 3c 61 20  ..      "<td><a 
2a50: 68 72 65 66 3d 5c 22 22 20 69 74 65 6d 70 61 74  href=\"" itempat
2a60: 68 20 22 2f 22 20 6c 6f 67 66 20 22 5c 22 3e 20  h "/" logf "\"> 
2a70: 22 20 69 74 65 6d 70 61 74 68 20 22 3c 2f 61 3e  " itempath "</a>
2a80: 3c 2f 74 64 3e 22 20 0a 09 09 09 09 20 20 20 20  </td>" .....    
2a90: 20 20 22 3c 74 64 3e 22 20 73 74 61 74 65 20 20    "<td>" state  
2aa0: 20 20 22 3c 2f 74 64 3e 22 20 0a 09 09 09 09 20    "</td>" ..... 
2ab0: 20 20 20 20 20 22 3c 74 64 3e 3c 66 6f 6e 74 20       "<td><font 
2ac0: 63 6f 6c 6f 72 3d 22 20 28 63 6f 6d 6d 6f 6e 3a  color=" (common:
2ad0: 67 65 74 2d 63 6f 6c 6f 72 2d 66 72 6f 6d 2d 73  get-color-from-s
2ae0: 74 61 74 75 73 20 73 74 61 74 75 73 29 0a 09 09  tatus status)...
2af0: 09 09 20 20 20 20 20 20 22 3e 22 20 20 20 73 74  ..      ">"   st
2b00: 61 74 75 73 20 20 20 22 3c 2f 66 6f 6e 74 3e 3c  atus   "</font><
2b10: 2f 74 64 3e 22 0a 09 09 09 09 20 20 20 20 20 20  /td>".....      
2b20: 22 3c 74 64 3e 22 20 28 69 66 20 28 65 71 75 61  "<td>" (if (equa
2b30: 6c 3f 20 63 6f 6d 6d 65 6e 74 20 22 22 29 0a 09  l? comment "")..
2b40: 09 09 09 09 09 20 22 26 6e 62 73 70 3b 22 0a 09  ..... "&nbsp;"..
2b50: 09 09 09 09 09 20 63 6f 6d 6d 65 6e 74 29 20 22  ..... comment) "
2b60: 3c 2f 74 64 3e 22 0a 09 09 09 09 09 09 20 22 3c  </td>"....... "<
2b70: 2f 74 72 3e 22 29 29 29 0a 09 09 20 64 62 0a 09  /tr>")))... db..
2b80: 09 20 22 53 45 4c 45 43 54 20 69 64 2c 69 74 65  . "SELECT id,ite
2b90: 6d 5f 70 61 74 68 2c 73 74 61 74 65 2c 73 74 61  m_path,state,sta
2ba0: 74 75 73 2c 72 75 6e 5f 64 75 72 61 74 69 6f 6e  tus,run_duration
2bb0: 2c 66 69 6e 61 6c 5f 6c 6f 67 66 2c 63 6f 6d 6d  ,final_logf,comm
2bc0: 65 6e 74 20 46 52 4f 4d 20 74 65 73 74 73 20 57  ent FROM tests W
2bd0: 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e  HERE run_id=? AN
2be0: 44 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44  D testname=? AND
2bf0: 20 69 74 65 6d 5f 70 61 74 68 20 21 3d 20 27 27   item_path != ''
2c00: 3b 22 0a 09 09 20 72 75 6e 2d 69 64 20 74 65 73  ;"... run-id tes
2c10: 74 2d 6e 61 6d 65 29 0a 0a 09 09 28 70 72 69 6e  t-name)....(prin
2c20: 74 20 22 3c 74 61 62 6c 65 3e 3c 74 72 3e 3c 74  t "<table><tr><t
2c30: 64 20 76 61 6c 69 67 6e 3d 5c 22 74 6f 70 5c 22  d valign=\"top\"
2c40: 3e 22 29 0a 09 09 3b 3b 20 50 72 69 6e 74 20 6f  >")...;; Print o
2c50: 75 74 20 73 74 61 74 73 20 66 6f 72 20 73 74 61  ut stats for sta
2c60: 74 75 73 0a 09 09 28 73 65 74 21 20 74 6f 74 20  tus...(set! tot 
2c70: 30 29 0a 09 09 28 70 72 69 6e 74 20 22 3c 74 61  0)...(print "<ta
2c80: 62 6c 65 20 63 65 6c 6c 73 70 61 63 69 6e 67 3d  ble cellspacing=
2c90: 5c 22 30 5c 22 20 62 6f 72 64 65 72 3d 5c 22 31  \"0\" border=\"1
2ca0: 5c 22 3e 3c 74 72 3e 3c 74 64 20 63 6f 6c 73 70  \"><tr><td colsp
2cb0: 61 6e 3d 5c 22 32 5c 22 3e 3c 68 32 3e 53 74 61  an=\"2\"><h2>Sta
2cc0: 74 65 20 73 74 61 74 73 3c 2f 68 32 3e 3c 2f 74  te stats</h2></t
2cd0: 64 3e 3c 2f 74 72 3e 22 29 0a 09 09 28 66 6f 72  d></tr>")...(for
2ce0: 2d 65 61 63 68 20 28 6c 61 6d 62 64 61 20 28 73  -each (lambda (s
2cf0: 74 61 74 65 29 0a 09 09 09 20 20 20 20 28 73 65  tate)....    (se
2d00: 74 21 20 74 6f 74 20 28 2b 20 74 6f 74 20 28 68  t! tot (+ tot (h
2d10: 61 73 68 2d 74 61 62 6c 65 2d 72 65 66 20 73 74  ash-table-ref st
2d20: 61 74 65 63 6f 75 6e 74 73 20 73 74 61 74 65 29  atecounts state)
2d30: 29 29 0a 09 09 09 20 20 20 20 28 70 72 69 6e 74  ))....    (print
2d40: 20 22 3c 74 72 3e 3c 74 64 3e 22 20 73 74 61 74   "<tr><td>" stat
2d50: 65 20 22 3c 2f 74 64 3e 3c 74 64 3e 22 20 28 68  e "</td><td>" (h
2d60: 61 73 68 2d 74 61 62 6c 65 2d 72 65 66 20 73 74  ash-table-ref st
2d70: 61 74 65 63 6f 75 6e 74 73 20 73 74 61 74 65 29  atecounts state)
2d80: 20 22 3c 2f 74 64 3e 3c 2f 74 72 3e 22 29 29 0a   "</td></tr>")).
2d90: 09 09 09 20 20 28 68 61 73 68 2d 74 61 62 6c 65  ...  (hash-table
2da0: 2d 6b 65 79 73 20 73 74 61 74 65 63 6f 75 6e 74  -keys statecount
2db0: 73 29 29 0a 09 09 28 70 72 69 6e 74 20 22 3c 74  s))...(print "<t
2dc0: 72 3e 3c 74 64 3e 54 6f 74 61 6c 3c 2f 74 64 3e  r><td>Total</td>
2dd0: 3c 74 64 3e 22 20 74 6f 74 20 22 3c 2f 74 64 3e  <td>" tot "</td>
2de0: 3c 2f 74 72 3e 3c 2f 74 61 62 6c 65 3e 22 29 0a  </tr></table>").
2df0: 09 09 28 70 72 69 6e 74 20 22 3c 2f 74 64 3e 3c  ..(print "</td><
2e00: 74 64 20 76 61 6c 69 67 6e 3d 5c 22 74 6f 70 5c  td valign=\"top\
2e10: 22 3e 22 29 0a 09 09 3b 3b 20 50 72 69 6e 74 20  ">")...;; Print 
2e20: 6f 75 74 20 73 74 61 74 73 20 66 6f 72 20 73 74  out stats for st
2e30: 61 74 65 0a 09 09 28 73 65 74 21 20 74 6f 74 20  ate...(set! tot 
2e40: 30 29 0a 09 09 28 70 72 69 6e 74 20 22 3c 74 61  0)...(print "<ta
2e50: 62 6c 65 20 63 65 6c 6c 73 70 61 63 69 6e 67 3d  ble cellspacing=
2e60: 5c 22 30 5c 22 20 62 6f 72 64 65 72 3d 5c 22 31  \"0\" border=\"1
2e70: 5c 22 3e 3c 74 72 3e 3c 74 64 20 63 6f 6c 73 70  \"><tr><td colsp
2e80: 61 6e 3d 5c 22 32 5c 22 3e 3c 68 32 3e 53 74 61  an=\"2\"><h2>Sta
2e90: 74 75 73 20 73 74 61 74 73 3c 2f 68 32 3e 3c 2f  tus stats</h2></
2ea0: 74 64 3e 3c 2f 74 72 3e 22 29 0a 09 09 28 66 6f  td></tr>")...(fo
2eb0: 72 2d 65 61 63 68 20 28 6c 61 6d 62 64 61 20 28  r-each (lambda (
2ec0: 73 74 61 74 75 73 29 0a 09 09 09 20 20 20 20 28  status)....    (
2ed0: 73 65 74 21 20 74 6f 74 20 28 2b 20 74 6f 74 20  set! tot (+ tot 
2ee0: 28 68 61 73 68 2d 74 61 62 6c 65 2d 72 65 66 20  (hash-table-ref 
2ef0: 63 6f 75 6e 74 73 20 73 74 61 74 75 73 29 29 29  counts status)))
2f00: 0a 09 09 09 20 20 20 20 28 70 72 69 6e 74 20 22  ....    (print "
2f10: 3c 74 72 3e 3c 74 64 3e 3c 66 6f 6e 74 20 63 6f  <tr><td><font co
2f20: 6c 6f 72 3d 5c 22 22 20 28 63 6f 6d 6d 6f 6e 3a  lor=\"" (common:
2f30: 67 65 74 2d 63 6f 6c 6f 72 2d 66 72 6f 6d 2d 73  get-color-from-s
2f40: 74 61 74 75 73 20 73 74 61 74 75 73 29 20 22 5c  tatus status) "\
2f50: 22 3e 22 20 73 74 61 74 75 73 0a 09 09 09 09 20  ">" status..... 
2f60: 20 20 22 3c 2f 66 6f 6e 74 3e 3c 2f 74 64 3e 3c    "</font></td><
2f70: 74 64 3e 22 20 28 68 61 73 68 2d 74 61 62 6c 65  td>" (hash-table
2f80: 2d 72 65 66 20 63 6f 75 6e 74 73 20 73 74 61 74  -ref counts stat
2f90: 75 73 29 20 22 3c 2f 74 64 3e 3c 2f 74 72 3e 22  us) "</td></tr>"
2fa0: 29 29 0a 09 09 09 20 20 28 68 61 73 68 2d 74 61  ))....  (hash-ta
2fb0: 62 6c 65 2d 6b 65 79 73 20 63 6f 75 6e 74 73 29  ble-keys counts)
2fc0: 29 0a 09 09 28 70 72 69 6e 74 20 22 3c 74 72 3e  )...(print "<tr>
2fd0: 3c 74 64 3e 54 6f 74 61 6c 3c 2f 74 64 3e 3c 74  <td>Total</td><t
2fe0: 64 3e 22 20 74 6f 74 20 22 3c 2f 74 64 3e 3c 2f  d>" tot "</td></
2ff0: 74 72 3e 3c 2f 74 61 62 6c 65 3e 22 29 0a 09 09  tr></table>")...
3000: 28 70 72 69 6e 74 20 22 3c 2f 74 64 3e 3c 2f 74  (print "</td></t
3010: 64 3e 3c 2f 74 72 3e 3c 2f 74 61 62 6c 65 3e 22  d></tr></table>"
3020: 29 0a 0a 09 09 28 70 72 69 6e 74 20 22 3c 74 61  )....(print "<ta
3030: 62 6c 65 20 63 65 6c 6c 73 70 61 63 69 6e 67 3d  ble cellspacing=
3040: 5c 22 30 5c 22 20 62 6f 72 64 65 72 3d 5c 22 31  \"0\" border=\"1
3050: 5c 22 3e 22 20 0a 09 09 20 20 20 20 20 20 20 22  \">" ...       "
3060: 3c 74 72 3e 3c 74 64 3e 49 74 65 6d 3c 2f 74 64  <tr><td>Item</td
3070: 3e 3c 74 64 3e 53 74 61 74 65 3c 2f 74 64 3e 3c  ><td>State</td><
3080: 74 64 3e 53 74 61 74 75 73 3c 2f 74 64 3e 3c 74  td>Status</td><t
3090: 64 3e 43 6f 6d 6d 65 6e 74 3c 2f 74 64 3e 22 0a  d>Comment</td>".
30a0: 09 09 20 20 20 20 20 20 20 6f 75 74 74 78 74 20  ..       outtxt 
30b0: 22 3c 2f 74 61 62 6c 65 3e 3c 2f 62 6f 64 79 3e  "</table></body>
30c0: 3c 2f 68 74 6d 6c 3e 22 29 0a 09 09 28 72 65 6c  </html>")...(rel
30d0: 65 61 73 65 2d 64 6f 74 2d 6c 6f 63 6b 20 6f 75  ease-dot-lock ou
30e0: 74 70 75 74 66 69 6c 65 6e 61 6d 65 29 29 29 0a  tputfilename))).
30f0: 09 20 20 20 20 28 63 6c 6f 73 65 2d 6f 75 74 70  .    (close-outp
3100: 75 74 2d 70 6f 72 74 20 6f 75 70 29 0a 09 20 20  ut-port oup)..  
3110: 20 20 28 63 68 61 6e 67 65 2d 64 69 72 65 63 74    (change-direct
3120: 6f 72 79 20 6f 72 69 67 2d 64 69 72 29 0a 09 20  ory orig-dir).. 
3130: 20 20 20 28 74 65 73 74 73 3a 74 65 73 74 2d 73     (tests:test-s
3140: 65 74 2d 74 6f 70 6c 6f 67 21 20 64 62 20 72 75  et-toplog! db ru
3150: 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 6f  n-id test-name o
3160: 75 74 70 75 74 66 69 6c 65 6e 61 6d 65 29 0a 09  utputfilename)..
3170: 20 20 20 20 29 29 29 29 29 0a 0a 28 64 65 66 69      )))))..(defi
3180: 6e 65 20 28 67 65 74 2d 61 6c 6c 2d 6c 65 67 61  ne (get-all-lega
3190: 6c 2d 74 65 73 74 73 29 0a 20 20 28 6c 65 74 2a  l-tests).  (let*
31a0: 20 28 28 74 65 73 74 73 20 20 28 67 6c 6f 62 20   ((tests  (glob 
31b0: 28 63 6f 6e 63 20 2a 74 6f 70 70 61 74 68 2a 20  (conc *toppath* 
31c0: 22 2f 74 65 73 74 73 2f 2a 22 29 29 29 0a 09 20  "/tests/*"))).. 
31d0: 28 72 65 73 20 20 20 20 27 28 29 29 29 0a 20 20  (res    '())).  
31e0: 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34    (debug:print 4
31f0: 20 22 49 4e 46 4f 3a 20 4c 6f 6f 6b 69 6e 67 20   "INFO: Looking 
3200: 61 74 20 74 65 73 74 73 20 22 20 28 73 74 72 69  at tests " (stri
3210: 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20 74  ng-intersperse t
3220: 65 73 74 73 20 22 2c 22 29 29 0a 20 20 20 20 28  ests ",")).    (
3230: 66 6f 72 2d 65 61 63 68 20 28 6c 61 6d 62 64 61  for-each (lambda
3240: 20 28 74 65 73 74 70 61 74 68 29 0a 09 09 28 69   (testpath)...(i
3250: 66 20 28 66 69 6c 65 2d 65 78 69 73 74 73 3f 20  f (file-exists? 
3260: 28 63 6f 6e 63 20 74 65 73 74 70 61 74 68 20 22  (conc testpath "
3270: 2f 74 65 73 74 63 6f 6e 66 69 67 22 29 29 0a 09  /testconfig"))..
3280: 09 20 20 20 20 28 73 65 74 21 20 72 65 73 20 28  .    (set! res (
3290: 63 6f 6e 73 20 28 6c 61 73 74 20 28 73 74 72 69  cons (last (stri
32a0: 6e 67 2d 73 70 6c 69 74 20 74 65 73 74 70 61 74  ng-split testpat
32b0: 68 20 22 2f 22 29 29 20 72 65 73 29 29 29 29 0a  h "/")) res)))).
32c0: 09 20 20 20 20 20 20 74 65 73 74 73 29 0a 20 20  .      tests).  
32d0: 20 20 72 65 73 29 29 0a 0a 28 64 65 66 69 6e 65    res))..(define
32e0: 20 28 74 65 73 74 73 3a 67 65 74 2d 74 65 73 74   (tests:get-test
32f0: 63 6f 6e 66 69 67 20 74 65 73 74 2d 6e 61 6d 65  config test-name
3300: 20 73 79 73 74 65 6d 2d 61 6c 6c 6f 77 65 64 29   system-allowed)
3310: 0a 20 20 28 6c 65 74 2a 20 28 28 74 65 73 74 2d  .  (let* ((test-
3320: 70 61 74 68 20 20 20 20 28 63 6f 6e 63 20 2a 74  path    (conc *t
3330: 6f 70 70 61 74 68 2a 20 22 2f 74 65 73 74 73 2f  oppath* "/tests/
3340: 22 20 74 65 73 74 2d 6e 61 6d 65 29 29 0a 09 20  " test-name)).. 
3350: 28 74 65 73 74 2d 63 6f 6e 66 69 67 66 20 28 63  (test-configf (c
3360: 6f 6e 63 20 74 65 73 74 2d 70 61 74 68 20 22 2f  onc test-path "/
3370: 74 65 73 74 63 6f 6e 66 69 67 22 29 29 0a 09 20  testconfig")).. 
3380: 28 74 65 73 74 65 78 69 73 74 73 20 20 20 28 61  (testexists   (a
3390: 6e 64 20 28 66 69 6c 65 2d 65 78 69 73 74 73 3f  nd (file-exists?
33a0: 20 74 65 73 74 2d 63 6f 6e 66 69 67 66 29 28 66   test-configf)(f
33b0: 69 6c 65 2d 72 65 61 64 2d 61 63 63 65 73 73 3f  ile-read-access?
33c0: 20 74 65 73 74 2d 63 6f 6e 66 69 67 66 29 29 29   test-configf)))
33d0: 29 0a 20 20 20 20 28 69 66 20 74 65 73 74 65 78  ).    (if testex
33e0: 69 73 74 73 0a 09 28 72 65 61 64 2d 63 6f 6e 66  ists..(read-conf
33f0: 69 67 20 74 65 73 74 2d 63 6f 6e 66 69 67 66 20  ig test-configf 
3400: 23 66 20 73 79 73 74 65 6d 2d 61 6c 6c 6f 77 65  #f system-allowe
3410: 64 20 65 6e 76 69 72 6f 6e 2d 70 61 74 74 3a 20  d environ-patt: 
3420: 28 69 66 20 73 79 73 74 65 6d 2d 61 6c 6c 6f 77  (if system-allow
3430: 65 64 0a 09 09 09 09 09 09 09 09 20 20 20 20 20  ed.........     
3440: 20 22 70 72 65 2d 6c 61 75 6e 63 68 2d 65 6e 76   "pre-launch-env
3450: 2d 76 61 72 73 22 0a 09 09 09 09 09 09 09 09 20  -vars"......... 
3460: 20 20 20 20 20 23 66 29 29 0a 09 23 66 29 29 29       #f))..#f)))
3470: 0a 20 20 0a 3b 3b 20 73 6f 72 74 20 74 65 73 74  .  .;; sort test
3480: 73 20 62 79 20 70 72 69 6f 72 69 74 79 20 61 6e  s by priority an
3490: 64 20 77 61 69 74 6f 6e 0a 3b 3b 20 4d 6f 76 65  d waiton.;; Move
34a0: 20 74 65 73 74 20 73 70 65 63 69 66 69 63 20 73   test specific s
34b0: 74 75 66 66 20 74 6f 20 61 20 74 65 73 74 20 75  tuff to a test u
34c0: 6e 69 74 20 46 49 58 4d 45 20 6f 6e 65 20 6f 66  nit FIXME one of
34d0: 20 74 68 65 73 65 20 64 61 79 73 0a 28 64 65 66   these days.(def
34e0: 69 6e 65 20 28 74 65 73 74 73 3a 73 6f 72 74 2d  ine (tests:sort-
34f0: 62 79 2d 70 72 69 6f 72 69 74 79 2d 61 6e 64 2d  by-priority-and-
3500: 77 61 69 74 6f 6e 20 74 65 73 74 2d 72 65 63 6f  waiton test-reco
3510: 72 64 73 29 0a 20 20 28 6c 65 74 20 28 28 6d 75  rds).  (let ((mu
3520: 6e 67 65 70 72 69 6f 72 69 74 79 20 28 6c 61 6d  ngepriority (lam
3530: 62 64 61 20 28 70 72 69 6f 72 69 74 79 29 0a 09  bda (priority)..
3540: 09 09 20 28 69 66 20 70 72 69 6f 72 69 74 79 0a  .. (if priority.
3550: 09 09 09 20 20 20 20 20 28 6c 65 74 20 28 28 74  ...     (let ((t
3560: 6d 70 20 28 61 6e 79 2d 3e 6e 75 6d 62 65 72 20  mp (any->number 
3570: 70 72 69 6f 72 69 74 79 29 29 29 0a 09 09 09 20  priority))).... 
3580: 20 20 20 20 20 20 28 69 66 20 74 6d 70 20 74 6d        (if tmp tm
3590: 70 20 28 62 65 67 69 6e 20 28 64 65 62 75 67 3a  p (begin (debug:
35a0: 70 72 69 6e 74 20 30 20 22 45 52 52 4f 52 3a 20  print 0 "ERROR: 
35b0: 62 61 64 20 70 72 69 6f 72 69 74 79 20 76 61 6c  bad priority val
35c0: 75 65 20 22 20 70 72 69 6f 72 69 74 79 20 22 2c  ue " priority ",
35d0: 20 75 73 69 6e 67 20 30 22 29 20 30 29 29 29 0a   using 0") 0))).
35e0: 09 09 09 20 20 20 20 20 30 29 29 29 29 0a 20 20  ...     0)))).  
35f0: 20 20 28 73 6f 72 74 20 0a 20 20 20 20 20 28 68    (sort .     (h
3600: 61 73 68 2d 74 61 62 6c 65 2d 6b 65 79 73 20 74  ash-table-keys t
3610: 65 73 74 2d 72 65 63 6f 72 64 73 29 20 3b 3b 20  est-records) ;; 
3620: 61 76 6f 69 64 20 64 65 61 6c 69 6e 67 20 77 69  avoid dealing wi
3630: 74 68 20 64 65 6c 65 74 65 64 20 74 65 73 74 73  th deleted tests
3640: 2c 20 6c 6f 6f 6b 20 61 74 20 74 68 65 20 68 61  , look at the ha
3650: 73 68 20 74 61 62 6c 65 0a 20 20 20 20 20 28 6c  sh table.     (l
3660: 61 6d 62 64 61 20 28 61 20 62 29 0a 20 20 20 20  ambda (a b).    
3670: 20 20 20 28 6c 65 74 2a 20 28 28 61 2d 72 65 63     (let* ((a-rec
3680: 6f 72 64 20 20 20 28 68 61 73 68 2d 74 61 62 6c  ord   (hash-tabl
3690: 65 2d 72 65 66 20 74 65 73 74 2d 72 65 63 6f 72  e-ref test-recor
36a0: 64 73 20 61 29 29 0a 09 20 20 20 20 20 20 28 62  ds a))..      (b
36b0: 2d 72 65 63 6f 72 64 20 20 20 28 68 61 73 68 2d  -record   (hash-
36c0: 74 61 62 6c 65 2d 72 65 66 20 74 65 73 74 2d 72  table-ref test-r
36d0: 65 63 6f 72 64 73 20 62 29 29 0a 09 20 20 20 20  ecords b))..    
36e0: 20 20 28 61 2d 77 61 69 74 6f 6e 73 20 20 28 74    (a-waitons  (t
36f0: 65 73 74 73 3a 74 65 73 74 71 75 65 75 65 2d 67  ests:testqueue-g
3700: 65 74 2d 77 61 69 74 6f 6e 73 20 61 2d 72 65 63  et-waitons a-rec
3710: 6f 72 64 29 29 0a 09 20 20 20 20 20 20 28 62 2d  ord))..      (b-
3720: 77 61 69 74 6f 6e 73 20 20 28 74 65 73 74 73 3a  waitons  (tests:
3730: 74 65 73 74 71 75 65 75 65 2d 67 65 74 2d 77 61  testqueue-get-wa
3740: 69 74 6f 6e 73 20 62 2d 72 65 63 6f 72 64 29 29  itons b-record))
3750: 0a 09 20 20 20 20 20 20 28 61 2d 63 6f 6e 66 69  ..      (a-confi
3760: 67 20 20 20 28 74 65 73 74 73 3a 74 65 73 74 71  g   (tests:testq
3770: 75 65 75 65 2d 67 65 74 2d 74 65 73 74 63 6f 6e  ueue-get-testcon
3780: 66 69 67 20 20 61 2d 72 65 63 6f 72 64 29 29 0a  fig  a-record)).
3790: 09 20 20 20 20 20 20 28 62 2d 63 6f 6e 66 69 67  .      (b-config
37a0: 20 20 20 28 74 65 73 74 73 3a 74 65 73 74 71 75     (tests:testqu
37b0: 65 75 65 2d 67 65 74 2d 74 65 73 74 63 6f 6e 66  eue-get-testconf
37c0: 69 67 20 20 62 2d 72 65 63 6f 72 64 29 29 0a 09  ig  b-record))..
37d0: 20 20 20 20 20 20 28 61 2d 72 61 77 2d 70 72 69        (a-raw-pri
37e0: 20 20 28 63 6f 6e 66 69 67 2d 6c 6f 6f 6b 75 70    (config-lookup
37f0: 20 61 2d 63 6f 6e 66 69 67 20 22 72 65 71 75 69   a-config "requi
3800: 72 65 6d 65 6e 74 73 22 20 22 70 72 69 6f 72 69  rements" "priori
3810: 74 79 22 29 29 0a 09 20 20 20 20 20 20 28 62 2d  ty"))..      (b-
3820: 72 61 77 2d 70 72 69 20 20 28 63 6f 6e 66 69 67  raw-pri  (config
3830: 2d 6c 6f 6f 6b 75 70 20 62 2d 63 6f 6e 66 69 67  -lookup b-config
3840: 20 22 72 65 71 75 69 72 65 6d 65 6e 74 73 22 20   "requirements" 
3850: 22 70 72 69 6f 72 69 74 79 22 29 29 0a 09 20 20  "priority"))..  
3860: 20 20 20 20 28 61 2d 70 72 69 6f 72 69 74 79 20      (a-priority 
3870: 28 6d 75 6e 67 65 70 72 69 6f 72 69 74 79 20 61  (mungepriority a
3880: 2d 72 61 77 2d 70 72 69 29 29 0a 09 20 20 20 20  -raw-pri))..    
3890: 20 20 28 62 2d 70 72 69 6f 72 69 74 79 20 28 6d    (b-priority (m
38a0: 75 6e 67 65 70 72 69 6f 72 69 74 79 20 62 2d 72  ungepriority b-r
38b0: 61 77 2d 70 72 69 29 29 29 0a 09 3b 3b 20 20 28  aw-pri)))..;;  (
38c0: 64 65 62 75 67 3a 70 72 69 6e 74 20 35 20 22 73  debug:print 5 "s
38d0: 6f 72 74 2d 62 79 2d 70 72 69 6f 72 69 74 79 2d  ort-by-priority-
38e0: 61 6e 64 2d 77 61 69 74 6f 6e 2c 20 61 3a 20 22  and-waiton, a: "
38f0: 20 61 20 22 20 62 3a 20 22 20 62 0a 09 3b 3b 20   a " b: " b..;; 
3900: 09 20 20 20 20 20 20 22 5c 6e 20 20 20 20 20 61  .      "\n     a
3910: 2d 72 65 63 6f 72 64 3a 20 20 20 22 20 61 2d 72  -record:   " a-r
3920: 65 63 6f 72 64 20 0a 09 3b 3b 20 09 20 20 20 20  ecord ..;; .    
3930: 20 20 22 5c 6e 20 20 20 20 20 62 2d 72 65 63 6f    "\n     b-reco
3940: 72 64 3a 20 20 20 22 20 62 2d 72 65 63 6f 72 64  rd:   " b-record
3950: 0a 09 3b 3b 20 09 20 20 20 20 20 20 22 5c 6e 20  ..;; .      "\n 
3960: 20 20 20 20 61 2d 77 61 69 74 6f 6e 73 3a 20 20      a-waitons:  
3970: 22 20 61 2d 77 61 69 74 6f 6e 73 0a 09 3b 3b 20  " a-waitons..;; 
3980: 09 20 20 20 20 20 20 22 5c 6e 20 20 20 20 20 62  .      "\n     b
3990: 2d 77 61 69 74 6f 6e 73 3a 20 20 22 20 62 2d 77  -waitons:  " b-w
39a0: 61 69 74 6f 6e 73 0a 09 3b 3b 20 09 20 20 20 20  aitons..;; .    
39b0: 20 20 22 5c 6e 20 20 20 20 20 61 2d 63 6f 6e 66    "\n     a-conf
39c0: 69 67 3a 20 20 20 22 20 28 68 61 73 68 2d 74 61  ig:   " (hash-ta
39d0: 62 6c 65 2d 3e 61 6c 69 73 74 20 61 2d 63 6f 6e  ble->alist a-con
39e0: 66 69 67 29 0a 09 3b 3b 20 09 20 20 20 20 20 20  fig)..;; .      
39f0: 22 5c 6e 20 20 20 20 20 62 2d 63 6f 6e 66 69 67  "\n     b-config
3a00: 3a 20 20 20 22 20 28 68 61 73 68 2d 74 61 62 6c  :   " (hash-tabl
3a10: 65 2d 3e 61 6c 69 73 74 20 62 2d 63 6f 6e 66 69  e->alist b-confi
3a20: 67 29 0a 09 3b 3b 20 09 20 20 20 20 20 20 22 5c  g)..;; .      "\
3a30: 6e 20 20 20 20 20 61 2d 72 61 77 2d 70 72 69 3a  n     a-raw-pri:
3a40: 20 20 22 20 61 2d 72 61 77 2d 70 72 69 0a 09 3b    " a-raw-pri..;
3a50: 3b 20 09 20 20 20 20 20 20 22 5c 6e 20 20 20 20  ; .      "\n    
3a60: 20 62 2d 72 61 77 2d 70 72 69 3a 20 20 22 20 62   b-raw-pri:  " b
3a70: 2d 72 61 77 2d 70 72 69 0a 09 3b 3b 20 09 20 20  -raw-pri..;; .  
3a80: 20 20 20 20 22 5c 6e 20 20 20 20 20 61 2d 70 72      "\n     a-pr
3a90: 69 6f 72 69 74 79 3a 20 22 20 61 2d 70 72 69 6f  iority: " a-prio
3aa0: 72 69 74 79 0a 09 3b 3b 20 09 20 20 20 20 20 20  rity..;; .      
3ab0: 22 5c 6e 20 20 20 20 20 62 2d 70 72 69 6f 72 69  "\n     b-priori
3ac0: 74 79 3a 20 22 20 62 2d 70 72 69 6f 72 69 74 79  ty: " b-priority
3ad0: 29 0a 09 20 28 74 65 73 74 73 3a 74 65 73 74 71  ).. (tests:testq
3ae0: 75 65 75 65 2d 73 65 74 2d 70 72 69 6f 72 69 74  ueue-set-priorit
3af0: 79 21 20 61 2d 72 65 63 6f 72 64 20 61 2d 70 72  y! a-record a-pr
3b00: 69 6f 72 69 74 79 29 0a 09 20 28 74 65 73 74 73  iority).. (tests
3b10: 3a 74 65 73 74 71 75 65 75 65 2d 73 65 74 2d 70  :testqueue-set-p
3b20: 72 69 6f 72 69 74 79 21 20 62 2d 72 65 63 6f 72  riority! b-recor
3b30: 64 20 62 2d 70 72 69 6f 72 69 74 79 29 0a 09 20  d b-priority).. 
3b40: 28 69 66 20 28 61 6e 64 20 61 2d 77 61 69 74 6f  (if (and a-waito
3b50: 6e 73 20 28 6d 65 6d 62 65 72 20 28 74 65 73 74  ns (member (test
3b60: 73 3a 74 65 73 74 71 75 65 75 65 2d 67 65 74 2d  s:testqueue-get-
3b70: 74 65 73 74 6e 61 6d 65 20 62 2d 72 65 63 6f 72  testname b-recor
3b80: 64 29 20 61 2d 77 61 69 74 6f 6e 73 29 29 0a 09  d) a-waitons))..
3b90: 20 20 20 20 20 23 66 20 3b 3b 20 63 61 6e 6e 6f       #f ;; canno
3ba0: 74 20 68 61 76 65 20 61 20 77 68 69 63 68 20 69  t have a which i
3bb0: 73 20 77 61 69 74 69 6e 67 20 6f 6e 20 62 20 68  s waiting on b h
3bc0: 61 70 70 65 6e 69 6e 67 20 62 65 66 6f 72 65 20  appening before 
3bd0: 62 0a 09 20 20 20 20 20 28 69 66 20 28 61 6e 64  b..     (if (and
3be0: 20 62 2d 77 61 69 74 6f 6e 73 20 28 6d 65 6d 62   b-waitons (memb
3bf0: 65 72 20 28 74 65 73 74 73 3a 74 65 73 74 71 75  er (tests:testqu
3c00: 65 75 65 2d 67 65 74 2d 74 65 73 74 6e 61 6d 65  eue-get-testname
3c10: 20 61 2d 72 65 63 6f 72 64 29 20 62 2d 77 61 69   a-record) b-wai
3c20: 74 6f 6e 73 29 29 0a 09 09 20 23 74 20 3b 3b 20  tons))... #t ;; 
3c30: 74 68 69 73 20 69 73 20 74 68 65 20 63 6f 72 72  this is the corr
3c40: 65 63 74 20 6f 72 64 65 72 2c 20 62 20 69 73 20  ect order, b is 
3c50: 77 61 69 74 69 6e 67 20 6f 6e 20 61 20 61 6e 64  waiting on a and
3c60: 20 62 20 69 73 20 62 65 66 6f 72 65 20 61 0a 09   b is before a..
3c70: 09 20 28 69 66 20 28 3e 20 61 2d 70 72 69 6f 72  . (if (> a-prior
3c80: 69 74 79 20 62 2d 70 72 69 6f 72 69 74 79 29 0a  ity b-priority).
3c90: 09 09 20 20 20 20 20 23 74 20 3b 3b 20 69 66 20  ..     #t ;; if 
3ca0: 61 20 69 73 20 61 20 68 69 67 68 65 72 20 70 72  a is a higher pr
3cb0: 69 6f 72 69 74 79 20 74 68 61 6e 20 62 20 74 68  iority than b th
3cc0: 65 6e 20 77 65 20 61 72 65 20 67 6f 6f 64 20 74  en we are good t
3cd0: 6f 20 67 6f 0a 09 09 20 20 20 20 20 23 66 29 29  o go...     #f))
3ce0: 29 29 29 29 29 29 0a 0a 3b 3b 20 66 6f 72 20 65  ))))))..;; for e
3cf0: 61 63 68 20 74 65 73 74 3a 0a 3b 3b 20 20 20 0a  ach test:.;;   .
3d00: 28 64 65 66 69 6e 65 20 28 74 65 73 74 73 3a 66  (define (tests:f
3d10: 69 6c 74 65 72 2d 6e 6f 6e 2d 72 75 6e 6e 61 62  ilter-non-runnab
3d20: 6c 65 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73  le db run-id tes
3d30: 74 6b 65 79 6e 61 6d 65 73 20 74 65 73 74 72 65  tkeynames testre
3d40: 63 6f 72 64 73 68 61 73 68 29 0a 20 20 28 6c 65  cordshash).  (le
3d50: 74 20 28 28 72 75 6e 6e 61 62 6c 65 73 20 27 28  t ((runnables '(
3d60: 29 29 29 0a 20 20 20 20 28 66 6f 72 2d 65 61 63  ))).    (for-eac
3d70: 68 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28  h.     (lambda (
3d80: 74 65 73 74 6b 65 79 6e 61 6d 65 29 0a 20 20 20  testkeyname).   
3d90: 20 20 20 20 28 6c 65 74 2a 20 28 28 74 65 73 74      (let* ((test
3da0: 2d 72 65 63 6f 72 64 20 28 68 61 73 68 2d 74 61  -record (hash-ta
3db0: 62 6c 65 2d 72 65 66 20 74 65 73 74 72 65 63 6f  ble-ref testreco
3dc0: 72 64 73 68 61 73 68 20 74 65 73 74 6b 65 79 6e  rdshash testkeyn
3dd0: 61 6d 65 29 29 0a 09 20 20 20 20 20 20 28 74 65  ame))..      (te
3de0: 73 74 2d 6e 61 6d 65 20 20 20 28 74 65 73 74 73  st-name   (tests
3df0: 3a 74 65 73 74 71 75 65 75 65 2d 67 65 74 2d 74  :testqueue-get-t
3e00: 65 73 74 6e 61 6d 65 20 20 74 65 73 74 2d 72 65  estname  test-re
3e10: 63 6f 72 64 29 29 0a 09 20 20 20 20 20 20 28 69  cord))..      (i
3e20: 74 65 6d 64 61 74 20 20 20 20 20 28 74 65 73 74  temdat     (test
3e30: 73 3a 74 65 73 74 71 75 65 75 65 2d 67 65 74 2d  s:testqueue-get-
3e40: 69 74 65 6d 64 61 74 20 20 20 74 65 73 74 2d 72  itemdat   test-r
3e50: 65 63 6f 72 64 29 29 0a 09 20 20 20 20 20 20 28  ecord))..      (
3e60: 69 74 65 6d 2d 70 61 74 68 20 20 20 28 74 65 73  item-path   (tes
3e70: 74 73 3a 74 65 73 74 71 75 65 75 65 2d 67 65 74  ts:testqueue-get
3e80: 2d 69 74 65 6d 5f 70 61 74 68 20 74 65 73 74 2d  -item_path test-
3e90: 72 65 63 6f 72 64 29 29 0a 09 20 20 20 20 20 20  record))..      
3ea0: 28 77 61 69 74 6f 6e 73 20 20 20 20 20 28 74 65  (waitons     (te
3eb0: 73 74 73 3a 74 65 73 74 71 75 65 75 65 2d 67 65  sts:testqueue-ge
3ec0: 74 2d 77 61 69 74 6f 6e 73 20 20 20 74 65 73 74  t-waitons   test
3ed0: 2d 72 65 63 6f 72 64 29 29 0a 09 20 20 20 20 20  -record))..     
3ee0: 20 28 6b 65 65 70 2d 74 65 73 74 20 20 20 23 74   (keep-test   #t
3ef0: 29 0a 09 20 20 20 20 20 20 28 74 65 73 74 2d 69  )..      (test-i
3f00: 64 20 20 20 20 20 28 64 62 3a 67 65 74 2d 74 65  d     (db:get-te
3f10: 73 74 2d 69 64 20 64 62 20 72 75 6e 2d 69 64 20  st-id db run-id 
3f20: 74 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70  test-name item-p
3f30: 61 74 68 29 29 0a 09 20 20 20 20 20 20 28 74 64  ath))..      (td
3f40: 61 74 20 20 20 20 20 20 20 20 28 64 62 3a 67 65  at        (db:ge
3f50: 74 2d 74 65 73 74 2d 69 6e 66 6f 2d 62 79 2d 69  t-test-info-by-i
3f60: 64 20 64 62 20 74 65 73 74 2d 69 64 29 29 29 0a  d db test-id))).
3f70: 09 20 28 69 66 20 74 64 61 74 0a 09 20 20 20 20  . (if tdat..    
3f80: 20 28 62 65 67 69 6e 0a 09 20 20 20 20 20 20 20   (begin..       
3f90: 3b 3b 20 4c 6f 6f 6b 20 61 74 20 74 68 65 20 74  ;; Look at the t
3fa0: 65 73 74 20 73 74 61 74 65 20 61 6e 64 20 73 74  est state and st
3fb0: 61 74 75 73 0a 09 20 20 20 20 20 20 20 28 69 66  atus..       (if
3fc0: 20 28 6f 72 20 28 6d 65 6d 62 65 72 20 28 64 62   (or (member (db
3fd0: 3a 74 65 73 74 2d 67 65 74 2d 73 74 61 74 75 73  :test-get-status
3fe0: 20 74 64 61 74 29 20 0a 09 09 09 20 20 20 20 20   tdat) ....     
3ff0: 20 20 27 28 22 50 41 53 53 22 20 22 57 41 52 4e    '("PASS" "WARN
4000: 22 20 22 57 41 49 56 45 44 22 20 22 43 48 45 43  " "WAIVED" "CHEC
4010: 4b 22 29 29 0a 09 09 20 20 20 20 20 20 20 28 6d  K"))...       (m
4020: 65 6d 62 65 72 20 28 64 62 3a 74 65 73 74 2d 67  ember (db:test-g
4030: 65 74 2d 73 74 61 74 65 20 74 64 61 74 29 0a 09  et-state tdat)..
4040: 09 09 20 20 20 20 20 20 20 27 28 22 49 4e 43 4f  ..       '("INCO
4050: 4d 50 4c 45 54 45 22 20 22 4b 49 4c 4c 45 44 22  MPLETE" "KILLED"
4060: 29 29 29 0a 09 09 20 20 20 28 73 65 74 21 20 6b  )))...   (set! k
4070: 65 65 70 2d 74 65 73 74 20 23 66 29 29 0a 0a 09  eep-test #f))...
4080: 20 20 20 20 20 20 20 3b 3b 20 65 78 61 6d 69 6e         ;; examin
4090: 65 20 77 61 69 74 6f 6e 73 20 66 6f 72 20 61 6e  e waitons for an
40a0: 79 20 66 61 69 6c 73 2e 20 49 66 20 69 74 20 69  y fails. If it i
40b0: 73 20 46 41 49 4c 20 6f 72 20 49 4e 43 4f 4d 50  s FAIL or INCOMP
40c0: 4c 45 54 45 20 74 68 65 6e 20 65 6c 69 6d 69 6e  LETE then elimin
40d0: 61 74 65 20 74 68 69 73 20 74 65 73 74 0a 09 20  ate this test.. 
40e0: 20 20 20 20 20 20 3b 3b 20 66 72 6f 6d 20 74 68        ;; from th
40f0: 65 20 72 75 6e 6e 61 62 6c 65 20 6c 69 73 74 0a  e runnable list.
4100: 09 20 20 20 20 20 20 20 28 69 66 20 6b 65 65 70  .       (if keep
4110: 2d 74 65 73 74 0a 09 09 20 20 20 28 66 6f 72 2d  -test...   (for-
4120: 65 61 63 68 20 28 6c 61 6d 62 64 61 20 28 77 61  each (lambda (wa
4130: 69 74 6f 6e 29 0a 09 09 09 20 20 20 20 20 20 20  iton)....       
4140: 3b 3b 20 66 6f 72 20 6e 6f 77 20 77 65 20 61 72  ;; for now we ar
4150: 65 20 77 61 69 74 69 6e 67 20 6f 6e 6c 79 20 6f  e waiting only o
4160: 6e 20 74 68 65 20 70 61 72 65 6e 74 20 74 65 73  n the parent tes
4170: 74 0a 09 09 09 20 20 20 20 20 20 20 28 6c 65 74  t....       (let
4180: 2a 20 28 28 70 61 72 65 6e 74 2d 74 65 73 74 2d  * ((parent-test-
4190: 69 64 20 28 64 62 3a 67 65 74 2d 74 65 73 74 2d  id (db:get-test-
41a0: 69 64 20 64 62 20 72 75 6e 2d 69 64 20 77 61 69  id db run-id wai
41b0: 74 6f 6e 20 22 22 29 29 0a 09 09 09 09 20 20 20  ton "")).....   
41c0: 20 20 20 28 77 74 64 61 74 20 28 64 62 3a 67 65     (wtdat (db:ge
41d0: 74 2d 74 65 73 74 2d 69 6e 66 6f 2d 62 79 2d 69  t-test-info-by-i
41e0: 64 20 64 62 20 74 65 73 74 2d 69 64 29 29 29 0a  d db test-id))).
41f0: 09 09 09 09 20 28 69 66 20 28 6f 72 20 28 6d 65  .... (if (or (me
4200: 6d 62 65 72 20 28 64 62 3a 74 65 73 74 2d 67 65  mber (db:test-ge
4210: 74 2d 73 74 61 74 75 73 20 77 74 64 61 74 29 0a  t-status wtdat).
4220: 09 09 09 09 09 09 20 27 28 22 46 41 49 4c 22 20  ...... '("FAIL" 
4230: 22 4b 49 4c 4c 45 44 22 29 29 0a 09 09 09 09 09  "KILLED"))......
4240: 20 28 6d 65 6d 62 65 72 20 28 64 62 3a 74 65 73   (member (db:tes
4250: 74 2d 67 65 74 2d 73 74 61 74 65 20 77 74 64 61  t-get-state wtda
4260: 74 29 0a 09 09 09 09 09 09 20 27 28 22 49 4e 43  t)....... '("INC
4270: 4f 4d 50 45 54 45 22 29 29 29 0a 09 09 09 09 20  OMPETE")))..... 
4280: 20 20 20 20 28 73 65 74 21 20 6b 65 65 70 2d 74      (set! keep-t
4290: 65 73 74 20 23 66 29 29 29 29 20 3b 3b 20 6e 6f  est #f)))) ;; no
42a0: 20 70 6f 69 6e 74 20 69 6e 20 72 75 6e 6e 69 6e   point in runnin
42b0: 67 20 74 68 69 73 20 6f 6e 65 20 61 67 61 69 6e  g this one again
42c0: 0a 09 09 09 20 20 20 20 20 77 61 69 74 6f 6e 73  ....     waitons
42d0: 29 29 29 29 0a 09 20 28 69 66 20 6b 65 65 70 2d  )))).. (if keep-
42e0: 74 65 73 74 20 28 73 65 74 21 20 72 75 6e 6e 61  test (set! runna
42f0: 62 6c 65 73 20 28 63 6f 6e 73 20 74 65 73 74 6b  bles (cons testk
4300: 65 79 6e 61 6d 65 20 72 75 6e 6e 61 62 6c 65 73  eyname runnables
4310: 29 29 29 29 29 0a 20 20 20 20 20 74 65 73 74 6b  ))))).     testk
4320: 65 79 6e 61 6d 65 73 29 0a 20 20 20 20 72 75 6e  eynames).    run
4330: 6e 61 62 6c 65 73 29 29 0a 0a 3b 3b 3d 3d 3d 3d  nables))..;;====
4340: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4350: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4360: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4370: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4380: 3d 3d 0a 3b 3b 20 74 65 73 74 20 73 74 65 70 73  ==.;; test steps
4390: 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  .;;=============
43a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
43b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
43c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
43d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 74 65  =========..;; te
43e0: 73 74 73 74 65 70 2d 73 65 74 2d 73 74 61 74 75  ststep-set-statu
43f0: 73 21 20 75 73 65 64 20 74 6f 20 62 65 20 68 65  s! used to be he
4400: 72 65 0a 0a 28 64 65 66 69 6e 65 20 28 74 65 73  re..(define (tes
4410: 74 2d 67 65 74 2d 6b 69 6c 6c 2d 72 65 71 75 65  t-get-kill-reque
4420: 73 74 20 64 62 20 74 65 73 74 2d 69 64 29 20 3b  st db test-id) ;
4430: 3b 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61  ; run-id test-na
4440: 6d 65 20 69 74 65 6d 64 61 74 29 0a 20 20 28 6c  me itemdat).  (l
4450: 65 74 2a 20 28 3b 3b 20 28 69 74 65 6d 2d 70 61  et* (;; (item-pa
4460: 74 68 20 28 69 74 65 6d 2d 6c 69 73 74 2d 3e 70  th (item-list->p
4470: 61 74 68 20 69 74 65 6d 64 61 74 29 29 0a 09 20  ath itemdat)).. 
4480: 28 74 65 73 74 64 61 74 20 20 20 28 64 62 3a 67  (testdat   (db:g
4490: 65 74 2d 74 65 73 74 2d 69 6e 66 6f 2d 62 79 2d  et-test-info-by-
44a0: 69 64 20 64 62 20 74 65 73 74 2d 69 64 29 29 29  id db test-id)))
44b0: 20 3b 3b 20 72 75 6e 2d 69 64 20 74 65 73 74 2d   ;; run-id test-
44c0: 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 29  name item-path))
44d0: 29 0a 20 20 20 20 28 65 71 75 61 6c 3f 20 28 74  ).    (equal? (t
44e0: 65 73 74 3a 67 65 74 2d 73 74 61 74 65 20 74 65  est:get-state te
44f0: 73 74 64 61 74 29 20 22 4b 49 4c 4c 52 45 51 22  stdat) "KILLREQ"
4500: 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 74 65  )))..(define (te
4510: 73 74 3a 74 64 62 2d 67 65 74 2d 72 75 6e 64 61  st:tdb-get-runda
4520: 74 2d 63 6f 75 6e 74 20 74 64 62 29 0a 20 20 28  t-count tdb).  (
4530: 69 66 20 74 64 62 0a 20 20 20 20 20 20 28 6c 65  if tdb.      (le
4540: 74 20 28 28 72 65 73 20 30 29 29 0a 09 28 73 71  t ((res 0))..(sq
4550: 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72  lite3:for-each-r
4560: 6f 77 0a 09 20 28 6c 61 6d 62 64 61 20 28 63 6f  ow.. (lambda (co
4570: 75 6e 74 29 0a 09 20 20 20 28 73 65 74 21 20 72  unt)..   (set! r
4580: 65 73 20 63 6f 75 6e 74 29 29 0a 09 20 74 64 62  es count)).. tdb
4590: 0a 09 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74  .. "SELECT count
45a0: 28 69 64 29 20 46 52 4f 4d 20 74 65 73 74 5f 72  (id) FROM test_r
45b0: 75 6e 64 61 74 3b 22 29 0a 09 72 65 73 29 29 0a  undat;")..res)).
45c0: 20 20 30 29 0a 0a 28 64 65 66 69 6e 65 20 28 74    0)..(define (t
45d0: 65 73 74 2d 73 65 74 2d 6d 65 74 61 2d 69 6e 66  est-set-meta-inf
45e0: 6f 20 64 62 20 74 65 73 74 2d 69 64 20 72 75 6e  o db test-id run
45f0: 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 69 74 65  -id testname ite
4600: 6d 64 61 74 20 6d 69 6e 75 74 65 73 29 0a 20 20  mdat minutes).  
4610: 28 6c 65 74 2a 20 28 28 74 64 62 20 20 20 20 20  (let* ((tdb     
4620: 20 20 20 20 28 64 62 3a 6f 70 65 6e 2d 74 65 73      (db:open-tes
4630: 74 2d 64 62 2d 62 79 2d 74 65 73 74 2d 69 64 20  t-db-by-test-id 
4640: 64 62 20 74 65 73 74 2d 69 64 29 29 0a 09 20 28  db test-id)).. (
4650: 6e 75 6d 2d 72 65 63 6f 72 64 73 20 28 74 65 73  num-records (tes
4660: 74 3a 74 64 62 2d 67 65 74 2d 72 75 6e 64 61 74  t:tdb-get-rundat
4670: 2d 63 6f 75 6e 74 20 74 64 62 29 29 0a 09 20 28  -count tdb)).. (
4680: 69 74 65 6d 2d 70 61 74 68 20 20 20 28 69 74 65  item-path   (ite
4690: 6d 2d 6c 69 73 74 2d 3e 70 61 74 68 20 69 74 65  m-list->path ite
46a0: 6d 64 61 74 29 29 0a 09 20 28 63 70 75 6c 6f 61  mdat)).. (cpuloa
46b0: 64 20 20 28 67 65 74 2d 63 70 75 2d 6c 6f 61 64  d  (get-cpu-load
46c0: 29 29 0a 09 20 28 64 69 73 6b 66 72 65 65 20 28  )).. (diskfree (
46d0: 67 65 74 2d 64 66 20 28 63 75 72 72 65 6e 74 2d  get-df (current-
46e0: 64 69 72 65 63 74 6f 72 79 29 29 29 29 0a 20 20  directory)))).  
46f0: 20 20 28 69 66 20 28 65 71 3f 20 28 6d 6f 64 75    (if (eq? (modu
4700: 6c 6f 20 6e 75 6d 2d 72 65 63 6f 72 64 73 20 31  lo num-records 1
4710: 30 29 20 30 29 20 3b 3b 20 65 76 65 72 79 20 74  0) 0) ;; every t
4720: 65 6e 20 72 65 63 6f 72 64 73 20 75 70 64 61 74  en records updat
4730: 65 20 63 65 6e 74 72 61 6c 0a 09 28 62 65 67 69  e central..(begi
4740: 6e 0a 09 20 20 28 73 71 6c 69 74 65 33 3a 65 78  n..  (sqlite3:ex
4750: 65 63 75 74 65 20 64 62 20 22 55 50 44 41 54 45  ecute db "UPDATE
4760: 20 74 65 73 74 73 20 53 45 54 20 63 70 75 6c 6f   tests SET cpulo
4770: 61 64 3d 3f 2c 64 69 73 6b 66 72 65 65 3d 3f 20  ad=?,diskfree=? 
4780: 57 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41  WHERE run_id=? A
4790: 4e 44 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e  ND testname=? AN
47a0: 44 20 69 74 65 6d 5f 70 61 74 68 3d 3f 3b 22 0a  D item_path=?;".
47b0: 09 09 09 20 20 20 63 70 75 6c 6f 61 64 0a 09 09  ...   cpuload...
47c0: 09 20 20 20 64 69 73 6b 66 72 65 65 0a 09 09 09  .   diskfree....
47d0: 20 20 20 72 75 6e 2d 69 64 0a 09 09 09 20 20 20     run-id....   
47e0: 74 65 73 74 6e 61 6d 65 0a 09 09 09 20 20 20 69  testname....   i
47f0: 74 65 6d 2d 70 61 74 68 29 0a 09 20 20 28 69 66  tem-path)..  (if
4800: 20 6d 69 6e 75 74 65 73 20 28 73 71 6c 69 74 65   minutes (sqlite
4810: 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 55 50  3:execute db "UP
4820: 44 41 54 45 20 74 65 73 74 73 20 53 45 54 20 72  DATE tests SET r
4830: 75 6e 5f 64 75 72 61 74 69 6f 6e 3d 3f 20 57 48  un_duration=? WH
4840: 45 52 45 20 69 64 3d 3f 3b 22 20 6d 69 6e 75 74  ERE id=?;" minut
4850: 65 73 20 74 65 73 74 2d 69 64 29 29 0a 09 20 20  es test-id))..  
4860: 28 69 66 20 28 65 71 3f 20 6e 75 6d 2d 72 65 63  (if (eq? num-rec
4870: 6f 72 64 73 20 30 29 0a 09 20 20 20 20 20 20 28  ords 0)..      (
4880: 6c 65 74 20 28 28 75 6e 61 6d 65 20 28 67 65 74  let ((uname (get
4890: 2d 75 6e 61 6d 65 20 22 2d 73 72 76 70 69 6f 22  -uname "-srvpio"
48a0: 29 29 0a 09 09 20 20 20 20 28 68 6f 73 74 6e 61  ))...    (hostna
48b0: 6d 65 20 28 67 65 74 2d 68 6f 73 74 2d 6e 61 6d  me (get-host-nam
48c0: 65 29 29 29 0a 09 09 28 73 71 6c 69 74 65 33 3a  e)))...(sqlite3:
48d0: 65 78 65 63 75 74 65 20 64 62 20 22 55 50 44 41  execute db "UPDA
48e0: 54 45 20 74 65 73 74 73 20 53 45 54 20 75 6e 61  TE tests SET una
48f0: 6d 65 3d 3f 2c 68 6f 73 74 3d 3f 20 57 48 45 52  me=?,host=? WHER
4900: 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74  E run_id=? AND t
4910: 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 74  estname=? AND it
4920: 65 6d 5f 70 61 74 68 3d 3f 3b 22 0a 09 09 09 09  em_path=?;".....
4930: 20 75 6e 61 6d 65 20 68 6f 73 74 6e 61 6d 65 20   uname hostname 
4940: 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20  run-id testname 
4950: 69 74 65 6d 2d 70 61 74 68 29 29 29 29 29 0a 20  item-path))))). 
4960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
4970: 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65      (sqlite3:exe
4980: 63 75 74 65 20 74 64 62 20 22 49 4e 53 45 52 54  cute tdb "INSERT
4990: 20 49 4e 54 4f 20 74 65 73 74 5f 72 75 6e 64 61   INTO test_runda
49a0: 74 20 28 75 70 64 61 74 65 5f 74 69 6d 65 2c 63  t (update_time,c
49b0: 70 75 6c 6f 61 64 2c 64 69 73 6b 66 72 65 65 2c  puload,diskfree,
49c0: 72 75 6e 5f 64 75 72 61 74 69 6f 6e 29 20 56 41  run_duration) VA
49d0: 4c 55 45 53 20 28 73 74 72 66 74 69 6d 65 28 27  LUES (strftime('
49e0: 25 73 27 2c 27 6e 6f 77 27 29 2c 3f 2c 3f 2c 3f  %s','now'),?,?,?
49f0: 29 3b 22 0a 09 09 20 20 20 20 20 63 70 75 6c 6f  );"...     cpulo
4a00: 61 64 20 64 69 73 6b 66 72 65 65 20 6d 69 6e 75  ad diskfree minu
4a10: 74 65 73 29 29 29 0a 09 20 20 0a 0a 3b 3b 3d 3d  tes)))..  ..;;==
4a20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4a30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4a40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4a50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4a60: 3d 3d 3d 3d 0a 3b 3b 20 41 20 52 20 43 20 48 20  ====.;; A R C H 
4a70: 49 20 56 20 49 20 4e 20 47 0a 3b 3b 3d 3d 3d 3d  I V I N G.;;====
4a80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4a90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4aa0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4ab0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4ac0: 3d 3d 0a 0a 28 64 65 66 69 6e 65 20 28 74 65 73  ==..(define (tes
4ad0: 74 3a 61 72 63 68 69 76 65 20 64 62 20 74 65 73  t:archive db tes
4ae0: 74 2d 69 64 29 0a 20 20 23 66 29 0a 0a 28 64 65  t-id).  #f)..(de
4af0: 66 69 6e 65 20 28 74 65 73 74 3a 61 72 63 68 69  fine (test:archi
4b00: 76 65 2d 74 65 73 74 73 20 64 62 20 6b 65 79 6e  ve-tests db keyn
4b10: 61 6d 65 73 20 74 61 72 67 65 74 29 0a 20 20 23  ames target).  #
4b20: 66 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  f)..;;==========
4b30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4b40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4b50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4b60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20  ============.;; 
4b70: 52 20 50 20 43 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d  R P C.;;========
4b80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4b90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4ba0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4bb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a  ==============..
4bc0: 28 64 65 66 69 6e 65 20 28 72 74 65 73 74 73 3a  (define (rtests:
4bd0: 72 65 67 69 73 74 65 72 2d 74 65 73 74 20 64 62  register-test db
4be0: 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d   run-id test-nam
4bf0: 65 20 69 74 65 6d 2d 70 61 74 68 29 0a 20 20 28  e item-path).  (
4c00: 69 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a 20  if *runremote*. 
4c10: 20 20 20 20 20 28 6c 65 74 20 28 28 68 6f 73 74       (let ((host
4c20: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75   (vector-ref *ru
4c30: 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20 20  nremote* 0))..  
4c40: 20 20 28 70 6f 72 74 20 28 76 65 63 74 6f 72 2d    (port (vector-
4c50: 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20  ref *runremote* 
4c60: 31 29 29 29 0a 09 28 28 72 70 63 3a 70 72 6f 63  1)))..((rpc:proc
4c70: 65 64 75 72 65 20 27 72 74 65 73 74 73 3a 72 65  edure 'rtests:re
4c80: 67 69 73 74 65 72 2d 74 65 73 74 20 68 6f 73 74  gister-test host
4c90: 20 70 6f 72 74 29 20 72 75 6e 2d 69 64 20 74 65   port) run-id te
4ca0: 73 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74  st-name item-pat
4cb0: 68 29 29 0a 20 20 20 20 20 20 28 74 65 73 74 73  h)).      (tests
4cc0: 3a 72 65 67 69 73 74 65 72 2d 74 65 73 74 20 64  :register-test d
4cd0: 62 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61  b run-id test-na
4ce0: 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 29 29 0a  me item-path))).
4cf0: 0a 28 64 65 66 69 6e 65 20 28 72 74 65 73 74 73  .(define (rtests
4d00: 3a 74 65 73 74 2d 73 65 74 2d 73 74 61 74 75 73  :test-set-status
4d10: 21 20 20 64 62 20 74 65 73 74 2d 69 64 20 73 74  !  db test-id st
4d20: 61 74 65 20 73 74 61 74 75 73 20 63 6f 6d 6d 65  ate status comme
4d30: 6e 74 20 64 61 74 29 0a 20 20 28 69 66 20 2a 72  nt dat).  (if *r
4d40: 75 6e 72 65 6d 6f 74 65 2a 0a 20 20 20 20 20 20  unremote*.      
4d50: 28 6c 65 74 20 28 28 68 6f 73 74 20 28 76 65 63  (let ((host (vec
4d60: 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f  tor-ref *runremo
4d70: 74 65 2a 20 30 29 29 0a 09 20 20 20 20 28 70 6f  te* 0))..    (po
4d80: 72 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a  rt (vector-ref *
4d90: 72 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a  runremote* 1))).
4da0: 09 28 28 72 70 63 3a 70 72 6f 63 65 64 75 72 65  .((rpc:procedure
4db0: 20 27 72 74 65 73 74 73 3a 74 65 73 74 2d 73 65   'rtests:test-se
4dc0: 74 2d 73 74 61 74 75 73 21 20 68 6f 73 74 20 70  t-status! host p
4dd0: 6f 72 74 29 20 74 65 73 74 2d 69 64 20 73 74 61  ort) test-id sta
4de0: 74 65 20 73 74 61 74 75 73 20 63 6f 6d 6d 65 6e  te status commen
4df0: 74 20 64 61 74 29 29 0a 20 20 20 20 20 20 28 74  t dat)).      (t
4e00: 65 73 74 73 3a 74 65 73 74 2d 73 65 74 2d 73 74  ests:test-set-st
4e10: 61 74 75 73 21 20 64 62 20 74 65 73 74 2d 69 64  atus! db test-id
4e20: 20 73 74 61 74 65 20 73 74 61 74 75 73 20 63 6f   state status co
4e30: 6d 6d 65 6e 74 20 64 61 74 29 29 29 0a 0a 28 64  mment dat)))..(d
4e40: 65 66 69 6e 65 20 28 72 74 65 73 74 73 3a 74 65  efine (rtests:te
4e50: 73 74 2d 73 65 74 2d 74 6f 70 6c 6f 67 21 20 64  st-set-toplog! d
4e60: 62 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61  b run-id test-na
4e70: 6d 65 20 6c 6f 67 66 29 0a 20 20 28 69 66 20 2a  me logf).  (if *
4e80: 72 75 6e 72 65 6d 6f 74 65 2a 0a 20 20 20 20 20  runremote*.     
4e90: 20 28 6c 65 74 20 28 28 68 6f 73 74 20 28 76 65   (let ((host (ve
4ea0: 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d  ctor-ref *runrem
4eb0: 6f 74 65 2a 20 30 29 29 0a 20 20 20 20 20 20 20  ote* 0)).       
4ec0: 20 20 20 20 20 28 70 6f 72 74 20 28 76 65 63 74       (port (vect
4ed0: 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74  or-ref *runremot
4ee0: 65 2a 20 31 29 29 29 0a 20 20 20 20 20 20 20 20  e* 1))).        
4ef0: 28 28 72 70 63 3a 70 72 6f 63 65 64 75 72 65 20  ((rpc:procedure 
4f00: 27 72 74 65 73 74 73 3a 74 65 73 74 2d 73 65 74  'rtests:test-set
4f10: 2d 74 6f 70 6c 6f 67 21 20 68 6f 73 74 20 70 6f  -toplog! host po
4f20: 72 74 29 20 72 75 6e 2d 69 64 20 74 65 73 74 2d  rt) run-id test-
4f30: 6e 61 6d 65 20 6c 6f 67 66 29 29 0a 20 20 20 20  name logf)).    
4f40: 20 20 28 74 65 73 74 73 3a 74 65 73 74 2d 73 65    (tests:test-se
4f50: 74 2d 74 6f 70 6c 6f 67 21 20 64 62 20 72 75 6e  t-toplog! db run
4f60: 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 6c 6f  -id test-name lo
4f70: 67 66 29 29 29 0a 0a                             gf)))..