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

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

load_lib gdb-python.exp

standard_testfile

if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile}] } {
    return -1
}

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

if ![runto_main] then {
    fail "Cannot run to main."
    return 0
}

global hex decimal

# Initially there should be one breakpoint: main.

gdb_py_test_silent_cmd "python blist = gdb.breakpoints()" "Get Breakpoint List" 0
gdb_test "python print (blist\[0\])" "<gdb.Breakpoint object at $hex>" "Check obj exists"
gdb_test "python print (blist\[0\].location)" "main." "Check breakpoint location"

set mult_line [gdb_get_line_number "Break at multiply."]
gdb_breakpoint ${mult_line}
gdb_continue_to_breakpoint "Break at multiply."

# Check that the Python breakpoint code noted the addition of a
# breakpoint "behind the scenes". 
gdb_py_test_silent_cmd "python blist = gdb.breakpoints()" "Get Breakpoint List" 0
gdb_test "python print (len(blist))" "2" "Check for two breakpoints"
gdb_test "python print (blist\[0\])" "<gdb.Breakpoint object at $hex>" "Check obj exists"
gdb_test "python print (blist\[0\].location)" "main." "Check breakpoint location"
gdb_test "python print (blist\[1\])" "<gdb.Breakpoint object at $hex>" "Check obj exists"

gdb_test "python print (blist\[1\].location)" "py-breakpoint\.c:${mult_line}*" \
         "Check breakpoint location"

# Check hit and ignore counts. 
gdb_test "python print (blist\[1\].hit_count)" "1" "Check breakpoint hit count"
gdb_py_test_silent_cmd "python blist\[1\].ignore_count = 4" "Set breakpoint hit count" 0
gdb_continue_to_breakpoint "Break at multiply."
gdb_test "python print (blist\[1\].hit_count)" "6" "Check breakpoint hit count"
gdb_test "print result" " = 545" "Check expected variable result after 6 iterations"

# Test breakpoint is enabled and disabled correctly..
gdb_breakpoint [gdb_get_line_number "Break at add."]
gdb_continue_to_breakpoint "Break at add."
gdb_test "python print (blist\[1\].enabled)" "True" "Check breakpoint enabled."
gdb_py_test_silent_cmd  "python blist\[1\].enabled = False" "Set breakpoint disabled." 0
gdb_continue_to_breakpoint "Break at add."
gdb_py_test_silent_cmd  "python blist\[1\].enabled = True" "Set breakpoint enabled." 0
gdb_continue_to_breakpoint "Break at multiply."

# Test other getters and setters.
gdb_py_test_silent_cmd "python blist = gdb.breakpoints()" "Get Breakpoint List" 0
gdb_test "python print (blist\[1\].thread)" "None" "Check breakpoint thread"
gdb_test "python print (blist\[1\].type == gdb.BP_BREAKPOINT)" "True" "Check breakpoint type"
gdb_test "python print (blist\[0\].number)" "1" "Check breakpoint number"
gdb_test "python print (blist\[1\].number)" "2" "Check breakpoint number"
gdb_test "python print (blist\[2\].number)" "3" "Check breakpoint number"

# Start with a fresh gdb.
clean_restart ${testfile}

if ![runto_main] then {
    fail "Cannot run to main."
    return 0
}

# Test breakpoints are deleted correctly.
set deltst_location [gdb_get_line_number "Break at multiply."]
set end_location [gdb_get_line_number "Break at end."]
gdb_py_test_silent_cmd  "python dp1 = gdb.Breakpoint (\"$deltst_location\")" "Set breakpoint" 0
gdb_breakpoint [gdb_get_line_number "Break at end."]
gdb_py_test_silent_cmd "python del_list = gdb.breakpoints()" "Get Breakpoint List" 0
gdb_test "python print (len(del_list))" "3" "Number of breakpoints before delete"
gdb_continue_to_breakpoint "Break at multiply." ".*/$srcfile:$deltst_location.*"
gdb_py_test_silent_cmd  "python dp1.delete()" "Delete Breakpoint" 0
gdb_test "python print (dp1.number)" "RuntimeError: Breakpoint 2 is invalid.*" "Check breakpoint invalidated"
gdb_py_test_silent_cmd "python del_list = gdb.breakpoints()" "Get Breakpoint List" 0
gdb_test "python print (len(del_list))" "2" "Number of breakpoints after delete"
gdb_continue_to_breakpoint "Break at end." ".*/$srcfile:$end_location.*"


# Start with a fresh gdb.
clean_restart ${testfile}

if ![runto_main] then {
    fail "Cannot run to main."
    return 0
}

