# Copyright 2012-2021 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 "skipping shared library tests"
    return -1
}

if {[get_compiler_info]} {
    warning "Could not get compiler info"
    untested "no compiler info"
    return -1
}

standard_testfile .c
if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug shlib_load}] != "" } {
    untested "failed to compile"
    return -1
}

set testfile2 catch-load-so
set srcfile2 ${testfile2}.c
set binfile2 [standard_output_file ${testfile2}.so]
set binfile2_dlopen [shlib_target_file ${testfile2}.so]
if { [gdb_compile_shlib "${srcdir}/${subdir}/${srcfile2}" ${binfile2} {debug}] != "" } {
    untested "failed to compile shared library"
    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 testfile testfile2 binfile2 binfile2_dlopen
	global decimal gdb_prompt

	clean_restart $testfile
	gdb_load_shlib $binfile2

	if {![runto_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
