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

load_lib "trace-support.exp"

if {[skip_shlib_tests]} {
    return 0
}

standard_testfile
set executable $testfile

set libipa [get_in_proc_agent]

set lib_opts debug

if [get_compiler_info] {
    return -1
}

set additional_flags [list quiet debug shlib=$libipa shlib_load \
			  "additional_flags=-lust -lurcu-bp" ]

if { [gdb_compile $srcdir/$subdir/$srcfile $binfile executable $additional_flags] != ""} {
    untested "UST library or headers are not installed"
    return -1
}

# Test that the socket file is removed when GDB quits, detaches or
# resumes the inferior until it exits.

proc strace_remove_socket { action } {
    with_test_prefix "remove_socket_after_${action}" {

    global executable
    global gdb_prompt
    global libipa

    # Restart with a fresh gdb.
    clean_restart $executable
    gdb_load_shlibs $libipa
    if ![runto_main] {
	fail "Can't run to main"
	return -1
    }

    # List the markers in program.
    gdb_test "info static-tracepoint-markers" \
	".*ust/bar\[\t \]+n\[\t \]+.*ust/bar2\[\t \]+n\[\t \]+.*"

    set pid ""
    set test "collect pid"
    gdb_test_multiple "info inferiors" $test {
	-re "process (\[-0-9a-fx\]+) \[^\n\]*\n.*${gdb_prompt} $" {
	    set pid $expect_out(1,string)
	    pass $test
	}
	-re ".*${gdb_prompt} $" {
	    fail $test
	}
    }

    set test "socket file exists"
    set socket_file "/tmp/gdb_ust${pid}"
    set status [remote_exec target "sh -c { \[ -S $socket_file \] }"]

    if { [lindex $status 0] == 0 } {
	pass $test
    } else {
	fail $test
    }

    send_gdb "${action}\n"
    gdb_expect {
	-re "A debugging session is active.\r\n.*\r\nQuit anyway\\? \\(y or n\\) $" {
	    send_gdb "y\n"
	}
	-re "Detaching .*, process .*$" {
	}
	-re "Continuing.*$" {
	}
    }

    set exists 1

    for {set i 1} {$i <= 5} {incr i} {
	set status [remote_exec target "sh -c { \[ -S $socket_file \] }"]
	if { [lindex $status 0] != 0 } {
	    set exists 0
	    break
	}
	sleep 1
    }

    if { ![is_remote target] && ![string equal $action "detach"] } {
	setup_kfail gdb/14161 *-*-*
    }

    set test "socket file removed"

    if { $exists } {
	fail $test
	# Since $socket_file is a socket file instead of a regular file, we
	# can't use 'remote_file target delete $socket_file' here.
	remote_exec target "sh -c \"rm -r $socket_file\""
    } else {
	pass $test
    }

    if { [string equal $action "quit"] && [is_remote host] } {
	global gdb_spawn_id
	# unset gdb_spawn_id here to avoid sending command 'quit' to GDB
	# later in default_gdb_exit.
	unset gdb_spawn_id
    }
}}

proc strace_info_marker { } {
    with_test_prefix "info_marker" {
	global executable
	global gdb_prompt
	global libipa

	# Restart with a fresh gdb.
	clean_restart $executable
	gdb_load_shlibs $libipa
	if ![runto_main] {
	    fail "Can't run to main"
	    return -1
	}

	# List the markers in program.  They should be disabled.
	gdb_test "info static-tracepoint-markers" \
	    ".*ust/bar\[\t \]+n\[\t \]+.*ust/bar2\[\t \]+n\[\t \]+.*"

	# List all the thread.  It is expected to get three threads without
	# any errors.
	gdb_test_multiple "info threads 3 2 1" "info threads" {
	    -re "3\[ \t\]+Thread .*2\[ \t\]+Thread .*1\[ \t\]+Thread .*${gdb_prompt} $" {
		pass "info threads"
	    }
	}

	# GDB detaches inferior so that the socket file can be removed.
	gdb_test_multiple "detach" "detach" {
	    -re "Detaching .*, process .*${gdb_prompt} $" {
		pass "detach"
	    }
	}
    }
}

