Writing a test is a matter of spawning the test program, then using
the expect
to match the output and report failure as
appropriate.
A simple example is as follows.
# Timeout reduced to 3 seconds set timeout 3 # The name of this test and the command we will run set test_name "Simple test" set command_line "or32-elf-sim -f default.cfg test-prog.or32" # When verbose, tell the user what we are running if { $verbose > 1 } { send_user "starting $command_line\n" } # Run the program. spawn $command_line expect { # Check for any warning messages in the output first Warning { fail "$test_name: warning: $expect_out(buffer)" } # Check for any error messages ERROR { fail "$test_name: error: $expect_out(buffer)" } # The string indicating successful completion "Test complete" { pass "$test_name\n" } # EOF and timeout only come after everything else. EOF must be an error. eof { fail "$test_name: EOF\n" } # Timeout requires inspection to determine the cause of failure. timeout { unresolved "$test_name: timeout" } }
This test will look first for the strings "Warning"
or "ERROR"
in the output stream from the spawned
program. Then it will look for the string
Test complete
. Finally it will check for
end-of-file or timeout.
The ordering matters. For a small program, the spawned output could
all fit in the buffer. By that time, the program might have completed
execution. So that buffer would match both
Test complete
and end-of-file. So we must
check for successful completion first.
Similarly the program might generate warnings or errors, but still
print Test complete
. So we should check for
warnings or errors before we test for successful
completion.