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

set testfile "info-os"
set srcfile ${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.*"