proc strace_probe_marker { } {
    with_test_prefix "probe_marker" {
	global executable
	global expect_out
	global gdb_prompt
	global hex
	global libipa

	# Restart with a fresh gdb.
	clean_restart $executable
	gdb_load_shlibs $libipa
	if ![runto_main] {
	    fail "Can't run to main"
	    return -1
	}

	gdb_test "strace -m ust/bar" \
	    "Static tracepoint \[0-9\]+ at ${hex}: file.*"
	gdb_test "strace -m ust/bar2" \
	    "Static tracepoint \[0-9\]+ at ${hex}: file.*"
	# Two trace markers should be enabled.
	gdb_test "info static-tracepoint-markers" \
	    "ust/bar\[\t \]+y\[\t \]+$hex .*ust/bar2\[\t \]+y\[\t \]+$hex.*"

	gdb_test "break end" "Breakpoint \[0-9\]+ at.*"

	gdb_test_no_output "tstart"
	gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" \
	    "continue to end"
	gdb_test_no_output "tstop"

	gdb_test "tfind" "Found trace frame 0, tracepoint .*" \
	    "tfind frame 0"
	gdb_test "tfind" "Found trace frame 1, tracepoint .*" \
	    "tfind frame 1"
	gdb_test "tfind" \
	    "Target failed to find requested trace frame\\..*"
    }
}

proc strace_trace_on_same_addr { type } {
    with_test_prefix "trace_same_addr $type" {
	global executable
	global expect_out
	global gdb_prompt
	global hex
	global libipa

	# Restart with a fresh gdb.
	clean_restart $executable
	gdb_load_shlibs $libipa
	if ![runto_main] {
	    fail "Can't run to main"
	    return -1
	}

	set marker_bar_addr ""
	set marker_bar2_addr ""

	# List the markers in program.  They should be disabled.
	gdb_test_multiple "info static-tracepoint-markers" "info static-tracepoint-markers 1" {
	    -re ".*ust/bar\[\t \]+n.*${gdb_prompt} $" {
		set ignore ""

		regexp "ust/bar\[\t \]+n\[\t \]+($hex) .*ust/bar2\[\t \]+n\[\t \]+($hex) " \
		    "$expect_out(0,string)" ignore marker_bar_addr marker_bar2_addr

		pass "info static-tracepoint-markers 1"
	    }
	    -re ".*${gdb_prompt} $" {
		fail "info static-tracepoint-markers 1"
	    }
	}

	gdb_test "strace -m ust/bar" "Static tracepoint \[0-9\]+ at ${hex}: file.*"
	gdb_test "strace -m ust/bar2" "Static tracepoint \[0-9\]+ at ${hex}: file.*"
	# Two trace markers should be enabled.
	gdb_test "info static-tracepoint-markers" \
	    "ust/bar\[\t \]+y\[\t \]+$hex .*ust/bar2\[\t \]+y\[\t \]+$hex.*" \
	    "info static-tracepoint-markers 2"

	# Set breapoints or tracepoints.
	set test "${type} on marker bar"
	gdb_test_multiple "${type} *${marker_bar_addr}" $test {
	    -re "\(Fast trace|Trace|Break\)point \[0-9\]+ at ${hex}: file.*\r\n$gdb_prompt $" {
		pass $test
	    }
	    -re ".*\r\n$gdb_prompt $" {
		if [string equal $type "ftrace"] {
		    # The instruction may be not long enough to set a fast
		    # tracepoint.  Skip the rest of this test.
		    return -1
		} else {
		    fail $test
		}
	    }
	}
	set test "${type} on marker bar2"
	gdb_test_multiple "${type} *${marker_bar2_addr}" $test {
	    -re "\(Fast trace|Trace|Break\)point \[0-9\]+ at ${hex}: file.*" {
		pass $test
	    }
	    -re ".*\r\n$gdb_prompt $" {
		if [string equal $type "ftrace"] {
		    # The instruction may be not long enough to set a fast
		    # tracepoint.  Skip the rest of this test.
		    return -1
		} else {
		    fail $test
		}
	    }
	}

	gdb_test "break end" "Breakpoint \[0-9\]+ at.*"

	if [string equal $type "break"] {
	    gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" \
		"continue to bar"
	    gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" \
		"continue to bar2"
	    gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" \
		"continue to end"
	} else {

	    gdb_test_no_output "tstart"
	    gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" \
		"continue to end"
	    gdb_test_no_output "tstop"

	    gdb_test "tfind" "Found trace frame 0, tracepoint .*" \
		"tfind frame 0"
	    gdb_test "tfind" "Found trace frame 1, tracepoint .*" \
		"tfind frame 1"
	    gdb_test "tfind" "Found trace frame 2, tracepoint .*" \
		"tfind frame 2"
	    gdb_test "tfind" "Found trace frame 3, tracepoint .*" \
		"tfind frame 3"
	    gdb_test "tfind" \
		"Target failed to find requested trace frame\\..*"
	}
    }
}

