Index: dashboard.scm ================================================================== --- dashboard.scm +++ dashboard.scm @@ -530,21 +530,33 @@ (define *tim* (iup:timer)) (define *ord* #f) (iup:attribute-set! *tim* "TIME" 300) (iup:attribute-set! *tim* "RUN" "YES") +;; Move this stuff to db.scm FIXME +;; +(define *last-db-update-time* (file-modification-time (conc *toppath* "/megatest.db"))) +(define (db:been-changed) + (> (file-modification-time (conc *toppath* "/megatest.db")) *last-db-update-time*)) +(define (db:set-db-update-time) + (set! *last-db-update-time* (file-modification-time (conc *toppath* "/megatest.db")))) + (define (run-update x) (update-buttons uidat *num-runs* *num-tests*) - (update-rundat (hash-table-ref/default *searchpatts* "runname" "%") *num-runs* - (hash-table-ref/default *searchpatts* "test-name" "%") - (hash-table-ref/default *searchpatts* "item-name" "%") - (let ((res '())) - (for-each (lambda (key) - (let ((val (hash-table-ref/default *searchpatts* key #f))) - (if val (set! res (cons (list key val) res))))) - *dbkeys*) - res))) + ;; (if (db:been-changed) + (begin + (update-rundat (hash-table-ref/default *searchpatts* "runname" "%") *num-runs* + (hash-table-ref/default *searchpatts* "test-name" "%") + (hash-table-ref/default *searchpatts* "item-name" "%") + (let ((res '())) + (for-each (lambda (key) + (let ((val (hash-table-ref/default *searchpatts* key #f))) + (if val (set! res (cons (list key val) res))))) + *dbkeys*) + res)) + ; (db:set-db-update-time) + )) (cond ((args:get-arg "-run") (let ((runid (string->number (args:get-arg "-run")))) (if runid Index: runs.scm ================================================================== --- runs.scm +++ runs.scm @@ -406,16 +406,16 @@ (testdat (db:get-test-info db run-id test-name item-path))) (debug:print 5 "testdat: " testdat) (if (and testdat ;; if the section exists then force specification BUG, I don't like how this works. (or (not state)(not status))) (debug:print 0 "WARNING: Invalid " (if status "status" "state") - " value \"" (if status status-in state-in) "\", update your validstates section in megatest.config")) + " value \"" (if status state-in status-in) "\", update your validvalues section in megatest.config")) (if testdat (let ((test-id (test:get-id testdat))) (sqlite3:execute db "INSERT OR REPLACE into test_steps (test_id,stepname,state,status,event_time,comment) VALUES(?,?,?,?,strftime('%s','now'),?);" - test-id teststep-name state status (if comment comment ""))) + test-id teststep-name state-in status-in (if comment comment ""))) (debug:print 0 "ERROR: Can't update " test-name " for run " run-id " -> no such test in db")))) (define (test-get-kill-request db run-id test-name itemdat) (let* ((item-path (item-list->path itemdat)) (testdat (db:get-test-info db run-id test-name item-path))) Index: tests/megatest.config ================================================================== --- tests/megatest.config +++ tests/megatest.config @@ -20,11 +20,11 @@ ## get a shell with (system "bash") # launcher xterm -e csi -- [validvalues] state start end completed -status pass fail n/a +status pass fail n/a 0 1 # These are set before all tests, override them # in the testconfig [pre-launch-env-overrides] section [env-override] SPECIAL_ENV_VARS overide them here - should be seen at launch and in the runs ADDED utils/mt_laststep Index: utils/mt_laststep ================================================================== --- /dev/null +++ utils/mt_laststep @@ -0,0 +1,65 @@ +#!/bin/bash + +# Purpose: run a step, record start and end with exit codes, if sucessful +# update test status with PASS, else update with FAIL +# +# Call like this: +# mt_laststep stepname command .... +# +# This expects that you have a logpro file named stepname.logpro and must be run +# inside a test environment (click on xterm button on a test control panel +# then source megatest.csh (if you are using tcsh) or megatest.sh (if you are using +# bash, sh or zsh) +# +# Example: copy files +# mt_runstep copy_files cp $frompath $topath +# +# Use a copy_files.logpro file like this: +# (expect:error in "LogFileBody" = 0 "Any err/error/warn/warning" #/(err|warn)/) +# +stepname=$1;shift + +# Theoretically could call megatest directly like the following line but +# we'll do each individual step so folks can see what is going on. +# +# $MT_MEGATEST -runstep $stepname -logpro ${stepname}.logpro "$*" || exit $? + +# First, register the start of this step +$MT_MEGATEST -step $stepname :state start :status n/a + +# Second, run the command (the remaining stuff on the command line after the stepname) +# We could put the results in a log file for processing but we are relying on logpro... +# $* 2>&1 ${stepname}.log + +# So lets use a pipe to logpro, put the output from logpro into stepname_logpro.log +$* 2>&1| logpro ${stepname}.logpro ${stepname}.html 2>&1 ${stepname}_logpro.log + +allstatus=(${PIPESTATUS[0]} ${PIPESTATUS[1]}) +runstatus=${allstatus[0]} +logprostatus=${allstatus[1]} + +echo runstatus: $runstatus logprostatus: $logprostatus + +# Record the step completion and exit status +$MT_MEGATEST -step $stepname :state end :status $runstatus + +# If the test exits with non-zero, we will record FAIL even if logpro +# says it is a PASS + +if [ $runstatus -ne 0 ]; then + finalstatus=FAIL +elif [ $logprostatus -eq 0 ]; then + finalstatus=PASS +elif [ $logprostatus -eq 2 ]; then + finalstatus=WARN +else + finalstatus=FAIL +fi + +# test ${logprostatus} -eq 0 && finalstatus="PASS" +# test ${logprostatus} -eq 1 && finalstatus="FAIL" +# test ${logprostatus} -eq 2 && finalstatus="WARN" +# test ${logprostatus} -gt 2 && finalstatus="FAIL" + +# Set the final test status +$MT_MEGATEST -test-status :state COMPLETED :status $finalstatus ADDED utils/mt_runstep Index: utils/mt_runstep ================================================================== --- /dev/null +++ utils/mt_runstep @@ -0,0 +1,37 @@ +#!/bin/bash + +# Purpose: run a step, record start and end with exit codes +# +# Call like this: +# mt_runstep stepname command .... +# +# This expects that you have a logpro file named stepname.logpro and must be run +# inside a test environment (click on xterm button on a test control panel +# then source megatest.csh (if you are using tcsh) or megatest.sh (if you are using +# bash, sh or zsh) +# +# Example: copy files +# mt_runstep copy_files cp $frompath $topath +# +# Use a copy_files.logpro file like this: +# (expect:error in "LogFileBody" = 0 "Any err/error/warn/warning" #/(err|warn)/) +# +stepname=$1;shift + +# Theoretically could call megatest directly like the following line but +# we'll do each individual step so folks can see what is going on. +# +# $MT_MEGATEST -runstep $stepname -logpro ${stepname}.logpro "$*" || exit $? + +# First, register the start of this step +$MT_MEGATEST -step $stepname :state start :status n/a + +# Second, run the command (the remaining stuff on the command line after the stepname) +# We could put the results in a log file for processing but we are relying on logpro... +# $* 2>&1 ${stepname}.log + +# So lets use a pipe to logpro, put the output from logpro into stepname_logpro.log +$* 2>&1| logpro ${stepname}.logpro ${stepname}.html 2>&1 ${stepname}_logpro.log + +# Finally, log the step completion and exit status +$MT_MEGATEST -step $stepname :state end :status ${PIPESTATUS[*]} Index: utils/mtutils.csh ================================================================== --- utils/mtutils.csh +++ utils/mtutils.csh @@ -1,5 +1,8 @@ +# Better to use the mt_* snippet scripts in utils +# To use the snippets set PREFIX then install with "make installall" + alias mt_runstep 'set argv=(\!*); \ set stepname = $1;shift; \ megatest -runstep $stepname -logpro ${stepname}.logpro "$*" || exit $?' alias mt_laststep 'set argv=(\!*);set stepname = $1;shift; \