# This file contains support code for the gdbtk test suite. # Copyright 2001 Red Hat, Inc. # # Based on the Tcl testsuite support code, portions of this file # are Copyright (c) 1990-1994 The Regents of the University of California and # Copyright (c) 1994-1996 Sun Microsystems, Inc. # global _test env srcdir objdir if {![info exists srcdir]} { if {[info exists env(SRCDIR)]} { set srcdir $env(SRCDIR) } else { set srcdir . } } if {![info exists objdir]} { if {[info exists env(OBJDIR)]} { set objdir $env(OBJDIR) } elseif {$_test(interactive)} { # If running interactively, assume that the objdir is # relative to the executable's location set objdir [file join [file dirname [info nameofexecutable]] testsuite gdb.gdbtk] } else { set objdir . } } if {![info exists _test(verbose)]} { if {[info exists env(GDBTK_VERBOSE)]} { set _test(verbose) $env(GDBTK_VERBOSE) } else { set _test(verbose) 0 } } if {![info exists _test(tests)]} { if {[info exists env(GDBTK_TESTS)]} { set _test(tests) $env(GDBTK_TESTS) } else { set _test(tests) {} } } if {[info exists env(GDBTK_LOGFILE)]} { set _test(logfile) [open $env(GDBTK_LOGFILE) a+] fconfigure $_test(logfile) -buffering none } else { set _test(logfile) {} } # Informs gdbtk internals that testsuite is running. An example # where this is needed is the window manager, which must place # all windows at some place on the screen so that the system's # window manager does not interfere. This is reset in gdbtk_test_done. set env(GDBTK_TEST_RUNNING) 1 # The gdb "file" command to use for gdbtk testing # NOTE: This proc appends ".exe" to all windows' programs proc gdbtk_test_file {filename} { global tcl_platform if {$tcl_platform(platform) == "windows"} { append filename ".exe" } set err [catch {gdb_cmd "file $filename" 1} text] if {$err} { error $text } return $text } proc gdbtk_test_run {{prog_args {}}} { global env # Get the target_info array from the testsuite array set target_info $env(TARGET_INFO) # We get the target ready by: # 1. Run all init commands # 2. Issue target command # 3. Issue load command # 4. Issue run command foreach cmd $target_info(init) { set err [catch {gdb_cmd $cmd 0} txt] if {$err} { _report_error "Target initialization command \"$cmd\" failed: $txt" return 0 } } if {$target_info(target) != ""} { set err [catch {gdb_cmd $target_info(target) 0} txt] if {$err} { _report_error "Failed to connect to target: $txt" return 0 } } if {$target_info(load) != ""} { set err [catch {gdb_cmd $target_info(load) 0} txt] if {$err} { _report_error "Failed to load: $txt" return 0 } } if {$target_info(run) != ""} { set err [catch {gdb_cmd $target_info(run) 0} txt] if {$err} { _report_error "Could not run target with \"$target_info(run)\": $txt" return 0 } } return 1 } proc _report_error {msg} { global _test if {[info exists _test(interactive)] && $_test(interactive)} { # Dialog tk_messageBox -message $msg -icon error -type ok } else { # to stderr puts stderr $msg } } proc gdbtk_print_verbose {status name description script code answer} { global _test switch $code { 0 { set code_words {} } 1 { set code_words "Test generated error: $answer" } 2 { set code_words "Test generated return exception; result was: $answer" } 3 { set code_words "Test generated break exception" } 4 { set code_words "Test generated continue exception" } 5 { set code_words "Test generated exception $code; message was:$answer" } } if {$_test(verbose) > 1 \ || ($_test(verbose) != 1 && ($status == "ERROR" || $status == "FAIL"))} { # Printed when user verbose mode (verbose > 1) or an error/failure occurs # not running the testsuite (dejagnu) puts stdout "\n" puts stdout "==== $name $description" puts stdout "==== Contents of test case:" puts stdout "$script" if {$code_words != ""} { puts stdout $code_words } puts stdout "==== Result was:" puts stdout "$answer" } elseif {$_test(verbose)} { # Printed for the testsuite (verbose = 1) puts stdout "[list $status $name $description $code_words]" if {$_test(logfile) != ""} { puts $_test(logfile) "\n" puts $_test(logfile) "==== $name $description" puts $_test(logfile) "==== Contents of test case:" puts $_test(logfile) "$script" if {$code_words != ""} { puts $_test(logfile) $code_words } puts $_test(logfile) "==== Result was:" puts $_test(logfile) "$answer" } } } # gdbtk_test # # This procedure runs a test and prints an error message if the # test fails. # # Arguments: # name - Name of test, in the form foo-1.2. # description - Short textual description of the test, to # help humans understand what it does. # script - Script to run to carry out the test. It must # return a result that can be checked for # correctness. # answer - Expected result from script. proc gdbtk_test {name description script answer} { global _test test_ran set test_ran 0 if {[string compare $_test(tests) ""] != 0} then { set ok 0 foreach test $_test(tests) { if [string match $test $name] then { set ok 1 break } } if !$ok then return } set code [catch {uplevel $script} result] set test_ran 1 if {$code != 0} { # Error gdbtk_print_verbose ERROR $name $description $script \ $code $result } elseif {[string compare $result $answer] == 0} { if {[string index $name 0] == "*"} { # XPASS set HOW XPASS } else { set HOW PASS } if {$_test(verbose)} { gdbtk_print_verbose $HOW $name $description $script \ $code $result if {$_test(verbose) != 1} { puts stdout "++++ $name ${HOW}ED" } } if {$_test(logfile) != ""} { puts $_test(logfile) "++++ $name ${HOW}ED" } } else { if {[string index $name 0] == "*"} { # XFAIL set HOW XFAIL } else { set HOW FAIL } gdbtk_print_verbose $HOW $name $description $script \ $code $result if {$_test(verbose) != 1} { puts stdout "---- Result should have been:" puts stdout "$answer" puts stdout "---- $name ${HOW}ED" } if {$_test(logfile) != ""} { puts $_test(logfile) "---- Result should have been:" puts $_test(logfile) "$answer" puts $_test(logfile) "---- $name ${HOW}ED" } } } proc gdbtk_dotests {file args} { global _test set savedTests $_test(tests) set _test(tests) $args source $file set _test(tests) $savedTests } proc gdbtk_test_done {} { global _test env if {$_test(logfile) != ""} { close $_test(logfile) } set env(GDBTK_TEST_RUNNING) 0 if {![info exists _test(interactive)] || !$_test(interactive)} { gdbtk_force_quit } } proc gdbtk_test_error {desc} { set desc [join [split $desc \n] |] puts "ERROR \{$desc\} \{\} \{\}" gdbtk_test_done } # Override the warning dialog. We don't want to see them. rename show_warning real_show_warning proc show_warning {msg} { global _test set str "INSIGHT TESTSUITE WARNING: $msg" puts stdout $str if {$_test(logfile) != ""} { puts $_test(logfile) $str } }