# Copyright (C) 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 Python-based
# frame-filters when the 'function ()' method on FrameDecorator
# returns the address for the function being decorated.

load_lib gdb-python.exp

standard_testfile

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

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

if ![runto_main] {
   return -1
}

# Run to our test breakpoint.
gdb_breakpoint [gdb_get_line_number "Break here"]
gdb_continue_to_breakpoint "run to test breakpoint"

gdb_test "bt" \
    [multi_line \
	 "#0  func3 \\(\\) at \[^\r\n\]+/py-framefilter-addr.c:21" \
	 "#1  $hex in func2 \\(\\) at \[^\r\n\]+/py-framefilter-addr.c:27" \
	 "#2  $hex in func1 \\(\\) at \[^\r\n\]+/py-framefilter-addr.c:33" \
	 "#3  $hex in main \\(\\) at \[^\r\n\]+/py-framefilter-addr.c:39" ] \
    "backtrace without frame filters"

# Make the frame filters Python script available.
set remote_python_file \
    [gdb_remote_download host ${srcdir}/${subdir}/${testfile}.py \
	 ${testfile}.py]

# And load it into GDB.
gdb_test_no_output "source ${remote_python_file}" "load python file"

gdb_test "bt" \
    [multi_line \
	 "#0  func3 \\(\\) at \[^\r\n\]+/py-framefilter-addr.c:21" \
	 "#1  $hex in func2 \\(\\) at \[^\r\n\]+/py-framefilter-addr.c:27" \
	 "#2  $hex in func1 \\(\\) at \[^\r\n\]+/py-framefilter-addr.c:33" \
	 "#3  $hex in main \\(\\) at \[^\r\n\]+/py-framefilter-addr.c:39" ] \
    "backtrace with frame filters"
