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

# This test only works for native processes on GNU/Linux.
if {[target_info gdb_protocol] != "" || ![istarget *-linux*]} {
    continue
}

# Test relies on checking gdb debug output. Do not run if gdb debug is
# enabled as any debug will be redirected to the log.
if [gdb_debug_enabled] {
    untested "debug is enabled"
    return 0
}

standard_testfile

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

# Case 1: libthread_db fakes a single thread with th_unique == NULL.
set thread_re1 "0 => $decimal => 0"
# Case 2: libthread_db already initialized.
set thread_re2 "$hex => $decimal => ${hex}(; errno = 0)?"
# Match either of the two cases.
set initial_thread_re "($thread_re1|$thread_re2)"

with_test_prefix "user-initiated check" {

    # User-initiated check with libthread_db not loaded.
    clean_restart ${binfile}

    gdb_test "maint show check-libthread-db" \
	"Whether to check libthread_db at load time is off."

    gdb_test_no_output "set stop-on-solib-events 1"
    gdb_run_cmd
    gdb_test "" \
	".*Stopped due to shared library event.*no libraries added or removed.*"

    gdb_test "maint check libthread-db" \
	"No libthread_db loaded" \
	"no libpthread.so loaded"

    # User-initiated check with NPTL possibly uninitialized.
    gdb_test "continue" \
	[multi_line \
	     "Stopped due to shared library event:" \
	     "  Inferior loaded .*(libpthread|libc).*"]

    gdb_test_sequence "maint check libthread-db" \
	"libpthread.so possibly not initialized" \
	[list \
	     "\[\r\n\]+Running libthread_db integrity checks:" \
	     "\[\r\n\]+\[ \]+Got thread $initial_thread_re ... OK" \
	     "\[\r\n\]+libthread_db integrity checks passed."]

    # User-initiated check with NPTL fully operational.
    gdb_test_no_output "set stop-on-solib-events 0"
    gdb_breakpoint break_here
    gdb_continue_to_breakpoint break_here

    gdb_test_sequence "maint check libthread-db" \
	"libpthread.so fully initialized" {
	    "\[\r\n\]+Running libthread_db integrity checks:"
	    "\[\r\n\]+\[ \]+Got thread 0x\[1-9a-f\]\[0-9a-f\]+ => \[0-9\]+ => 0x\[1-9a-f\]\[0-9a-f\]+; errno = 23 ... OK"
	    "\[\r\n\]+\[ \]+Got thread 0x\[1-9a-f\]\[0-9a-f\]+ => \[0-9\]+ => 0x\[1-9a-f\]\[0-9a-f\]+; errno = 42 ... OK"
	    "\[\r\n\]+libthread_db integrity checks passed."
	}
}

with_test_prefix "automated load-time check" {

    # Automated load-time check with NPTL possibly uninitialized.
    with_test_prefix "libpthread.so possibly not initialized" {
	clean_restart ${binfile}

	gdb_test_no_output "maint set check-libthread-db 1"
	gdb_test_no_output "set debug libthread-db 1"
	gdb_breakpoint break_here
	gdb_run_cmd

	gdb_test_sequence "" \
	    "check debug libthread-db output" \
	    [list \
		 "\[\r\n\]+Running libthread_db integrity checks:" \
		 "\[\r\n\]+\[ \]+Got thread $initial_thread_re ... OK" \
		 "\[\r\n\]+libthread_db integrity checks passed." \
		 "\[\r\n\]+\\\[Thread debugging using libthread_db enabled\\\]"]
    }

    # Automated load-time check with NPTL fully operational.
    with_test_prefix "libpthread.so fully initialized" {
	clean_restart ${binfile}

	gdb_test_no_output "maint set check-libthread-db 1"
	gdb_test_no_output "set debug libthread-db 1"

	set test_spawn_id [spawn_wait_for_attach $binfile]
	set testpid [spawn_id_get_pid $test_spawn_id]

	gdb_test_sequence "attach $testpid" \
	    "check debug libthread-db output" {
		"\[\r\n\]+Running libthread_db integrity checks:"
		"\[\r\n\]+\[ \]+Got thread 0x\[1-9a-f\]\[0-9a-f\]+ => \[0-9\]+ => 0x\[1-9a-f\]\[0-9a-f\]+ ... OK"
		"\[\r\n\]+\[ \]+Got thread 0x\[1-9a-f\]\[0-9a-f\]+ => \[0-9\]+ => 0x\[1-9a-f\]\[0-9a-f\]+ ... OK"
		"\[\r\n\]+libthread_db integrity checks passed."
		"\[\r\n\]+[Thread debugging using libthread_db enabled]"
	    }

	gdb_exit
	kill_wait_spawned_process $test_spawn_id
    }
}
