Megatest

Hex Artifact Content
Login

Artifact 1a89bc4432adb3e42c34459c82c2e9c8b087c643:


0000: 28 75 73 65 20 73 71 6c 69 74 65 33 20 73 72 66  (use sqlite3 srf
0010: 69 2d 31 20 70 6f 73 69 78 20 72 65 67 65 78 20  i-1 posix regex 
0020: 72 65 67 65 78 2d 63 61 73 65 20 73 72 66 69 2d  regex-case srfi-
0030: 36 39 20 64 6f 74 2d 6c 6f 63 6b 69 6e 67 29 0a  69 dot-locking).
0040: 28 69 6d 70 6f 72 74 20 28 70 72 65 66 69 78 20  (import (prefix 
0050: 73 71 6c 69 74 65 33 20 73 71 6c 69 74 65 33 3a  sqlite3 sqlite3:
0060: 29 29 0a 0a 28 64 65 63 6c 61 72 65 20 28 75 6e  ))..(declare (un
0070: 69 74 20 74 65 73 74 73 29 29 0a 28 64 65 63 6c  it tests)).(decl
0080: 61 72 65 20 28 75 73 65 73 20 64 62 29 29 0a 28  are (uses db)).(
0090: 64 65 63 6c 61 72 65 20 28 75 73 65 73 20 63 6f  declare (uses co
00a0: 6d 6d 6f 6e 29 29 0a 28 64 65 63 6c 61 72 65 20  mmon)).(declare 
00b0: 28 75 73 65 73 20 69 74 65 6d 73 29 29 0a 28 64  (uses items)).(d
00c0: 65 63 6c 61 72 65 20 28 75 73 65 73 20 72 75 6e  eclare (uses run
00d0: 63 6f 6e 66 69 67 29 29 0a 0a 28 69 6e 63 6c 75  config))..(inclu
00e0: 64 65 20 22 63 6f 6d 6d 6f 6e 5f 72 65 63 6f 72  de "common_recor
00f0: 64 73 2e 73 63 6d 22 29 0a 28 69 6e 63 6c 75 64  ds.scm").(includ
0100: 65 20 22 6b 65 79 5f 72 65 63 6f 72 64 73 2e 73  e "key_records.s
0110: 63 6d 22 29 0a 28 69 6e 63 6c 75 64 65 20 22 64  cm").(include "d
0120: 62 5f 72 65 63 6f 72 64 73 2e 73 63 6d 22 29 0a  b_records.scm").
0130: 28 69 6e 63 6c 75 64 65 20 22 72 75 6e 5f 72 65  (include "run_re
0140: 63 6f 72 64 73 2e 73 63 6d 22 29 0a 28 69 6e 63  cords.scm").(inc
0150: 6c 75 64 65 20 22 74 65 73 74 5f 72 65 63 6f 72  lude "test_recor
0160: 64 73 2e 73 63 6d 22 29 0a 0a 0a 28 64 65 66 69  ds.scm")...(defi
0170: 6e 65 20 28 72 65 67 69 73 74 65 72 2d 74 65 73  ne (register-tes
0180: 74 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74  t db run-id test
0190: 2d 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 29  -name item-path)
01a0: 0a 20 20 28 6c 65 74 20 28 28 69 74 65 6d 2d 70  .  (let ((item-p
01b0: 61 74 68 73 20 28 69 66 20 28 65 71 75 61 6c 3f  aths (if (equal?
01c0: 20 69 74 65 6d 2d 70 61 74 68 20 22 22 29 0a 09   item-path "")..
01d0: 09 09 28 6c 69 73 74 20 69 74 65 6d 2d 70 61 74  ..(list item-pat
01e0: 68 29 0a 09 09 09 28 6c 69 73 74 20 69 74 65 6d  h)....(list item
01f0: 2d 70 61 74 68 20 22 22 29 29 29 29 0a 20 20 20  -path "")))).   
0200: 20 28 66 6f 72 2d 65 61 63 68 20 0a 20 20 20 20   (for-each .    
0210: 20 28 6c 61 6d 62 64 61 20 28 70 74 68 29 0a 20   (lambda (pth). 
0220: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65        (sqlite3:e
0230: 78 65 63 75 74 65 20 64 62 20 22 49 4e 53 45 52  xecute db "INSER
0240: 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f  T OR IGNORE INTO
0250: 20 74 65 73 74 73 20 28 72 75 6e 5f 69 64 2c 74   tests (run_id,t
0260: 65 73 74 6e 61 6d 65 2c 65 76 65 6e 74 5f 74 69  estname,event_ti
0270: 6d 65 2c 69 74 65 6d 5f 70 61 74 68 2c 73 74 61  me,item_path,sta
0280: 74 65 2c 73 74 61 74 75 73 29 20 56 41 4c 55 45  te,status) VALUE
0290: 53 20 28 3f 2c 3f 2c 73 74 72 66 74 69 6d 65 28  S (?,?,strftime(
02a0: 27 25 73 27 2c 27 6e 6f 77 27 29 2c 3f 2c 27 4e  '%s','now'),?,'N
02b0: 4f 54 5f 53 54 41 52 54 45 44 27 2c 27 6e 2f 61  OT_STARTED','n/a
02c0: 27 29 3b 22 20 0a 09 09 09 72 75 6e 2d 69 64 20  ');" ....run-id 
02d0: 0a 09 09 09 74 65 73 74 2d 6e 61 6d 65 0a 09 09  ....test-name...
02e0: 09 70 74 68 20 0a 09 09 09 3b 3b 20 28 63 6f 6e  .pth ....;; (con
02f0: 63 20 22 2c 22 20 28 73 74 72 69 6e 67 2d 69 6e  c "," (string-in
0300: 74 65 72 73 70 65 72 73 65 20 74 61 67 73 20 22  tersperse tags "
0310: 2c 22 29 20 22 2c 22 29 0a 09 09 09 29 29 0a 20  ,") ",")....)). 
0320: 20 20 20 20 69 74 65 6d 2d 70 61 74 68 73 20 29      item-paths )
0330: 29 29 0a 0a 3b 3b 20 67 65 74 20 74 68 65 20 70  ))..;; get the p
0340: 72 65 76 69 6f 75 73 20 72 65 63 6f 72 64 20 66  revious record f
0350: 6f 72 20 77 68 65 6e 20 74 68 69 73 20 74 65 73  or when this tes
0360: 74 20 77 61 73 20 72 75 6e 20 77 68 65 72 65 20  t was run where 
0370: 61 6c 6c 20 6b 65 79 73 20 6d 61 74 63 68 20 62  all keys match b
0380: 75 74 20 72 75 6e 6e 61 6d 65 0a 3b 3b 20 72 65  ut runname.;; re
0390: 74 75 72 6e 73 20 23 66 20 69 66 20 6e 6f 20 73  turns #f if no s
03a0: 75 63 68 20 74 65 73 74 20 66 6f 75 6e 64 2c 20  uch test found, 
03b0: 72 65 74 75 72 6e 73 20 61 20 73 69 6e 67 6c 65  returns a single
03c0: 20 74 65 73 74 20 72 65 63 6f 72 64 20 69 66 20   test record if 
03d0: 66 6f 75 6e 64 0a 28 64 65 66 69 6e 65 20 28 74  found.(define (t
03e0: 65 73 74 3a 67 65 74 2d 70 72 65 76 69 6f 75 73  est:get-previous
03f0: 2d 74 65 73 74 2d 72 75 6e 2d 72 65 63 6f 72 64  -test-run-record
0400: 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 2d   db run-id test-
0410: 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 0a  name item-path).
0420: 20 20 28 6c 65 74 2a 20 28 28 6b 65 79 73 20 20    (let* ((keys  
0430: 20 20 28 64 62 3a 67 65 74 2d 6b 65 79 73 20 64    (db:get-keys d
0440: 62 29 29 0a 09 20 28 73 65 6c 73 74 72 20 20 28  b)).. (selstr  (
0450: 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72  string-intersper
0460: 73 65 20 28 6d 61 70 20 28 6c 61 6d 62 64 61 20  se (map (lambda 
0470: 28 78 29 28 76 65 63 74 6f 72 2d 72 65 66 20 78  (x)(vector-ref x
0480: 20 30 29 29 20 6b 65 79 73 29 20 22 2c 22 29 29   0)) keys) ","))
0490: 0a 09 20 28 71 72 79 73 74 72 20 20 28 73 74 72  .. (qrystr  (str
04a0: 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20  ing-intersperse 
04b0: 28 6d 61 70 20 28 6c 61 6d 62 64 61 20 28 78 29  (map (lambda (x)
04c0: 28 63 6f 6e 63 20 28 76 65 63 74 6f 72 2d 72 65  (conc (vector-re
04d0: 66 20 78 20 30 29 20 22 3d 3f 22 29 29 20 6b 65  f x 0) "=?")) ke
04e0: 79 73 29 20 22 20 41 4e 44 20 22 29 29 0a 09 20  ys) " AND ")).. 
04f0: 28 6b 65 79 76 61 6c 73 20 23 66 29 29 0a 20 20  (keyvals #f)).  
0500: 20 20 3b 3b 20 66 69 72 73 74 20 6c 6f 6f 6b 20    ;; first look 
0510: 75 70 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65  up the key value
0520: 73 20 66 72 6f 6d 20 74 68 65 20 72 75 6e 20 73  s from the run s
0530: 65 6c 65 63 74 65 64 20 62 79 20 72 75 6e 2d 69  elected by run-i
0540: 64 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66  d.    (sqlite3:f
0550: 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a 20 20 20  or-each-row .   
0560: 20 20 28 6c 61 6d 62 64 61 20 28 61 20 2e 20 62    (lambda (a . b
0570: 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 6b  ).       (set! k
0580: 65 79 76 61 6c 73 20 28 63 6f 6e 73 20 61 20 62  eyvals (cons a b
0590: 29 29 29 0a 20 20 20 20 20 64 62 0a 20 20 20 20  ))).     db.    
05a0: 20 28 63 6f 6e 63 20 22 53 45 4c 45 43 54 20 22   (conc "SELECT "
05b0: 20 73 65 6c 73 74 72 20 22 20 46 52 4f 4d 20 72   selstr " FROM r
05c0: 75 6e 73 20 57 48 45 52 45 20 69 64 3d 3f 20 4f  uns WHERE id=? O
05d0: 52 44 45 52 20 42 59 20 65 76 65 6e 74 5f 74 69  RDER BY event_ti
05e0: 6d 65 20 44 45 53 43 3b 22 29 20 72 75 6e 2d 69  me DESC;") run-i
05f0: 64 29 0a 20 20 20 20 28 69 66 20 28 6e 6f 74 20  d).    (if (not 
0600: 6b 65 79 76 61 6c 73 29 0a 09 23 66 0a 09 28 6c  keyvals)..#f..(l
0610: 65 74 20 28 28 70 72 65 76 2d 72 75 6e 2d 69 64  et ((prev-run-id
0620: 73 20 27 28 29 29 29 0a 09 20 20 28 61 70 70 6c  s '()))..  (appl
0630: 79 20 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61  y sqlite3:for-ea
0640: 63 68 2d 72 6f 77 0a 09 09 20 28 6c 61 6d 62 64  ch-row... (lambd
0650: 61 20 28 69 64 29 0a 09 09 20 20 20 28 73 65 74  a (id)...   (set
0660: 21 20 70 72 65 76 2d 72 75 6e 2d 69 64 73 20 28  ! prev-run-ids (
0670: 63 6f 6e 73 20 69 64 20 70 72 65 76 2d 72 75 6e  cons id prev-run
0680: 2d 69 64 73 29 29 29 0a 09 09 20 64 62 0a 09 09  -ids)))... db...
0690: 20 28 63 6f 6e 63 20 22 53 45 4c 45 43 54 20 69   (conc "SELECT i
06a0: 64 20 46 52 4f 4d 20 72 75 6e 73 20 57 48 45 52  d FROM runs WHER
06b0: 45 20 22 20 71 72 79 73 74 72 20 22 20 41 4e 44  E " qrystr " AND
06c0: 20 69 64 20 21 3d 20 3f 3b 22 29 20 28 61 70 70   id != ?;") (app
06d0: 65 6e 64 20 6b 65 79 76 61 6c 73 20 28 6c 69 73  end keyvals (lis
06e0: 74 20 72 75 6e 2d 69 64 29 29 29 0a 09 20 20 3b  t run-id)))..  ;
06f0: 3b 20 66 6f 72 20 65 61 63 68 20 72 75 6e 20 73  ; for each run s
0700: 74 61 72 74 69 6e 67 20 77 69 74 68 20 74 68 65  tarting with the
0710: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 6c 6f 6f   most recent loo
0720: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72  k to see if ther
0730: 65 20 69 73 20 61 20 6d 61 74 63 68 69 6e 67 20  e is a matching 
0740: 74 65 73 74 0a 09 20 20 3b 3b 20 69 66 20 66 6f  test..  ;; if fo
0750: 75 6e 64 20 74 68 65 6e 20 72 65 74 75 72 6e 20  und then return 
0760: 74 68 61 74 20 6d 61 74 63 68 69 6e 67 20 74 65  that matching te
0770: 73 74 20 72 65 63 6f 72 64 0a 09 20 20 28 64 65  st record..  (de
0780: 62 75 67 3a 70 72 69 6e 74 20 34 20 22 73 65 6c  bug:print 4 "sel
0790: 73 74 72 3a 20 22 20 73 65 6c 73 74 72 20 22 2c  str: " selstr ",
07a0: 20 71 72 79 73 74 72 3a 20 22 20 71 72 79 73 74   qrystr: " qryst
07b0: 72 20 22 2c 20 6b 65 79 76 61 6c 73 3a 20 22 20  r ", keyvals: " 
07c0: 6b 65 79 76 61 6c 73 20 22 2c 20 70 72 65 76 69  keyvals ", previ
07d0: 6f 75 73 20 72 75 6e 20 69 64 73 20 66 6f 75 6e  ous run ids foun
07e0: 64 3a 20 22 20 70 72 65 76 2d 72 75 6e 2d 69 64  d: " prev-run-id
07f0: 73 29 0a 09 20 20 28 69 66 20 28 6e 75 6c 6c 3f  s)..  (if (null?
0800: 20 70 72 65 76 2d 72 75 6e 2d 69 64 73 29 20 23   prev-run-ids) #
0810: 66 0a 09 20 20 20 20 20 20 28 6c 65 74 20 6c 6f  f..      (let lo
0820: 6f 70 20 28 28 68 65 64 20 28 63 61 72 20 70 72  op ((hed (car pr
0830: 65 76 2d 72 75 6e 2d 69 64 73 29 29 0a 09 09 09  ev-run-ids))....
0840: 20 28 74 61 6c 20 28 63 64 72 20 70 72 65 76 2d   (tal (cdr prev-
0850: 72 75 6e 2d 69 64 73 29 29 29 0a 09 09 28 6c 65  run-ids)))...(le
0860: 74 20 28 28 72 65 73 75 6c 74 73 20 28 64 62 2d  t ((results (db-
0870: 67 65 74 2d 74 65 73 74 73 2d 66 6f 72 2d 72 75  get-tests-for-ru
0880: 6e 20 64 62 20 68 65 64 20 74 65 73 74 2d 6e 61  n db hed test-na
0890: 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 27 28 29  me item-path '()
08a0: 20 27 28 29 29 29 29 0a 09 09 20 20 28 64 65 62   '())))...  (deb
08b0: 75 67 3a 70 72 69 6e 74 20 34 20 22 47 6f 74 20  ug:print 4 "Got 
08c0: 74 65 73 74 73 20 66 6f 72 20 72 75 6e 2d 69 64  tests for run-id
08d0: 20 22 20 72 75 6e 2d 69 64 20 22 2c 20 74 65 73   " run-id ", tes
08e0: 74 2d 6e 61 6d 65 20 22 20 74 65 73 74 2d 6e 61  t-name " test-na
08f0: 6d 65 20 22 2c 20 69 74 65 6d 2d 70 61 74 68 20  me ", item-path 
0900: 22 20 69 74 65 6d 2d 70 61 74 68 20 22 3a 20 22  " item-path ": "
0910: 20 72 65 73 75 6c 74 73 29 0a 09 09 20 20 28 69   results)...  (i
0920: 66 20 28 61 6e 64 20 28 6e 75 6c 6c 3f 20 72 65  f (and (null? re
0930: 73 75 6c 74 73 29 0a 09 09 09 20 20 20 28 6e 6f  sults)....   (no
0940: 74 20 28 6e 75 6c 6c 3f 20 74 61 6c 29 29 29 0a  t (null? tal))).
0950: 09 09 20 20 20 20 20 20 28 6c 6f 6f 70 20 28 63  ..      (loop (c
0960: 61 72 20 74 61 6c 29 28 63 64 72 20 74 61 6c 29  ar tal)(cdr tal)
0970: 29 0a 09 09 20 20 20 20 20 20 28 69 66 20 28 6e  )...      (if (n
0980: 75 6c 6c 3f 20 72 65 73 75 6c 74 73 29 20 23 66  ull? results) #f
0990: 0a 09 09 09 20 20 28 63 61 72 20 72 65 73 75 6c  ....  (car resul
09a0: 74 73 29 29 29 29 29 29 29 29 29 29 0a 20 20 20  ts)))))))))).   
09b0: 20 0a 3b 3b 20 67 65 74 20 74 68 65 20 70 72 65   .;; get the pre
09c0: 76 69 6f 75 73 20 72 65 63 6f 72 64 73 20 66 6f  vious records fo
09d0: 72 20 77 68 65 6e 20 74 68 65 73 65 20 74 65 73  r when these tes
09e0: 74 73 20 77 65 72 65 20 72 75 6e 20 77 68 65 72  ts were run wher
09f0: 65 20 61 6c 6c 20 6b 65 79 73 20 6d 61 74 63 68  e all keys match
0a00: 20 62 75 74 20 72 75 6e 6e 61 6d 65 0a 3b 3b 20   but runname.;; 
0a10: 4e 42 2f 2f 20 4d 65 72 67 65 20 74 68 69 73 20  NB// Merge this 
0a20: 77 69 74 68 20 74 65 73 74 3a 67 65 74 2d 70 72  with test:get-pr
0a30: 65 76 69 6f 75 73 2d 74 65 73 74 2d 72 75 6e 2d  evious-test-run-
0a40: 72 65 63 6f 72 64 73 3f 20 54 68 69 73 20 6f 6e  records? This on
0a50: 65 20 6c 6f 6f 6b 73 20 66 6f 72 20 61 6c 6c 20  e looks for all 
0a60: 6d 61 74 63 68 69 6e 67 20 74 65 73 74 73 0a 3b  matching tests.;
0a70: 3b 20 63 61 6e 20 75 73 65 20 77 69 6c 64 63 61  ; can use wildca
0a80: 72 64 73 2e 20 0a 28 64 65 66 69 6e 65 20 28 74  rds. .(define (t
0a90: 65 73 74 3a 67 65 74 2d 6d 61 74 63 68 69 6e 67  est:get-matching
0aa0: 2d 70 72 65 76 69 6f 75 73 2d 74 65 73 74 2d 72  -previous-test-r
0ab0: 75 6e 2d 72 65 63 6f 72 64 73 20 64 62 20 72 75  un-records db ru
0ac0: 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69  n-id test-name i
0ad0: 74 65 6d 2d 70 61 74 68 29 0a 20 20 28 6c 65 74  tem-path).  (let
0ae0: 2a 20 28 28 6b 65 79 73 20 20 20 20 28 64 62 3a  * ((keys    (db:
0af0: 67 65 74 2d 6b 65 79 73 20 64 62 29 29 0a 09 20  get-keys db)).. 
0b00: 28 73 65 6c 73 74 72 20 20 28 73 74 72 69 6e 67  (selstr  (string
0b10: 2d 69 6e 74 65 72 73 70 65 72 73 65 20 28 6d 61  -intersperse (ma
0b20: 70 20 28 6c 61 6d 62 64 61 20 28 78 29 28 76 65  p (lambda (x)(ve
0b30: 63 74 6f 72 2d 72 65 66 20 78 20 30 29 29 20 6b  ctor-ref x 0)) k
0b40: 65 79 73 29 20 22 2c 22 29 29 0a 09 20 28 71 72  eys) ",")).. (qr
0b50: 79 73 74 72 20 20 28 73 74 72 69 6e 67 2d 69 6e  ystr  (string-in
0b60: 74 65 72 73 70 65 72 73 65 20 28 6d 61 70 20 28  tersperse (map (
0b70: 6c 61 6d 62 64 61 20 28 78 29 28 63 6f 6e 63 20  lambda (x)(conc 
0b80: 28 76 65 63 74 6f 72 2d 72 65 66 20 78 20 30 29  (vector-ref x 0)
0b90: 20 22 3d 3f 22 29 29 20 6b 65 79 73 29 20 22 20   "=?")) keys) " 
0ba0: 41 4e 44 20 22 29 29 0a 09 20 28 6b 65 79 76 61  AND ")).. (keyva
0bb0: 6c 73 20 23 66 29 0a 09 20 28 74 65 73 74 73 2d  ls #f).. (tests-
0bc0: 68 61 73 68 20 28 6d 61 6b 65 2d 68 61 73 68 2d  hash (make-hash-
0bd0: 74 61 62 6c 65 29 29 29 0a 20 20 20 20 3b 3b 20  table))).    ;; 
0be0: 66 69 72 73 74 20 6c 6f 6f 6b 20 75 70 20 74 68  first look up th
0bf0: 65 20 6b 65 79 20 76 61 6c 75 65 73 20 66 72 6f  e key values fro
0c00: 6d 20 74 68 65 20 72 75 6e 20 73 65 6c 65 63 74  m the run select
0c10: 65 64 20 62 79 20 72 75 6e 2d 69 64 0a 20 20 20  ed by run-id.   
0c20: 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61   (sqlite3:for-ea
0c30: 63 68 2d 72 6f 77 20 0a 20 20 20 20 20 28 6c 61  ch-row .     (la
0c40: 6d 62 64 61 20 28 61 20 2e 20 62 29 0a 20 20 20  mbda (a . b).   
0c50: 20 20 20 20 28 73 65 74 21 20 6b 65 79 76 61 6c      (set! keyval
0c60: 73 20 28 63 6f 6e 73 20 61 20 62 29 29 29 0a 20  s (cons a b))). 
0c70: 20 20 20 20 64 62 0a 20 20 20 20 20 28 63 6f 6e      db.     (con
0c80: 63 20 22 53 45 4c 45 43 54 20 22 20 73 65 6c 73  c "SELECT " sels
0c90: 74 72 20 22 20 46 52 4f 4d 20 72 75 6e 73 20 57  tr " FROM runs W
0ca0: 48 45 52 45 20 69 64 3d 3f 20 4f 52 44 45 52 20  HERE id=? ORDER 
0cb0: 42 59 20 65 76 65 6e 74 5f 74 69 6d 65 20 44 45  BY event_time DE
0cc0: 53 43 3b 22 29 20 72 75 6e 2d 69 64 29 0a 20 20  SC;") run-id).  
0cd0: 20 20 28 69 66 20 28 6e 6f 74 20 6b 65 79 76 61    (if (not keyva
0ce0: 6c 73 29 0a 09 27 28 29 0a 09 28 6c 65 74 20 28  ls)..'()..(let (
0cf0: 28 70 72 65 76 2d 72 75 6e 2d 69 64 73 20 27 28  (prev-run-ids '(
0d00: 29 29 29 0a 09 20 20 28 61 70 70 6c 79 20 73 71  )))..  (apply sq
0d10: 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72  lite3:for-each-r
0d20: 6f 77 0a 09 09 20 28 6c 61 6d 62 64 61 20 28 69  ow... (lambda (i
0d30: 64 29 0a 09 09 20 20 20 28 73 65 74 21 20 70 72  d)...   (set! pr
0d40: 65 76 2d 72 75 6e 2d 69 64 73 20 28 63 6f 6e 73  ev-run-ids (cons
0d50: 20 69 64 20 70 72 65 76 2d 72 75 6e 2d 69 64 73   id prev-run-ids
0d60: 29 29 29 0a 09 09 20 64 62 0a 09 09 20 28 63 6f  )))... db... (co
0d70: 6e 63 20 22 53 45 4c 45 43 54 20 69 64 20 46 52  nc "SELECT id FR
0d80: 4f 4d 20 72 75 6e 73 20 57 48 45 52 45 20 22 20  OM runs WHERE " 
0d90: 71 72 79 73 74 72 20 22 20 41 4e 44 20 69 64 20  qrystr " AND id 
0da0: 21 3d 20 3f 3b 22 29 20 28 61 70 70 65 6e 64 20  != ?;") (append 
0db0: 6b 65 79 76 61 6c 73 20 28 6c 69 73 74 20 72 75  keyvals (list ru
0dc0: 6e 2d 69 64 29 29 29 0a 09 20 20 3b 3b 20 63 6f  n-id)))..  ;; co
0dd0: 6c 6c 65 63 74 20 61 6c 6c 20 6d 61 74 63 68 69  llect all matchi
0de0: 6e 67 20 74 65 73 74 73 20 66 6f 72 20 74 68 65  ng tests for the
0df0: 20 72 75 6e 73 20 74 68 65 6e 0a 09 20 20 3b 3b   runs then..  ;;
0e00: 20 65 78 74 72 61 63 74 20 74 68 65 20 6d 6f 73   extract the mos
0e10: 74 20 72 65 63 65 6e 74 20 74 65 73 74 20 61 6e  t recent test an
0e20: 64 20 72 65 74 75 72 6e 20 74 68 61 74 2e 0a 09  d return that...
0e30: 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34    (debug:print 4
0e40: 20 22 73 65 6c 73 74 72 3a 20 22 20 73 65 6c 73   "selstr: " sels
0e50: 74 72 20 22 2c 20 71 72 79 73 74 72 3a 20 22 20  tr ", qrystr: " 
0e60: 71 72 79 73 74 72 20 22 2c 20 6b 65 79 76 61 6c  qrystr ", keyval
0e70: 73 3a 20 22 20 6b 65 79 76 61 6c 73 20 0a 09 09  s: " keyvals ...
0e80: 20 20 20 20 20 20 20 22 2c 20 70 72 65 76 69 6f         ", previo
0e90: 75 73 20 72 75 6e 20 69 64 73 20 66 6f 75 6e 64  us run ids found
0ea0: 3a 20 22 20 70 72 65 76 2d 72 75 6e 2d 69 64 73  : " prev-run-ids
0eb0: 29 0a 09 20 20 28 69 66 20 28 6e 75 6c 6c 3f 20  )..  (if (null? 
0ec0: 70 72 65 76 2d 72 75 6e 2d 69 64 73 29 20 27 28  prev-run-ids) '(
0ed0: 29 20 20 3b 3b 20 6e 6f 20 70 72 65 76 69 6f 75  )  ;; no previou
0ee0: 73 20 72 75 6e 73 3f 20 72 65 74 75 72 6e 20 6e  s runs? return n
0ef0: 75 6c 6c 0a 09 20 20 20 20 20 20 28 6c 65 74 20  ull..      (let 
0f00: 6c 6f 6f 70 20 28 28 68 65 64 20 28 63 61 72 20  loop ((hed (car 
0f10: 70 72 65 76 2d 72 75 6e 2d 69 64 73 29 29 0a 09  prev-run-ids))..
0f20: 09 09 20 28 74 61 6c 20 28 63 64 72 20 70 72 65  .. (tal (cdr pre
0f30: 76 2d 72 75 6e 2d 69 64 73 29 29 29 0a 09 09 28  v-run-ids)))...(
0f40: 6c 65 74 20 28 28 72 65 73 75 6c 74 73 20 28 64  let ((results (d
0f50: 62 2d 67 65 74 2d 74 65 73 74 73 2d 66 6f 72 2d  b-get-tests-for-
0f60: 72 75 6e 20 64 62 20 68 65 64 20 74 65 73 74 2d  run db hed test-
0f70: 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 27  name item-path '
0f80: 28 29 20 27 28 29 29 29 29 0a 09 09 20 20 28 64  () '())))...  (d
0f90: 65 62 75 67 3a 70 72 69 6e 74 20 34 20 22 47 6f  ebug:print 4 "Go
0fa0: 74 20 74 65 73 74 73 20 66 6f 72 20 72 75 6e 2d  t tests for run-
0fb0: 69 64 20 22 20 72 75 6e 2d 69 64 20 22 2c 20 74  id " run-id ", t
0fc0: 65 73 74 2d 6e 61 6d 65 20 22 20 74 65 73 74 2d  est-name " test-
0fd0: 6e 61 6d 65 20 0a 09 09 09 20 20 20 20 20 20 20  name ....       
0fe0: 22 2c 20 69 74 65 6d 2d 70 61 74 68 20 22 20 69  ", item-path " i
0ff0: 74 65 6d 2d 70 61 74 68 20 22 20 72 65 73 75 6c  tem-path " resul
1000: 74 73 3a 20 22 20 28 69 6e 74 65 72 73 70 65 72  ts: " (intersper
1010: 73 65 20 72 65 73 75 6c 74 73 20 22 5c 6e 22 29  se results "\n")
1020: 29 0a 09 09 20 20 3b 3b 20 4b 65 65 70 20 6f 6e  )...  ;; Keep on
1030: 6c 79 20 74 68 65 20 79 6f 75 6e 67 65 73 74 20  ly the youngest 
1040: 6f 66 20 61 6e 79 20 74 65 73 74 2f 69 74 65 6d  of any test/item
1050: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 09 09 20   combination... 
1060: 20 28 66 6f 72 2d 65 61 63 68 20 0a 09 09 20 20   (for-each ...  
1070: 20 28 6c 61 6d 62 64 61 20 28 74 65 73 74 64 61   (lambda (testda
1080: 74 29 0a 09 09 20 20 20 20 20 28 6c 65 74 2a 20  t)...     (let* 
1090: 28 28 66 75 6c 6c 2d 74 65 73 74 6e 61 6d 65 20  ((full-testname 
10a0: 28 63 6f 6e 63 20 28 64 62 3a 74 65 73 74 2d 67  (conc (db:test-g
10b0: 65 74 2d 74 65 73 74 6e 61 6d 65 20 74 65 73 74  et-testname test
10c0: 64 61 74 29 20 22 2f 22 20 28 64 62 3a 74 65 73  dat) "/" (db:tes
10d0: 74 2d 67 65 74 2d 69 74 65 6d 2d 70 61 74 68 20  t-get-item-path 
10e0: 74 65 73 74 64 61 74 29 29 29 0a 09 09 09 20 20  testdat)))....  
10f0: 20 20 28 73 74 6f 72 65 64 2d 74 65 73 74 20 20    (stored-test  
1100: 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 72 65 66   (hash-table-ref
1110: 2f 64 65 66 61 75 6c 74 20 74 65 73 74 73 2d 68  /default tests-h
1120: 61 73 68 20 66 75 6c 6c 2d 74 65 73 74 6e 61 6d  ash full-testnam
1130: 65 20 23 66 29 29 29 0a 09 09 20 20 20 20 20 20  e #f)))...      
1140: 20 28 69 66 20 28 6f 72 20 28 6e 6f 74 20 73 74   (if (or (not st
1150: 6f 72 65 64 2d 74 65 73 74 29 0a 09 09 09 20 20  ored-test)....  
1160: 20 20 20 20 20 28 61 6e 64 20 73 74 6f 72 65 64       (and stored
1170: 2d 74 65 73 74 0a 09 09 09 09 20 20 20 20 28 3e  -test.....    (>
1180: 20 28 64 62 3a 74 65 73 74 2d 67 65 74 2d 65 76   (db:test-get-ev
1190: 65 6e 74 5f 74 69 6d 65 20 74 65 73 74 64 61 74  ent_time testdat
11a0: 29 28 64 62 3a 74 65 73 74 2d 67 65 74 2d 65 76  )(db:test-get-ev
11b0: 65 6e 74 5f 74 69 6d 65 20 73 74 6f 72 65 64 2d  ent_time stored-
11c0: 74 65 73 74 29 29 29 29 0a 09 09 09 20 20 20 3b  test))))....   ;
11d0: 3b 20 74 68 69 73 20 74 65 73 74 20 69 73 20 79  ; this test is y
11e0: 6f 75 6e 67 65 72 2c 20 73 74 6f 72 65 20 69 74  ounger, store it
11f0: 20 69 6e 20 74 68 65 20 68 61 73 68 0a 09 09 09   in the hash....
1200: 20 20 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 73     (hash-table-s
1210: 65 74 21 20 74 65 73 74 73 2d 68 61 73 68 20 66  et! tests-hash f
1220: 75 6c 6c 2d 74 65 73 74 6e 61 6d 65 20 74 65 73  ull-testname tes
1230: 74 64 61 74 29 29 29 29 0a 09 09 20 20 20 72 65  tdat))))...   re
1240: 73 75 6c 74 73 29 0a 09 09 20 20 28 69 66 20 28  sults)...  (if (
1250: 6e 75 6c 6c 3f 20 74 61 6c 29 0a 09 09 20 20 20  null? tal)...   
1260: 20 20 20 28 6d 61 70 20 63 64 72 20 28 68 61 73     (map cdr (has
1270: 68 2d 74 61 62 6c 65 2d 3e 61 6c 69 73 74 20 74  h-table->alist t
1280: 65 73 74 73 2d 68 61 73 68 29 29 20 3b 3b 20 72  ests-hash)) ;; r
1290: 65 74 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20  eturn a list of 
12a0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
12b0: 74 65 73 74 73 0a 09 09 20 20 20 20 20 20 28 6c  tests...      (l
12c0: 6f 6f 70 20 28 63 61 72 20 74 61 6c 29 28 63 64  oop (car tal)(cd
12d0: 72 20 74 61 6c 29 29 29 29 29 29 29 29 29 29 0a  r tal)))))))))).
12e0: 0a 28 64 65 66 69 6e 65 20 28 74 65 73 74 2d 73  .(define (test-s
12f0: 65 74 2d 73 74 61 74 75 73 21 20 64 62 20 72 75  et-status! db ru
1300: 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 73  n-id test-name s
1310: 74 61 74 65 20 73 74 61 74 75 73 20 69 74 65 6d  tate status item
1320: 64 61 74 2d 6f 72 2d 70 61 74 68 20 63 6f 6d 6d  dat-or-path comm
1330: 65 6e 74 20 64 61 74 29 0a 20 20 28 6c 65 74 2a  ent dat).  (let*
1340: 20 28 28 72 65 61 6c 2d 73 74 61 74 75 73 20 73   ((real-status s
1350: 74 61 74 75 73 29 0a 09 20 28 69 74 65 6d 2d 70  tatus).. (item-p
1360: 61 74 68 20 20 20 28 69 66 20 28 73 74 72 69 6e  ath   (if (strin
1370: 67 3f 20 69 74 65 6d 64 61 74 2d 6f 72 2d 70 61  g? itemdat-or-pa
1380: 74 68 29 20 69 74 65 6d 64 61 74 2d 6f 72 2d 70  th) itemdat-or-p
1390: 61 74 68 20 28 69 74 65 6d 2d 6c 69 73 74 2d 3e  ath (item-list->
13a0: 70 61 74 68 20 69 74 65 6d 64 61 74 2d 6f 72 2d  path itemdat-or-
13b0: 70 61 74 68 29 29 29 0a 09 20 28 74 65 73 74 64  path))).. (testd
13c0: 61 74 20 20 20 20 20 28 64 62 3a 67 65 74 2d 74  at     (db:get-t
13d0: 65 73 74 2d 69 6e 66 6f 20 64 62 20 72 75 6e 2d  est-info db run-
13e0: 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 65  id test-name ite
13f0: 6d 2d 70 61 74 68 29 29 0a 09 20 28 74 65 73 74  m-path)).. (test
1400: 2d 69 64 20 20 20 20 20 28 69 66 20 74 65 73 74  -id     (if test
1410: 64 61 74 20 28 64 62 3a 74 65 73 74 2d 67 65 74  dat (db:test-get
1420: 2d 69 64 20 74 65 73 74 64 61 74 29 20 23 66 29  -id testdat) #f)
1430: 29 0a 09 20 28 6f 74 68 65 72 64 61 74 20 20 20  ).. (otherdat   
1440: 20 28 69 66 20 64 61 74 20 64 61 74 20 28 6d 61   (if dat dat (ma
1450: 6b 65 2d 68 61 73 68 2d 74 61 62 6c 65 29 29 29  ke-hash-table)))
1460: 0a 09 20 3b 3b 20 62 65 66 6f 72 65 20 70 72 6f  .. ;; before pro
1470: 63 65 65 64 69 6e 67 20 77 65 20 6d 75 73 74 20  ceeding we must 
1480: 66 69 6e 64 20 6f 75 74 20 69 66 20 74 68 65 20  find out if the 
1490: 70 72 65 76 69 6f 75 73 20 74 65 73 74 20 28 77  previous test (w
14a0: 68 65 72 65 20 61 6c 6c 20 6b 65 79 73 20 6d 61  here all keys ma
14b0: 74 63 68 65 64 20 65 78 63 65 70 74 20 72 75 6e  tched except run
14c0: 6e 61 6d 65 29 0a 09 20 3b 3b 20 77 61 73 20 57  name).. ;; was W
14d0: 41 49 56 45 44 20 69 66 20 74 68 69 73 20 74 65  AIVED if this te
14e0: 73 74 20 69 73 20 46 41 49 4c 0a 09 20 28 77 61  st is FAIL.. (wa
14f0: 69 76 65 64 20 20 20 28 69 66 20 28 65 71 75 61  ived   (if (equa
1500: 6c 3f 20 73 74 61 74 75 73 20 22 46 41 49 4c 22  l? status "FAIL"
1510: 29 0a 09 09 20 20 20 20 20 20 20 28 6c 65 74 20  )...       (let 
1520: 28 28 70 72 65 76 2d 74 65 73 74 20 28 74 65 73  ((prev-test (tes
1530: 74 3a 67 65 74 2d 70 72 65 76 69 6f 75 73 2d 74  t:get-previous-t
1540: 65 73 74 2d 72 75 6e 2d 72 65 63 6f 72 64 20 64  est-run-record d
1550: 62 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61  b run-id test-na
1560: 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 29 29 0a  me item-path))).
1570: 09 09 09 20 28 69 66 20 70 72 65 76 2d 74 65 73  ... (if prev-tes
1580: 74 20 3b 3b 20 74 72 75 65 20 69 66 20 77 65 20  t ;; true if we 
1590: 66 6f 75 6e 64 20 61 20 70 72 65 76 69 6f 75 73  found a previous
15a0: 20 74 65 73 74 20 69 6e 20 74 68 69 73 20 72 75   test in this ru
15b0: 6e 20 73 65 72 69 65 73 0a 09 09 09 20 20 20 20  n series....    
15c0: 20 28 6c 65 74 20 28 28 70 72 65 76 2d 73 74 61   (let ((prev-sta
15d0: 74 75 73 20 28 64 62 3a 74 65 73 74 2d 67 65 74  tus (db:test-get
15e0: 2d 73 74 61 74 75 73 20 20 20 70 72 65 76 2d 74  -status   prev-t
15f0: 65 73 74 29 29 0a 09 09 09 09 20 20 20 28 70 72  est)).....   (pr
1600: 65 76 2d 73 74 61 74 65 20 20 28 64 62 3a 74 65  ev-state  (db:te
1610: 73 74 2d 67 65 74 2d 73 74 61 74 65 20 20 20 20  st-get-state    
1620: 70 72 65 76 2d 74 65 73 74 29 29 0a 09 09 09 09  prev-test)).....
1630: 20 20 20 28 70 72 65 76 2d 63 6f 6d 6d 65 6e 74     (prev-comment
1640: 20 28 64 62 3a 74 65 73 74 2d 67 65 74 2d 63 6f   (db:test-get-co
1650: 6d 6d 65 6e 74 20 70 72 65 76 2d 74 65 73 74 29  mment prev-test)
1660: 29 29 0a 09 09 09 20 20 20 20 20 20 20 28 64 65  ))....       (de
1670: 62 75 67 3a 70 72 69 6e 74 20 34 20 22 70 72 65  bug:print 4 "pre
1680: 76 2d 73 74 61 74 75 73 20 22 20 70 72 65 76 2d  v-status " prev-
1690: 73 74 61 74 75 73 20 22 2c 20 70 72 65 76 2d 73  status ", prev-s
16a0: 74 61 74 65 20 22 20 70 72 65 76 2d 73 74 61 74  tate " prev-stat
16b0: 65 20 22 2c 20 70 72 65 76 2d 63 6f 6d 6d 65 6e  e ", prev-commen
16c0: 74 20 22 20 70 72 65 76 2d 63 6f 6d 6d 65 6e 74  t " prev-comment
16d0: 29 0a 09 09 09 20 20 20 20 20 20 20 28 69 66 20  )....       (if 
16e0: 28 61 6e 64 20 28 65 71 75 61 6c 3f 20 70 72 65  (and (equal? pre
16f0: 76 2d 73 74 61 74 65 20 20 22 43 4f 4d 50 4c 45  v-state  "COMPLE
1700: 54 45 44 22 29 0a 09 09 09 09 09 28 65 71 75 61  TED")......(equa
1710: 6c 3f 20 70 72 65 76 2d 73 74 61 74 75 73 20 22  l? prev-status "
1720: 57 41 49 56 45 44 22 29 29 0a 09 09 09 09 20 20  WAIVED")).....  
1730: 20 70 72 65 76 2d 63 6f 6d 6d 65 6e 74 20 3b 3b   prev-comment ;;
1740: 20 77 61 69 76 65 64 20 69 73 20 65 69 74 68 65   waived is eithe
1750: 72 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 72  r the comment or
1760: 20 23 66 0a 09 09 09 09 20 20 20 23 66 29 29 0a   #f.....   #f)).
1770: 09 09 09 20 20 20 20 20 23 66 29 29 0a 09 09 20  ...     #f))... 
1780: 20 20 20 20 20 20 23 66 29 29 29 0a 20 20 20 20        #f))).    
1790: 28 69 66 20 77 61 69 76 65 64 20 28 73 65 74 21  (if waived (set!
17a0: 20 72 65 61 6c 2d 73 74 61 74 75 73 20 22 57 41   real-status "WA
17b0: 49 56 45 44 22 29 29 0a 20 20 20 20 28 64 65 62  IVED")).    (deb
17c0: 75 67 3a 70 72 69 6e 74 20 34 20 22 72 65 61 6c  ug:print 4 "real
17d0: 2d 73 74 61 74 75 73 20 22 20 72 65 61 6c 2d 73  -status " real-s
17e0: 74 61 74 75 73 20 22 2c 20 77 61 69 76 65 64 20  tatus ", waived 
17f0: 22 20 77 61 69 76 65 64 20 22 2c 20 73 74 61 74  " waived ", stat
1800: 75 73 20 22 20 73 74 61 74 75 73 29 0a 0a 20 20  us " status)..  
1810: 20 20 3b 3b 20 75 70 64 61 74 65 20 74 68 65 20    ;; update the 
1820: 70 72 69 6d 61 72 79 20 72 65 63 6f 72 64 20 49  primary record I
1830: 46 20 73 74 61 74 65 20 41 4e 44 20 73 74 61 74  F state AND stat
1840: 75 73 20 61 72 65 20 64 65 66 69 6e 65 64 0a 20  us are defined. 
1850: 20 20 20 28 69 66 20 28 61 6e 64 20 73 74 61 74     (if (and stat
1860: 65 20 73 74 61 74 75 73 29 0a 09 28 73 71 6c 69  e status)..(sqli
1870: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22  te3:execute db "
1880: 55 50 44 41 54 45 20 74 65 73 74 73 20 53 45 54  UPDATE tests SET
1890: 20 73 74 61 74 65 3d 3f 2c 73 74 61 74 75 73 3d   state=?,status=
18a0: 3f 2c 65 76 65 6e 74 5f 74 69 6d 65 3d 73 74 72  ?,event_time=str
18b0: 66 74 69 6d 65 28 27 25 73 27 2c 27 6e 6f 77 27  ftime('%s','now'
18c0: 29 20 57 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f  ) WHERE run_id=?
18d0: 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d 3f 20   AND testname=? 
18e0: 41 4e 44 20 69 74 65 6d 5f 70 61 74 68 3d 3f 3b  AND item_path=?;
18f0: 22 20 0a 09 09 09 20 73 74 61 74 65 20 72 65 61  " .... state rea
1900: 6c 2d 73 74 61 74 75 73 20 72 75 6e 2d 69 64 20  l-status run-id 
1910: 74 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70  test-name item-p
1920: 61 74 68 29 29 0a 0a 20 20 20 20 3b 3b 20 69 66  ath))..    ;; if
1930: 20 73 74 61 74 75 73 20 69 73 20 22 41 55 54 4f   status is "AUTO
1940: 22 20 74 68 65 6e 20 63 61 6c 6c 20 72 6f 6c 6c  " then call roll
1950: 75 70 0a 20 20 20 20 28 69 66 20 28 61 6e 64 20  up.    (if (and 
1960: 74 65 73 74 2d 69 64 20 73 74 61 74 65 20 73 74  test-id state st
1970: 61 74 75 73 20 28 65 71 75 61 6c 3f 20 73 74 61  atus (equal? sta
1980: 74 75 73 20 22 41 55 54 4f 22 29 29 20 0a 09 28  tus "AUTO")) ..(
1990: 64 62 3a 74 65 73 74 2d 64 61 74 61 2d 72 6f 6c  db:test-data-rol
19a0: 6c 75 70 20 64 62 20 74 65 73 74 2d 69 64 20 73  lup db test-id s
19b0: 74 61 74 75 73 29 29 0a 0a 20 20 20 20 3b 3b 20  tatus))..    ;; 
19c0: 61 64 64 20 6d 65 74 61 64 61 74 61 20 28 6e 65  add metadata (ne
19d0: 65 64 20 74 6f 20 64 6f 20 74 68 69 73 20 77 61  ed to do this wa
19e0: 79 20 74 6f 20 61 76 6f 69 64 20 53 51 4c 20 69  y to avoid SQL i
19f0: 6e 6a 65 63 74 69 6f 6e 20 69 73 73 75 65 73 29  njection issues)
1a00: 0a 0a 20 20 20 20 3b 3b 20 3a 66 69 72 73 74 5f  ..    ;; :first_
1a10: 65 72 72 0a 20 20 20 20 3b 3b 20 28 6c 65 74 20  err.    ;; (let 
1a20: 28 28 76 61 6c 20 28 68 61 73 68 2d 74 61 62 6c  ((val (hash-tabl
1a30: 65 2d 72 65 66 2f 64 65 66 61 75 6c 74 20 6f 74  e-ref/default ot
1a40: 68 65 72 64 61 74 20 22 3a 66 69 72 73 74 5f 65  herdat ":first_e
1a50: 72 72 22 20 23 66 29 29 29 0a 20 20 20 20 3b 3b  rr" #f))).    ;;
1a60: 20 20 20 28 69 66 20 76 61 6c 0a 20 20 20 20 3b     (if val.    ;
1a70: 3b 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ;       (sqlite3
1a80: 3a 65 78 65 63 75 74 65 20 64 62 20 22 55 50 44  :execute db "UPD
1a90: 41 54 45 20 74 65 73 74 73 20 53 45 54 20 66 69  ATE tests SET fi
1aa0: 72 73 74 5f 65 72 72 3d 3f 20 57 48 45 52 45 20  rst_err=? WHERE 
1ab0: 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73  run_id=? AND tes
1ac0: 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d  tname=? AND item
1ad0: 5f 70 61 74 68 3d 3f 3b 22 20 76 61 6c 20 72 75  _path=?;" val ru
1ae0: 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69  n-id test-name i
1af0: 74 65 6d 2d 70 61 74 68 29 29 29 0a 20 20 20 20  tem-path))).    
1b00: 3b 3b 20 0a 20 20 20 20 3b 3b 20 3b 3b 20 3a 66  ;; .    ;; ;; :f
1b10: 69 72 73 74 5f 77 61 72 6e 0a 20 20 20 20 3b 3b  irst_warn.    ;;
1b20: 20 28 6c 65 74 20 28 28 76 61 6c 20 28 68 61 73   (let ((val (has
1b30: 68 2d 74 61 62 6c 65 2d 72 65 66 2f 64 65 66 61  h-table-ref/defa
1b40: 75 6c 74 20 6f 74 68 65 72 64 61 74 20 22 3a 66  ult otherdat ":f
1b50: 69 72 73 74 5f 77 61 72 6e 22 20 23 66 29 29 29  irst_warn" #f)))
1b60: 0a 20 20 20 20 3b 3b 20 20 20 28 69 66 20 76 61  .    ;;   (if va
1b70: 6c 0a 20 20 20 20 3b 3b 20 20 20 20 20 20 20 28  l.    ;;       (
1b80: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20  sqlite3:execute 
1b90: 64 62 20 22 55 50 44 41 54 45 20 74 65 73 74 73  db "UPDATE tests
1ba0: 20 53 45 54 20 66 69 72 73 74 5f 77 61 72 6e 3d   SET first_warn=
1bb0: 3f 20 57 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f  ? WHERE run_id=?
1bc0: 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d 3f 20   AND testname=? 
1bd0: 41 4e 44 20 69 74 65 6d 5f 70 61 74 68 3d 3f 3b  AND item_path=?;
1be0: 22 20 76 61 6c 20 72 75 6e 2d 69 64 20 74 65 73  " val run-id tes
1bf0: 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68  t-name item-path
1c00: 29 29 29 0a 0a 20 20 20 20 28 6c 65 74 20 28 28  )))..    (let ((
1c10: 63 61 74 65 67 6f 72 79 20 28 68 61 73 68 2d 74  category (hash-t
1c20: 61 62 6c 65 2d 72 65 66 2f 64 65 66 61 75 6c 74  able-ref/default
1c30: 20 6f 74 68 65 72 64 61 74 20 22 3a 63 61 74 65   otherdat ":cate
1c40: 67 6f 72 79 22 20 22 22 29 29 0a 09 20 20 28 76  gory" ""))..  (v
1c50: 61 72 69 61 62 6c 65 20 28 68 61 73 68 2d 74 61  ariable (hash-ta
1c60: 62 6c 65 2d 72 65 66 2f 64 65 66 61 75 6c 74 20  ble-ref/default 
1c70: 6f 74 68 65 72 64 61 74 20 22 3a 76 61 72 69 61  otherdat ":varia
1c80: 62 6c 65 22 20 22 22 29 29 0a 09 20 20 28 76 61  ble" ""))..  (va
1c90: 6c 75 65 20 20 20 20 28 68 61 73 68 2d 74 61 62  lue    (hash-tab
1ca0: 6c 65 2d 72 65 66 2f 64 65 66 61 75 6c 74 20 6f  le-ref/default o
1cb0: 74 68 65 72 64 61 74 20 22 3a 76 61 6c 75 65 22  therdat ":value"
1cc0: 20 20 20 20 23 66 29 29 0a 09 20 20 28 65 78 70      #f))..  (exp
1cd0: 65 63 74 65 64 20 28 68 61 73 68 2d 74 61 62 6c  ected (hash-tabl
1ce0: 65 2d 72 65 66 2f 64 65 66 61 75 6c 74 20 6f 74  e-ref/default ot
1cf0: 68 65 72 64 61 74 20 22 3a 65 78 70 65 63 74 65  herdat ":expecte
1d00: 64 22 20 23 66 29 29 0a 09 20 20 28 74 6f 6c 20  d" #f))..  (tol 
1d10: 20 20 20 20 20 28 68 61 73 68 2d 74 61 62 6c 65       (hash-table
1d20: 2d 72 65 66 2f 64 65 66 61 75 6c 74 20 6f 74 68  -ref/default oth
1d30: 65 72 64 61 74 20 22 3a 74 6f 6c 22 20 20 20 20  erdat ":tol"    
1d40: 20 20 23 66 29 29 0a 09 20 20 28 75 6e 69 74 73    #f))..  (units
1d50: 20 20 20 20 28 68 61 73 68 2d 74 61 62 6c 65 2d      (hash-table-
1d60: 72 65 66 2f 64 65 66 61 75 6c 74 20 6f 74 68 65  ref/default othe
1d70: 72 64 61 74 20 22 3a 75 6e 69 74 73 22 20 20 20  rdat ":units"   
1d80: 20 22 22 29 29 0a 09 20 20 28 74 79 70 65 20 20   ""))..  (type  
1d90: 20 20 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 72     (hash-table-r
1da0: 65 66 2f 64 65 66 61 75 6c 74 20 6f 74 68 65 72  ef/default other
1db0: 64 61 74 20 22 3a 74 79 70 65 22 20 20 20 20 20  dat ":type"     
1dc0: 22 22 29 29 0a 09 20 20 28 64 63 6f 6d 6d 65 6e  ""))..  (dcommen
1dd0: 74 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 72 65  t (hash-table-re
1de0: 66 2f 64 65 66 61 75 6c 74 20 6f 74 68 65 72 64  f/default otherd
1df0: 61 74 20 22 3a 63 6f 6d 6d 65 6e 74 22 20 20 22  at ":comment"  "
1e00: 22 29 29 29 0a 20 20 20 20 20 20 28 64 65 62 75  "))).      (debu
1e10: 67 3a 70 72 69 6e 74 20 34 20 0a 09 09 20 20 20  g:print 4 ...   
1e20: 22 63 61 74 65 67 6f 72 79 3a 20 22 20 63 61 74  "category: " cat
1e30: 65 67 6f 72 79 20 22 2c 20 76 61 72 69 61 62 6c  egory ", variabl
1e40: 65 3a 20 22 20 76 61 72 69 61 62 6c 65 20 22 2c  e: " variable ",
1e50: 20 76 61 6c 75 65 3a 20 22 20 76 61 6c 75 65 0a   value: " value.
1e60: 09 09 20 20 20 22 2c 20 65 78 70 65 63 74 65 64  ..   ", expected
1e70: 3a 20 22 20 65 78 70 65 63 74 65 64 20 22 2c 20  : " expected ", 
1e80: 74 6f 6c 3a 20 22 20 74 6f 6c 20 22 2c 20 75 6e  tol: " tol ", un
1e90: 69 74 73 3a 20 22 20 75 6e 69 74 73 29 0a 20 20  its: " units).  
1ea0: 20 20 20 20 28 69 66 20 28 61 6e 64 20 76 61 6c      (if (and val
1eb0: 75 65 20 65 78 70 65 63 74 65 64 20 74 6f 6c 29  ue expected tol)
1ec0: 20 3b 3b 20 61 6c 6c 20 74 68 72 65 65 20 72 65   ;; all three re
1ed0: 71 75 69 72 65 64 0a 09 20 20 28 64 62 3a 63 73  quired..  (db:cs
1ee0: 76 2d 3e 74 65 73 74 2d 64 61 74 61 20 64 62 20  v->test-data db 
1ef0: 74 65 73 74 2d 69 64 20 0a 09 09 09 20 20 20 20  test-id ....    
1f00: 20 28 63 6f 6e 63 20 63 61 74 65 67 6f 72 79 20   (conc category 
1f10: 22 2c 22 0a 09 09 09 09 20 20 20 76 61 72 69 61  ",".....   varia
1f20: 62 6c 65 20 22 2c 22 0a 09 09 09 09 20 20 20 76  ble ",".....   v
1f30: 61 6c 75 65 20 20 20 20 22 2c 22 0a 09 09 09 09  alue    ",".....
1f40: 20 20 20 65 78 70 65 63 74 65 64 20 22 2c 22 0a     expected ",".
1f50: 09 09 09 09 20 20 20 74 6f 6c 20 20 20 20 20 20  ....   tol      
1f60: 22 2c 22 0a 09 09 09 09 20 20 20 75 6e 69 74 73  ",".....   units
1f70: 20 20 20 20 22 2c 22 0a 09 09 09 09 20 20 20 64      ",".....   d
1f80: 63 6f 6d 6d 65 6e 74 20 22 2c 2c 22 20 3b 3b 20  comment ",," ;; 
1f90: 65 78 74 72 61 20 63 6f 6d 6d 61 20 66 6f 72 20  extra comma for 
1fa0: 73 74 61 74 75 73 0a 09 09 09 09 20 20 20 74 79  status.....   ty
1fb0: 70 65 20 20 20 20 20 29 29 29 29 0a 09 09 09 09  pe     )))).....
1fc0: 20 20 20 0a 20 20 20 20 3b 3b 20 6e 65 65 64 20     .    ;; need 
1fd0: 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 74 6f  to update the to
1fe0: 70 20 74 65 73 74 20 72 65 63 6f 72 64 20 69 66  p test record if
1ff0: 20 50 41 53 53 20 6f 72 20 46 41 49 4c 20 61 6e   PASS or FAIL an
2000: 64 20 74 68 69 73 20 69 73 20 61 20 73 75 62 74  d this is a subt
2010: 65 73 74 0a 20 20 20 20 28 69 66 20 28 61 6e 64  est.    (if (and
2020: 20 28 6e 6f 74 20 28 65 71 75 61 6c 3f 20 69 74   (not (equal? it
2030: 65 6d 2d 70 61 74 68 20 22 22 29 29 0a 09 20 20  em-path ""))..  
2040: 20 20 20 28 6f 72 20 28 65 71 75 61 6c 3f 20 73     (or (equal? s
2050: 74 61 74 75 73 20 22 50 41 53 53 22 29 0a 09 09  tatus "PASS")...
2060: 20 28 65 71 75 61 6c 3f 20 73 74 61 74 75 73 20   (equal? status 
2070: 22 57 41 52 4e 22 29 0a 09 09 20 28 65 71 75 61  "WARN")... (equa
2080: 6c 3f 20 73 74 61 74 75 73 20 22 46 41 49 4c 22  l? status "FAIL"
2090: 29 0a 09 09 20 28 65 71 75 61 6c 3f 20 73 74 61  )... (equal? sta
20a0: 74 75 73 20 22 57 41 49 56 45 44 22 29 0a 09 09  tus "WAIVED")...
20b0: 20 28 65 71 75 61 6c 3f 20 73 74 61 74 75 73 20   (equal? status 
20c0: 22 52 55 4e 4e 49 4e 47 22 29 29 29 0a 09 28 62  "RUNNING")))..(b
20d0: 65 67 69 6e 0a 09 20 20 28 73 71 6c 69 74 65 33  egin..  (sqlite3
20e0: 3a 65 78 65 63 75 74 65 20 0a 09 20 20 20 64 62  :execute ..   db
20f0: 0a 09 20 20 20 22 55 50 44 41 54 45 20 74 65 73  ..   "UPDATE tes
2100: 74 73 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ts .            
2110: 20 53 45 54 20 66 61 69 6c 5f 63 6f 75 6e 74 3d   SET fail_count=
2120: 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 69 64  (SELECT count(id
2130: 29 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45  ) FROM tests WHE
2140: 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20  RE run_id=? AND 
2150: 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69  testname=? AND i
2160: 74 65 6d 5f 70 61 74 68 20 21 3d 20 27 27 20 41  tem_path != '' A
2170: 4e 44 20 73 74 61 74 75 73 3d 27 46 41 49 4c 27  ND status='FAIL'
2180: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
2190: 20 20 20 20 70 61 73 73 5f 63 6f 75 6e 74 3d 28      pass_count=(
21a0: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 69 64 29  SELECT count(id)
21b0: 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52   FROM tests WHER
21c0: 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74  E run_id=? AND t
21d0: 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 74  estname=? AND it
21e0: 65 6d 5f 70 61 74 68 20 21 3d 20 27 27 20 41 4e  em_path != '' AN
21f0: 44 20 28 73 74 61 74 75 73 3d 27 50 41 53 53 27  D (status='PASS'
2200: 20 4f 52 20 73 74 61 74 75 73 3d 27 57 41 52 4e   OR status='WARN
2210: 27 20 4f 52 20 73 74 61 74 75 73 3d 27 57 41 49  ' OR status='WAI
2220: 56 45 44 27 29 29 0a 20 20 20 20 20 20 20 20 20  VED')).         
2230: 20 20 20 20 57 48 45 52 45 20 72 75 6e 5f 69 64      WHERE run_id
2240: 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d  =? AND testname=
2250: 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 68 3d  ? AND item_path=
2260: 27 27 3b 22 0a 09 20 20 20 72 75 6e 2d 69 64 20  '';"..   run-id 
2270: 74 65 73 74 2d 6e 61 6d 65 20 72 75 6e 2d 69 64  test-name run-id
2280: 20 74 65 73 74 2d 6e 61 6d 65 20 72 75 6e 2d 69   test-name run-i
2290: 64 20 74 65 73 74 2d 6e 61 6d 65 29 0a 09 20 20  d test-name)..  
22a0: 28 69 66 20 28 65 71 75 61 6c 3f 20 73 74 61 74  (if (equal? stat
22b0: 75 73 20 22 52 55 4e 4e 49 4e 47 22 29 20 3b 3b  us "RUNNING") ;;
22c0: 20 72 75 6e 6e 69 6e 67 20 74 61 6b 65 73 20 70   running takes p
22d0: 72 69 6f 72 69 74 79 20 6f 76 65 72 20 61 6c 6c  riority over all
22e0: 20 6f 74 68 65 72 20 73 74 61 74 65 73 2c 20 66   other states, f
22f0: 6f 72 63 65 20 74 68 65 20 74 65 73 74 20 73 74  orce the test st
2300: 61 74 65 20 74 6f 20 52 55 4e 4e 49 4e 47 0a 09  ate to RUNNING..
2310: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65        (sqlite3:e
2320: 78 65 63 75 74 65 20 64 62 20 22 55 50 44 41 54  xecute db "UPDAT
2330: 45 20 74 65 73 74 73 20 53 45 54 20 73 74 61 74  E tests SET stat
2340: 65 3d 3f 20 57 48 45 52 45 20 72 75 6e 5f 69 64  e=? WHERE run_id
2350: 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d  =? AND testname=
2360: 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 68 3d  ? AND item_path=
2370: 27 27 3b 22 20 22 52 55 4e 4e 49 4e 47 22 20 72  '';" "RUNNING" r
2380: 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 29  un-id test-name)
2390: 0a 09 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ..      (sqlite3
23a0: 3a 65 78 65 63 75 74 65 0a 09 20 20 20 20 20 20  :execute..      
23b0: 20 64 62 0a 09 20 20 20 20 20 20 20 22 55 50 44   db..       "UPD
23c0: 41 54 45 20 74 65 73 74 73 0a 20 20 20 20 20 20  ATE tests.      
23d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e0: 20 53 45 54 20 73 74 61 74 65 3d 43 41 53 45 20   SET state=CASE 
23f0: 57 48 45 4e 20 28 53 45 4c 45 43 54 20 63 6f 75  WHEN (SELECT cou
2400: 6e 74 28 69 64 29 20 46 52 4f 4d 20 74 65 73 74  nt(id) FROM test
2410: 73 20 57 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f  s WHERE run_id=?
2420: 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d 3f 20   AND testname=? 
2430: 41 4e 44 20 69 74 65 6d 5f 70 61 74 68 20 21 3d  AND item_path !=
2440: 20 27 27 20 41 4e 44 20 73 74 61 74 65 20 69 6e   '' AND state in
2450: 20 28 27 52 55 4e 4e 49 4e 47 27 2c 27 4e 4f 54   ('RUNNING','NOT
2460: 5f 53 54 41 52 54 45 44 27 29 29 20 3e 20 30 20  _STARTED')) > 0 
2470: 54 48 45 4e 20 0a 20 20 20 20 20 20 20 20 20 20  THEN .          
2480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2490: 27 52 55 4e 4e 49 4e 47 27 0a 20 20 20 20 20 20  'RUNNING'.      
24a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b0: 20 45 4c 53 45 20 27 43 4f 4d 50 4c 45 54 45 44   ELSE 'COMPLETED
24c0: 27 20 45 4e 44 2c 0a 20 20 20 20 20 20 20 20 20  ' END,.         
24d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e0: 20 73 74 61 74 75 73 3d 43 41 53 45 20 57 48 45   status=CASE WHE
24f0: 4e 20 66 61 69 6c 5f 63 6f 75 6e 74 20 3e 20 30  N fail_count > 0
2500: 20 54 48 45 4e 20 27 46 41 49 4c 27 20 57 48 45   THEN 'FAIL' WHE
2510: 4e 20 70 61 73 73 5f 63 6f 75 6e 74 20 3e 20 30  N pass_count > 0
2520: 20 41 4e 44 20 66 61 69 6c 5f 63 6f 75 6e 74 3d   AND fail_count=
2530: 30 20 54 48 45 4e 20 27 50 41 53 53 27 20 45 4c  0 THEN 'PASS' EL
2540: 53 45 20 27 55 4e 4b 4e 4f 57 4e 27 20 45 4e 44  SE 'UNKNOWN' END
2550: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2560: 20 20 20 20 20 20 20 20 57 48 45 52 45 20 72 75          WHERE ru
2570: 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e  n_id=? AND testn
2580: 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70  ame=? AND item_p
2590: 61 74 68 3d 27 27 3b 22 0a 09 20 20 20 20 20 20  ath='';"..      
25a0: 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d   run-id test-nam
25b0: 65 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61  e run-id test-na
25c0: 6d 65 29 29 29 29 0a 20 20 20 20 28 69 66 20 28  me)))).    (if (
25d0: 6f 72 20 28 61 6e 64 20 28 73 74 72 69 6e 67 3f  or (and (string?
25e0: 20 63 6f 6d 6d 65 6e 74 29 0a 09 09 20 28 73 74   comment)... (st
25f0: 72 69 6e 67 2d 6d 61 74 63 68 20 28 72 65 67 65  ring-match (rege
2600: 78 70 20 22 5c 5c 53 2b 22 29 20 63 6f 6d 6d 65  xp "\\S+") comme
2610: 6e 74 29 29 0a 09 20 20 20 20 77 61 69 76 65 64  nt))..    waived
2620: 29 0a 09 28 73 71 6c 69 74 65 33 3a 65 78 65 63  )..(sqlite3:exec
2630: 75 74 65 20 64 62 20 22 55 50 44 41 54 45 20 74  ute db "UPDATE t
2640: 65 73 74 73 20 53 45 54 20 63 6f 6d 6d 65 6e 74  ests SET comment
2650: 3d 3f 20 57 48 45 52 45 20 72 75 6e 5f 69 64 3d  =? WHERE run_id=
2660: 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d 3f  ? AND testname=?
2670: 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 68 3d 3f   AND item_path=?
2680: 3b 22 0a 09 09 09 20 28 69 66 20 77 61 69 76 65  ;".... (if waive
2690: 64 20 77 61 69 76 65 64 20 63 6f 6d 6d 65 6e 74  d waived comment
26a0: 29 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61  ) run-id test-na
26b0: 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 29 0a 20  me item-path)). 
26c0: 20 20 20 29 29 0a 0a 28 64 65 66 69 6e 65 20 28     ))..(define (
26d0: 74 65 73 74 2d 73 65 74 2d 6c 6f 67 21 20 64 62  test-set-log! db
26e0: 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d   run-id test-nam
26f0: 65 20 69 74 65 6d 64 61 74 20 6c 6f 67 66 29 20  e itemdat logf) 
2700: 0a 20 20 28 6c 65 74 20 28 28 69 74 65 6d 2d 70  .  (let ((item-p
2710: 61 74 68 20 28 69 74 65 6d 2d 6c 69 73 74 2d 3e  ath (item-list->
2720: 70 61 74 68 20 69 74 65 6d 64 61 74 29 29 29 0a  path itemdat))).
2730: 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65      (sqlite3:exe
2740: 63 75 74 65 20 64 62 20 22 55 50 44 41 54 45 20  cute db "UPDATE 
2750: 74 65 73 74 73 20 53 45 54 20 66 69 6e 61 6c 5f  tests SET final_
2760: 6c 6f 67 66 3d 3f 20 57 48 45 52 45 20 72 75 6e  logf=? WHERE run
2770: 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61  _id=? AND testna
2780: 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61  me=? AND item_pa
2790: 74 68 3d 3f 3b 22 20 0a 09 09 20 20 20 20 20 6c  th=?;" ...     l
27a0: 6f 67 66 20 72 75 6e 2d 69 64 20 74 65 73 74 2d  ogf run-id test-
27b0: 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 29  name item-path))
27c0: 29 0a 0a 28 64 65 66 69 6e 65 20 28 74 65 73 74  )..(define (test
27d0: 2d 73 65 74 2d 74 6f 70 6c 6f 67 21 20 64 62 20  -set-toplog! db 
27e0: 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65  run-id test-name
27f0: 20 6c 6f 67 66 29 20 0a 20 20 28 73 71 6c 69 74   logf) .  (sqlit
2800: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 55  e3:execute db "U
2810: 50 44 41 54 45 20 74 65 73 74 73 20 53 45 54 20  PDATE tests SET 
2820: 66 69 6e 61 6c 5f 6c 6f 67 66 3d 3f 20 57 48 45  final_logf=? WHE
2830: 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20  RE run_id=? AND 
2840: 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69  testname=? AND i
2850: 74 65 6d 5f 70 61 74 68 3d 27 27 3b 22 20 0a 09  tem_path='';" ..
2860: 09 20 20 20 6c 6f 67 66 20 72 75 6e 2d 69 64 20  .   logf run-id 
2870: 74 65 73 74 2d 6e 61 6d 65 29 29 0a 0a 28 64 65  test-name))..(de
2880: 66 69 6e 65 20 28 74 65 73 74 73 3a 73 75 6d 6d  fine (tests:summ
2890: 61 72 69 7a 65 2d 69 74 65 6d 73 20 64 62 20 72  arize-items db r
28a0: 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20  un-id test-name 
28b0: 66 6f 72 63 65 29 0a 20 20 3b 3b 20 69 66 20 6e  force).  ;; if n
28c0: 6f 74 20 66 6f 72 63 65 20 74 68 65 6e 20 6f 6e  ot force then on
28d0: 6c 79 20 75 70 64 61 74 65 20 74 68 65 20 72 65  ly update the re
28e0: 63 6f 72 64 20 69 66 20 6f 6e 65 20 6f 66 20 74  cord if one of t
28f0: 68 65 73 65 20 69 73 20 74 72 75 65 3a 0a 20 20  hese is true:.  
2900: 3b 3b 20 20 20 31 2e 20 6c 6f 67 66 20 69 73 20  ;;   1. logf is 
2910: 22 6c 6f 67 2f 66 69 6e 61 6c 2e 6c 6f 67 0a 20  "log/final.log. 
2920: 20 3b 3b 20 20 20 32 2e 20 6c 6f 67 66 20 69 73   ;;   2. logf is
2930: 20 73 61 6d 65 20 61 73 20 6f 75 74 70 75 74 66   same as outputf
2940: 69 6c 65 6e 61 6d 65 0a 20 20 28 6c 65 74 20 28  ilename.  (let (
2950: 28 6f 75 74 70 75 74 66 69 6c 65 6e 61 6d 65 20  (outputfilename 
2960: 28 63 6f 6e 63 20 22 6d 65 67 61 74 65 73 74 2d  (conc "megatest-
2970: 72 6f 6c 6c 75 70 2d 22 20 74 65 73 74 2d 6e 61  rollup-" test-na
2980: 6d 65 20 22 2e 68 74 6d 6c 22 29 29 0a 09 28 6f  me ".html"))..(o
2990: 72 69 67 2d 64 69 72 20 20 20 20 20 20 20 28 63  rig-dir       (c
29a0: 75 72 72 65 6e 74 2d 64 69 72 65 63 74 6f 72 79  urrent-directory
29b0: 29 29 0a 09 28 6c 6f 67 66 20 20 20 20 20 20 20  ))..(logf       
29c0: 20 20 20 20 23 66 29 29 0a 20 20 20 20 28 73 71      #f)).    (sq
29d0: 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72  lite3:for-each-r
29e0: 6f 77 20 0a 20 20 20 20 20 28 6c 61 6d 62 64 61  ow .     (lambda
29f0: 20 28 70 61 74 68 20 66 69 6e 61 6c 5f 6c 6f 67   (path final_log
2a00: 66 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 20  f).       (set! 
2a10: 6c 6f 67 66 20 66 69 6e 61 6c 5f 6c 6f 67 66 29  logf final_logf)
2a20: 0a 20 20 20 20 20 20 20 28 69 66 20 28 64 69 72  .       (if (dir
2a30: 65 63 74 6f 72 79 3f 20 70 61 74 68 29 0a 09 20  ectory? path).. 
2a40: 20 20 28 62 65 67 69 6e 0a 09 20 20 20 20 20 28    (begin..     (
2a50: 70 72 69 6e 74 20 22 46 6f 75 6e 64 20 70 61 74  print "Found pat
2a60: 68 3a 20 22 20 70 61 74 68 29 0a 09 20 20 20 20  h: " path)..    
2a70: 20 28 63 68 61 6e 67 65 2d 64 69 72 65 63 74 6f   (change-directo
2a80: 72 79 20 70 61 74 68 29 29 0a 09 20 20 20 20 20  ry path))..     
2a90: 3b 3b 20 28 73 65 74 21 20 6f 75 74 70 75 74 66  ;; (set! outputf
2aa0: 69 6c 65 6e 61 6d 65 20 28 63 6f 6e 63 20 70 61  ilename (conc pa
2ab0: 74 68 20 22 2f 22 20 6f 75 74 70 75 74 66 69 6c  th "/" outputfil
2ac0: 65 6e 61 6d 65 29 29 29 0a 09 20 20 20 28 70 72  ename)))..   (pr
2ad0: 69 6e 74 20 22 4e 6f 20 73 75 63 68 20 70 61 74  int "No such pat
2ae0: 68 3a 20 22 20 70 61 74 68 29 29 29 0a 20 20 20  h: " path))).   
2af0: 20 20 64 62 20 0a 20 20 20 20 20 22 53 45 4c 45    db .     "SELE
2b00: 43 54 20 72 75 6e 64 69 72 2c 66 69 6e 61 6c 5f  CT rundir,final_
2b10: 6c 6f 67 66 20 46 52 4f 4d 20 74 65 73 74 73 20  logf FROM tests 
2b20: 57 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41  WHERE run_id=? A
2b30: 4e 44 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e  ND testname=? AN
2b40: 44 20 69 74 65 6d 5f 70 61 74 68 3d 27 27 3b 22  D item_path='';"
2b50: 0a 20 20 20 20 20 72 75 6e 2d 69 64 20 74 65 73  .     run-id tes
2b60: 74 2d 6e 61 6d 65 29 0a 20 20 20 20 28 70 72 69  t-name).    (pri
2b70: 6e 74 20 22 73 75 6d 6d 61 72 69 7a 65 2d 69 74  nt "summarize-it
2b80: 65 6d 73 20 77 69 74 68 20 6c 6f 67 66 20 22 20  ems with logf " 
2b90: 6c 6f 67 66 29 0a 20 20 20 20 28 69 66 20 28 6f  logf).    (if (o
2ba0: 72 20 28 65 71 75 61 6c 3f 20 6c 6f 67 66 20 22  r (equal? logf "
2bb0: 6c 6f 67 73 2f 66 69 6e 61 6c 2e 6c 6f 67 22 29  logs/final.log")
2bc0: 0a 09 20 20 20 20 28 65 71 75 61 6c 3f 20 6c 6f  ..    (equal? lo
2bd0: 67 66 20 6f 75 74 70 75 74 66 69 6c 65 6e 61 6d  gf outputfilenam
2be0: 65 29 0a 09 20 20 20 20 66 6f 72 63 65 29 0a 09  e)..    force)..
2bf0: 28 62 65 67 69 6e 0a 09 20 20 28 69 66 20 28 6f  (begin..  (if (o
2c00: 62 74 61 69 6e 2d 64 6f 74 2d 6c 6f 63 6b 20 6f  btain-dot-lock o
2c10: 75 74 70 75 74 66 69 6c 65 6e 61 6d 65 20 31 20  utputfilename 1 
2c20: 32 30 20 33 30 29 20 3b 3b 20 72 65 74 72 79 20  20 30) ;; retry 
2c30: 65 76 65 72 79 20 73 65 63 6f 6e 64 20 66 6f 72  every second for
2c40: 20 32 30 20 73 65 63 6f 6e 64 73 2c 20 63 61 6c   20 seconds, cal
2c50: 6c 20 69 74 20 64 65 61 64 20 61 66 74 65 72 20  l it dead after 
2c60: 33 30 20 73 65 63 6f 6e 64 73 20 61 6e 64 20 73  30 seconds and s
2c70: 74 65 61 6c 20 74 68 65 20 6c 6f 63 6b 0a 09 20  teal the lock.. 
2c80: 20 20 20 20 20 28 70 72 69 6e 74 20 22 4f 62 74       (print "Obt
2c90: 61 69 6e 65 64 20 6c 6f 63 6b 20 66 6f 72 20 22  ained lock for "
2ca0: 20 6f 75 74 70 75 74 66 69 6c 65 6e 61 6d 65 29   outputfilename)
2cb0: 0a 09 20 20 20 20 20 20 28 70 72 69 6e 74 20 22  ..      (print "
2cc0: 46 61 69 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e  Failed to obtain
2cd0: 20 6c 6f 63 6b 20 66 6f 72 20 22 20 6f 75 74 70   lock for " outp
2ce0: 75 74 66 69 6c 65 6e 61 6d 65 29 29 0a 09 20 20  utfilename))..  
2cf0: 28 6c 65 74 20 28 28 6f 75 70 20 20 20 20 28 6f  (let ((oup    (o
2d00: 70 65 6e 2d 6f 75 74 70 75 74 2d 66 69 6c 65 20  pen-output-file 
2d10: 6f 75 74 70 75 74 66 69 6c 65 6e 61 6d 65 29 29  outputfilename))
2d20: 0a 09 09 28 63 6f 75 6e 74 73 20 28 6d 61 6b 65  ...(counts (make
2d30: 2d 68 61 73 68 2d 74 61 62 6c 65 29 29 0a 09 09  -hash-table))...
2d40: 28 73 74 61 74 65 63 6f 75 6e 74 73 20 28 6d 61  (statecounts (ma
2d50: 6b 65 2d 68 61 73 68 2d 74 61 62 6c 65 29 29 0a  ke-hash-table)).
2d60: 09 09 28 6f 75 74 74 78 74 20 22 22 29 0a 09 09  ..(outtxt "")...
2d70: 28 74 6f 74 20 20 20 20 30 29 29 0a 09 20 20 20  (tot    0))..   
2d80: 20 28 77 69 74 68 2d 6f 75 74 70 75 74 2d 74 6f   (with-output-to
2d90: 2d 70 6f 72 74 0a 09 09 6f 75 70 0a 09 20 20 20  -port...oup..   
2da0: 20 20 20 28 6c 61 6d 62 64 61 20 28 29 0a 09 09     (lambda ()...
2db0: 28 73 65 74 21 20 6f 75 74 74 78 74 20 28 63 6f  (set! outtxt (co
2dc0: 6e 63 20 6f 75 74 74 78 74 20 22 3c 68 74 6d 6c  nc outtxt "<html
2dd0: 3e 3c 74 69 74 6c 65 3e 53 75 6d 6d 61 72 79 3a  ><title>Summary:
2de0: 20 22 20 74 65 73 74 2d 6e 61 6d 65 20 0a 09 09   " test-name ...
2df0: 09 09 20 20 20 22 3c 2f 74 69 74 6c 65 3e 3c 62  ..   "</title><b
2e00: 6f 64 79 3e 3c 68 32 3e 53 75 6d 6d 61 72 79 20  ody><h2>Summary 
2e10: 66 6f 72 20 22 20 74 65 73 74 2d 6e 61 6d 65 20  for " test-name 
2e20: 22 3c 2f 68 32 3e 22 29 29 0a 09 09 28 73 71 6c  "</h2>"))...(sql
2e30: 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f  ite3:for-each-ro
2e40: 77 20 0a 09 09 20 28 6c 61 6d 62 64 61 20 28 69  w ... (lambda (i
2e50: 64 20 69 74 65 6d 70 61 74 68 20 73 74 61 74 65  d itempath state
2e60: 20 73 74 61 74 75 73 20 72 75 6e 5f 64 75 72 61   status run_dura
2e70: 74 69 6f 6e 20 6c 6f 67 66 20 63 6f 6d 6d 65 6e  tion logf commen
2e80: 74 29 0a 09 09 20 20 20 28 68 61 73 68 2d 74 61  t)...   (hash-ta
2e90: 62 6c 65 2d 73 65 74 21 20 63 6f 75 6e 74 73 20  ble-set! counts 
2ea0: 73 74 61 74 75 73 20 28 2b 20 31 20 28 68 61 73  status (+ 1 (has
2eb0: 68 2d 74 61 62 6c 65 2d 72 65 66 2f 64 65 66 61  h-table-ref/defa
2ec0: 75 6c 74 20 63 6f 75 6e 74 73 20 73 74 61 74 75  ult counts statu
2ed0: 73 20 30 29 29 29 0a 09 09 20 20 20 28 68 61 73  s 0)))...   (has
2ee0: 68 2d 74 61 62 6c 65 2d 73 65 74 21 20 73 74 61  h-table-set! sta
2ef0: 74 65 63 6f 75 6e 74 73 20 73 74 61 74 65 20 28  tecounts state (
2f00: 2b 20 31 20 28 68 61 73 68 2d 74 61 62 6c 65 2d  + 1 (hash-table-
2f10: 72 65 66 2f 64 65 66 61 75 6c 74 20 73 74 61 74  ref/default stat
2f20: 65 63 6f 75 6e 74 73 20 73 74 61 74 65 20 30 29  ecounts state 0)
2f30: 29 29 0a 09 09 20 20 20 28 73 65 74 21 20 6f 75  ))...   (set! ou
2f40: 74 74 78 74 20 28 63 6f 6e 63 20 6f 75 74 74 78  ttxt (conc outtx
2f50: 74 20 22 3c 74 72 3e 22 0a 09 09 09 09 20 20 20  t "<tr>".....   
2f60: 20 20 20 22 3c 74 64 3e 3c 61 20 68 72 65 66 3d     "<td><a href=
2f70: 5c 22 22 20 69 74 65 6d 70 61 74 68 20 22 2f 22  \"" itempath "/"
2f80: 20 6c 6f 67 66 20 22 5c 22 3e 20 22 20 69 74 65   logf "\"> " ite
2f90: 6d 70 61 74 68 20 22 3c 2f 61 3e 3c 2f 74 64 3e  mpath "</a></td>
2fa0: 22 20 0a 09 09 09 09 20 20 20 20 20 20 22 3c 74  " .....      "<t
2fb0: 64 3e 22 20 73 74 61 74 65 20 20 20 20 22 3c 2f  d>" state    "</
2fc0: 74 64 3e 22 20 0a 09 09 09 09 20 20 20 20 20 20  td>" .....      
2fd0: 22 3c 74 64 3e 3c 66 6f 6e 74 20 63 6f 6c 6f 72  "<td><font color
2fe0: 3d 22 20 28 63 6f 6d 6d 6f 6e 3a 67 65 74 2d 63  =" (common:get-c
2ff0: 6f 6c 6f 72 2d 66 72 6f 6d 2d 73 74 61 74 75 73  olor-from-status
3000: 20 73 74 61 74 75 73 29 0a 09 09 09 09 20 20 20   status).....   
3010: 20 20 20 22 3e 22 20 20 20 73 74 61 74 75 73 20     ">"   status 
3020: 20 20 22 3c 2f 66 6f 6e 74 3e 3c 2f 74 64 3e 22    "</font></td>"
3030: 0a 09 09 09 09 20 20 20 20 20 20 22 3c 74 64 3e  .....      "<td>
3040: 22 20 28 69 66 20 28 65 71 75 61 6c 3f 20 63 6f  " (if (equal? co
3050: 6d 6d 65 6e 74 20 22 22 29 0a 09 09 09 09 09 09  mment "").......
3060: 20 22 26 6e 62 73 70 3b 22 0a 09 09 09 09 09 09   "&nbsp;".......
3070: 20 63 6f 6d 6d 65 6e 74 29 20 22 3c 2f 74 64 3e   comment) "</td>
3080: 22 0a 09 09 09 09 09 09 20 22 3c 2f 74 72 3e 22  "....... "</tr>"
3090: 29 29 29 0a 09 09 20 64 62 0a 09 09 20 22 53 45  )))... db... "SE
30a0: 4c 45 43 54 20 69 64 2c 69 74 65 6d 5f 70 61 74  LECT id,item_pat
30b0: 68 2c 73 74 61 74 65 2c 73 74 61 74 75 73 2c 72  h,state,status,r
30c0: 75 6e 5f 64 75 72 61 74 69 6f 6e 2c 66 69 6e 61  un_duration,fina
30d0: 6c 5f 6c 6f 67 66 2c 63 6f 6d 6d 65 6e 74 20 46  l_logf,comment F
30e0: 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45 20  ROM tests WHERE 
30f0: 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73  run_id=? AND tes
3100: 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d  tname=? AND item
3110: 5f 70 61 74 68 20 21 3d 20 27 27 3b 22 0a 09 09  _path != '';"...
3120: 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d   run-id test-nam
3130: 65 29 0a 0a 09 09 28 70 72 69 6e 74 20 22 3c 74  e)....(print "<t
3140: 61 62 6c 65 3e 3c 74 72 3e 3c 74 64 20 76 61 6c  able><tr><td val
3150: 69 67 6e 3d 5c 22 74 6f 70 5c 22 3e 22 29 0a 09  ign=\"top\">")..
3160: 09 3b 3b 20 50 72 69 6e 74 20 6f 75 74 20 73 74  .;; Print out st
3170: 61 74 73 20 66 6f 72 20 73 74 61 74 75 73 0a 09  ats for status..
3180: 09 28 73 65 74 21 20 74 6f 74 20 30 29 0a 09 09  .(set! tot 0)...
3190: 28 70 72 69 6e 74 20 22 3c 74 61 62 6c 65 20 63  (print "<table c
31a0: 65 6c 6c 73 70 61 63 69 6e 67 3d 5c 22 30 5c 22  ellspacing=\"0\"
31b0: 20 62 6f 72 64 65 72 3d 5c 22 31 5c 22 3e 3c 74   border=\"1\"><t
31c0: 72 3e 3c 74 64 20 63 6f 6c 73 70 61 6e 3d 5c 22  r><td colspan=\"
31d0: 32 5c 22 3e 3c 68 32 3e 53 74 61 74 65 20 73 74  2\"><h2>State st
31e0: 61 74 73 3c 2f 68 32 3e 3c 2f 74 64 3e 3c 2f 74  ats</h2></td></t
31f0: 72 3e 22 29 0a 09 09 28 66 6f 72 2d 65 61 63 68  r>")...(for-each
3200: 20 28 6c 61 6d 62 64 61 20 28 73 74 61 74 65 29   (lambda (state)
3210: 0a 09 09 09 20 20 20 20 28 73 65 74 21 20 74 6f  ....    (set! to
3220: 74 20 28 2b 20 74 6f 74 20 28 68 61 73 68 2d 74  t (+ tot (hash-t
3230: 61 62 6c 65 2d 72 65 66 20 73 74 61 74 65 63 6f  able-ref stateco
3240: 75 6e 74 73 20 73 74 61 74 65 29 29 29 0a 09 09  unts state)))...
3250: 09 20 20 20 20 28 70 72 69 6e 74 20 22 3c 74 72  .    (print "<tr
3260: 3e 3c 74 64 3e 22 20 73 74 61 74 65 20 22 3c 2f  ><td>" state "</
3270: 74 64 3e 3c 74 64 3e 22 20 28 68 61 73 68 2d 74  td><td>" (hash-t
3280: 61 62 6c 65 2d 72 65 66 20 73 74 61 74 65 63 6f  able-ref stateco
3290: 75 6e 74 73 20 73 74 61 74 65 29 20 22 3c 2f 74  unts state) "</t
32a0: 64 3e 3c 2f 74 72 3e 22 29 29 0a 09 09 09 20 20  d></tr>"))....  
32b0: 28 68 61 73 68 2d 74 61 62 6c 65 2d 6b 65 79 73  (hash-table-keys
32c0: 20 73 74 61 74 65 63 6f 75 6e 74 73 29 29 0a 09   statecounts))..
32d0: 09 28 70 72 69 6e 74 20 22 3c 74 72 3e 3c 74 64  .(print "<tr><td
32e0: 3e 54 6f 74 61 6c 3c 2f 74 64 3e 3c 74 64 3e 22  >Total</td><td>"
32f0: 20 74 6f 74 20 22 3c 2f 74 64 3e 3c 2f 74 72 3e   tot "</td></tr>
3300: 3c 2f 74 61 62 6c 65 3e 22 29 0a 09 09 28 70 72  </table>")...(pr
3310: 69 6e 74 20 22 3c 2f 74 64 3e 3c 74 64 20 76 61  int "</td><td va
3320: 6c 69 67 6e 3d 5c 22 74 6f 70 5c 22 3e 22 29 0a  lign=\"top\">").
3330: 09 09 3b 3b 20 50 72 69 6e 74 20 6f 75 74 20 73  ..;; Print out s
3340: 74 61 74 73 20 66 6f 72 20 73 74 61 74 65 0a 09  tats for state..
3350: 09 28 73 65 74 21 20 74 6f 74 20 30 29 0a 09 09  .(set! tot 0)...
3360: 28 70 72 69 6e 74 20 22 3c 74 61 62 6c 65 20 63  (print "<table c
3370: 65 6c 6c 73 70 61 63 69 6e 67 3d 5c 22 30 5c 22  ellspacing=\"0\"
3380: 20 62 6f 72 64 65 72 3d 5c 22 31 5c 22 3e 3c 74   border=\"1\"><t
3390: 72 3e 3c 74 64 20 63 6f 6c 73 70 61 6e 3d 5c 22  r><td colspan=\"
33a0: 32 5c 22 3e 3c 68 32 3e 53 74 61 74 75 73 20 73  2\"><h2>Status s
33b0: 74 61 74 73 3c 2f 68 32 3e 3c 2f 74 64 3e 3c 2f  tats</h2></td></
33c0: 74 72 3e 22 29 0a 09 09 28 66 6f 72 2d 65 61 63  tr>")...(for-eac
33d0: 68 20 28 6c 61 6d 62 64 61 20 28 73 74 61 74 75  h (lambda (statu
33e0: 73 29 0a 09 09 09 20 20 20 20 28 73 65 74 21 20  s)....    (set! 
33f0: 74 6f 74 20 28 2b 20 74 6f 74 20 28 68 61 73 68  tot (+ tot (hash
3400: 2d 74 61 62 6c 65 2d 72 65 66 20 63 6f 75 6e 74  -table-ref count
3410: 73 20 73 74 61 74 75 73 29 29 29 0a 09 09 09 20  s status))).... 
3420: 20 20 20 28 70 72 69 6e 74 20 22 3c 74 72 3e 3c     (print "<tr><
3430: 74 64 3e 3c 66 6f 6e 74 20 63 6f 6c 6f 72 3d 5c  td><font color=\
3440: 22 22 20 28 63 6f 6d 6d 6f 6e 3a 67 65 74 2d 63  "" (common:get-c
3450: 6f 6c 6f 72 2d 66 72 6f 6d 2d 73 74 61 74 75 73  olor-from-status
3460: 20 73 74 61 74 75 73 29 20 22 5c 22 3e 22 20 73   status) "\">" s
3470: 74 61 74 75 73 0a 09 09 09 09 20 20 20 22 3c 2f  tatus.....   "</
3480: 66 6f 6e 74 3e 3c 2f 74 64 3e 3c 74 64 3e 22 20  font></td><td>" 
3490: 28 68 61 73 68 2d 74 61 62 6c 65 2d 72 65 66 20  (hash-table-ref 
34a0: 63 6f 75 6e 74 73 20 73 74 61 74 75 73 29 20 22  counts status) "
34b0: 3c 2f 74 64 3e 3c 2f 74 72 3e 22 29 29 0a 09 09  </td></tr>"))...
34c0: 09 20 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 6b  .  (hash-table-k
34d0: 65 79 73 20 63 6f 75 6e 74 73 29 29 0a 09 09 28  eys counts))...(
34e0: 70 72 69 6e 74 20 22 3c 74 72 3e 3c 74 64 3e 54  print "<tr><td>T
34f0: 6f 74 61 6c 3c 2f 74 64 3e 3c 74 64 3e 22 20 74  otal</td><td>" t
3500: 6f 74 20 22 3c 2f 74 64 3e 3c 2f 74 72 3e 3c 2f  ot "</td></tr></
3510: 74 61 62 6c 65 3e 22 29 0a 09 09 28 70 72 69 6e  table>")...(prin
3520: 74 20 22 3c 2f 74 64 3e 3c 2f 74 64 3e 3c 2f 74  t "</td></td></t
3530: 72 3e 3c 2f 74 61 62 6c 65 3e 22 29 0a 0a 09 09  r></table>")....
3540: 28 70 72 69 6e 74 20 22 3c 74 61 62 6c 65 20 63  (print "<table c
3550: 65 6c 6c 73 70 61 63 69 6e 67 3d 5c 22 30 5c 22  ellspacing=\"0\"
3560: 20 62 6f 72 64 65 72 3d 5c 22 31 5c 22 3e 22 20   border=\"1\">" 
3570: 0a 09 09 20 20 20 20 20 20 20 22 3c 74 72 3e 3c  ...       "<tr><
3580: 74 64 3e 49 74 65 6d 3c 2f 74 64 3e 3c 74 64 3e  td>Item</td><td>
3590: 53 74 61 74 65 3c 2f 74 64 3e 3c 74 64 3e 53 74  State</td><td>St
35a0: 61 74 75 73 3c 2f 74 64 3e 3c 74 64 3e 43 6f 6d  atus</td><td>Com
35b0: 6d 65 6e 74 3c 2f 74 64 3e 22 0a 09 09 20 20 20  ment</td>"...   
35c0: 20 20 20 20 6f 75 74 74 78 74 20 22 3c 2f 74 61      outtxt "</ta
35d0: 62 6c 65 3e 3c 2f 62 6f 64 79 3e 3c 2f 68 74 6d  ble></body></htm
35e0: 6c 3e 22 29 0a 09 09 28 72 65 6c 65 61 73 65 2d  l>")...(release-
35f0: 64 6f 74 2d 6c 6f 63 6b 20 6f 75 74 70 75 74 66  dot-lock outputf
3600: 69 6c 65 6e 61 6d 65 29 29 29 0a 09 20 20 20 20  ilename)))..    
3610: 28 63 6c 6f 73 65 2d 6f 75 74 70 75 74 2d 70 6f  (close-output-po
3620: 72 74 20 6f 75 70 29 0a 09 20 20 20 20 28 63 68  rt oup)..    (ch
3630: 61 6e 67 65 2d 64 69 72 65 63 74 6f 72 79 20 6f  ange-directory o
3640: 72 69 67 2d 64 69 72 29 0a 09 20 20 20 20 28 74  rig-dir)..    (t
3650: 65 73 74 2d 73 65 74 2d 74 6f 70 6c 6f 67 21 20  est-set-toplog! 
3660: 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e  db run-id test-n
3670: 61 6d 65 20 6f 75 74 70 75 74 66 69 6c 65 6e 61  ame outputfilena
3680: 6d 65 29 0a 09 20 20 20 20 29 29 29 29 29 0a 0a  me)..    )))))..
3690: 28 64 65 66 69 6e 65 20 28 67 65 74 2d 61 6c 6c  (define (get-all
36a0: 2d 6c 65 67 61 6c 2d 74 65 73 74 73 29 0a 20 20  -legal-tests).  
36b0: 28 6c 65 74 2a 20 28 28 74 65 73 74 73 20 20 28  (let* ((tests  (
36c0: 67 6c 6f 62 20 28 63 6f 6e 63 20 2a 74 6f 70 70  glob (conc *topp
36d0: 61 74 68 2a 20 22 2f 74 65 73 74 73 2f 2a 22 29  ath* "/tests/*")
36e0: 29 29 0a 09 20 28 72 65 73 20 20 20 20 27 28 29  )).. (res    '()
36f0: 29 29 0a 20 20 20 20 28 64 65 62 75 67 3a 70 72  )).    (debug:pr
3700: 69 6e 74 20 34 20 22 49 4e 46 4f 3a 20 4c 6f 6f  int 4 "INFO: Loo
3710: 6b 69 6e 67 20 61 74 20 74 65 73 74 73 20 22 20  king at tests " 
3720: 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65  (string-interspe
3730: 72 73 65 20 74 65 73 74 73 20 22 2c 22 29 29 0a  rse tests ",")).
3740: 20 20 20 20 28 66 6f 72 2d 65 61 63 68 20 28 6c      (for-each (l
3750: 61 6d 62 64 61 20 28 74 65 73 74 70 61 74 68 29  ambda (testpath)
3760: 0a 09 09 28 69 66 20 28 66 69 6c 65 2d 65 78 69  ...(if (file-exi
3770: 73 74 73 3f 20 28 63 6f 6e 63 20 74 65 73 74 70  sts? (conc testp
3780: 61 74 68 20 22 2f 74 65 73 74 63 6f 6e 66 69 67  ath "/testconfig
3790: 22 29 29 0a 09 09 20 20 20 20 28 73 65 74 21 20  "))...    (set! 
37a0: 72 65 73 20 28 63 6f 6e 73 20 28 6c 61 73 74 20  res (cons (last 
37b0: 28 73 74 72 69 6e 67 2d 73 70 6c 69 74 20 74 65  (string-split te
37c0: 73 74 70 61 74 68 20 22 2f 22 29 29 20 72 65 73  stpath "/")) res
37d0: 29 29 29 29 0a 09 20 20 20 20 20 20 74 65 73 74  ))))..      test
37e0: 73 29 0a 20 20 20 20 72 65 73 29 29 0a 0a 28 64  s).    res))..(d
37f0: 65 66 69 6e 65 20 28 74 65 73 74 3a 67 65 74 2d  efine (test:get-
3800: 74 65 73 74 63 6f 6e 66 69 67 20 74 65 73 74 2d  testconfig test-
3810: 6e 61 6d 65 20 73 79 73 74 65 6d 2d 61 6c 6c 6f  name system-allo
3820: 77 65 64 29 0a 20 20 28 6c 65 74 2a 20 28 28 74  wed).  (let* ((t
3830: 65 73 74 2d 70 61 74 68 20 20 20 20 28 63 6f 6e  est-path    (con
3840: 63 20 2a 74 6f 70 70 61 74 68 2a 20 22 2f 74 65  c *toppath* "/te
3850: 73 74 73 2f 22 20 74 65 73 74 2d 6e 61 6d 65 29  sts/" test-name)
3860: 29 0a 09 20 28 74 65 73 74 2d 63 6f 6e 66 69 67  ).. (test-config
3870: 66 20 28 63 6f 6e 63 20 74 65 73 74 2d 70 61 74  f (conc test-pat
3880: 68 20 22 2f 74 65 73 74 63 6f 6e 66 69 67 22 29  h "/testconfig")
3890: 29 0a 09 20 28 74 65 73 74 65 78 69 73 74 73 20  ).. (testexists 
38a0: 20 20 28 61 6e 64 20 28 66 69 6c 65 2d 65 78 69    (and (file-exi
38b0: 73 74 73 3f 20 74 65 73 74 2d 63 6f 6e 66 69 67  sts? test-config
38c0: 66 29 28 66 69 6c 65 2d 72 65 61 64 2d 61 63 63  f)(file-read-acc
38d0: 65 73 73 3f 20 74 65 73 74 2d 63 6f 6e 66 69 67  ess? test-config
38e0: 66 29 29 29 29 0a 20 20 20 20 28 69 66 20 74 65  f)))).    (if te
38f0: 73 74 65 78 69 73 74 73 0a 09 28 72 65 61 64 2d  stexists..(read-
3900: 63 6f 6e 66 69 67 20 74 65 73 74 2d 63 6f 6e 66  config test-conf
3910: 69 67 66 20 23 66 20 73 79 73 74 65 6d 2d 61 6c  igf #f system-al
3920: 6c 6f 77 65 64 20 65 6e 76 69 72 6f 6e 2d 70 61  lowed environ-pa
3930: 74 74 3a 20 28 69 66 20 73 79 73 74 65 6d 2d 61  tt: (if system-a
3940: 6c 6c 6f 77 65 64 0a 09 09 09 09 09 09 09 09 20  llowed......... 
3950: 20 20 20 20 20 22 70 72 65 2d 6c 61 75 6e 63 68       "pre-launch
3960: 2d 65 6e 76 2d 76 61 72 73 22 0a 09 09 09 09 09  -env-vars"......
3970: 09 09 09 20 20 20 20 20 20 23 66 29 29 0a 09 23  ...      #f))..#
3980: 66 29 29 29 0a 20 20 0a 3b 3b 20 73 6f 72 74 20  f))).  .;; sort 
3990: 74 65 73 74 73 20 62 79 20 70 72 69 6f 72 69 74  tests by priorit
39a0: 79 20 61 6e 64 20 77 61 69 74 6f 6e 0a 3b 3b 20  y and waiton.;; 
39b0: 4d 6f 76 65 20 74 65 73 74 20 73 70 65 63 69 66  Move test specif
39c0: 69 63 20 73 74 75 66 66 20 74 6f 20 61 20 74 65  ic stuff to a te
39d0: 73 74 20 75 6e 69 74 20 46 49 58 4d 45 20 6f 6e  st unit FIXME on
39e0: 65 20 6f 66 20 74 68 65 73 65 20 64 61 79 73 0a  e of these days.
39f0: 28 64 65 66 69 6e 65 20 28 74 65 73 74 73 3a 73  (define (tests:s
3a00: 6f 72 74 2d 62 79 2d 70 72 69 6f 72 69 74 79 2d  ort-by-priority-
3a10: 61 6e 64 2d 77 61 69 74 6f 6e 20 74 65 73 74 2d  and-waiton test-
3a20: 72 65 63 6f 72 64 73 29 0a 20 20 28 6c 65 74 20  records).  (let 
3a30: 28 28 6d 75 6e 67 65 70 72 69 6f 72 69 74 79 20  ((mungepriority 
3a40: 28 6c 61 6d 62 64 61 20 28 70 72 69 6f 72 69 74  (lambda (priorit
3a50: 79 29 0a 09 09 09 20 28 69 66 20 70 72 69 6f 72  y).... (if prior
3a60: 69 74 79 0a 09 09 09 20 20 20 20 20 28 6c 65 74  ity....     (let
3a70: 20 28 28 74 6d 70 20 28 61 6e 79 2d 3e 6e 75 6d   ((tmp (any->num
3a80: 62 65 72 20 70 72 69 6f 72 69 74 79 29 29 29 0a  ber priority))).
3a90: 09 09 09 20 20 20 20 20 20 20 28 69 66 20 74 6d  ...       (if tm
3aa0: 70 20 74 6d 70 20 28 62 65 67 69 6e 20 28 64 65  p tmp (begin (de
3ab0: 62 75 67 3a 70 72 69 6e 74 20 30 20 22 45 52 52  bug:print 0 "ERR
3ac0: 4f 52 3a 20 62 61 64 20 70 72 69 6f 72 69 74 79  OR: bad priority
3ad0: 20 76 61 6c 75 65 20 22 20 70 72 69 6f 72 69 74   value " priorit
3ae0: 79 20 22 2c 20 75 73 69 6e 67 20 30 22 29 20 30  y ", using 0") 0
3af0: 29 29 29 0a 09 09 09 20 20 20 20 20 30 29 29 29  )))....     0)))
3b00: 29 0a 20 20 20 20 28 73 6f 72 74 20 0a 20 20 20  ).    (sort .   
3b10: 20 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 6b 65    (hash-table-ke
3b20: 79 73 20 74 65 73 74 2d 72 65 63 6f 72 64 73 29  ys test-records)
3b30: 20 3b 3b 20 61 76 6f 69 64 20 64 65 61 6c 69 6e   ;; avoid dealin
3b40: 67 20 77 69 74 68 20 64 65 6c 65 74 65 64 20 74  g with deleted t
3b50: 65 73 74 73 2c 20 6c 6f 6f 6b 20 61 74 20 74 68  ests, look at th
3b60: 65 20 68 61 73 68 20 74 61 62 6c 65 0a 20 20 20  e hash table.   
3b70: 20 20 28 6c 61 6d 62 64 61 20 28 61 20 62 29 0a    (lambda (a b).
3b80: 20 20 20 20 20 20 20 28 6c 65 74 2a 20 28 28 61         (let* ((a
3b90: 2d 72 65 63 6f 72 64 20 20 20 28 68 61 73 68 2d  -record   (hash-
3ba0: 74 61 62 6c 65 2d 72 65 66 20 74 65 73 74 2d 72  table-ref test-r
3bb0: 65 63 6f 72 64 73 20 61 29 29 0a 09 20 20 20 20  ecords a))..    
3bc0: 20 20 28 62 2d 72 65 63 6f 72 64 20 20 20 28 68    (b-record   (h
3bd0: 61 73 68 2d 74 61 62 6c 65 2d 72 65 66 20 74 65  ash-table-ref te
3be0: 73 74 2d 72 65 63 6f 72 64 73 20 62 29 29 0a 09  st-records b))..
3bf0: 20 20 20 20 20 20 28 61 2d 77 61 69 74 6f 6e 73        (a-waitons
3c00: 20 20 28 74 65 73 74 73 3a 74 65 73 74 71 75 65    (tests:testque
3c10: 75 65 2d 67 65 74 2d 77 61 69 74 6f 6e 73 20 61  ue-get-waitons a
3c20: 2d 72 65 63 6f 72 64 29 29 0a 09 20 20 20 20 20  -record))..     
3c30: 20 28 62 2d 77 61 69 74 6f 6e 73 20 20 28 74 65   (b-waitons  (te
3c40: 73 74 73 3a 74 65 73 74 71 75 65 75 65 2d 67 65  sts:testqueue-ge
3c50: 74 2d 77 61 69 74 6f 6e 73 20 62 2d 72 65 63 6f  t-waitons b-reco
3c60: 72 64 29 29 0a 09 20 20 20 20 20 20 28 61 2d 63  rd))..      (a-c
3c70: 6f 6e 66 69 67 20 20 20 28 74 65 73 74 73 3a 74  onfig   (tests:t
3c80: 65 73 74 71 75 65 75 65 2d 67 65 74 2d 74 65 73  estqueue-get-tes
3c90: 74 63 6f 6e 66 69 67 20 20 61 2d 72 65 63 6f 72  tconfig  a-recor
3ca0: 64 29 29 0a 09 20 20 20 20 20 20 28 62 2d 63 6f  d))..      (b-co
3cb0: 6e 66 69 67 20 20 20 28 74 65 73 74 73 3a 74 65  nfig   (tests:te
3cc0: 73 74 71 75 65 75 65 2d 67 65 74 2d 74 65 73 74  stqueue-get-test
3cd0: 63 6f 6e 66 69 67 20 20 62 2d 72 65 63 6f 72 64  config  b-record
3ce0: 29 29 0a 09 20 20 20 20 20 20 28 61 2d 72 61 77  ))..      (a-raw
3cf0: 2d 70 72 69 20 20 28 63 6f 6e 66 69 67 2d 6c 6f  -pri  (config-lo
3d00: 6f 6b 75 70 20 61 2d 63 6f 6e 66 69 67 20 22 72  okup a-config "r
3d10: 65 71 75 69 72 65 6d 65 6e 74 73 22 20 22 70 72  equirements" "pr
3d20: 69 6f 72 69 74 79 22 29 29 0a 09 20 20 20 20 20  iority"))..     
3d30: 20 28 62 2d 72 61 77 2d 70 72 69 20 20 28 63 6f   (b-raw-pri  (co
3d40: 6e 66 69 67 2d 6c 6f 6f 6b 75 70 20 62 2d 63 6f  nfig-lookup b-co
3d50: 6e 66 69 67 20 22 72 65 71 75 69 72 65 6d 65 6e  nfig "requiremen
3d60: 74 73 22 20 22 70 72 69 6f 72 69 74 79 22 29 29  ts" "priority"))
3d70: 0a 09 20 20 20 20 20 20 28 61 2d 70 72 69 6f 72  ..      (a-prior
3d80: 69 74 79 20 28 6d 75 6e 67 65 70 72 69 6f 72 69  ity (mungepriori
3d90: 74 79 20 61 2d 72 61 77 2d 70 72 69 29 29 0a 09  ty a-raw-pri))..
3da0: 20 20 20 20 20 20 28 62 2d 70 72 69 6f 72 69 74        (b-priorit
3db0: 79 20 28 6d 75 6e 67 65 70 72 69 6f 72 69 74 79  y (mungepriority
3dc0: 20 62 2d 72 61 77 2d 70 72 69 29 29 29 0a 09 3b   b-raw-pri)))..;
3dd0: 3b 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20  ;  (debug:print 
3de0: 35 20 22 73 6f 72 74 2d 62 79 2d 70 72 69 6f 72  5 "sort-by-prior
3df0: 69 74 79 2d 61 6e 64 2d 77 61 69 74 6f 6e 2c 20  ity-and-waiton, 
3e00: 61 3a 20 22 20 61 20 22 20 62 3a 20 22 20 62 0a  a: " a " b: " b.
3e10: 09 3b 3b 20 09 20 20 20 20 20 20 22 5c 6e 20 20  .;; .      "\n  
3e20: 20 20 20 61 2d 72 65 63 6f 72 64 3a 20 20 20 22     a-record:   "
3e30: 20 61 2d 72 65 63 6f 72 64 20 0a 09 3b 3b 20 09   a-record ..;; .
3e40: 20 20 20 20 20 20 22 5c 6e 20 20 20 20 20 62 2d        "\n     b-
3e50: 72 65 63 6f 72 64 3a 20 20 20 22 20 62 2d 72 65  record:   " b-re
3e60: 63 6f 72 64 0a 09 3b 3b 20 09 20 20 20 20 20 20  cord..;; .      
3e70: 22 5c 6e 20 20 20 20 20 61 2d 77 61 69 74 6f 6e  "\n     a-waiton
3e80: 73 3a 20 20 22 20 61 2d 77 61 69 74 6f 6e 73 0a  s:  " a-waitons.
3e90: 09 3b 3b 20 09 20 20 20 20 20 20 22 5c 6e 20 20  .;; .      "\n  
3ea0: 20 20 20 62 2d 77 61 69 74 6f 6e 73 3a 20 20 22     b-waitons:  "
3eb0: 20 62 2d 77 61 69 74 6f 6e 73 0a 09 3b 3b 20 09   b-waitons..;; .
3ec0: 20 20 20 20 20 20 22 5c 6e 20 20 20 20 20 61 2d        "\n     a-
3ed0: 63 6f 6e 66 69 67 3a 20 20 20 22 20 28 68 61 73  config:   " (has
3ee0: 68 2d 74 61 62 6c 65 2d 3e 61 6c 69 73 74 20 61  h-table->alist a
3ef0: 2d 63 6f 6e 66 69 67 29 0a 09 3b 3b 20 09 20 20  -config)..;; .  
3f00: 20 20 20 20 22 5c 6e 20 20 20 20 20 62 2d 63 6f      "\n     b-co
3f10: 6e 66 69 67 3a 20 20 20 22 20 28 68 61 73 68 2d  nfig:   " (hash-
3f20: 74 61 62 6c 65 2d 3e 61 6c 69 73 74 20 62 2d 63  table->alist b-c
3f30: 6f 6e 66 69 67 29 0a 09 3b 3b 20 09 20 20 20 20  onfig)..;; .    
3f40: 20 20 22 5c 6e 20 20 20 20 20 61 2d 72 61 77 2d    "\n     a-raw-
3f50: 70 72 69 3a 20 20 22 20 61 2d 72 61 77 2d 70 72  pri:  " a-raw-pr
3f60: 69 0a 09 3b 3b 20 09 20 20 20 20 20 20 22 5c 6e  i..;; .      "\n
3f70: 20 20 20 20 20 62 2d 72 61 77 2d 70 72 69 3a 20       b-raw-pri: 
3f80: 20 22 20 62 2d 72 61 77 2d 70 72 69 0a 09 3b 3b   " b-raw-pri..;;
3f90: 20 09 20 20 20 20 20 20 22 5c 6e 20 20 20 20 20   .      "\n     
3fa0: 61 2d 70 72 69 6f 72 69 74 79 3a 20 22 20 61 2d  a-priority: " a-
3fb0: 70 72 69 6f 72 69 74 79 0a 09 3b 3b 20 09 20 20  priority..;; .  
3fc0: 20 20 20 20 22 5c 6e 20 20 20 20 20 62 2d 70 72      "\n     b-pr
3fd0: 69 6f 72 69 74 79 3a 20 22 20 62 2d 70 72 69 6f  iority: " b-prio
3fe0: 72 69 74 79 29 0a 09 20 28 74 65 73 74 73 3a 74  rity).. (tests:t
3ff0: 65 73 74 71 75 65 75 65 2d 73 65 74 2d 70 72 69  estqueue-set-pri
4000: 6f 72 69 74 79 21 20 61 2d 72 65 63 6f 72 64 20  ority! a-record 
4010: 61 2d 70 72 69 6f 72 69 74 79 29 0a 09 20 28 74  a-priority).. (t
4020: 65 73 74 73 3a 74 65 73 74 71 75 65 75 65 2d 73  ests:testqueue-s
4030: 65 74 2d 70 72 69 6f 72 69 74 79 21 20 62 2d 72  et-priority! b-r
4040: 65 63 6f 72 64 20 62 2d 70 72 69 6f 72 69 74 79  ecord b-priority
4050: 29 0a 09 20 28 69 66 20 28 61 6e 64 20 61 2d 77  ).. (if (and a-w
4060: 61 69 74 6f 6e 73 20 28 6d 65 6d 62 65 72 20 28  aitons (member (
4070: 74 65 73 74 73 3a 74 65 73 74 71 75 65 75 65 2d  tests:testqueue-
4080: 67 65 74 2d 74 65 73 74 6e 61 6d 65 20 62 2d 72  get-testname b-r
4090: 65 63 6f 72 64 29 20 61 2d 77 61 69 74 6f 6e 73  ecord) a-waitons
40a0: 29 29 0a 09 20 20 20 20 20 23 66 20 3b 3b 20 63  ))..     #f ;; c
40b0: 61 6e 6e 6f 74 20 68 61 76 65 20 61 20 77 68 69  annot have a whi
40c0: 63 68 20 69 73 20 77 61 69 74 69 6e 67 20 6f 6e  ch is waiting on
40d0: 20 62 20 68 61 70 70 65 6e 69 6e 67 20 62 65 66   b happening bef
40e0: 6f 72 65 20 62 0a 09 20 20 20 20 20 28 69 66 20  ore b..     (if 
40f0: 28 61 6e 64 20 62 2d 77 61 69 74 6f 6e 73 20 28  (and b-waitons (
4100: 6d 65 6d 62 65 72 20 28 74 65 73 74 73 3a 74 65  member (tests:te
4110: 73 74 71 75 65 75 65 2d 67 65 74 2d 74 65 73 74  stqueue-get-test
4120: 6e 61 6d 65 20 61 2d 72 65 63 6f 72 64 29 20 62  name a-record) b
4130: 2d 77 61 69 74 6f 6e 73 29 29 0a 09 09 20 23 74  -waitons))... #t
4140: 20 3b 3b 20 74 68 69 73 20 69 73 20 74 68 65 20   ;; this is the 
4150: 63 6f 72 72 65 63 74 20 6f 72 64 65 72 2c 20 62  correct order, b
4160: 20 69 73 20 77 61 69 74 69 6e 67 20 6f 6e 20 61   is waiting on a
4170: 20 61 6e 64 20 62 20 69 73 20 62 65 66 6f 72 65   and b is before
4180: 20 61 0a 09 09 20 28 69 66 20 28 3e 20 61 2d 70   a... (if (> a-p
4190: 72 69 6f 72 69 74 79 20 62 2d 70 72 69 6f 72 69  riority b-priori
41a0: 74 79 29 0a 09 09 20 20 20 20 20 23 74 20 3b 3b  ty)...     #t ;;
41b0: 20 69 66 20 61 20 69 73 20 61 20 68 69 67 68 65   if a is a highe
41c0: 72 20 70 72 69 6f 72 69 74 79 20 74 68 61 6e 20  r priority than 
41d0: 62 20 74 68 65 6e 20 77 65 20 61 72 65 20 67 6f  b then we are go
41e0: 6f 64 20 74 6f 20 67 6f 0a 09 09 20 20 20 20 20  od to go...     
41f0: 23 66 29 29 29 29 29 29 29 29 0a 0a 0a 3b 3b 3d  #f))))))))...;;=
4200: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4210: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4220: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4230: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4240: 3d 3d 3d 3d 3d 0a 3b 3b 20 74 65 73 74 20 73 74  =====.;; test st
4250: 65 70 73 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  eps.;;==========
4260: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4270: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4280: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4290: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 28 64  ============..(d
42a0: 65 66 69 6e 65 20 28 74 65 73 74 73 74 65 70 2d  efine (teststep-
42b0: 73 65 74 2d 73 74 61 74 75 73 21 20 64 62 20 72  set-status! db r
42c0: 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20  un-id test-name 
42d0: 74 65 73 74 73 74 65 70 2d 6e 61 6d 65 20 73 74  teststep-name st
42e0: 61 74 65 2d 69 6e 20 73 74 61 74 75 73 2d 69 6e  ate-in status-in
42f0: 20 69 74 65 6d 64 61 74 20 63 6f 6d 6d 65 6e 74   itemdat comment
4300: 20 6c 6f 67 66 69 6c 65 29 0a 20 20 28 64 65 62   logfile).  (deb
4310: 75 67 3a 70 72 69 6e 74 20 34 20 22 72 75 6e 2d  ug:print 4 "run-
4320: 69 64 3a 20 22 20 72 75 6e 2d 69 64 20 22 20 74  id: " run-id " t
4330: 65 73 74 2d 6e 61 6d 65 3a 20 22 20 74 65 73 74  est-name: " test
4340: 2d 6e 61 6d 65 29 0a 20 20 28 6c 65 74 2a 20 28  -name).  (let* (
4350: 28 73 74 61 74 65 20 20 20 20 20 28 63 68 65 63  (state     (chec
4360: 6b 2d 76 61 6c 69 64 2d 69 74 65 6d 73 20 22 73  k-valid-items "s
4370: 74 61 74 65 22 20 73 74 61 74 65 2d 69 6e 29 29  tate" state-in))
4380: 0a 09 20 28 73 74 61 74 75 73 20 20 20 20 28 63  .. (status    (c
4390: 68 65 63 6b 2d 76 61 6c 69 64 2d 69 74 65 6d 73  heck-valid-items
43a0: 20 22 73 74 61 74 75 73 22 20 73 74 61 74 75 73   "status" status
43b0: 2d 69 6e 29 29 0a 09 20 28 69 74 65 6d 2d 70 61  -in)).. (item-pa
43c0: 74 68 20 28 69 74 65 6d 2d 6c 69 73 74 2d 3e 70  th (item-list->p
43d0: 61 74 68 20 69 74 65 6d 64 61 74 29 29 0a 09 20  ath itemdat)).. 
43e0: 28 74 65 73 74 64 61 74 20 20 20 28 64 62 3a 67  (testdat   (db:g
43f0: 65 74 2d 74 65 73 74 2d 69 6e 66 6f 20 64 62 20  et-test-info db 
4400: 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65  run-id test-name
4410: 20 69 74 65 6d 2d 70 61 74 68 29 29 29 0a 20 20   item-path))).  
4420: 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 35    (debug:print 5
4430: 20 22 74 65 73 74 64 61 74 3a 20 22 20 74 65 73   "testdat: " tes
4440: 74 64 61 74 29 0a 20 20 20 20 28 69 66 20 28 61  tdat).    (if (a
4450: 6e 64 20 74 65 73 74 64 61 74 20 3b 3b 20 69 66  nd testdat ;; if
4460: 20 74 68 65 20 73 65 63 74 69 6f 6e 20 65 78 69   the section exi
4470: 73 74 73 20 74 68 65 6e 20 66 6f 72 63 65 20 73  sts then force s
4480: 70 65 63 69 66 69 63 61 74 69 6f 6e 20 42 55 47  pecification BUG
4490: 2c 20 49 20 64 6f 6e 27 74 20 6c 69 6b 65 20 68  , I don't like h
44a0: 6f 77 20 74 68 69 73 20 77 6f 72 6b 73 2e 0a 09  ow this works...
44b0: 20 20 20 20 20 28 6f 72 20 28 6e 6f 74 20 73 74       (or (not st
44c0: 61 74 65 29 28 6e 6f 74 20 73 74 61 74 75 73 29  ate)(not status)
44d0: 29 29 0a 09 28 64 65 62 75 67 3a 70 72 69 6e 74  ))..(debug:print
44e0: 20 30 20 22 57 41 52 4e 49 4e 47 3a 20 49 6e 76   0 "WARNING: Inv
44f0: 61 6c 69 64 20 22 20 28 69 66 20 73 74 61 74 75  alid " (if statu
4500: 73 20 22 73 74 61 74 75 73 22 20 22 73 74 61 74  s "status" "stat
4510: 65 22 29 0a 09 20 20 20 20 20 20 20 22 20 76 61  e")..       " va
4520: 6c 75 65 20 5c 22 22 20 28 69 66 20 73 74 61 74  lue \"" (if stat
4530: 75 73 20 73 74 61 74 65 2d 69 6e 20 73 74 61 74  us state-in stat
4540: 75 73 2d 69 6e 29 20 22 5c 22 2c 20 75 70 64 61  us-in) "\", upda
4550: 74 65 20 79 6f 75 72 20 76 61 6c 69 64 76 61 6c  te your validval
4560: 75 65 73 20 73 65 63 74 69 6f 6e 20 69 6e 20 6d  ues section in m
4570: 65 67 61 74 65 73 74 2e 63 6f 6e 66 69 67 22 29  egatest.config")
4580: 29 0a 20 20 20 20 28 69 66 20 74 65 73 74 64 61  ).    (if testda
4590: 74 0a 09 28 6c 65 74 20 28 28 74 65 73 74 2d 69  t..(let ((test-i
45a0: 64 20 28 74 65 73 74 3a 67 65 74 2d 69 64 20 74  d (test:get-id t
45b0: 65 73 74 64 61 74 29 29 29 0a 09 20 20 3b 3b 20  estdat)))..  ;; 
45c0: 46 49 58 4d 45 20 2d 20 74 68 69 73 20 73 68 6f  FIXME - this sho
45d0: 75 6c 64 20 6e 6f 74 20 75 70 64 61 74 65 20 74  uld not update t
45e0: 68 65 20 6c 6f 67 66 69 6c 65 20 75 6e 6c 65 73  he logfile unles
45f0: 73 20 69 74 20 69 73 20 73 70 65 63 69 66 69 65  s it is specifie
4600: 64 2e 0a 09 20 20 28 73 71 6c 69 74 65 33 3a 65  d...  (sqlite3:e
4610: 78 65 63 75 74 65 20 64 62 20 0a 09 09 09 22 49  xecute db ...."I
4620: 4e 53 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45  NSERT OR REPLACE
4630: 20 69 6e 74 6f 20 74 65 73 74 5f 73 74 65 70 73   into test_steps
4640: 20 28 74 65 73 74 5f 69 64 2c 73 74 65 70 6e 61   (test_id,stepna
4650: 6d 65 2c 73 74 61 74 65 2c 73 74 61 74 75 73 2c  me,state,status,
4660: 65 76 65 6e 74 5f 74 69 6d 65 2c 63 6f 6d 6d 65  event_time,comme
4670: 6e 74 2c 6c 6f 67 66 69 6c 65 29 20 56 41 4c 55  nt,logfile) VALU
4680: 45 53 28 3f 2c 3f 2c 3f 2c 3f 2c 73 74 72 66 74  ES(?,?,?,?,strft
4690: 69 6d 65 28 27 25 73 27 2c 27 6e 6f 77 27 29 2c  ime('%s','now'),
46a0: 3f 2c 3f 29 3b 22 0a 09 09 09 74 65 73 74 2d 69  ?,?);"....test-i
46b0: 64 20 74 65 73 74 73 74 65 70 2d 6e 61 6d 65 20  d teststep-name 
46c0: 73 74 61 74 65 2d 69 6e 20 73 74 61 74 75 73 2d  state-in status-
46d0: 69 6e 20 28 69 66 20 63 6f 6d 6d 65 6e 74 20 63  in (if comment c
46e0: 6f 6d 6d 65 6e 74 20 22 22 29 20 28 69 66 20 6c  omment "") (if l
46f0: 6f 67 66 69 6c 65 20 6c 6f 67 66 69 6c 65 20 22  ogfile logfile "
4700: 22 29 29 29 0a 09 28 64 65 62 75 67 3a 70 72 69  ")))..(debug:pri
4710: 6e 74 20 30 20 22 45 52 52 4f 52 3a 20 43 61 6e  nt 0 "ERROR: Can
4720: 27 74 20 75 70 64 61 74 65 20 22 20 74 65 73 74  't update " test
4730: 2d 6e 61 6d 65 20 22 20 66 6f 72 20 72 75 6e 20  -name " for run 
4740: 22 20 72 75 6e 2d 69 64 20 22 20 2d 3e 20 6e 6f  " run-id " -> no
4750: 20 73 75 63 68 20 74 65 73 74 20 69 6e 20 64 62   such test in db
4760: 22 29 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28  "))))..(define (
4770: 74 65 73 74 2d 67 65 74 2d 6b 69 6c 6c 2d 72 65  test-get-kill-re
4780: 71 75 65 73 74 20 64 62 20 72 75 6e 2d 69 64 20  quest db run-id 
4790: 74 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d 64 61  test-name itemda
47a0: 74 29 0a 20 20 28 6c 65 74 2a 20 28 28 69 74 65  t).  (let* ((ite
47b0: 6d 2d 70 61 74 68 20 28 69 74 65 6d 2d 6c 69 73  m-path (item-lis
47c0: 74 2d 3e 70 61 74 68 20 69 74 65 6d 64 61 74 29  t->path itemdat)
47d0: 29 0a 09 20 28 74 65 73 74 64 61 74 20 20 20 28  ).. (testdat   (
47e0: 64 62 3a 67 65 74 2d 74 65 73 74 2d 69 6e 66 6f  db:get-test-info
47f0: 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 2d   db run-id test-
4800: 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 29  name item-path))
4810: 29 0a 20 20 20 20 28 65 71 75 61 6c 3f 20 28 74  ).    (equal? (t
4820: 65 73 74 3a 67 65 74 2d 73 74 61 74 65 20 74 65  est:get-state te
4830: 73 74 64 61 74 29 20 22 4b 49 4c 4c 52 45 51 22  stdat) "KILLREQ"
4840: 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 74 65  )))..(define (te
4850: 73 74 2d 73 65 74 2d 6d 65 74 61 2d 69 6e 66 6f  st-set-meta-info
4860: 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 6e   db run-id testn
4870: 61 6d 65 20 69 74 65 6d 64 61 74 29 0a 20 20 28  ame itemdat).  (
4880: 6c 65 74 20 28 28 69 74 65 6d 2d 70 61 74 68 20  let ((item-path 
4890: 28 69 74 65 6d 2d 6c 69 73 74 2d 3e 70 61 74 68  (item-list->path
48a0: 20 69 74 65 6d 64 61 74 29 29 0a 09 28 63 70 75   itemdat))..(cpu
48b0: 6c 6f 61 64 20 20 28 67 65 74 2d 63 70 75 2d 6c  load  (get-cpu-l
48c0: 6f 61 64 29 29 0a 09 28 68 6f 73 74 6e 61 6d 65  oad))..(hostname
48d0: 20 28 67 65 74 2d 68 6f 73 74 2d 6e 61 6d 65 29   (get-host-name)
48e0: 29 0a 09 28 64 69 73 6b 66 72 65 65 20 28 67 65  )..(diskfree (ge
48f0: 74 2d 64 66 20 28 63 75 72 72 65 6e 74 2d 64 69  t-df (current-di
4900: 72 65 63 74 6f 72 79 29 29 29 0a 09 28 75 6e 61  rectory)))..(una
4910: 6d 65 20 20 20 20 28 67 65 74 2d 75 6e 61 6d 65  me    (get-uname
4920: 20 22 2d 73 72 76 70 69 6f 22 29 29 0a 09 28 72   "-srvpio"))..(r
4930: 75 6e 70 61 74 68 20 20 28 63 75 72 72 65 6e 74  unpath  (current
4940: 2d 64 69 72 65 63 74 6f 72 79 29 29 29 0a 20 20  -directory))).  
4950: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
4960: 74 65 20 64 62 20 22 55 50 44 41 54 45 20 74 65  te db "UPDATE te
4970: 73 74 73 20 53 45 54 20 68 6f 73 74 3d 3f 2c 63  sts SET host=?,c
4980: 70 75 6c 6f 61 64 3d 3f 2c 64 69 73 6b 66 72 65  puload=?,diskfre
4990: 65 3d 3f 2c 75 6e 61 6d 65 3d 3f 2c 72 75 6e 64  e=?,uname=?,rund
49a0: 69 72 3d 3f 20 57 48 45 52 45 20 72 75 6e 5f 69  ir=? WHERE run_i
49b0: 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d 65  d=? AND testname
49c0: 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 68  =? AND item_path
49d0: 3d 3f 3b 22 0a 09 09 20 20 68 6f 73 74 6e 61 6d  =?;"...  hostnam
49e0: 65 0a 09 09 20 20 63 70 75 6c 6f 61 64 0a 09 09  e...  cpuload...
49f0: 20 20 64 69 73 6b 66 72 65 65 0a 09 09 20 20 75    diskfree...  u
4a00: 6e 61 6d 65 0a 09 09 20 20 72 75 6e 70 61 74 68  name...  runpath
4a10: 0a 09 09 20 20 72 75 6e 2d 69 64 0a 09 09 20 20  ...  run-id...  
4a20: 74 65 73 74 6e 61 6d 65 0a 09 09 20 20 69 74 65  testname...  ite
4a30: 6d 2d 70 61 74 68 29 29 29 0a 0a 28 64 65 66 69  m-path)))..(defi
4a40: 6e 65 20 28 74 65 73 74 2d 75 70 64 61 74 65 2d  ne (test-update-
4a50: 6d 65 74 61 2d 69 6e 66 6f 20 64 62 20 72 75 6e  meta-info db run
4a60: 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 69 74 65  -id testname ite
4a70: 6d 64 61 74 20 6d 69 6e 75 74 65 73 20 63 70 75  mdat minutes cpu
4a80: 6c 6f 61 64 20 64 69 73 6b 66 72 65 65 20 74 6d  load diskfree tm
4a90: 70 66 72 65 65 29 0a 20 20 28 6c 65 74 20 28 28  pfree).  (let ((
4aa0: 69 74 65 6d 2d 70 61 74 68 20 28 69 74 65 6d 2d  item-path (item-
4ab0: 6c 69 73 74 2d 3e 70 61 74 68 20 69 74 65 6d 64  list->path itemd
4ac0: 61 74 29 29 29 0a 20 20 20 20 28 69 66 20 28 6e  at))).    (if (n
4ad0: 6f 74 20 69 74 65 6d 2d 70 61 74 68 29 28 62 65  ot item-path)(be
4ae0: 67 69 6e 20 28 64 65 62 75 67 3a 70 72 69 6e 74  gin (debug:print
4af0: 20 30 20 22 57 41 52 4e 49 4e 47 3a 20 49 54 45   0 "WARNING: ITE
4b00: 4d 50 41 54 48 20 6e 6f 74 20 73 65 74 2e 22 29  MPATH not set.")
4b10: 20 20 20 28 73 65 74 21 20 69 74 65 6d 2d 70 61     (set! item-pa
4b20: 74 68 20 22 22 29 29 29 0a 20 20 20 20 3b 3b 20  th ""))).    ;; 
4b30: 28 6c 65 74 20 28 28 74 65 73 74 69 6e 66 6f 20  (let ((testinfo 
4b40: 28 64 62 3a 67 65 74 2d 74 65 73 74 2d 69 6e 66  (db:get-test-inf
4b50: 6f 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74  o db run-id test
4b60: 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 29  name item-path))
4b70: 29 0a 20 20 20 20 3b 3b 20 20 20 28 69 66 20 28  ).    ;;   (if (
4b80: 61 6e 64 20 28 6e 6f 74 20 28 65 71 75 61 6c 3f  and (not (equal?
4b90: 20 28 64 62 3a 74 65 73 74 2d 67 65 74 2d 73 74   (db:test-get-st
4ba0: 61 74 75 73 20 74 65 73 74 69 6e 66 6f 29 20 22  atus testinfo) "
4bb0: 43 4f 4d 50 4c 45 54 45 44 22 29 29 0a 20 20 20  COMPLETED")).   
4bc0: 20 3b 3b 20 20 20 20 20 20 20 20 20 20 20 20 28   ;;            (
4bd0: 6e 6f 74 20 28 65 71 75 61 6c 3f 20 28 64 62 3a  not (equal? (db:
4be0: 74 65 73 74 2d 67 65 74 2d 73 74 61 74 75 73 20  test-get-status 
4bf0: 74 65 73 74 69 6e 66 6f 29 20 22 4b 49 4c 4c 52  testinfo) "KILLR
4c00: 45 51 22 29 29 0a 20 20 20 20 28 73 71 6c 69 74  EQ")).    (sqlit
4c10: 65 33 3a 65 78 65 63 75 74 65 0a 20 20 20 20 20  e3:execute.     
4c20: 64 62 0a 20 20 20 20 20 22 55 50 44 41 54 45 20  db.     "UPDATE 
4c30: 74 65 73 74 73 20 53 45 54 20 63 70 75 6c 6f 61  tests SET cpuloa
4c40: 64 3d 3f 2c 64 69 73 6b 66 72 65 65 3d 3f 2c 72  d=?,diskfree=?,r
4c50: 75 6e 5f 64 75 72 61 74 69 6f 6e 3d 3f 2c 73 74  un_duration=?,st
4c60: 61 74 65 3d 27 52 55 4e 4e 49 4e 47 27 20 57 48  ate='RUNNING' WH
4c70: 45 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44  ERE run_id=? AND
4c80: 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20   testname=? AND 
4c90: 69 74 65 6d 5f 70 61 74 68 3d 3f 20 41 4e 44 20  item_path=? AND 
4ca0: 73 74 61 74 65 20 4e 4f 54 20 49 4e 20 28 27 43  state NOT IN ('C
4cb0: 4f 4d 50 4c 45 54 45 44 27 2c 27 4b 49 4c 4c 52  OMPLETED','KILLR
4cc0: 45 51 27 2c 27 4b 49 4c 4c 45 44 27 29 3b 22 0a  EQ','KILLED');".
4cd0: 20 20 20 20 20 63 70 75 6c 6f 61 64 0a 20 20 20       cpuload.   
4ce0: 20 20 64 69 73 6b 66 72 65 65 0a 20 20 20 20 20    diskfree.     
4cf0: 6d 69 6e 75 74 65 73 0a 20 20 20 20 20 72 75 6e  minutes.     run
4d00: 2d 69 64 0a 20 20 20 20 20 74 65 73 74 6e 61 6d  -id.     testnam
4d10: 65 0a 20 20 20 20 20 69 74 65 6d 2d 70 61 74 68  e.     item-path
4d20: 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d  )))..;;=========
4d30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4d40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4d50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4d60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b  =============.;;
4d70: 20 41 20 52 20 43 20 48 20 49 20 56 20 49 20 4e   A R C H I V I N
4d80: 20 47 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d   G.;;===========
4d90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4da0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4db0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4dc0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 28 64 65  ===========..(de
4dd0: 66 69 6e 65 20 28 74 65 73 74 3a 61 72 63 68 69  fine (test:archi
4de0: 76 65 20 64 62 20 74 65 73 74 2d 69 64 29 0a 20  ve db test-id). 
4df0: 20 23 66 29 0a 0a 28 64 65 66 69 6e 65 20 28 74   #f)..(define (t
4e00: 65 73 74 3a 61 72 63 68 69 76 65 2d 74 65 73 74  est:archive-test
4e10: 73 20 64 62 20 6b 65 79 6e 61 6d 65 73 20 74 61  s db keynames ta
4e20: 72 67 65 74 29 0a 20 20 23 66 29 0a              rget).  #f).