# Copyright 2023-2026 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/>.

# Test DAP read/write memory.

require allow_dap_tests

load_lib dap-support.exp

standard_testfile

if {[build_executable ${testfile}.exp $testfile] == -1} {
    return
}

save_vars { env(ASAN_OPTIONS) env(TSAN_OPTIONS) } {
    # The request readMemory with count 18446744073709551615 triggers address
    # sanitizer.  Suppress the error, leaving us with just this warning:
    #   WARNING: AddressSanitizer failed to allocate 0xffffffffffffffff bytes
    append_environment ASAN_OPTIONS allocator_may_return_null 1
    append_environment TSAN_OPTIONS allocator_may_return_null 1

    if {[dap_initialize] == ""} {
	return
    }
}

set launch_id [dap_launch $testfile]

set line [gdb_get_line_number "BREAK"]
set obj [dap_check_request_and_response "set breakpoint by line number" \
	     setBreakpoints \
	     [format {o source [o path [%s]] breakpoints [a [o line [i %d]]]} \
		  [list s $srcfile] $line]]
set line_bpno [dap_get_breakpoint_number $obj]

dap_check_request_and_response "configurationDone" configurationDone

dap_check_response "launch response" launch $launch_id

dap_wait_for_event_and_check "inferior started" thread "body reason" started

dap_wait_for_event_and_check "stopped at line breakpoint" stopped \
    "body reason" breakpoint \
    "body hitBreakpointIds" $line_bpno

set obj [dap_check_request_and_response "evaluate global" \
	     evaluate {o expression [s thirty_two]}]
dap_match_values "global value" [lindex $obj 0] "body result" 7

set obj [dap_check_request_and_response "evaluate global pointer" \
	     evaluate {o expression [s thirty_two_p]}]
set addr [dict get [lindex $obj 0] body memoryReference]

set obj [dap_request_and_response \
	     readMemory [format {o memoryReference [s %s] count [i 18446744073709551615]} $addr]]
set response [lindex $obj 0]
gdb_assert { [dict get $response success] == "false" } "read memory, count to big"

set obj [dap_check_request_and_response "read memory" \
	     readMemory [format {o memoryReference [s %s] count [i 4]} $addr]]

set bytes [binary decode base64 [dict get [lindex $obj 0] body data]]
gdb_assert {[string length $bytes] == 4}

set newbytes ""
set zeros 0
set sevens 0
set others 0
foreach byte [split $bytes ""] {
    if {$byte == "\0"} {
	incr zeros
	append newbytes $byte
    } elseif {$byte == "\x7"} {
	incr sevens
	append newbytes "\x8"
    } else {
	incr others
    }
}
gdb_assert {$zeros == 3}
gdb_assert {$sevens == 1}
gdb_assert {$others == 0}

set encoded [binary encode base64 $newbytes]

set obj [dap_check_request_and_response "write memory" \
	     writeMemory [format {o memoryReference [s %s] count [i 4] data [s %s]} \
			      $addr $encoded]]

set obj [dap_check_request_and_response "re-evaluate global" \
	     evaluate {o expression [s thirty_two]}]
dap_match_values "updated global value" [lindex $obj 0] "body result" 8

dap_shutdown
