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

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

# Test gdbserver monitor commands.

load_lib gdbserver-support.exp

set testfile "server"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/server-mon

if { [skip_gdbserver_tests] } {
    return 0
}

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
    return -1
}

gdb_exit
gdb_start
gdb_load $binfile
gdb_reinitialize_dir $srcdir/$subdir

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" "Debug output enabled\\."
gdb_test "monitor set debug 0" "Debug output disabled\\."
gdb_test "monitor set remote-debug 1" "Protocol debug output enabled\\."
gdb_test "monitor set remote-debug 0" "Protocol debug output disabled\\."
