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

# 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 $testfile.exp
    return -1
}

if [get_compiler_info] {
    return -1
}

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir

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"

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"

gdb_test "set may-write-memory off"

gdb_test "print x = 92" "Writing to memory is not allowed.*" \
    "try to set a global"

gdb_test "print x" "$decimal = 45"

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