# Common tests for the RWLockPrinter 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 = 'rwlock'
    to_string = 'pthread_rwlock_t'

    break_at(test_source, 'Test locking (reader)')
    continue_cmd() # Go to test_locking_reader
    test_printer(var, to_string, {'Status': 'Not acquired'})
    next_cmd()
    test_printer(var, to_string, {'Status': r'Acquired \(Read\)', 'Readers': '1'})
    next_cmd()
    test_printer(var, to_string, {'Readers': '2'})
    next_cmd()
    test_printer(var, to_string, {'Readers': '3'})

    break_at(test_source, 'Test locking (writer)')
    continue_cmd() # Go to test_locking_writer
    test_printer(var, to_string, {'Status': 'Not acquired'})
    next_cmd()
    thread_id = get_current_thread_lwpid()
    test_printer(var, to_string, {'Status': r'Acquired \(Write\)',
                                  'Writer ID': thread_id})

    continue_cmd() # Exit

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

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

exit(result)