proc strace_trace_on_diff_addr { } {
    with_test_prefix "trace_diff_addr" {

	global executable
	global expect_out
	global gdb_prompt
	global hex
	global libipa

	# Restart with a fresh gdb.
	clean_restart $executable
	gdb_load_shlibs $libipa
	if ![runto_main] {
	    fail "Can't run to main"
	    return -1
	}

	set marker_bar_addr ""
	set marker_bar2_addr ""

	# List the markers in program.  They should be disabled.
	gdb_test_multiple "info static-tracepoint-markers" "info static-tracepoint-markers 1" {
	    -re ".*ust/bar\[\t \]+n.*${gdb_prompt} $" {
		set ignore ""

		regexp "ust/bar\[\t \]+n\[\t \]+($hex) .*ust/bar2\[\t \]+n\[\t \]+($hex) " \
		    "$expect_out(0,string)" ignore marker_bar_addr marker_bar2_addr

		pass "info static-tracepoint-markers 1"
	    }
	    -re ".*${gdb_prompt} $" {
		fail "info static-tracepoint-markers 1"
	    }
	}

	gdb_test "strace -m ust/bar" "Static tracepoint \[0-9\]+ at ${hex}: file.*"

	gdb_test "info static-tracepoint-markers" \
	    "ust/bar\[\t \]+y\[\t \]+$hex .*ust/bar2\[\t \]+n\[\t \]+$hex.*" \
	    "info static-tracepoint-markers 2"


	# Set common tracepoint.
	gdb_test "trace *${marker_bar2_addr}" \
	    "Tracepoint \[0-9\]+ at ${hex}: file.*"

	gdb_test "break end" "Breakpoint \[0-9\]+ at.*"

	gdb_test_no_output "tstart"
	gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" \
	    "continue to end"
	gdb_test_no_output "tstop"

	gdb_test "tfind" "Found trace frame 0, tracepoint .*" \
	    "tfind frame 0"
	gdb_test "tfind" "Found trace frame 1, tracepoint .*" \
	    "tfind frame 1"
	gdb_test "tfind" \
	    "Target failed to find requested trace frame\\..*"
    }
}

# Run it on x86/x86_64 linux.
if { [istarget "x86_64-*-linux*"] || [istarget "i\[34567\]86-*-linux*"] } {
    strace_info_marker
    strace_remove_socket "quit"
    strace_remove_socket "detach"
    strace_remove_socket "continue"
}

clean_restart $executable
gdb_load_shlibs $libipa
if ![runto_main] {
    fail "Can't run to main to check for trace support"
    return -1
}
if { ![gdb_target_supports_trace] } then {
    # At this point, the socket file has been created.  We must make sure it is
    # removed when we return here.  GDB detaches inferior so that the socket
    # file can be removed.  Note that GDB simply kill inferior doesn't remove
    # the socket file.
    gdb_test "detach" "Detaching .*, process .*"
    unsupported "Current target does not support trace"
    return -1
}

strace_probe_marker

strace_trace_on_same_addr "trace"
strace_trace_on_same_addr "ftrace"
strace_trace_on_same_addr "break"
strace_trace_on_diff_addr
