#   Copyright 2003 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 2 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */

# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@prep.ai.mit.edu

# 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
}

set prms_id 0
set bug_id 0

# 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}] != "" } {
     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}

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

  runto_main
  gdb_test "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
