5268c2982dcf09233c42b4367e0c0544c0600054
[WebKit-https.git] / Tools / Scripts / webkitpy / webdriver_tests / webdriver_test_runner_w3c.py
1 # Copyright (C) 2017 Igalia S.L.
2 #
3 # Redistribution and use in source and binary forms, with or without
4 # modification, are permitted provided that the following conditions
5 # are met:
6 # 1.  Redistributions of source code must retain the above copyright
7 #     notice, this list of conditions and the following disclaimer.
8 # 2.  Redistributions in binary form must reproduce the above copyright
9 #     notice, this list of conditions and the following disclaimer in the
10 #     documentation and/or other materials provided with the distribution.
11 #
12 # THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
13 # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
14 # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
15 # DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
16 # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
17 # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
18 # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
19 # ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
20 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
21 # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
22
23 import logging
24 import os
25 import sys
26
27 from webkitpy.common.system.filesystem import FileSystem
28 from webkitpy.common.webkit_finder import WebKitFinder
29 from webkitpy.webdriver_tests.webdriver_w3c_executor import WebDriverW3CExecutor
30 from webkitpy.webdriver_tests.webdriver_test_result import WebDriverTestResult
31 from webkitpy.webdriver_tests.webdriver_w3c_web_server import WebDriverW3CWebServer
32
33 _log = logging.getLogger(__name__)
34
35
36 class WebDriverTestRunnerW3C(object):
37
38     def __init__(self, port, driver, display_driver):
39         self._port = port
40         self._driver = driver
41         self._display_driver = display_driver
42         self._results = []
43
44         self._server = WebDriverW3CWebServer(self._port)
45
46     def _tests_dir(self):
47         return WebKitFinder(self._port.host.filesystem).path_from_webkit_base('WebDriverTests')
48
49     def collect_tests(self, tests=[]):
50         relative_tests_dir = os.path.join('imported', 'w3c', 'webdriver', 'tests')
51         w3c_tests = []
52         if not tests:
53             tests = [relative_tests_dir]
54         for test in tests:
55             if not test.startswith(relative_tests_dir):
56                 continue
57             test_path = os.path.join(self._tests_dir(), test)
58             if os.path.isdir(test_path):
59                 w3c_tests.extend(self._scan_directory(test_path))
60             elif self._is_test(test_path):
61                 w3c_tests.append(test_path)
62         return w3c_tests
63
64     def _is_test(self, test):
65         if not os.path.isfile(test):
66             return False
67         if os.path.splitext(test)[1] != '.py':
68             return False
69         if os.path.basename(test) in ['conftest.py', '__init__.py']:
70             return False
71         if os.path.basename(os.path.dirname(test)) == 'support':
72             return False
73         return True
74
75     def _scan_directory(self, directory):
76         tests = []
77         for path in self._port.host.filesystem.files_under(directory):
78             if self._is_test(path):
79                 tests.append(path)
80         return tests
81
82     def _subtest_name(self, subtest):
83         path, test = subtest.split('::', 1)
84         return os.path.basename(path) + '::' + test
85
86     def run(self, tests=[]):
87         self._server.start()
88
89         executor = WebDriverW3CExecutor(self._driver, self._server, self._display_driver)
90         executor.setup()
91         timeout = self._port.get_option('timeout')
92         try:
93             for test in tests:
94                 test_name = os.path.relpath(test, self._tests_dir())
95                 harness_result, test_results = executor.run(test, timeout)
96                 result = WebDriverTestResult(test_name, *harness_result)
97                 if harness_result[0] == 'OK':
98                     for subtest, status, message, backtrace in test_results:
99                         result.add_subtest_results(self._subtest_name(subtest), status, message, backtrace)
100                 else:
101                     # FIXME: handle other results.
102                     pass
103                 self._results.append(result)
104         finally:
105             executor.teardown()
106             self._server.stop()
107
108         return len(self._results)
109
110     def results(self):
111         return self._results