[GTK][WPE] Bump libsoup3 version to 2.99.1
[WebKit-https.git] / Tools / Scripts / webkitpy / layout_tests / lint_test_expectations.py
1 # Copyright (C) 2012 Google Inc. All rights reserved.
2 #
3 # Redistribution and use in source and binary forms, with or without
4 # modification, are permitted provided that the following conditions are
5 # met:
6 #
7 #     * Redistributions of source code must retain the above copyright
8 # notice, this list of conditions and the following disclaimer.
9 #     * Redistributions in binary form must reproduce the above
10 # copyright notice, this list of conditions and the following disclaimer
11 # in the documentation and/or other materials provided with the
12 # distribution.
13 #     * Neither the name of Google Inc. nor the names of its
14 # contributors may be used to endorse or promote products derived from
15 # this software without specific prior written permission.
16 #
17 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
29 from __future__ import print_function
30 import logging
31 import optparse
32 import signal
33 import traceback
34
35 from webkitpy.common.host import Host
36 from webkitpy.layout_tests.models import test_expectations
37 from webkitpy.port import platform_options
38
39
40 # This mirrors what the shell normally does.
41 INTERRUPTED_EXIT_STATUS = signal.SIGINT + 128
42
43 # This is a randomly chosen exit code that can be tested against to
44 # indicate that an unexpected exception occurred.
45 EXCEPTIONAL_EXIT_STATUS = 254
46
47 _log = logging.getLogger(__name__)
48
49
50 def lint(host, options, logging_stream):
51     logger = logging.getLogger()
52     logger.setLevel(logging.INFO)
53     handler = logging.StreamHandler(logging_stream)
54     logger.addHandler(handler)
55
56     try:
57         ports_to_lint = [host.port_factory.get(name) for name in host.port_factory.all_port_names(options.platform)]
58         files_linted = set()
59         lint_failed = False
60
61         for port_to_lint in ports_to_lint:
62             if port_to_lint in ['gtk', 'wpe']:
63                 port_to_lint._options.additional_expectations = ['LayoutTests/platform/glib/TestExpectations']
64             expectations_dict = port_to_lint.expectations_dict()
65
66             # FIXME: This won't work if multiple ports share a TestExpectations file but support different modifiers in the file.
67             for expectations_file in expectations_dict.keys():
68                 if expectations_file in files_linted:
69                     continue
70
71                 try:
72                     expectations = test_expectations.TestExpectations(port_to_lint,
73                         expectations_to_lint={expectations_file: expectations_dict[expectations_file]})
74                     expectations.parse_all_expectations()
75                 except test_expectations.ParseError as e:
76                     lint_failed = True
77                     _log.error('')
78                     for warning in e.warnings:
79                         _log.error(warning)
80                     _log.error('')
81                 files_linted.add(expectations_file)
82
83         if lint_failed:
84             _log.error('Lint failed.')
85             return -1
86
87         _log.info('Lint succeeded.')
88         return 0
89     finally:
90         logger.removeHandler(handler)
91
92
93 def main(argv, _, stderr):
94     parser = optparse.OptionParser(option_list=platform_options(use_globs=True))
95     options, _ = parser.parse_args(argv)
96
97     if options.platform and 'test' in options.platform:
98         # It's a bit lame to import mocks into real code, but this allows the user
99         # to run tests against the test platform interactively, which is useful for
100         # debugging test failures.
101         from webkitpy.common.host_mock import MockHost
102         host = MockHost()
103     else:
104         host = Host()
105
106     try:
107         exit_status = lint(host, options, stderr)
108     except KeyboardInterrupt:
109         exit_status = INTERRUPTED_EXIT_STATUS
110     except Exception as e:
111         print('\n%s raised: %s' % (e.__class__.__name__, str(e)), file=stderr)
112         traceback.print_exc(file=stderr)
113         exit_status = EXCEPTIONAL_EXIT_STATUS
114
115     return exit_status