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

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

load_lib gdbserver-support.exp

standard_testfile

if { [skip_gdbserver_tests] } {
    return 0
}

global server_spawn_id

set gdbserver [find_gdbserver]
set gdbserver_command "$gdbserver --selftest"

set server_spawn_id [remote_spawn target $gdbserver_command]

set test "unit tests"
gdb_expect {
    -i $server_spawn_id
    -re "Ran ($decimal) unit tests, 0 failed" {
	set num_ran $expect_out(1,string)
	gdb_assert "$num_ran >= 0" $test
    }

    -re "Selftests have been disabled for this build.\r\n$" {
	unsupported $test
    }

    default {
	fail $test
    }
}
