# Copyright (C) 2007-2013 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
}


standard_testfile

if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable debug] != "" } {
    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
