# Copyright (C) 2014-2020 Free Software Foundation, Inc.

# This program 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.
#
# This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.

if [target_info exists gdb,nointerrupts] {
    verbose "Skipping paginate-after-ctrl-c-running.exp because of nointerrupts."
    return
}

standard_testfile

if {[build_executable "failed to prepare" $testfile $srcfile debug] == -1} {
    return -1
}

# Send a ctrl-c while the target is running and the next output causes
# a pagination prompt.

proc test_ctrlc_while_target_running_paginates {} {
    global binfile srcfile
    global gdb_prompt pagination_prompt

    set testline [gdb_get_line_number "after sleep"]

    with_test_prefix "ctrlc target running" {
	clean_restart $binfile

	if ![runto_main] then {
	    fail "can't run to main"
	    return 0
	}

	gdb_test "b $srcfile:$testline" \
	    "Breakpoint .*$srcfile, line $testline.*" \
	    "set breakpoint"

	gdb_test_no_output "set height 2"

	# Wait for the "Continuing" line, indicating the program is
	# running.
	set test "continue"
	gdb_test_multiple $test $test {
	    -re "Continuing" {
		pass $test
	    }
	}

	# The program sleeps 10 seconds.  Wait just a bit and send a
	# ctrl-c.
	sleep 2
	send_gdb "\003"

	# GDB now intercepts the SIGINT and tries to let the user know
	# about the spurious signal, but that paginates.  Make sure
	# the user can respond to the pagination query.
	set test "got prompt"
	set saw_pagination_prompt 0
	gdb_test_multiple "" $test {
	    -re "$pagination_prompt$" {
		set saw_pagination_prompt 1
		send_gdb "\n"
		exp_continue
	    }
	    -re "$gdb_prompt $" {
		gdb_assert $saw_pagination_prompt $test
	    }
	}

	# Confirm GDB can still process input.
	gdb_test "p 1" " = 1" "GDB accepts further input"

	# In case the board file wants to send further commands.
	gdb_test_no_output "set height unlimited"
    }
}

test_ctrlc_while_target_running_paginates
