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

# Tests for permissions and observer mode.

# The permissions flags are only fully functional with stubs or targets
# that can run asynchronously.

standard_testfile start.c

if {[build_executable $testfile.exp $testfile \
	 $srcfile {debug nowarnings}] == -1} {
    untested "failed to compile"
    return -1
}

if [get_compiler_info] {
    return -1
}

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir

with_test_prefix "observer mode off" {

    gdb_test "show may-write-registers" \
	"Permission to write into registers is on."

    gdb_test "show may-write-memory" \
	"Permission to write into target memory is on."

    gdb_test "show may-insert-breakpoints" \
	"Permission to insert breakpoints in the target is on."

    gdb_test "show may-insert-tracepoints" \
	"Permission to insert tracepoints in the target is on."

    gdb_test "show may-insert-fast-tracepoints" \
	"Permission to insert fast tracepoints in the target is on."

    gdb_test "show may-interrupt" \
	"Permission to interrupt or signal the target is on."
}

gdb_test "set observer on" "Observer mode is now on." "enable observer mode"

with_test_prefix "observer mode on" {
    gdb_test "show may-write-memory" \
	"Permission to write into target memory is off."

    gdb_test "show may-write-registers" \
	"Permission to write into registers is off."

    gdb_test "show may-insert-breakpoints" \
	"Permission to insert breakpoints in the target is off."

    gdb_test "show may-insert-tracepoints" \
	"Permission to insert tracepoints in the target is off."

    gdb_test "show may-insert-fast-tracepoints" \
	"Permission to insert fast tracepoints in the target is on."

    gdb_test "show may-interrupt" \
	"Permission to interrupt or signal the target is off."
}

gdb_test "set observer off" "Observer mode is now off." "disable observer mode"

# Go back to all-stop mode.

gdb_test_no_output "set non-stop off"

gdb_load ${binfile}

if ![runto_main] then {
    perror "couldn't run to breakpoint"
    continue
}

gdb_test "print x = 45" "$decimal = 45" "set a global"

gdb_test "print x" "$decimal = 45" "validate setting a global"

gdb_test "set may-write-memory off"

gdb_test "print x = 92" "Writing to memory is not allowed.*" \
    "set a global, 2nd time"

gdb_test "print x" "$decimal = 45" "validate setting a global, 2nd time"

# FIXME Add tests for other flags when a testsuite-able target becomes
# available.
