# Copyright 2002, 2003, 2004, 2007, 2008, 2009 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/>.

# This file was written by Michael Snyder (msnyder@redhat.com)
# This is a test for the gdb command "info proc"

if $tracelevel then {
	strace $tracelevel
}

if { [is_remote target] } then {
  continue
}

set prms_id 0
set bug_id 0

set ws "\[ \t\]+"

set testfile "break"
set srcfile ${testfile}.c
set srcfile1 ${testfile}1.c
set binfile ${objdir}/${subdir}/${testfile}

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}0.o" object {debug nowarnings}] != "" } {
     untested info-proc.exp
     return -1
}

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile1}" "${binfile}1.o" object {debug nowarnings}] != "" } {
     untested info-proc.exp
     return -1
}

if  { [gdb_compile "${binfile}0.o ${binfile}1.o" "${binfile}" executable {debug nowarnings}] != "" } {
     untested info-proc.exp
     return -1
}

# Start with a fresh gdb.

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

# Does this gdb support info proc?
send_gdb "help info proc\n"
gdb_expect {
    -re "Undefined info command: .proc..  Try .help info.*$gdb_prompt $" {
	# info proc command not supported -- nothing to test here.
	unsupported "gdb does not support info proc on this target"
	return -1;
    }
    -re "Show /proc process information about .*$gdb_prompt $" {
	pass "help info proc"
    }
    -re ".*$gdb_prompt $" {
	fail "help info proc"
    }
    timeout {
	fail "help info proc (timeout)"
    }
}

gdb_test "info proc" "No current process.*" "info proc without a process"

if { ! [ runto_main ] } then {
    untested info-proc.exp
    return -1
}

gdb_test "info proc" "process ${decimal}.*" "info proc with process"

gdb_test "info proc mapping" \
	".*Mapped address spaces:.*${hex}${ws}${hex}${ws}${hex}${ws}${hex}.*" \
	"info proc mapping"
