# Copyright (C) 2017-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/>.

# This file is part of the GDB testsuite.  It tests the mechanism
# exposing values to Python.

load_lib gdb-python.exp

standard_testfile py-rbreak.c py-rbreak-func2.c

if {[prepare_for_testing "failed to prepare" ${testfile} [list $srcfile $srcfile2]] } {
    return 1
}

# Skip all tests if Python scripting is not enabled.
if { [skip_python_tests] } { continue }

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

gdb_test_no_output "nosharedlibrary"
gdb_py_test_silent_cmd "py sl = gdb.rbreak(\"^\[^_\]\",minsyms=False)" \
    "get all function breakpoints" 0
gdb_test "py print(len(sl))" "11" \
    "check number of returned breakpoints is 11"
gdb_py_test_silent_cmd "py sl = gdb.rbreak(\"main\.\*\",minsyms=False)" \
    "get main function breakpoint" 0
gdb_test "py print(len(sl))" "1" \
    "check number of returned breakpoints is 1"
gdb_py_test_silent_cmd "py sl = gdb.rbreak(\"func\.\*\",minsyms=False,throttle=10)" \
    "get functions matching func.*" 0
gdb_test "py print(len(sl))" "9" \
    "check number of returned breakpoints is 9"
gdb_test "py gdb.rbreak(\"func\.\*\",minsyms=False,throttle=5)" \
    "Number of breakpoints exceeds throttled maximum.*" \
    "check throttle errors on too many breakpoints"
gdb_py_test_silent_cmd "py sl = gdb.rbreak(\"func1\",minsyms=True)" \
    "including minimal symbols, get functions matching func.*" 0
gdb_test "py print(len(sl))" "2" \
    "check number of returned breakpoints is 2"
gdb_py_test_silent_cmd "python sym = gdb.lookup_symbol(\"efunc1\")" \
    "find a symbol in objfile" 1
gdb_py_test_silent_cmd "python symtab = sym\[0\].symtab" \
    "get backing symbol table" 1
gdb_py_test_silent_cmd "py sl = gdb.rbreak(\"func\.\*\",minsyms=False,throttle=10,symtabs=\[symtab\])" \
    "get functions matching func.* in one symtab only" 0
gdb_test "py print(len(sl))" "3" \
    "check number of returned breakpoints is 3"
