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

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

set ws "\[ \t\]+"

standard_testfile break.c break1.c

if {[prepare_for_testing $testfile.exp $testfile \
	 [list $srcfile $srcfile2] {debug nowarnings}]} {
    untested $testfile.exp
    return -1
}

gdb_test "help info proc" "Show /proc process information about .*"

gdb_test_multiple "info proc" "info proc without a process" {
    -re "No current process.*$gdb_prompt $" {
	pass "info proc without a process"
    }
    -re "Not supported on this target.*$gdb_prompt $" {
	# info proc command not supported -- nothing to test here.
	unsupported "gdb does not support info proc on this target"
	return -1
    }
}

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"

if {[istarget "*-*-linux*"]} {
    set gcorefile [standard_output_file $testfile.gcore]
    if {[gdb_gcore_cmd $gcorefile "save a core file"]} {
	clean_restart $binfile

	gdb_test "core $gcorefile" "Core was generated by.*" \
	    "core [file tail $gcorefile]"

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