# Test conditional setting.
set bp_location1 [gdb_get_line_number "Break at multiply."]
gdb_py_test_silent_cmd  "python bp1 = gdb.Breakpoint (\"$bp_location1\")" "Set breakpoint" 0
gdb_continue_to_breakpoint "Break at multiply."
gdb_py_test_silent_cmd  "python bp1.condition = \"i == 5\"" "Set breakpoint" 0
gdb_test "python print (bp1.condition)" "i == 5" "Test conditional has been set"
gdb_continue_to_breakpoint "Break at multiply."
gdb_test "print i" "5" "Test conditional breakpoint stopped after five iterations"
gdb_py_test_silent_cmd  "python bp1.condition = None"  "Clear condition" 0
gdb_test "python print (bp1.condition)" "None" "Test conditional read"
gdb_continue_to_breakpoint "Break at multiply."
gdb_test "print i" "6" "Test breakpoint stopped after six iterations"

# Test commands.
gdb_breakpoint [gdb_get_line_number "Break at add."]
set test {commands $bpnum}
gdb_test_multiple $test $test { -re "\r\n>$" { pass $test } }
set test {print "Command for breakpoint has been executed."}
gdb_test_multiple $test $test { -re "\r\n>$" { pass $test } }
set test {print result}
gdb_test_multiple $test $test { -re "\r\n>$" { pass $test } }
gdb_test "end"

gdb_py_test_silent_cmd "python blist = gdb.breakpoints()" "Get Breakpoint List" 0
gdb_test "python print (blist\[len(blist)-1\].commands)" "print \"Command for breakpoint has been executed.\".*print result"

# Start with a fresh gdb.
clean_restart ${testfile}

if ![runto_main] then {
    fail "Cannot run to main."
    return 0
}

# Test invisible breakpoints.
delete_breakpoints
set ibp_location [gdb_get_line_number "Break at multiply."]
gdb_py_test_silent_cmd  "python ibp = gdb.Breakpoint(\"$ibp_location\", internal=False)" "Set invisible breakpoint" 0
gdb_py_test_silent_cmd "python ilist = gdb.breakpoints()" "Get Breakpoint List" 0
gdb_test "python print (ilist\[0\])" "<gdb.Breakpoint object at $hex>" "Check invisible bp obj exists"
gdb_test "python print (ilist\[0\].location)" "py-breakpoint\.c:$ibp_location*" "Check breakpoint location"
gdb_test "python print (ilist\[0\].visible)" "True" "Check breakpoint visibility"
gdb_test "info breakpoints" "py-breakpoint\.c:$ibp_location.*" "Check info breakpoints shows visible breakpoints"
delete_breakpoints
gdb_py_test_silent_cmd  "python ibp = gdb.Breakpoint(\"$ibp_location\", internal=True)" "Set invisible breakpoint" 0
gdb_py_test_silent_cmd "python ilist = gdb.breakpoints()" "Get Breakpoint List" 0
gdb_test "python print (ilist\[0\])" "<gdb.Breakpoint object at $hex>" "Check invisible bp obj exists"
gdb_test "python print (ilist\[0\].location)" "py-breakpoint\.c:$ibp_location*" "Check breakpoint location"
gdb_test "python print (ilist\[0\].visible)" "False" "Check breakpoint visibility"
gdb_test "info breakpoints" "No breakpoints or watchpoints.*" "Check info breakpoints does not show invisible breakpoints"
gdb_test "maint info breakpoints" "py-breakpoint\.c:$ibp_location.*" "Check maint info breakpoints shows invisible breakpoints"


# Watchpoints
# Start with a fresh gdb.
clean_restart ${testfile}

# Disable hardware watchpoints if necessary.
if [target_info exists gdb,no_hardware_watchpoints] {
    gdb_test_no_output "set can-use-hw-watchpoints 0" ""
}

if ![runto_main] then {
    fail "Cannot run to main."
    return 0
}

gdb_py_test_silent_cmd  "python wp1 = gdb.Breakpoint (\"result\", type=gdb.BP_WATCHPOINT, wp_class=gdb.WP_WRITE )" "Set watchpoint" 0
gdb_test "continue" ".*\[Ww\]atchpoint.*result.*Old value = 0.*New value = 25.*main.*" "Test watchpoint write"

# Internal breakpoints.

# Start with a fresh gdb.
clean_restart ${testfile}

# Disable hardware watchpoints if necessary.
if [target_info exists gdb,no_hardware_watchpoints] {
    gdb_test_no_output "set can-use-hw-watchpoints 0" ""
}
if ![runto_main] then {
    fail "Cannot run to main."
    return 0
}
delete_breakpoints
gdb_py_test_silent_cmd  "python wp1 = gdb.Breakpoint (\"result\", type=gdb.BP_WATCHPOINT, wp_class=gdb.WP_WRITE, internal=True )" "Set watchpoint" 0
gdb_test "info breakpoints" "No breakpoints or watchpoints.*" "Check info breakpoints does not show invisible breakpoints"
gdb_test "maint info breakpoints" ".*watchpoint.*result.*" "Check maint info breakpoints shows invisible breakpoints"
gdb_test "continue" ".*\[Ww\]atchpoint.*result.*Old value = 0.*New value = 25.*" "Test watchpoint write"

# Breakpoints that have an evaluation function.

