# Copyright 1997-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/>.  */


# On HP-UX 11.0, this test is causing a process running the program
# "attach" to be left around spinning.  Until we figure out why, I am
# commenting out the test to avoid polluting tiamat (our 11.0 nightly
# test machine) with these processes. RT
#
# Setting the magic bit in the target app should work.  I added a
# "kill", and also a test for the R3 register warning.  JB
if { [istarget "hppa*-*-hpux*"] } {
    return 0
}

# are we on a target board
if [is_remote target] then {
    return 0
}

set testfile "attach"
set srcfile  ${testfile}.c
set srcfile2 ${testfile}2.c
set binfile  ${objdir}/${subdir}/${testfile}
set binfile2 ${objdir}/${subdir}/${testfile}2
set escapedbinfile  [string_to_regexp ${objdir}/${subdir}/${testfile}]

#execute_anywhere "rm -f ${binfile} ${binfile2}"
remote_exec build "rm -f ${binfile} ${binfile2}"
# For debugging this test
#
#log_user 1

# build the first test case
#
if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
    untested attach.exp
    return -1
}

# Build the in-system-call test

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile2}" "${binfile2}" executable {debug}] != "" } {
    untested attach.exp
    return -1
}

if [get_compiler_info] {
    return -1
}

proc do_attach_tests {} {
    global gdb_prompt
    global binfile
    global escapedbinfile
    global srcfile
    global testfile
    global objdir
    global subdir
    global timeout
    
    # Start the program running and then wait for a bit, to be sure
    # that it can be attached to.

    set testpid [eval exec $binfile &]
    exec sleep 2
    if { [istarget "*-*-cygwin*"] } {
	# testpid is the Cygwin PID, GDB uses the Windows PID, which might be
	# different due to the way fork/exec works.
	set testpid [ exec ps -e | gawk "{ if (\$1 == $testpid) print \$4; }" ]
    }

    # Verify that we cannot attach to nonsense.

    set test "attach to nonsense is prohibited"
    gdb_test_multiple "attach abc" "$test" {
	-re "Illegal process-id: abc\\.\r\n$gdb_prompt $" {
	    pass "$test"
	}
	-re "Attaching to.*, process .*couldn't open /proc file.*$gdb_prompt $" {
	    # Response expected from /proc-based systems.
	    pass "$test" 
	}
	-re "Can't attach to process..*$gdb_prompt $" {
	    # Response expected on Cygwin
	    pass "$test"
	}
	-re "Attaching to.*$gdb_prompt $" {
	    fail "$test (bogus pid allowed)"
	}
    }

    # Verify that we cannot attach to nonsense even if its initial part is
    # a valid PID.

    set test "attach to digits-starting nonsense is prohibited"
    gdb_test_multiple "attach ${testpid}x" "$test" {
	-re "Illegal process-id: ${testpid}x\\.\r\n$gdb_prompt $" {
	    pass "$test"
	}
	-re "Attaching to.*, process .*couldn't open /proc file.*$gdb_prompt $" {
	    # Response expected from /proc-based systems.
	    pass "$test" 
	}
	-re "Can't attach to process..*$gdb_prompt $" {
	    # Response expected on Cygwin
	    pass "$test"
	}
	-re "Attaching to.*$gdb_prompt $" {
	    fail "$test (bogus pid allowed)"
	}
    }

    # Verify that we cannot attach to what appears to be a valid
    # process ID, but is a process that doesn't exist.  Traditionally,
    # most systems didn't have a process with ID 0, so we take that as
    # the default.  However, there are a few exceptions.

    set boguspid 0
    if { [istarget "*-*-*bsd*"] } {
	# In FreeBSD 5.0, PID 0 is used for "swapper".  Use -1 instead
	# (which should have the desired effect on any version of
	# FreeBSD, and probably other *BSD's too).
	set boguspid -1
    }
    set test "attach to nonexistent process is prohibited"
    gdb_test_multiple "attach $boguspid" "$test" {
	-re "Attaching to.*, process $boguspid.*No such process.*$gdb_prompt $" {
	    # Response expected on ptrace-based systems (i.e. HP-UX 10.20).
	    pass "$test"
	}
	-re "Attaching to.*, process $boguspid failed.*Hint.*$gdb_prompt $" {
	    # Response expected on ttrace-based systems (i.e. HP-UX 11.0).
	    pass "$test"
	}
	-re "Attaching to.*, process $boguspid.*denied.*$gdb_prompt $" {
	    pass "$test"
	}
	-re "Attaching to.*, process $boguspid.*not permitted.*$gdb_prompt $" {
	    pass "$test"
	}
	-re "Attaching to.*, process .*couldn't open /proc file.*$gdb_prompt $" {
	    # Response expected from /proc-based systems.
	    pass "$test"
	}
	-re "Can't attach to process..*$gdb_prompt $" {
	    # Response expected on Cygwin
	    pass "$test"
	}
	-re "Attaching to.*, process $boguspid.*failed.*$gdb_prompt $" {
	    # Response expected on the extended-remote target.
	    pass "$test"
	}
    }
    
    # Verify that we can attach to the process by first giving its
    # executable name via the file command, and using attach with the
    # process ID.

    # (Actually, the test system appears to do this automatically for
    # us.  So, we must also be prepared to be asked if we want to
    # discard an existing set of symbols.)
    
    set test "set file, before attach1"
    gdb_test_multiple "file $binfile" "$test" {
	-re "Load new symbol table from.*y or n. $" {
	    gdb_test "y" "Reading symbols from $escapedbinfile\.\.\.*done." \
		"$test (re-read)"
	}
	-re "Reading symbols from $escapedbinfile\.\.\.*done.*$gdb_prompt $" {
	    pass "$test"
	}
    }

    set test "attach1, after setting file"
    gdb_test_multiple "attach $testpid" "$test" {
	-re "Attaching to program.*`?$escapedbinfile'?, process $testpid.*main.*at .*$srcfile:.*$gdb_prompt $" {
	    pass "$test"
	}
	-re "Attaching to program.*`?$escapedbinfile\.exe'?, process $testpid.*\[Switching to thread $testpid\..*\].*$gdb_prompt $" {
	    # Response expected on Cygwin
	    pass "$test"
	}
    }

    # Verify that we can "see" the variable "should_exit" in the
    # program, and that it is zero.
   
    gdb_test "print should_exit" " = 0" "after attach1, print should_exit"

    # Detach the process.
   
    gdb_test "detach" \
	"Detaching from program: .*$escapedbinfile, process $testpid" \
	"attach1 detach"

    # Wait a bit for gdb to finish detaching
    
    exec sleep 5

    # Purge the symbols from gdb's brain.  (We want to be certain the
    # next attach, which won't be preceded by a "file" command, is
    # really getting the executable file without our help.)
    
    set old_timeout $timeout
    set timeout 15 
    set test "attach1, purging symbols after detach"
    gdb_test_multiple "file" "$test" {
	-re "No executable file now.*Discard symbol table.*y or n. $" {
	    gdb_test "y" "No symbol file now." "$test"
	}
    }
    set timeout $old_timeout

    # Verify that we can attach to the process just by giving the
    # process ID.
   
    set test "attach2, with no file"
    set found_exec_file 0
    gdb_test_multiple "attach $testpid" "$test" {
	-re "Attaching to process $testpid.*Load new symbol table from \"$escapedbinfile\.exe\".*y or n. $" {
	    # On Cygwin, the DLL's symbol tables are loaded prior to the
	    # executable's symbol table.  This in turn always results in
	    # asking the user for actually loading the symbol table of the
	    # executable.
	    gdb_test "y" "Reading symbols from $escapedbinfile\.\.\.*done." \
		"$test (reset file)"

	    set found_exec_file 1
	}
	-re "Attaching to process $testpid.*Reading symbols from $escapedbinfile.*main.*at .*$gdb_prompt $" {
	    pass "$test"
	    set found_exec_file 1
	}
    }

    if {$found_exec_file == 0} {
	set test "load file manually, after attach2"
	gdb_test_multiple "file $binfile" "$test" {
	    -re "A program is being debugged already..*Are you sure you want to change the file.*y or n. $" {
		gdb_test "y" "Reading symbols from $escapedbinfile\.\.\.*done." \
		    "$test (re-read)"
	    }
	    -re "Reading symbols from $escapedbinfile\.\.\.*done.*$gdb_prompt $" {
		pass "$test"
	    }
	}
    }

    # Verify that we can modify the variable "should_exit" in the
    # program.

    gdb_test_no_output "set should_exit=1" "after attach2, set should_exit"

    # Verify that the modification really happened.

    gdb_test "tbreak 19" "Temporary breakpoint .*at.*$srcfile, line 19.*" \
	"after attach2, set tbreak postloop"

    gdb_test "continue" "main.*at.*$srcfile:19.*" \
	"after attach2, reach tbreak postloop"

    # Allow the test process to exit, to cleanup after ourselves.

    gdb_continue_to_end "after attach2, exit"

    # Make sure we don't leave a process around to confuse
    # the next test run (and prevent the compile by keeping
    # the text file busy), in case the "set should_exit" didn't
    # work.
   
    remote_exec build "kill -9 ${testpid}"

    # Start the program running and then wait for a bit, to be sure
    # that it can be attached to.
   
    set testpid [eval exec $binfile &]
    exec sleep 2
    if { [istarget "*-*-cygwin*"] } {
	# testpid is the Cygwin PID, GDB uses the Windows PID, which might be
	# different due to the way fork/exec works.
	set testpid [ exec ps -e | gawk "{ if (\$1 == $testpid) print \$4; }" ]
    }

    # Verify that we can attach to the process, and find its a.out
    # when we're cd'd to some directory that doesn't contain the
    # a.out.  (We use the source path set by the "dir" command.)
    
    gdb_test "dir ${objdir}/${subdir}" "Source directories searched: .*" \
	"set source path"

    gdb_test "cd /tmp" "Working directory /tmp." \
	"cd away from process working directory"

    # Explicitly flush out any knowledge of the previous attachment.

    set test "before attach3, flush symbols"
    gdb_test_multiple "symbol-file" "$test" {
	-re "Discard symbol table from.*y or n. $" {
	    gdb_test "y" "No symbol file now." \
		"$test"
	}
	-re "No symbol file now.*$gdb_prompt $" {
	    pass "$test"
	}
    }

    gdb_test "exec" "No executable file now." \
	"before attach3, flush exec"

    gdb_test "attach $testpid" \
	"Attaching to process $testpid.*Reading symbols from $escapedbinfile.*main.*at .*" \
	"attach when process' a.out not in cwd"

    set test "after attach3, exit"
    gdb_test "kill" \
	"" \
	"$test" \
	"Kill the program being debugged.*y or n. $" \
	"y"
    
    # Another "don't leave a process around"
    remote_exec build "kill -9 ${testpid}"
}

