# Copyright 2014-2017 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 "set auto-connect-native-target off" and "target native" on
# native targets.

standard_testfile

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

# Whether this GDB is configured with a "native" target.
set have_native 0

set test "help target native"
gdb_test_multiple $test $test {
    -re "Undefined target command.*$gdb_prompt $" {
	set have_native 0
    }
    -re "Native process.*$gdb_prompt $" {
	set have_native 1
    }
}

if { !$have_native } {
    unsupported "no \"target native\" support."
    return
}

# Returns the topmost target pushed on the target stack.  TEST is used
# as test message.

proc get_topmost_target {test} {
    global gdb_prompt

    set topmost "unknown"

    gdb_test_multiple "maint print target-stack" $test {
	-re "The current target stack is:\r\n  - (\[^ \]+) .*$gdb_prompt $" {
	    set topmost $expect_out(1,string)
	    pass $test
	}
    }

    return $topmost
}

set topmost [get_topmost_target "check whether a target is already connected"]

# Testing against the extended-remote board, for example?
if { $topmost != "exec" } {
    unsupported "already connected to target $topmost."
    return
}

# Check which target this board connects to.  If testing with a native
# target board, this should cause the native target to auto connect.
if ![runto_main] then {
    fail "can't run to main"
    return 0
}

# Returns true if the native target is pushed on the target stack.
# TEST is used as test message.

proc check_native_target {test} {
    global gdb_prompt

    gdb_test_multiple "maint print target-stack" $test {
	-re " native .*$gdb_prompt $" {
	    pass $test
	    return 1
	}
	-re "$gdb_prompt $" {
	    pass $test
	}
    }

    return 0
}

# Testing against a remote board, for example?
if { ![check_native_target "check whether board tests the native target"] } {
    unsupported "not testing the native target."
    return
}

# Kill program.  TEST is used as test message.

proc kill_program {test} {
    global gdb_prompt

    gdb_test_multiple "kill" $test {
	-re "Kill the program being debugged\\? .y or n. $" {
	    send_gdb "y\n"
	    exp_continue
	}
	-re "$gdb_prompt $" {
	    pass $test
	}
    }
}

# Kill the program.  This should pop the target.  The "start" test
# below will fail otherwise.
kill_program "kill"

# Now prevent the native target from auto connecting.
gdb_test_no_output "set auto-connect-native-target off"

# Commands that rely on the native target auto-connecting should no longer work.
gdb_test "start" "Don't know how to run.*" "start no longer works"

# Explicitly connect to the native target.
gdb_test "target native" \
    "Done.  Use the \"run\" command to start a process.*" \
    "explicitly connect to the native target"

proc test_native_target_remains_pushed {} {
    gdb_test "maint print target-stack"  \
	"The current target stack is:\r\n  .* native .* exec .*" \
	"native target remains pushed"
}

# Test a set of "inferior gone" scenarios, making sure the target
# remains pushed.

with_test_prefix "kill" {
    gdb_test "start" "main.*" "start"

    kill_program "kill"

    test_native_target_remains_pushed
}

with_test_prefix "detach" {
    gdb_test "start" "main.*"

    set test "detach"
    gdb_test_multiple $test $test {
	-re "Detach the program being debugged\\? .y or n. $" {
	    send_gdb "y\n"
	    exp_continue
	}
	-re "$gdb_prompt $" {
	    pass $test
	}
    }

    test_native_target_remains_pushed
}

with_test_prefix "run to exit" {
    gdb_test "start" "Temporary breakpoint .* main .*"

    gdb_test "c" "$inferior_exited_re normally.*"

    test_native_target_remains_pushed
}

# Now test disconnecting.  Commands that rely on the native target
# auto-connecting should no longer work (again) after this.

with_test_prefix "disconnect" {
    gdb_test "start" "Temporary breakpoint .* main .*"

    set test "disconnect"
    gdb_test_multiple $test $test {
	-re "A program is being debugged already.* .y or n. $" {
	    send_gdb "y\n"
	    exp_continue
	}
	-re "$gdb_prompt $" {
	    pass $test
	}
    }

    set topmost \
	[get_topmost_target "check whether the target is no longer connected"]

    set test "no longer connected to a target"
    if { $topmost == "exec" } {
	pass $test
    } else {
	fail $test
    }

    gdb_test "start" "Don't know how to run.*" "start no longer works"
}

# Reenable auto-connecting to the native target.  Plain "start" should
# start working again.
gdb_test_no_output "set auto-connect-native-target on"

gdb_test "start" "Temporary breakpoint .* main .*" \
    "start auto-connects to the native target after reenabling auto-connect"
