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

if {[skip_shlib_tests]} {
    untested catch-load.exp
    return -1
}

if {[get_compiler_info]} {
    warning "Could not get compiler info"
    untested catch-load.exp
    return -1
}

set testfile catch-load
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}
if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug shlib_load}] != "" } {
    untested catch-load.exp
    return -1
}

set testfile2 catch-load-so
set srcfile2 ${testfile2}.c
set binfile2 ${objdir}/${subdir}/${testfile2}.so
set binfile2_dlopen [shlib_target_file ${testfile2}.so]
if { [gdb_compile_shlib "${srcdir}/${subdir}/${srcfile2}" ${binfile2} {debug}] != "" } {
    untested catch-load.exp
    return -1
}

# Run one set of tests.
# SCENARIO is the name of the test scenario, it is just used in test
# names.
# KIND is passed to the "catch" command.
# MATCH is a boolean saying whether we expect the catchpoint to be hit.
proc one_catch_load_test {scenario kind match sostop} { with_test_prefix "${scenario}" {
    global verbose testfile testfile2 binfile2_dlopen
    global srcfile
    global decimal gdb_prompt

    clean_restart $testfile
    gdb_load_shlibs $binfile2_dlopen

    if {![runto_main]} {
	fail "can't run to main"
	return
    }

    gdb_breakpoint [gdb_get_line_number "final breakpoint here"]
    gdb_test_no_output "set var libname = \"$binfile2_dlopen\""
    gdb_test_no_output "set stop-on-solib-events $sostop"
    gdb_test "catch $kind" "Catchpoint $decimal \\(.*\\)"

    gdb_test_multiple "continue" "continue" {
	-re "Catchpoint $decimal\r\n.*loaded .*/$testfile2.*\r\n.*$gdb_prompt $" {
	    if {$match} {
		pass "continue"
	    } else {
		fail "continue"
	    }
	}

	-re "Stopped due to shared library event.*\r\n$gdb_prompt $" {
	    if {$sostop} {
		pass "continue"
	    } else {
		fail "continue"
	    }
	}

	-re "Breakpoint $decimal, .*\r\n$gdb_prompt $" {
	    if {!$match} {
		pass "continue"
	    } else {
		fail "continue"
	    }
	}

	-re ".*$gdb_prompt $" {
	    fail "continue"
	}
    }
}}

one_catch_load_test "plain load" "load" 1 0
one_catch_load_test "plain load with stop-on-solib-events" "load" 1 1
one_catch_load_test "rx load" "load $testfile2" 1 0
one_catch_load_test "rx load with stop-on-solib-events" "load $testfile2" 1 1
one_catch_load_test "non-matching load" "load zardoz" 0 0
one_catch_load_test "non-matching load with stop-on-solib-events" \
    "load zardoz" 0 1

one_catch_load_test "plain unload" "unload" 1 0
one_catch_load_test "plain unload with stop-on-solib-events" "unload" 1 1
one_catch_load_test "rx unload" "unload $testfile2" 1 0
one_catch_load_test "rx unload with stop-on-solib-events" \
    "unload $testfile2" 1 1
one_catch_load_test "non-matching unload" "unload zardoz" 0 0
one_catch_load_test "non-matching unload with stop-on-solib-events" \
    "unload zardoz" 0 1