proc do_call_attach_tests {} {
    global gdb_prompt
    global binfile2
    
    # Start the program running and then wait for a bit, to be sure
    # that it can be attached to.
   
    set testpid [eval exec $binfile2 &]
    exec sleep 2
    if { [istarget "*-*-cygwin*"] } {
	# testpid is the Cygwin PID, GDB uses the Windows PID, which might be
	# different due to the way fork/exec works.
	set testpid [ exec ps -e | gawk "{ if (\$1 == $testpid) print \$4; }" ]
    }

    # Attach
   
    gdb_test "file $binfile2" ".*" "force switch to gdb64, if necessary"
    set test "attach call"
    gdb_test_multiple "attach $testpid" "$test" {
	-re "warning: reading register.*I.*O error.*$gdb_prompt $" {
	    fail "$test (read register error)"
	}
	-re "Attaching to.*process $testpid.*libc.*$gdb_prompt $" {
	    pass "$test"
	}
	-re "Attaching to.*process $testpid.*\[Switching to thread $testpid\..*\].*$gdb_prompt $" {
	    pass "$test"
	}
    }

    # See if other registers are problems
    
    set test "info other register"
    gdb_test_multiple "i r r3" "$test" {
	-re "warning: reading register.*$gdb_prompt $" {
	    fail "$test"
	}
	-re "r3.*$gdb_prompt $" {
	    pass "$test"
	}
    }

    # Get rid of the process
    
    gdb_test "p should_exit = 1"
    gdb_continue_to_end
   
    # Be paranoid
   
    remote_exec build "kill -9 ${testpid}"
}


# Start with a fresh gdb

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

# This is a test of gdb's ability to attach to a running process.

do_attach_tests

# Test attaching when the target is inside a system call

gdb_exit
gdb_start

gdb_reinitialize_dir $srcdir/$subdir
do_call_attach_tests

return 0
