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