Line 55... |
Line 55... |
eval "spawn $command_line"
|
eval "spawn $command_line"
|
|
|
# Try each matchstr in turn, counting the lines for error reporting
|
# Try each matchstr in turn, counting the lines for error reporting
|
set match_line 0;
|
set match_line 0;
|
|
|
|
# The tests for Or1ksim are generally monolithic, with each line of output
|
|
# matched representing a pass. This is different to the tests for the
|
|
# library, which are each small and individual.
|
foreach matchstr $match_list {
|
foreach matchstr $match_list {
|
|
|
set match_line [expr {$match_line + 1}];
|
set match_line [expr {$match_line + 1}];
|
|
|
# send_user "matching |$matchstr|\n";
|
# Each matchstring corresponds to a pass, unless its first character
|
|
# is '!', indicating a string which must match (without its '!'), but
|
|
# does not count towards the pass rate.
|
|
set first_ch [string index $matchstr 0]
|
|
|
expect {
|
if { $first_ch == "!" } {
|
|
# A line to ignore
|
|
set matchlen [string length $matchstr]
|
|
set last_index [expr {$matchlen - 1}]
|
|
set matchstr [string range $matchstr 1 $last_index]
|
|
|
$matchstr {
|
if { $verbose > 2 } {
|
# String to match. Silently accept. Do first, so we can match
|
send_user "ignorning |$matchstr|\n";
|
# specific warnings or errors if desired
|
}
|
}
|
}
|
|
|
-re "Warning" {
|
if { $verbose > 2 } {
|
fail "$testname: warning: $expect_out(buffer)";
|
send_user "matching |$matchstr|\n";
|
|
}
|
|
|
|
# The matching is slightly tricky. In general we want to find warnings
|
|
# or errors. However expect will look at the entire buffer, so if we
|
|
# have the match string *after* an error or warning message, then the
|
|
# match will still work OK.
|
|
|
|
# The trick is to do some post-processing of the matched buffer to see
|
|
# if there was a preceding Warning or ERROR message.
|
|
|
|
expect {
|
|
-ex $matchstr {
|
|
set matchlen [string length $matchstr]
|
|
set buflen [string length $expect_out(buffer)]
|
|
set lastch [expr {$buflen - $matchlen}]
|
|
set prefix [string range $expect_out(buffer) 0 $lastch]
|
|
|
|
if { [string match *ERROR* $prefix] } {
|
|
# We skipped an error
|
|
fail "$testname: ERROR seeking match line $match_line";
|
return
|
return
|
|
} elseif { [string match *Warning* $prefix] } {
|
|
# We skipped a warning
|
|
fail "$testname: Warning seeking match line $match_line";
|
|
return;
|
|
} elseif { $first_ch != "!" } {
|
|
# If we match we have a pass, unless we were asked to
|
|
# ignore.
|
|
pass "$testname: $matchstr"
|
|
}
|
|
# Everything else skip silently
|
}
|
}
|
|
|
-re "ERROR" {
|
ERROR {
|
fail "$testname: error: $expect_out(buffer)";
|
# An error other than the one we seek
|
|
fail "$testname: ERROR seeking match line $match_line";
|
return
|
return
|
}
|
}
|
|
|
|
Warning {
|
|
# Any warning
|
|
fail "$testname: Warning seeking match line $match_line";
|
|
return;
|
|
}
|
|
|
eof {
|
eof {
|
fail "$testname: hit EOF seeking match line $match_line";
|
fail "$testname: hit EOF seeking match line $match_line";
|
return
|
return
|
}
|
}
|
|
|
timeout {
|
timeout {
|
|
perror "Timeout";
|
unresolved "$testname: timeout";
|
unresolved "$testname: timeout";
|
return
|
return
|
}
|
}
|
}
|
}
|
}
|
}
|
|
|
# If we get here we've passed
|
# If we get here we've passed the whole test. No need to report anything
|
pass $testname;
|
# else.
|
|
|
}
|
}
|
|
|
# Timeout 3 seconds is plenty as default
|
# Timeout 3 seconds is plenty as default
|
set timeout 3
|
set timeout 3
|