# Copyright (C) 2007, 2009, 2010 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 file was written by Chris Demetriou (cgd@google.com).
# It tests printing of thread event (start, exit) information, and
# disabling of those messages.
#
# Note: the format of thread event messages (and also whether or not
# messages are printed and can be disabled) is dependent on the target
# thread support code.

# This test has only been verified with Linux targets, and would need
# to be generalized to support other targets
if ![istarget *-*-linux*] then {
    return
}

# When using gdbserver, even on Linux, we don't get notifications
# about new threads.  This is expected, so don't test for that.
if [is_remote target] then {
    return
}

if $tracelevel then {
        strace $tracelevel
}


set testfile "thread_events"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

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

proc gdb_test_thread_start {messages_enabled command pattern message} {
  global gdb_prompt

  if { $messages_enabled } {
    set events_expected 1
  } else {
    set events_expected 0
  }
  set events_seen 0

  return [gdb_test_multiple $command $message {
    -re "\\\[New Thread \[^\]\]*\\\]\r\n" {
      incr events_seen;
      exp_continue;
    }
    -re "\[\r\n\]*($pattern)\[\r\n\]+$gdb_prompt $" {
      if { $events_seen != $events_expected } {
        fail "$message (saw $events_seen, expected $events_expected)"
      } else {
        pass "$message"
      }
    }
  }]
}

proc gdb_test_thread_exit {messages_enabled command pattern message} {
  global gdb_prompt

  if { $messages_enabled } {
    set events_expected 1
  } else {
    set events_expected 0
  }
  set events_seen 0

  return [gdb_test_multiple $command $message {
    -re "\\\[Thread \[^\]\]* exited\\\]\r\n" {
      incr events_seen
      exp_continue;
    }
    -re "\[\r\n\]*($pattern)\[\r\n\]+$gdb_prompt $" {
      if { $events_seen != $events_expected } {
        fail "$message (saw $events_seen, expected $events_expected)"
      } else {
        pass "$message"
      }
    }
  }]
}

proc test_thread_messages {enabled} {
  global srcdir subdir binfile srcfile

  if { $enabled } {
    set enabled_string "with messages enabled"
  } else {
    set enabled_string "with messages disabled"
  }

  gdb_start
  gdb_reinitialize_dir $srcdir/$subdir
  gdb_load ${binfile}

  if { $enabled } {
     gdb_test "set print thread-events on"
  } else {
     gdb_test "set print thread-events off"
  }

  # The initial thread may log a 'New Thread' message, but we don't
  # check for it.
  if ![runto_main] then {
     fail "Can't run to main $enabled_string"
     return 1
  }

  gdb_test "break threadfunc" \
      "Breakpoint.*at.* file .*$srcfile, line.*" \
      "breakpoint at threadfunc $enabled_string"
  gdb_test "break after_join_func" \
      "Breakpoint.*at.* file .*$srcfile, line.*" \
      "breakpoint at after_join_func $enabled_string"

  # continue to threadfunc breakpoint.  A thread will start.
  # Expect to see a thread start message, if messages are enabled.
  gdb_test_thread_start $enabled "continue" \
       ".*Breakpoint .*,.*threadfunc.*at.*$srcfile:.*" \
       "continue to threadfunc $enabled_string"

  # continue to after_join_func breakpoint.  A thread will exit.
  # Expect to see a thread exit message, if messages are enabled.
  gdb_test_thread_exit $enabled "continue" \
       ".*Breakpoint .*,.*after_join_func.*at.*$srcfile:.*" \
       "continue to after_join_func $enabled_string"

  delete_breakpoints

  gdb_exit
}

test_thread_messages 0
test_thread_messages 1
