blob: aeef63c17c49527e6b66ab37bac8b75143726c2e [file] [log] [blame]
# Copyright (C) 2010-2018 Apple Inc. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# Examples of how to run:
# python3 Source/WebKit/Scripts/webkit/messages_unittest.py [-r]
# cd Source/WebKit/Scripts && python3 -m webkit.messages_unittest
# cd Source/WebKit/Scripts && python3 -m unittest discover -p '*_unittest.py'
import os
import re
import sys
import unittest
module_directory = os.path.dirname(os.path.abspath(__file__))
sys.path.append(os.path.abspath(os.path.join(module_directory, os.path.pardir)))
from webkit import messages, model, parser # noqa: E402
tests_directory = os.path.join(module_directory, 'tests')
reset_results = False
_test_receiver_names = [
'TestWithSuperclass',
'TestWithLegacyReceiver',
'TestWithoutAttributes',
'TestWithIfMessage',
'TestWithSemaphore',
'TestWithImageData',
'TestWithStream',
'TestWithStreamBuffer',
'TestWithCVPixelBuffer',
]
def receiver_header_file_name(receiver_name):
return '%sMessages.h' % receiver_name
def receiver_implementation_file_name(receiver_name):
return '%sMessageReceiver.cpp' % receiver_name
def parse_receiver(receiver_name):
with open(os.path.join(tests_directory, '{}.messages.in'.format(receiver_name))) as in_file:
return parser.parse(in_file)
assert(False)
class GeneratedFileContentsTest(unittest.TestCase):
def setUp(self):
self.test_receivers = [parse_receiver(receiver_name) for receiver_name in _test_receiver_names]
self.receivers = model.generate_global_model(self.test_receivers)
def assertGeneratedFileContentsEqual(self, actual_file_contents, expected_file_name):
try:
if reset_results:
with open(os.path.join(tests_directory, expected_file_name), mode='w') as out_file:
out_file.write(actual_file_contents)
return
with open(os.path.join(tests_directory, expected_file_name), mode='r') as in_file:
expected_file_contents = in_file.read()
actual_line_list = actual_file_contents.splitlines(False)
expected_line_list = expected_file_contents.splitlines(False)
for index, actual_line in enumerate(actual_line_list):
self.assertEquals(actual_line, expected_line_list[index])
self.assertEquals(len(actual_line_list), len(expected_line_list))
except Exception:
sys.stderr.write('In expected file %s\n' % expected_file_name)
raise
def test_receiver(self):
for receiver_name, receiver in zip(_test_receiver_names, self.test_receivers):
header_contents = messages.generate_messages_header(receiver)
self.assertGeneratedFileContentsEqual(header_contents, os.path.join(tests_directory, '{}Messages.h'.format(receiver_name)))
implementation_contents = messages.generate_message_handler(receiver)
self.assertGeneratedFileContentsEqual(implementation_contents, os.path.join(tests_directory, '{}MessageReceiver.cpp'.format(receiver_name)))
def test_message_names(self):
header_contents = messages.generate_message_names_header(self.receivers)
self.assertGeneratedFileContentsEqual(header_contents, os.path.join(tests_directory, 'MessageNames.h'))
implementation_contents = messages.generate_message_names_implementation(self.receivers)
self.assertGeneratedFileContentsEqual(implementation_contents, os.path.join(tests_directory, 'MessageNames.cpp'))
def test_message_argument_description(self):
receiver_header_files = ['{}Messages.h'.format(receiver.name) for receiver in self.receivers]
implementation_contents = messages.generate_message_argument_description_implementation(self.receivers, receiver_header_files)
self.assertGeneratedFileContentsEqual(implementation_contents, os.path.join(tests_directory, 'MessageArgumentDescriptions.cpp'))
def add_reset_results_to_unittest_help():
script_name = os.path.basename(__file__)
reset_results_help = '''
Custom Options:
-r, --reset-results Reset expected results for {0}
'''.format(script_name)
options_regex = re.compile('^Usage:')
lines = unittest.TestProgram.USAGE.splitlines(True)
index = 0
for index, line in enumerate(lines):
if options_regex.match(line) and index + 1 < len(lines):
lines.insert(index + 1, reset_results_help)
break
if index == (len(lines) - 1):
lines.append(reset_results_help)
unittest.TestProgram.USAGE = ''.join(lines)
def parse_sys_argv():
global reset_results
for index, arg in enumerate(sys.argv[1:]):
if arg in ('-r', '--r', '--reset', '--reset-results') or '--reset-results'.startswith(arg):
reset_results = True
del sys.argv[index + 1]
break
if __name__ == '__main__':
add_reset_results_to_unittest_help()
parse_sys_argv()
unittest.main()