WebDriver: add support for test expectations
[WebKit-https.git] / Tools / Scripts / webkitpy / webdriver_tests / webdriver_test_runner_selenium.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_selenium_executor import WebDriverSeleniumExecutor
30 from webkitpy.webdriver_tests.webdriver_test_result import WebDriverTestResult
31
32 _log = logging.getLogger(__name__)
33
34
35 class WebDriverTestRunnerSelenium(object):
36
37     def __init__(self, port, driver, display_driver, expectations):
38         self._port = port
39         self._driver = driver
40         self._display_driver = display_driver
41         self._expectations = expectations
42         self._results = []
43         self._tests_dir = WebKitFinder(self._port.host.filesystem).path_from_webkit_base('WebDriverTests')
44
45     def collect_tests(self, tests):
46         if self._driver.selenium_name() is None:
47             return 0
48
49         skipped = [os.path.join(self._tests_dir, test) for test in self._expectations.skipped_tests()]
50         relative_tests_dir = os.path.join('imported', 'selenium', 'py', 'test')
51         executor = WebDriverSeleniumExecutor(self._driver, self._display_driver)
52         # Collected tests are relative to test directory.
53         base_dir = os.path.join(self._tests_dir, os.path.dirname(relative_tests_dir))
54         collected_tests = [os.path.join(base_dir, test) for test in executor.collect(os.path.join(self._tests_dir, relative_tests_dir))]
55         selenium_tests = []
56         if not tests:
57             tests = [relative_tests_dir]
58         for test in tests:
59             if not test.startswith(relative_tests_dir):
60                 continue
61             test_path = os.path.join(self._tests_dir, test)
62             if os.path.isdir(test_path):
63                 selenium_tests.extend([test for test in collected_tests if test.startswith(test_path) and test not in skipped])
64             elif test_path in collected_tests and test_path not in skipped:
65                 selenium_tests.append(test_path)
66         return selenium_tests
67
68     def run(self, tests=[]):
69         if self._driver.selenium_name() is None:
70             return
71
72         executor = WebDriverSeleniumExecutor(self._driver, self._display_driver)
73         timeout = self._port.get_option('timeout')
74         for test in tests:
75             test_name = os.path.relpath(test, self._tests_dir)
76             harness_result, test_results = executor.run(test, timeout, self._expectations)
77             result = WebDriverTestResult(test_name, *harness_result)
78             if harness_result[0] == 'OK':
79                 for subtest, status, message, backtrace in test_results:
80                     result.add_subtest_results(os.path.basename(subtest), status, message, backtrace)
81             else:
82                 # FIXME: handle other results.
83                 pass
84             self._results.append(result)
85
86     def results(self):
87         return self._results