# 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 double-prompt-target-event-error.exp because of nointerrupts."
    return
}

standard_testfile

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

# Test throwing an error while GDB is handling a target event.  We use
# a ctrl-c/quit in a pagination prompt to emulate an error.  COMMAND
# is either "continue" or "wrapcont".  The latter is a continue issued
# from a user-defined command.  That exercises the case of the
# interpreter forced sync, which was the case that originally had a
# bug.

proc cancel_pagination_in_target_event { command } {
    global binfile srcfile
    global gdb_prompt pagination_prompt

    set testline [gdb_get_line_number "after sleep"]

    with_test_prefix "ctrlc target event: $command" {
	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"

	if { $command == "wrapcont" } {
	    gdb_test_multiple "define wrapcont" "define user command: wrapcont" {
		-re "Type commands for definition of \"wrapcont\".\r\nEnd with a line saying just \"end\".\r\n>$" {
		    # Note that "Continuing." is ommitted when
		    # "continue" is issued from a user-defined
		    # command.  Issue it ourselves.
		    gdb_test "echo Continuing\.\ncontinue\nend" "" \
			"define user command: wrapcont"
		}
	    }
	}

	# Wait for pagination prompt after the "Continuing" line,
	# indicating the program was running and then stopped.
	set saw_continuing 0
	set test "continue to pagination"
	gdb_test_multiple "$command" $test {
	    -re "$pagination_prompt$" {
		if {$saw_continuing} {
		    pass $test
		} else {
		    send_gdb "\n"
		    exp_continue
		}
	    }
	    -re "Continuing" {
		set saw_continuing 1
		exp_continue
	    }
	}

	# We're now stopped in a pagination query while handling a
	# target event (printing where the program stopped).  Quitting
	# the pagination should result in only one prompt being
	# output.
	send_gdb "\003p 1\n"

	# Note gdb_test_multiple has a default match for the prompt,
	# which issues a FAIL.  Consume the first prompt.
	set test "first prompt"
	gdb_test_multiple "" $test {
	    -re "$gdb_prompt" {
		pass "first prompt"
	    }
	}

	# We should only see one prompt more, and it should be
	# preceeded by print's output.
	set test "no double prompt"
	gdb_test_multiple "" $test {
	    -re "$gdb_prompt.*$gdb_prompt $" {
		# The bug is present, and expect managed to read
		# enough characters into the buffer to fill it with
		# both prompts.
		fail $test
	    }
	    -re " = 1\r\n$gdb_prompt $" {
		pass $test
	    }
	}

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

foreach variant { "continue" "wrapcont" } {
    cancel_pagination_in_target_event $variant
}
