#   Copyright 2003, 2007, 2008, 2009, 2010 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 running a program from the GDB prompt and then detaching it.
# NOTE: This test could be much more thorough.

if $tracelevel then {
	strace $tracelevel
}


# Only GNU/Linux is known to support this.
if { ! [istarget "*-*-linux*"] } {
  return 0
}

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

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

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
     untested detach.exp
     return -1
}

proc do_detach_tests {} {
  global srcdir
  global binfile
  global escapedbinfile
  global subdir
  global pass

  runto_main
  gdb_test_no_output "set should_exit = 1" "set should_exit, $pass"
  gdb_test "detach" "Detaching from program: .*$escapedbinfile, .*" "detach, $pass"
}

# Start with a fresh gdb
gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

global pass
set pass "one"
do_detach_tests

# Wait a moment and do it again.
exec sleep 1

set pass "two"
do_detach_tests

return 0
