| # Copyright (C) 1992-2016, 2024, 2026 Free Software Foundation, Inc. | |
| # | |
| # This file is part of DejaGnu. | |
| # | |
| # DejaGnu is free software: you can redistribute it and/or modify it | |
| # under the terms of the GNU General Public License as published by | |
| # the Free Software Foundation, either version 3 of the License, or | |
| # (at your option) any later version. | |
| # | |
| # DejaGnu is distributed in the hope that it will be useful, but | |
| # WITHOUT ANY WARRANTY; without even the implied warranty of | |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| # General Public License for more details. | |
| # | |
| # You should have received a copy of the GNU General Public License | |
| # along with DejaGnu. If not, see <http://www.gnu.org/licenses/>. | |
| # Setup an environment so we can execute library procs without DejaGnu. | |
| # | |
| # Start an Expect process | |
| # | |
| proc start_expect { } { | |
| global EXPECT | |
| global spawn_id | |
| # We need to setup default values and a few default procs so we | |
| # can execute library code without DejaGnu | |
| # Start expect | |
| set stty_init { -onlcr } | |
| spawn $EXPECT | |
| expect { | |
| -re "expect.*> " { | |
| verbose "Started the child expect shell" 2 | |
| } | |
| timeout { | |
| perror "Timed out starting the child expect shell." | |
| return -1 | |
| } | |
| } | |
| send_defaults | |
| } | |
| # | |
| # Send default variables to a running Expect | |
| # | |
| proc send_defaults { } { | |
| global spawn_id | |
| global build_triplet | |
| global host_triplet | |
| global target_triplet | |
| global target_os | |
| global target_cpu | |
| set vars [subst { | |
| tool foobar | |
| srcdir {[testsuite file -source -top]} | |
| objdir {[testsuite file -object -top]} | |
| subdir {[relative_filename\ | |
| [testsuite file -source -top]\ | |
| [testsuite file -source -test]]} | |
| build_triplet $build_triplet | |
| host_triplet $host_triplet | |
| target_triplet $target_triplet | |
| target_os $target_os | |
| target_cpu $target_cpu | |
| prms_id 0 | |
| bug_id 0 | |
| exit_status 0 | |
| xfail_flag 0 xfail_prms 0 | |
| kfail_flag 0 kfail_prms 0 | |
| mail_logs 0 | |
| multipass_name 0 | |
| }] | |
| # Load defaults | |
| exp_send "array set default_vars {$vars}\n" | |
| expect { | |
| "expect*> " { | |
| verbose "Loaded testing defaults." 2 | |
| return 1 | |
| } | |
| "+> " { | |
| # discard continuation prompts generated from sending a | |
| # multiline command to Expect | |
| exp_continue | |
| } | |
| timeout { | |
| perror "Couldn't load the testing defaults file." | |
| return -1 | |
| } | |
| } | |
| } | |
| # | |
| # Stop the running expect process | |
| # | |
| proc stop_expect { } { | |
| global spawn_id | |
| # make expect exit | |
| exp_send "exit\n" | |
| catch {close -i $spawn_id} | |
| catch {wait -i $spawn_id} | |
| } | |
| # | |
| # Load the library to test | |
| # | |
| proc load_test_lib { lib } { | |
| global spawn_id | |
| exp_send "source $lib\n" | |
| expect { | |
| "expect*> " { | |
| verbose "Testing $lib" 2 | |
| } | |
| timeout { | |
| perror "Couldn't load the libraries to test" | |
| return -1 | |
| } | |
| } | |
| } | |
| # | |
| # test a library proc that emits patterns | |
| # | |
| proc exp_test { cmd pattern msg } { | |
| global spawn_id | |
| exp_send "puts ACK ; $cmd ; puts NAK\r\n" | |
| expect { | |
| "puts ACK*puts NAK" { | |
| verbose "Got command echo" 3 | |
| } | |
| timeout { | |
| warning "Never got command echo" | |
| } | |
| } | |
| expect { | |
| "ACK" { | |
| exp_continue | |
| } | |
| -re "\r\n1\r\n" { | |
| warning "$msg, 1 was returned" | |
| exp_continue | |
| } | |
| -re "\r\n0\r\n" { | |
| warning "$msg, 0 was returned" | |
| exp_continue | |
| } | |
| $pattern { | |
| pass $msg | |
| } | |
| timeout { | |
| fail $msg | |
| } | |
| } | |
| } | |
| # test a config proc that only returns a code | |
| # ex... config_test "isbuild $build_triplet" "pass" "fail" "isbuild, native" | |
| # args are: command, true condition, false condition, message to print | |
| proc config_test { cmd true false msg } { | |
| global spawn_id | |
| set timeout 20 | |
| exp_send "puts ACK ; puts \[$cmd\] ; puts NAK\r\n" | |
| expect { | |
| "puts ACK*$cmd*puts NAK" { | |
| verbose "Got command echo" 3 | |
| } | |
| timeout { | |
| warning "Never got command echo" | |
| } | |
| } | |
| expect { | |
| -re {Checking pattern*with*[\r\n]} { | |
| exp_continue | |
| } | |
| -re "\r\n1\r\n" { | |
| $true $msg | |
| } | |
| -re "\r\n0\r\n" { | |
| $false $msg | |
| } | |
| timeout { | |
| perror "$msg (timed out)" | |
| } | |
| } | |
| } |