run-webkit-tests --lint-test-files should lint all the ports by default
authordpranke@chromium.org <dpranke@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 25 Jan 2012 23:52:52 +0000 (23:52 +0000)
committerdpranke@chromium.org <dpranke@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 25 Jan 2012 23:52:52 +0000 (23:52 +0000)
https://bugs.webkit.org/show_bug.cgi?id=76749

Reviewed by Ojan Vafai.

Currently run-webkit-tests --lint-test-files will only lint the
test_expectations for the single port determined by the command
line options. This is not obvious and can produce unintended results
if you want to lint the chromium port (probably the normal case
for using --lint-test-files) but don't specify a port name or
--chromium.

I think we should probably lint *all* of the ports if no port
name is supplied. This change implements that, and also moves
the linting logic out of the Manager class, since this really
has nothing to do with Managers. It has little to do with
run-webkit-tests, but splitting it into a different script would
introduce compatibility issues. It might make sense to do that
anyway, in a separate patch and combining that with cleaning up
the style checker to share more code.

* Scripts/webkitpy/layout_tests/controllers/manager.py:
(Manager._strip_test_dir_prefix):
* Scripts/webkitpy/layout_tests/run_webkit_tests.py:
(lint):
(run):
* Scripts/webkitpy/layout_tests/run_webkit_tests_integrationtest.py:
(LintTest.test_all_configurations): added.
(LintTest.test_lint_test_files): added.
(LintTest.test_lint_test_files__errors): added.
(MainTest.test_lint_test_files): removed.
(MainTest.test_lint_test_files__errors): removed.

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@105936 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Tools/ChangeLog
Tools/Scripts/webkitpy/layout_tests/controllers/manager.py
Tools/Scripts/webkitpy/layout_tests/run_webkit_tests.py
Tools/Scripts/webkitpy/layout_tests/run_webkit_tests_integrationtest.py

index 8bd8f39..4cec3f6 100644 (file)
@@ -1,5 +1,63 @@
 2012-01-25  Dirk Pranke  <dpranke@chromium.org>
 
+        run-webkit-tests --lint-test-files should lint all the ports by default
+        https://bugs.webkit.org/show_bug.cgi?id=76749
+
+        Reviewed by Ojan Vafai.
+
+        Currently run-webkit-tests --lint-test-files will only lint the
+        test_expectations for the single port determined by the command
+        line options. This is not obvious and can produce unintended results
+        if you want to lint the chromium port (probably the normal case
+        for using --lint-test-files) but don't specify a port name or
+        --chromium.
+
+        I think we should probably lint *all* of the ports if no port
+        name is supplied. This change implements that, and also moves
+        the linting logic out of the Manager class, since this really
+        has nothing to do with Managers. It has little to do with
+        run-webkit-tests, but splitting it into a different script would
+        introduce compatibility issues. It might make sense to do that
+        anyway, in a separate patch and combining that with cleaning up
+        the style checker to share more code.
+
+        * Scripts/webkitpy/layout_tests/controllers/manager.py:
+        (Manager._strip_test_dir_prefix):
+        * Scripts/webkitpy/layout_tests/run_webkit_tests.py:
+        (lint):
+        (run):
+        * Scripts/webkitpy/layout_tests/run_webkit_tests_integrationtest.py:
+        (LintTest.test_all_configurations): added.
+        (LintTest.test_lint_test_files): added.
+        (LintTest.test_lint_test_files__errors): added.
+        (MainTest.test_lint_test_files): removed.
+        (MainTest.test_lint_test_files__errors): removed.
+
+2012-01-25  Dirk Pranke  <dpranke@chromium.org>
+
+        webkitpy: clean up a bunch of test scaffolding
+        https://bugs.webkit.org/show_bug.cgi?id=76973
+
+        Reviewed by Eric Seidel.
+
+        There were several helper modules in the webkitpy.test package
+        that appear to only be used by executive_unittest.py. I am
+        rolling them all into that file to make that clearer.
+
+        * Scripts/webkitpy/common/system/executive_unittest.py:
+        (ExecutiveTest.test_run_command_args_type):
+        (ExecutiveTest.test_run_command_with_unicode):
+        (ExecutiveTest.test_running_pids):
+        (command_line):
+        (main):
+        * Scripts/webkitpy/common/system/fileutils.py: Removed.
+        * Scripts/webkitpy/test/cat.py: Removed.
+        * Scripts/webkitpy/test/cat_unittest.py: Removed.
+        * Scripts/webkitpy/test/echo.py: Removed.
+        * Scripts/webkitpy/test/echo_unittest.py: Removed.
+
+2012-01-25  Dirk Pranke  <dpranke@chromium.org>
+
         webkitpy: clean up a bunch of test scaffolding
         https://bugs.webkit.org/show_bug.cgi?id=76973
 
