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

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 binfile2_dlopen
	global srcfile
	global decimal gdb_prompt

	clean_restart $testfile
	gdb_load_shlibs $binfile2

	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
