# Copyright (C) 2014-2021 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/>.

# Test that a breakpoint hit event coming from background execution
# does not trigger pagination.

standard_testfile

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

# Check that we handle a stop event coming from a background execution
# command without getting caught in pagination.

proc test_bg_execution_pagination_return {} {
    global binfile
    global decimal

    with_test_prefix "paginate" {
	clean_restart $binfile

	if ![runto_main] then {
	    return 0
	}

	gdb_test "b after_sleep"

	gdb_test_no_output "set height 2"

	gdb_test "continue&" "Continuing\."

	gdb_test_multiple "" "no pagination, breakpoint hit" {
	    -re "Breakpoint $decimal, after_sleep\[^\r\n\]+\r\n\[^\r\n\]+\r\n" {
		pass $gdb_test_name
	    }
	}

	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_bg_execution_pagination_return