index cf35f24..8090e2b 100644 (file)
@@ -347,25 +347,6 @@ class Manager(object):
             return path[len(self.LAYOUT_TESTS_DIRECTORY + self._filesystem.sep):]
         return path
 
-    def lint(self):
-        try:
-            test_expectations.TestExpectations(
-                self._port,
-                None,
-                self._port.test_expectations(),
-                self._port.test_configuration(),
-                self._options.lint_test_files,
-                self._port.test_expectations_overrides())
-        except test_expectations.ParseError, err:
-            for error in err.errors:
-                self._printer.write(error)
-            self._printer.write("")
-            _log.error("Lint failed.")
-            return -1
-
-        _log.info("Lint succeeded.")
-        return 0
-
     def _is_http_test(self, test):
         return self.HTTP_SUBDIR in test or self.WEBSOCKET_SUBDIR in test
 
index 72a73c5..d49f358 100755 (executable)
@@ -38,12 +38,50 @@ import sys
 
 from webkitpy.common.host import Host
 from webkitpy.layout_tests.controllers.manager import Manager, WorkerException
+from webkitpy.layout_tests.models import test_expectations
 from webkitpy.layout_tests.views import printing
 
 
 _log = logging.getLogger(__name__)
 
 
+def lint(port, options, expectations_class):
+    host = port.host
+    if options.platform:
+        ports_to_lint = [port]
+    else:
+        ports_to_lint = [host.port_factory.get(name) for name in host.port_factory.all_port_names()]
+
+    files_linted = set()
+    lint_failed = False
+
+    for port_to_lint in ports_to_lint:
+        expectations_file = port_to_lint.path_to_test_expectations_file()
+        if expectations_file in files_linted:
+            continue
+
+        try:
+            expectations_class(port_to_lint,
+                tests=None,
+                expectations=port_to_lint.test_expectations(),
+                test_config=port_to_lint.test_configuration(),
+                is_lint_mode=True,
+                overrides=port_to_lint.test_expectations_overrides())
+        except test_expectations.ParseError, e:
+            lint_failed = True
+            _log.error('')
+            for error in e.errors:
+                _log.error(error)
+            _log.error('')
+        files_linted.add(expectations_file)
+
+    if lint_failed:
+        _log.error('Lint failed.')
+        return -1
+    _log.info('Lint succeeded.')
+    return 0
+
+
 def run(port, options, args, regular_output=sys.stderr, buildbot_output=sys.stdout):
     warnings = _set_up_derived_options(port, options)
 
