1# Copyright 2016-2020 Free Software Foundation, Inc.
2
3# This program is free software; you can redistribute it and/or modify
4# it under the terms of the GNU General Public License as published by
5# the Free Software Foundation; either version 3 of the License, or
6# (at your option) any later version.
7#
8# This program is distributed in the hope that it will be useful,
9# but WITHOUT ANY WARRANTY; without even the implied warranty of
10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11# GNU General Public License for more details.
12#
13# You should have received a copy of the GNU General Public License
14# along with this program.  If not, see <http://www.gnu.org/licenses/>.
15
16standard_testfile
17
18set compile_options "debug"
19if {[build_executable $testfile.exp $testfile ${srcfile} ${compile_options}] == -1} {
20    untested "failed to compile"
21    return -1
22}
23
24# Ensure no output has been sent.  Use MESSAGE as test message.
25
26proc ensure_no_output {message} {
27    global decimal
28
29    # Run a command and use an anchor to make sure no output appears
30    # before the command's expected output.
31    gdb_test "print 999" "^print 999\r\n\\\$$decimal = 999" $message
32}
33
34# Run a few execution-related commands on CON1, and ensure the proper
35# output, or none, if appropriate, is sent to CON2.  CON1_NAME and
36# CON2_NAME are the names of the consoles.
37
38proc do_execution_tests {con1 con1_name con2 con2_name} {
39    global srcfile
40    global decimal
41
42    set bp_lineno [gdb_get_line_number "set break $con1_name here"]
43
44    with_spawn_id $con1 {
45	gdb_test "next" "global = 1;"
46    }
47    with_spawn_id $con2 {
48	ensure_no_output "next causes no spurious output on other console"
49    }
50
51    with_spawn_id $con1 {
52	gdb_test "break $srcfile:$bp_lineno" \
53	    "Breakpoint $decimal .*$srcfile, line $bp_lineno\\." \
54	    "set breakpoint"
55    }
56    with_spawn_id $con2 {
57	ensure_no_output "break causes no spurious output on other console"
58    }
59
60    with_spawn_id $con1 {
61	gdb_test "continue" "set break $con1_name here .*" "continue to breakpoint"
62    }
63
64    with_spawn_id $con2 {
65	set test "breakpoint hit reported on other console"
66	gdb_test_multiple "" $test {
67	    -re "Breakpoint $decimal, .* set break $con1_name here " {
68		pass $test
69	    }
70	}
71    }
72}
73
74# The test proper.
75
76proc_with_prefix do_test {} {
77    global srcfile testfile
78    global gdb_prompt
79    global gdb_spawn_id
80    global gdb_main_spawn_id extra_spawn_id
81
82    clean_restart $testfile
83
84    if ![runto_main] {
85	untested "could not run to main"
86	return -1
87    }
88
89    gdb_test "new-ui" \
90	"Usage: new-ui INTERPRETER TTY" \
91	"new-ui without arguments"
92
93    set test "new-ui does not repeat"
94    send_gdb "\n"
95    gdb_test_multiple "" $test {
96	-re "^\r\n$gdb_prompt $" {
97	    pass $test
98	}
99    }
100
101    # Save the main UI's spawn ID.
102    set gdb_main_spawn_id $gdb_spawn_id
103
104    # Create the new PTY for the secondary console UI.
105    spawn -pty
106    set extra_spawn_id $spawn_id
107    set extra_tty_name $spawn_out(slave,name)
108    gdb_test_multiple "new-ui console $extra_tty_name" "new-ui" {
109	-re "New UI allocated\r\n$gdb_prompt $" {
110	}
111    }
112
113    with_spawn_id $extra_spawn_id {
114	set test "initial prompt on extra console"
115	gdb_test_multiple "" $test {
116	    -re "$gdb_prompt $" {
117		pass $test
118	    }
119	}
120    }
121
122    # Ensure non-execution commands in one console don't cause output
123    # in the other consoles.
124    with_spawn_id $gdb_main_spawn_id {
125	gdb_test "print 1" "^print 1\r\n\\\$1 = 1" "print on main console"
126    }
127    with_spawn_id $extra_spawn_id {
128	gdb_test "print 2" "^print 2\r\n\\\$2 = 2" "print on extra console"
129    }
130
131    # Verify that we get proper queries on the main UI, but that they are
132    # auto-answered on secondary UIs.
133    with_spawn_id $gdb_main_spawn_id {
134	gdb_test "delete" "" "delete all breakpoint on main console" \
135		 "Delete all breakpoints. .y or n. $" "n"
136    }
137    with_spawn_id $extra_spawn_id {
138	# Check output in two stages in order to override
139	# gdb_test_multiple's internal "got interactive prompt" fail
140	# that would otherwise match if the expect buffer happens to
141	# fill with partial output that ends in "(y or n) ".
142	set test "delete all breakpoints on extra console"
143	gdb_test_multiple "delete" $test {
144	    -re "Delete all breakpoints. .y or n. " {
145		gdb_test "" \
146		    ".answered Y; input not from terminal." \
147		    $test
148	    }
149	}
150    }
151
152    # Run a few execution tests with the main console as the driver
153    # console.
154    with_test_prefix "main console" {
155	do_execution_tests \
156	    $gdb_main_spawn_id "main console" \
157	    $extra_spawn_id "extra console"
158    }
159    # Same, but with the extra console as driver.
160    with_test_prefix "extra console" {
161	do_execution_tests \
162	    $extra_spawn_id "extra console" \
163	    $gdb_main_spawn_id "main console"
164    }
165}
166
167# Test missing / invalid arguments.
168
169proc_with_prefix do_test_invalid_args {} {
170    global testfile
171
172    clean_restart $testfile
173
174    spawn -pty
175    set extra_tty_name $spawn_out(slave,name)
176
177    # Test bad terminal path.
178    gdb_test "new-ui console /non/existent/path" \
179	     "opening terminal failed: No such file or directory\." \
180	     "new-ui with bad terminal path"
181
182    # Test bad interpreter name.
183    gdb_test "new-ui bloop $extra_tty_name" \
184	     "Interpreter `bloop' unrecognized" \
185	     "new-ui with bad interpreter name"
186
187    # Test that we can continue working normally.
188    if ![runto_main] {
189	fail "could not run to main"
190    }
191}
192
193do_test
194do_test_invalid_args
195