# Start with a fresh gdb.
clean_restart ${testfile}

# Disable hardware watchpoints if necessary.
if [target_info exists gdb,no_hardware_watchpoints] {
    gdb_test_no_output "set can-use-hw-watchpoints 0" ""
}
if ![runto_main] then {
    fail "Cannot run to main."
    return 0
}
delete_breakpoints

gdb_py_test_multiple "Sub-class a breakpoint" \
  "python" "" \
  "class bp_eval (gdb.Breakpoint):" "" \
  "   inf_i = 0" "" \
  "   count = 0" "" \
  "   def stop (self):" "" \
  "      self.count = self.count + 1" "" \
  "      self.inf_i = gdb.parse_and_eval(\"i\")" "" \
  "      if self.inf_i == 3:" "" \
  "        return True" "" \
  "      return False" "" \
  "end" ""

gdb_py_test_multiple "Sub-class a second breakpoint" \
  "python" "" \
  "class bp_also_eval (gdb.Breakpoint):" "" \
  "   count = 0" "" \
  "   def stop (self):" "" \
  "      self.count = self.count + 1" "" \
  "      if self.count == 9:" "" \
  "        return True" "" \
  "      return False" "" \
  "end" ""

gdb_py_test_multiple "Sub-class a third breakpoint" \
  "python" "" \
  "class basic (gdb.Breakpoint):" "" \
  "   count = 0" "" \
  "end" ""

set bp_location2 [gdb_get_line_number "Break at multiply."]
set end_location [gdb_get_line_number "Break at end."]
gdb_py_test_silent_cmd  "python eval_bp1 = bp_eval(\"$bp_location2\")" "Set breakpoint" 0
gdb_py_test_silent_cmd  "python also_eval_bp1 = bp_also_eval(\"$bp_location2\")" "Set breakpoint" 0
gdb_py_test_silent_cmd  "python never_eval_bp1 = bp_also_eval(\"$end_location\")" "Set breakpoint" 0
gdb_continue_to_breakpoint "Break at multiply." ".*/$srcfile:$bp_location2.*"
gdb_test "print i" "3" "Check inferior value matches python accounting"
gdb_test "python print (eval_bp1.inf_i)" "3" "Check python accounting matches inferior"
gdb_test "python print (also_eval_bp1.count)" "4" \
    "Check non firing same-location breakpoint eval function was also called at each stop."
gdb_test "python print (eval_bp1.count)" "4" \
    "Check non firing same-location breakpoint eval function was also called at each stop."

delete_breakpoints
set cond_bp [gdb_get_line_number "Break at multiply."]
gdb_py_test_silent_cmd  "python eval_bp1 = bp_eval(\"$cond_bp\")" "Set breakpoint" 0
set test_cond {cond $bpnum}
gdb_test "$test_cond \"foo==3\"" "Cannot set a condition where a Python.*" \
    "Check you cannot add a CLI condition to a Python breakpoint that" \
    "has defined stop"
gdb_py_test_silent_cmd  "python eval_bp2 = basic(\"$cond_bp\")" "Set breakpoint" 0
gdb_py_test_silent_cmd  "python eval_bp2.condition = \"1==1\"" "Set a condition" 0
gdb_py_test_multiple "Construct an eval function" \
  "python" "" \
  "def stop_func ():" "" \
  "   return True" "" \
  "end" ""

gdb_test "python eval_bp2.stop = stop_func"  \
    "RuntimeError: Cannot set 'stop' method.*" \
    "Assign stop function to a breakpoint that has a condition"

delete_breakpoints
gdb_breakpoint [gdb_get_line_number "Break at multiply."]
gdb_py_test_silent_cmd  "python check_eval = bp_eval(\"$bp_location2\")" "Set breakpoint" 0
gdb_test "python print (check_eval.count)" "0" \
    "Test that evaluate function has not been yet executed (ie count = 0)"
gdb_continue_to_breakpoint "Break at multiply." ".*/$srcfile:$bp_location2.*"
gdb_test "python print (check_eval.count)" "1" \
    "Test that evaluate function is run when location also has normal bp"

gdb_py_test_multiple "Sub-class a watchpoint" \
  "python" "" \
  "class wp_eval (gdb.Breakpoint):" "" \
  "   def stop (self):" "" \
  "      self.result = gdb.parse_and_eval(\"result\")" "" \
  "      if self.result == 788:" "" \
  "        return True" "" \
  "      return False" "" \
  "end" ""

delete_breakpoints
gdb_py_test_silent_cmd  "python wp1 = wp_eval (\"result\", type=gdb.BP_WATCHPOINT, wp_class=gdb.WP_WRITE)" "Set watchpoint" 0
gdb_test "continue" ".*\[Ww\]atchpoint.*result.*Old value =.*New value = 788.*" "Test watchpoint write"
gdb_test "python print (never_eval_bp1.count)" "0" \
    "Check that this unrelated breakpoints eval function was never called."
