#   Copyright (C) 2013 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 [is_remote target] then {
    # Testing with remote/non-stop is racy at the moment.
    unsupported "Testing dprintf with remote/non-stop is not supported."
    return 0
}

standard_testfile

if [prepare_for_testing "failed to prepare for dprintf with non-stop" \
    ${testfile} ${srcfile} {debug}] {
    return -1
}

gdb_test_no_output "set target-async on"
gdb_test_no_output "set non-stop on"

if ![runto main] {
    fail "Can't run to main"
    return -1
}

gdb_test "dprintf foo,\"At foo entry\\n\"" "Dprintf .*"

gdb_test "continue &" "Continuing\\."

# Wait for the dprintf to trigger.
set test "dprintf triggered"
gdb_expect {
    -re "At foo entry" {
	pass "$test"
    }
    timeout {
	fail "$test (timeout)"
    }
}

# Now test that we're still able to issue commands.  GDB used to
# implement re-resuming from dprintfs with a synchronous "continue" in
# the dprintf's command list, which stole the prompt from the user.
set test "interrupt"
gdb_test_multiple $test $test {
    -re "interrupt\r\n$gdb_prompt " {
	pass $test
    }
}

set test "inferior stopped"
gdb_test_multiple "" $test {
    -re "\r\n\\\[.* \[0-9\]+\\\] #1 stopped\\\.\r\n" {
	pass $test
    }
}