@@ -57,6 +95,9 @@ def run(port, options, args, regular_output=sys.stderr, buildbot_output=sys.stdo
         printer.cleanup()
         return 0
 
+    if options.lint_test_files:
+        return lint(port, options, test_expectations.TestExpectations)
+
     # We wrap any parts of the run that are slow or likely to raise exceptions
     # in a try/finally to ensure that we clean up the logging configuration.
     unexpected_result_count = -1
@@ -64,9 +105,6 @@ def run(port, options, args, regular_output=sys.stderr, buildbot_output=sys.stdo
         manager = Manager(port, options, printer)
         manager.print_config()
 
-        if options.lint_test_files:
-            return manager.lint()
-
         printer.print_update("Collecting tests ...")
         try:
             manager.collect_tests(args)
index e3f6980..48f90a4 100755 (executable)
@@ -71,6 +71,7 @@ from webkitpy.layout_tests import run_webkit_tests
 from webkitpy.layout_tests.port import Port
 from webkitpy.layout_tests.port.test import TestPort, TestDriver
 from webkitpy.test.skip import skip_if
+from webkitpy.tool.mocktool import MockOptions
 
 
 def parse_args(extra_args=None, record_results=False, tests_included=False, new_results=False, print_nothing=True):
@@ -188,6 +189,76 @@ def get_tests_run(extra_args=None, tests_included=False, flatten_batches=False,
 unexpected_tests_count = 12
 
 
+class LintTest(unittest.TestCase):
+    def test_all_configurations(self):
+
+        class FakePort(object):
+            def __init__(self, name, path):
+                self.name = name
+                self.path = path
+
+            def test_expectations(self):
+                return ''
+
+            def path_to_test_expectations_file(self):
+                return self.path
+
+            def test_configuration(self):
+                return None
+
+            def test_expectations_overrides(self):
+                return None
+
+        class FakeFactory(object):
+            def __init__(self, host, ports):
+                self.host = host
+                self.ports = {}
+                for port in ports:
+                    self.ports[port.name] = port
+                    port.host = host
+                    port.factory = self
+
+            def get(self, port_name, *args, **kwargs):
+                return self.ports[port_name]
+
+            def all_port_names(self):
+                return sorted(self.ports.keys())
+
+        class FakeExpectationsParser(object):
+            def __init__(self, port, *args, **kwargs):
+                port.host.ports_parsed.append(port.name)
+
+        host = MockHost()
+        host.ports_parsed = []
+        host.port_factory = FakeFactory(host, (FakePort('a', 'path-to-a'),
+                                               FakePort('b', 'path-to-b'),
+                                               FakePort('b-win', 'path-to-b')))
+
+        self.assertEquals(run_webkit_tests.lint(host.port_factory.ports['a'], MockOptions(platform=None), FakeExpectationsParser), 0)
+        self.assertEquals(host.ports_parsed, ['a', 'b'])
+
+        host.ports_parsed = []
+        self.assertEquals(run_webkit_tests.lint(host.port_factory.ports['a'], MockOptions(platform='a'), FakeExpectationsParser), 0)
+        self.assertEquals(host.ports_parsed, ['a'])
+
+    def test_lint_test_files(self):
+        res, out, err, user = logging_run(['--lint-test-files'])
+        self.assertEqual(res, 0)
+        self.assertTrue(out.empty())
+        self.assertTrue(any(['Lint succeeded' in msg for msg in err.get()]))
+
+    def test_lint_test_files__errors(self):
+        options, parsed_args = parse_args(['--lint-test-files'])
+        host = MockHost()
+        port_obj = host.port_factory.get(options.platform, options=options)
+        port_obj.test_expectations = lambda: "# syntax error"
+        res, out, err = run_and_capture(port_obj, options, parsed_args)
+
+        self.assertEqual(res, -1)
+        self.assertTrue(out.empty())
+        self.assertTrue(any(['Lint failed' in msg for msg in err.get()]))
+
+
 class MainTest(unittest.TestCase):
     def test_accelerated_compositing(self):
         # This just tests that we recognize the command line args
@@ -284,23 +355,6 @@ class MainTest(unittest.TestCase):
             ['failures/expected/keyboard.html', '--worker-model', 'inline'],
             tests_included=True)
 
-    def test_lint_test_files(self):
-        res, out, err, user = logging_run(['--lint-test-files'])
-        self.assertEqual(res, 0)
-        self.assertTrue(out.empty())
-        self.assertTrue(any(['Lint succeeded' in msg for msg in err.get()]))
-
-    def test_lint_test_files__errors(self):
-        options, parsed_args = parse_args(['--lint-test-files'])
-        host = MockHost()
-        port_obj = host.port_factory.get(options.platform, options=options)
-        port_obj.test_expectations = lambda: "# syntax error"
-        res, out, err = run_and_capture(port_obj, options, parsed_args)
-
-        self.assertEqual(res, -1)
-        self.assertTrue(out.empty())
-        self.assertTrue(any(['Lint failed' in msg for msg in err.get()]))
-
     def test_no_tests_found(self):
         res, out, err, user = logging_run(['resources'], tests_included=True)
         self.assertEqual(res, -1)