• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright (C) 2010 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"""Unit testing base class for Port implementations."""
30
31import sys
32import unittest
33
34# Handle Python < 2.6 where multiprocessing isn't available.
35try:
36    import multiprocessing
37except ImportError:
38    multiprocessing = None
39
40from webkitpy.tool import mocktool
41mock_options = mocktool.MockOptions(use_apache=True,
42                                    configuration='Release')
43
44# FIXME: This should be used for all ports, not just WebKit Mac. See
45# https://bugs.webkit.org/show_bug.cgi?id=50043 .
46
47class PortTestCase(unittest.TestCase):
48    """Tests the WebKit port implementation."""
49    def port_maker(self, platform):
50        """Override to return the class object of the port to be tested,
51        or None if a valid port object cannot be constructed on the specified
52        platform."""
53        raise NotImplementedError()
54
55    def make_port(self, options=mock_options):
56        """This routine should be used for tests that should only be run
57        when we can create a full, valid port object."""
58        maker = self.port_maker(sys.platform)
59        if not maker:
60            return None
61
62        return maker(options=options)
63
64    def test_default_worker_model(self):
65        port = self.make_port()
66        if not port:
67            return
68
69        if multiprocessing:
70            self.assertEqual(port.default_worker_model(), 'processes')
71        else:
72            self.assertEqual(port.default_worker_model(), 'threads')
73
74    def test_driver_cmd_line(self):
75        port = self.make_port()
76        if not port:
77            return
78        self.assertTrue(len(port.driver_cmd_line()))
79
80        options = mocktool.MockOptions(additional_drt_flag=['--foo=bar', '--foo=baz'])
81        port = self.make_port(options=options)
82        cmd_line = port.driver_cmd_line()
83        self.assertTrue('--foo=bar' in cmd_line)
84        self.assertTrue('--foo=baz' in cmd_line)
85
86    def disabled_test_http_server(self):
87        port = self.make_port()
88        if not port:
89            return
90        port.start_http_server()
91        port.stop_http_server()
92
93    def disabled_test_image_diff(self):
94        port = self.make_port()
95        if not port:
96            return
97
98        if not port.check_image_diff():
99            # The port hasn't been built - don't run the tests.
100            return
101
102        dir = port.layout_tests_dir()
103        file1 = port._filesystem.join(dir, 'fast', 'css', 'button_center.png')
104        contents1 = port._filesystem.read_binary_file(file1)
105        file2 = port._filesystem.join(dir, 'fast', 'css',
106                                      'remove-shorthand-expected.png')
107        contents2 = port._filesystem.read_binary_file(file2)
108        tmpfd, tmpfile = port._filesystem.open_binary_tempfile('')
109        tmpfd.close()
110
111        self.assertFalse(port.diff_image(contents1, contents1))
112        self.assertTrue(port.diff_image(contents1, contents2))
113
114        self.assertTrue(port.diff_image(contents1, contents2, tmpfile))
115
116        port._filesystem.remove(tmpfile)
117
118    def test_diff_image__missing_both(self):
119        port = self.make_port()
120        if not port:
121            return
122        self.assertFalse(port.diff_image(None, None, None))
123        self.assertFalse(port.diff_image(None, '', None))
124        self.assertFalse(port.diff_image('', None, None))
125        self.assertFalse(port.diff_image('', '', None))
126
127    def test_diff_image__missing_actual(self):
128        port = self.make_port()
129        if not port:
130            return
131        self.assertTrue(port.diff_image(None, 'foo', None))
132        self.assertTrue(port.diff_image('', 'foo', None))
133
134    def test_diff_image__missing_expected(self):
135        port = self.make_port()
136        if not port:
137            return
138        self.assertTrue(port.diff_image('foo', None, None))
139        self.assertTrue(port.diff_image('foo', '', None))
140
141
142    def disabled_test_websocket_server(self):
143        port = self.make_port()
144        if not port:
145            return
146        port.start_websocket_server()
147        port.stop_websocket_server()
148
149    def test_test_configuration(self):
150        port = self.make_port()
151        if not port:
152            return
153        self.assertTrue(port.test_configuration())
154
155    def test_all_test_configurations(self):
156        port = self.make_port()
157        if not port:
158            return
159        self.assertTrue(len(port.all_test_configurations()) > 0)
160
161    def test_baseline_search_path(self):
162        port = self.make_port()
163        if not port:
164            return
165        self.assertTrue(port.baseline_path() in port.baseline_search_path())
166