#   Copyright 2003, 2007-2012 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.


# 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
