# This testcase is part of GDB, the GNU debugger.

# Copyright 2007-2024 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 gdbserver monitor commands.

load_lib gdbserver-support.exp

standard_testfile server.c

require allow_gdbserver_tests

if {[prepare_for_testing "failed to prepare" $testfile $srcfile debug]} {
    return -1
}

# Make sure we're disconnected, in case we're testing with an
# extended-remote board, therefore already connected.
gdb_test "disconnect" ".*"

gdbserver_run ""

gdb_test_multiple "monitor help" "monitor help" {
    -re "Unknown monitor command.*$gdb_prompt $" {
	fail "monitor help"
    }
    -re "The following monitor commands.*$gdb_prompt $" {
	pass "monitor help"
    }
}

gdb_test "monitor" "Unknown monitor command.*Protocol error.*"

gdb_test "monitor set debug 1" "General debug output enabled\\."
gdb_test "monitor set debug 0" "All debug output disabled\\."
gdb_test "monitor set debug yeah" \
    [multi_line \
	 "Missing value for 'set debug yeah' command\\." \
	 "The following monitor commands are supported:" \
	 ".*"]
gdb_test "monitor set debug on sometimes" \
    [multi_line \
	 "Junk 'sometimes' found at end of 'set debug on' command\\." \
	 "The following monitor commands are supported:" \
	 ".*"]
gdb_test "monitor set debug on" "General debug output enabled\\."
gdb_test "monitor set debug off" "All debug output disabled\\."
gdb_test "monitor set debug remote 1" "Debug output for 'remote' enabled\\."
gdb_test "monitor set debug remote 0" "Debug output for 'remote' disabled\\."
gdb_test "monitor set debug remote on" "Debug output for 'remote' enabled\\."
gdb_test "monitor set debug remote off" "Debug output for 'remote' disabled\\."
gdb_test "monitor set debug event-loop 1" "Debug output for 'event-loop' enabled\\."
gdb_test "monitor set debug event-loop 0" "Debug output for 'event-loop' disabled\\."
gdb_test "monitor set debug event-loop on" "Debug output for 'event-loop' enabled\\."
gdb_test "monitor set debug event-loop off" "Debug output for 'event-loop' disabled\\."
gdb_test "monitor set debug threads 1" "Debug output for 'threads' enabled\\."
gdb_test "monitor set debug threads 0" "Debug output for 'threads' disabled\\."
gdb_test "monitor set debug threads on" "Debug output for 'threads' enabled\\."
gdb_test "monitor set debug threads off" "Debug output for 'threads' disabled\\."
gdb_test "monitor set debug all 1" "Debug output for 'all' enabled\\."
gdb_test "monitor set debug all 0" "Debug output for 'all' disabled\\."
gdb_test "monitor set debug all on" "Debug output for 'all' enabled\\."
gdb_test "monitor set debug all off" "Debug output for 'all' disabled\\."
gdb_test "monitor set debug all yeah" \
    [multi_line \
	 "Invalid value 'yeah' for 'set debug all'\\." \
	 "The following monitor commands are supported:" \
	 ".*"]
gdb_test "monitor set debug all on sometimes" \
    [multi_line \
	 "Junk 'sometimes' found at end of 'set debug all on' command\\." \
	 "The following monitor commands are supported:" \
	 ".*"]


gdb_test "monitor set debug-format all" \
    "All extra debug format options enabled\\."
gdb_test "monitor set debug-format none" \
    "All extra debug format options disabled\\."
