blob: 0260dffd7fb510eac058a00d55972d46911531fe [file] [log] [blame]
# Copyright (C) 2010 Google Inc. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following disclaimer
# in the documentation and/or other materials provided with the
# distribution.
# * Neither the name of Google Inc. nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import unittest
import StringIO
from webkitpy.common.system import logtesting
from webkitpy.common.system import executive_mock
from webkitpy.common.system import filesystem_mock
from webkitpy.tool import mocktool
from webkitpy.thirdparty.mock import Mock
import chromium
import chromium_linux
import chromium_mac
import chromium_win
from webkitpy.layout_tests.port import port_testcase
class ChromiumDriverTest(unittest.TestCase):
def setUp(self):
mock_port = Mock()
mock_port.get_option = lambda option_name: ''
self.driver = chromium.ChromiumDriver(mock_port, worker_number=0)
def test_test_shell_command(self):
expected_command = "test.html 2 checksum\n"
self.assertEqual(self.driver._test_shell_command("test.html", 2, "checksum"), expected_command)
def _assert_write_command_and_read_line(self, input=None, expected_line=None, expected_stdin=None, expected_crash=False):
if not expected_stdin:
if input:
expected_stdin = input
else:
# We reset stdin, so we should expect stdin.getValue = ""
expected_stdin = ""
self.driver._proc.stdin = StringIO.StringIO()
line, did_crash = self.driver._write_command_and_read_line(input)
self.assertEqual(self.driver._proc.stdin.getvalue(), expected_stdin)
self.assertEqual(line, expected_line)
self.assertEqual(did_crash, expected_crash)
def test_write_command_and_read_line(self):
self.driver._proc = Mock()
# Set up to read 3 lines before we get an IOError
self.driver._proc.stdout = StringIO.StringIO("first\nsecond\nthird\n")
unicode_input = u"I \u2661 Unicode"
utf8_input = unicode_input.encode("utf-8")
# Test unicode input conversion to utf-8
self._assert_write_command_and_read_line(input=unicode_input, expected_stdin=utf8_input, expected_line="first\n")
# Test str() input.
self._assert_write_command_and_read_line(input="foo", expected_line="second\n")
# Test input=None
self._assert_write_command_and_read_line(expected_line="third\n")
# Test reading from a closed/empty stream.
# reading from a StringIO does not raise IOError like a real file would, so raise IOError manually.
def mock_readline():
raise IOError
self.driver._proc.stdout.readline = mock_readline
self._assert_write_command_and_read_line(expected_crash=True)
def test_stop(self):
self.pid = None
self.wait_called = False
self.driver._proc = Mock()
self.driver._proc.pid = 1
self.driver._proc.stdin = StringIO.StringIO()
self.driver._proc.stdout = StringIO.StringIO()
self.driver._proc.stderr = StringIO.StringIO()
self.driver._proc.poll = lambda: None
def fake_wait():
self.assertTrue(self.pid is not None)
self.wait_called = True
self.driver._proc.wait = fake_wait
class FakeExecutive(object):
def kill_process(other, pid):
self.pid = pid
self.driver._proc.poll = lambda: 2
self.driver._port._executive = FakeExecutive()
self.driver.KILL_TIMEOUT = 0.01
self.driver.stop()
self.assertTrue(self.wait_called)
self.assertEquals(self.pid, 1)
class ChromiumPortTest(port_testcase.PortTestCase):
def port_maker(self, platform):
return chromium.ChromiumPort
def test_driver_cmd_line(self):
# Override this test since ChromiumPort doesn't implement driver_cmd_line().
pass
def test_baseline_search_path(self):
# Override this test since ChromiumPort doesn't implement baseline_search_path().
pass
class TestMacPort(chromium_mac.ChromiumMacPort):
def __init__(self, options):
chromium_mac.ChromiumMacPort.__init__(self,
options=options,
filesystem=filesystem_mock.MockFileSystem())
def default_configuration(self):
self.default_configuration_called = True
return 'default'
class TestLinuxPort(chromium_linux.ChromiumLinuxPort):
def __init__(self, options):
chromium_linux.ChromiumLinuxPort.__init__(self,
options=options,
filesystem=filesystem_mock.MockFileSystem())
def default_configuration(self):
self.default_configuration_called = True
return 'default'
class TestWinPort(chromium_win.ChromiumWinPort):
def __init__(self, options):
chromium_win.ChromiumWinPort.__init__(self,
options=options,
filesystem=filesystem_mock.MockFileSystem())
def default_configuration(self):
self.default_configuration_called = True
return 'default'
def test_path_to_image_diff(self):
mock_options = mocktool.MockOptions()
port = ChromiumPortTest.TestLinuxPort(options=mock_options)
self.assertTrue(port._path_to_image_diff().endswith(
'/out/default/ImageDiff'))
port = ChromiumPortTest.TestMacPort(options=mock_options)
self.assertTrue(port._path_to_image_diff().endswith(
'/xcodebuild/default/ImageDiff'))
port = ChromiumPortTest.TestWinPort(options=mock_options)
self.assertTrue(port._path_to_image_diff().endswith(
'/default/ImageDiff.exe'))
def test_skipped_layout_tests(self):
mock_options = mocktool.MockOptions()
port = ChromiumPortTest.TestLinuxPort(options=mock_options)
fake_test = port._filesystem.join(port.layout_tests_dir(), "fast/js/not-good.js")
port.test_expectations = lambda: """BUG_TEST SKIP : fast/js/not-good.js = TEXT
LINUX WIN : fast/js/very-good.js = TIMEOUT PASS"""
port.test_expectations_overrides = lambda: ''
port.tests = lambda paths: set()
port.path_exists = lambda test: True
skipped_tests = port.skipped_layout_tests(extra_test_files=[fake_test, ])
self.assertTrue("fast/js/not-good.js" in skipped_tests)
def test_default_configuration(self):
mock_options = mocktool.MockOptions()
port = ChromiumPortTest.TestLinuxPort(options=mock_options)
self.assertEquals(mock_options.configuration, 'default')
self.assertTrue(port.default_configuration_called)
mock_options = mocktool.MockOptions(configuration=None)
port = ChromiumPortTest.TestLinuxPort(mock_options)
self.assertEquals(mock_options.configuration, 'default')
self.assertTrue(port.default_configuration_called)
def test_diff_image(self):
class TestPort(ChromiumPortTest.TestLinuxPort):
def _path_to_image_diff(self):
return "/path/to/image_diff"
mock_options = mocktool.MockOptions()
port = ChromiumPortTest.TestLinuxPort(mock_options)
# Images are different.
port._executive = executive_mock.MockExecutive2(exit_code=0)
self.assertEquals(False, port.diff_image("EXPECTED", "ACTUAL"))
# Images are the same.
port._executive = executive_mock.MockExecutive2(exit_code=1)
self.assertEquals(True, port.diff_image("EXPECTED", "ACTUAL"))
# There was some error running image_diff.
port._executive = executive_mock.MockExecutive2(exit_code=2)
exception_raised = False
try:
port.diff_image("EXPECTED", "ACTUAL")
except ValueError, e:
exception_raised = True
self.assertFalse(exception_raised)
class ChromiumPortLoggingTest(logtesting.LoggingTestCase):
def test_check_sys_deps(self):
mock_options = mocktool.MockOptions()
port = ChromiumPortTest.TestLinuxPort(options=mock_options)
# Success
port._executive = executive_mock.MockExecutive2(exit_code=0)
self.assertTrue(port.check_sys_deps(needs_http=False))
# Failure
port._executive = executive_mock.MockExecutive2(exit_code=1,
output='testing output failure')
self.assertFalse(port.check_sys_deps(needs_http=False))
self.assertLog([
'ERROR: System dependencies check failed.\n',
'ERROR: To override, invoke with --nocheck-sys-deps\n',
'ERROR: \n',
'ERROR: testing output failure\n'])
if __name__ == '__main__':
unittest.main()