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

standard_testfile .c

# This test is Linux-only.
if ![istarget *-*-linux*] then {
    unsupported "info-os.exp"
    return -1
}

# Support for XML-output is needed to run this test.
if [gdb_skip_xml_test] then {
    unsupported "info-os.exp"
    return -1
}

# Compile test program.
if { [prepare_for_testing ${testfile}.exp $testfile $srcfile {debug additional_flags=-lpthread}] } {
    fail "cannot compile test program"
    return -1
}

if ![runto_main] then {
    fail "cannot run to main"
    return -1
}

# Get PID of test program.
set inferior_pid -1
set test "get inferior process ID"
gdb_test_multiple "call getpid()" $test {
    -re ".* = ($decimal).*$gdb_prompt $" {
	set inferior_pid $expect_out(1,string)
	pass $test
    }
}

gdb_breakpoint ${srcfile}:[gdb_get_line_number "Set breakpoint here"]
gdb_continue_to_breakpoint "Set breakpoint here"

# Get keys and IDs of the IPC object instances.
set shmkey -1
set test "get shared memory key"
gdb_test_multiple "print shmkey" $test {
    -re ".* = ($decimal).*$gdb_prompt $" {
	set shmkey $expect_out(1,string)
	pass $test
    }
}
set shmid -1
set test "get shared memory ID"
gdb_test_multiple "print shmid" $test {
    -re ".* = ($decimal).*$gdb_prompt $" {
	set shmid $expect_out(1,string)
	pass $test
    }
}

set semkey -1
set test "get semaphore key"
gdb_test_multiple "print semkey" $test {
    -re ".* = ($decimal).*$gdb_prompt $" {
	set semkey $expect_out(1,string)
	pass $test
    }
}

set semid -1
set test "get semaphore ID"
gdb_test_multiple "print semid" $test {
    -re ".* = ($decimal).*$gdb_prompt $" {
	set semid $expect_out(1,string)
	pass $test
    }
}

set msgkey -1
set test "get message queue key"
gdb_test_multiple "print msgkey" $test {
    -re ".* = ($decimal).*$gdb_prompt $" {
	set msgkey $expect_out(1,string)
	pass $test
    }
}

set msqid -1
set test "get message queue ID"
gdb_test_multiple "print msqid" $test {
    -re ".* = ($decimal).*$gdb_prompt $" {
	set msqid $expect_out(1,string)
	pass $test
    }
}

# Get port number of test socket.
set port -1
set test "get socket port number"
gdb_test_multiple "print port" $test {
    -re ".* = ($decimal).*$gdb_prompt $" {
	set port $expect_out(1,string)
	pass $test
    }
}

# Act like gdb_test but prevent: +ERROR: internal buffer is full.

proc expect_multiline { command expect test } {
    global gdb_prompt

    # Do not duplicate FAILs from gdb_test_multiple.
    set pass 0
    set fail 0
    gdb_test_multiple $command $test {
	-re "^$expect *\r\n" {
	    pass $test
	    set pass 1
	    exp_continue
	}
	-re "^$gdb_prompt $" {
	    if !$pass {
		set fail 1
	    }
	    # Exit the loop.
	}
	-re "\r\n" {
	    # Drop the buffer.
	    exp_continue
	}
    }
    if $fail {
	fail $test
    }
}

# Test output of the 'info os' commands against the expected results.

#                                     pid            user  command      cores
expect_multiline "info os processes" "$inferior_pid +\\S+ +\\S*info-os +\[0-9,\]+" "get process list"

#                                      pgid           leader   pid            command line
expect_multiline "info os procgroups" "$inferior_pid +info-os +$inferior_pid +\\S*info-os" "get process groups"

#                                   pid            command  tid   core
expect_multiline "info os threads" "$inferior_pid +info-os +\\d+ +\\d+" "get threads"

#                                 pid            command  fd    name
expect_multiline "info os files" "$inferior_pid +info-os +\\d+ +/dev/null" "get file descriptors"

#                                   local address  l-port remote addr r-port state  user family protocol
expect_multiline "info os sockets" "0\\.0\\.0\\.0 +$port +0\\.0\\.0\\.0 +0 +LISTEN +\\S+ +INET +STREAM" "get internet-domain sockets"

#                               key   shmid   perm size creator command last op  command  num attached  user  group  creator user  creator group  last shmat() time  last shmdt() time  last shmctl() time
expect_multiline "info os shm" "$shmkey +$shmid +666 +4096 +info-os .*" "get shared-memory regions"

#                                      key   semid   perm num semaphores  user  group  creator user  creator group  last semop() time  last semctl() time
expect_multiline "info os semaphores" "$semkey +$semid +666 +1 .*" "get semaphores"

#                               key   msqid   perm  num used bytes  num messages  last msgsnd() command  last msgrcv() command  user  group  creator user  creator group  last msgsnd() time  last msgrcv() time  last msgctl() time
expect_multiline "info os msg" "$msgkey +$msqid +666 .*" "get message queues"


# The SysV IPC primitives linger on after the creating process is killed
# unless they are destroyed explicitly, so allow the test program to tidy
# up after itself.
gdb_test "continue" "exited.*"
