# Tests for the MutexPrinter class.
#
# Copyright (C) 2016-2018 Free Software Foundation, Inc.
# This file is part of the GNU C Library.
#
# The GNU C Library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# The GNU C Library 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
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with the GNU C Library; if not, see
# <http://www.gnu.org/licenses/>.

import sys

from test_printers_common import *

test_source = sys.argv[1]
test_bin = sys.argv[2]
printer_files = sys.argv[3:]
printer_names = ['global glibc-pthread-locks']

try:
    init_test(test_bin, printer_files, printer_names)
    go_to_main()

    var = 'mutex'
    to_string = 'pthread_mutex_t'

    break_at(test_source, 'Test status (destroyed)')
    continue_cmd() # Go to test_status_destroyed
    test_printer(var, to_string, {'Status': 'Destroyed'})

    break_at(test_source, 'Test status (non-robust)')
    continue_cmd() # Go to test_status_no_robust
    test_printer(var, to_string, {'Status': 'Not acquired'})
    next_cmd()
    thread_id = get_current_thread_lwpid()
    # Owner ID might be reported either as the thread ID or as "Unknown"
    # (if e.g. lock elision is enabled).
    test_printer(var, to_string,
                 {'Status': 'Acquired, possibly with no waiters',
                  'Owner ID': r'({0}|Unknown)'.format(thread_id)})

    break_at(test_source, 'Test status (robust)')
    continue_cmd() # Go to test_status_robust
    test_printer(var, to_string, {'Status': 'Not acquired'})

    # We'll now test the robust mutex locking states.  We'll create a new
    # thread that will lock a robust mutex and exit without unlocking it.
    break_at(test_source, 'Create')
    continue_cmd() # Go to test_locking_state_robust
    # Set a breakpoint for the new thread to hit.
    break_at(test_source, 'Thread function')
    continue_cmd()
    # By now the new thread is created and has hit its breakpoint.
    set_scheduler_locking(True)
    parent = 1
    child = 2
    select_thread(child)
    child_id = get_current_thread_lwpid()
    # We've got the new thread's ID.
    select_thread(parent)
    # Make the new thread finish its function while we wait.
    continue_cmd(thread=child)
    # The new thread should be dead by now.
    break_at(test_source, 'Test locking (robust)')
    continue_cmd()
    test_printer(var, to_string, {'Owner ID': r'{0} \(dead\)'.format(child_id)})
    # Try to lock and unlock the mutex.
    next_cmd()
    test_printer(var, to_string, {'Owner ID': thread_id,
                           'State protected by this mutex': 'Inconsistent'})
    next_cmd()
    test_printer(var, to_string, {'Status': 'Not acquired',
                        'State protected by this mutex': 'Not recoverable'})
    set_scheduler_locking(False)

    break_at(test_source, 'Test recursive locks')
    continue_cmd() # Go to test_recursive_locks
    test_printer(var, to_string, {'Times acquired by the owner': '2'})
    next_cmd()
    test_printer(var, to_string, {'Times acquired by the owner': '3'})
    continue_cmd() # Exit

except (NoLineError, pexpect.TIMEOUT) as exception:
    print('Error: {0}'.format(exception))
    result = FAIL

else:
    print('Test succeeded.')
    result = PASS

exit(result)
