18a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block#!/usr/bin/env python
28a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block# Copyright (C) 2010 Google Inc. All rights reserved.
38a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block#
48a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block# Redistribution and use in source and binary forms, with or without
58a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block# modification, are permitted provided that the following conditions are
68a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block# met:
78a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block#
88a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block#     * Redistributions of source code must retain the above copyright
98a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block# notice, this list of conditions and the following disclaimer.
108a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block#     * Redistributions in binary form must reproduce the above
118a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block# copyright notice, this list of conditions and the following disclaimer
128a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block# in the documentation and/or other materials provided with the
138a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block# distribution.
148a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block#     * Neither the Google name nor the names of its
158a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block# contributors may be used to endorse or promote products derived from
168a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block# this software without specific prior written permission.
178a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block#
188a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
198a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
208a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
218a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
228a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
238a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
248a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
258a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
268a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
278a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
288a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
298a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
308a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block"""Dummy Port implementation used for testing."""
31e78cbe89e6f337f2f1fe40315be88f742b547151Steve Blockfrom __future__ import with_statement
328a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochimport base64
348a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Blockimport time
358a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
36ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochfrom webkitpy.common.system import filesystem_mock
372fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockfrom webkitpy.tool import mocktool
386b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
398a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Blockimport base
408a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
418a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
42bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen# This sets basic expectations for a test. Each individual expectation
43bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen# can be overridden by a keyword argument in TestList.add().
44bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenclass TestInstance:
45bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    def __init__(self, name):
46bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        self.name = name
47bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        self.base = name[(name.rfind("/") + 1):name.rfind(".html")]
48bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        self.crash = False
49bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        self.exception = False
50bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        self.hang = False
51bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        self.keyboard = False
52bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        self.error = ''
53bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        self.timeout = False
542bde8e466a4451c7319e3a072d118917957d6554Steve Block        self.is_reftest = False
552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        # The values of each field are treated as raw byte strings. They
572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        # will be converted to unicode strings where appropriate using
582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        # MockFileSystem.read_text_file().
592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        self.actual_text = self.base + '-txt'
602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        self.actual_checksum = self.base + '-checksum'
612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        # We add the '\x8a' for the image file to prevent the value from
632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        # being treated as UTF-8 (the character is invalid)
642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        self.actual_image = self.base + '\x8a' + '-png'
652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
66bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        self.expected_text = self.actual_text
67bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        self.expected_checksum = self.actual_checksum
68bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        self.expected_image = self.actual_image
69bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        self.actual_audio = None
712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        self.expected_audio = None
72bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
73bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen# This is an in-memory list of tests, what we want them to produce, and
74bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen# what we want to claim are the expected results.
75bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenclass TestList:
76ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    def __init__(self):
77bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        self.tests = {}
78bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
79bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    def add(self, name, **kwargs):
80bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        test = TestInstance(name)
81bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        for key, value in kwargs.items():
82bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            test.__dict__[key] = value
83bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        self.tests[name] = test
84bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
852bde8e466a4451c7319e3a072d118917957d6554Steve Block    def add_reftest(self, name, reference_name, same_image):
862bde8e466a4451c7319e3a072d118917957d6554Steve Block        self.add(name, actual_checksum='xxx', actual_image='XXX', is_reftest=True)
872bde8e466a4451c7319e3a072d118917957d6554Steve Block        if same_image:
882bde8e466a4451c7319e3a072d118917957d6554Steve Block            self.add(reference_name, actual_checksum='xxx', actual_image='XXX', is_reftest=True)
892bde8e466a4451c7319e3a072d118917957d6554Steve Block        else:
902bde8e466a4451c7319e3a072d118917957d6554Steve Block            self.add(reference_name, actual_checksum='yyy', actual_image='YYY', is_reftest=True)
912bde8e466a4451c7319e3a072d118917957d6554Steve Block
92bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    def keys(self):
93bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return self.tests.keys()
94bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
95bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    def __contains__(self, item):
96bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return item in self.tests
97bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
98bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    def __getitem__(self, item):
99bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return self.tests[item]
100bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
101bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
102ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochdef unit_test_list():
103ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    tests = TestList()
104ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    tests.add('failures/expected/checksum.html',
1052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block              actual_checksum='checksum_fail-checksum')
106ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    tests.add('failures/expected/crash.html', crash=True)
107ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    tests.add('failures/expected/exception.html', exception=True)
108ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    tests.add('failures/expected/timeout.html', timeout=True)
109ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    tests.add('failures/expected/hang.html', hang=True)
1102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    tests.add('failures/expected/missing_text.html', expected_text=None)
111ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    tests.add('failures/expected/image.html',
1122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block              actual_image='image_fail-png',
1132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block              expected_image='image-png')
114ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    tests.add('failures/expected/image_checksum.html',
1152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block              actual_checksum='image_checksum_fail-checksum',
1162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block              actual_image='image_checksum_fail-png')
1172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    tests.add('failures/expected/audio.html',
1182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch              actual_audio=base64.b64encode('audio_fail-wav'), expected_audio='audio-wav',
1192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch              actual_text=None, expected_text=None,
1202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch              actual_image=None, expected_image=None,
1212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch              actual_checksum=None, expected_checksum=None)
1222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    tests.add('failures/expected/keyboard.html', keyboard=True)
1232bde8e466a4451c7319e3a072d118917957d6554Steve Block    tests.add('failures/expected/missing_check.html',
1242bde8e466a4451c7319e3a072d118917957d6554Steve Block              expected_checksum=None,
1252bde8e466a4451c7319e3a072d118917957d6554Steve Block              expected_image=None)
1262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    tests.add('failures/expected/missing_image.html', expected_image=None)
1272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    tests.add('failures/expected/missing_audio.html', expected_audio=None,
1282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch              actual_text=None, expected_text=None,
1292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch              actual_image=None, expected_image=None,
1302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch              actual_checksum=None, expected_checksum=None)
1312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    tests.add('failures/expected/missing_text.html', expected_text=None)
132ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    tests.add('failures/expected/newlines_leading.html',
1332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block              expected_text="\nfoo\n", actual_text="foo\n")
134ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    tests.add('failures/expected/newlines_trailing.html',
1352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block              expected_text="foo\n\n", actual_text="foo\n")
136ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    tests.add('failures/expected/newlines_with_excess_CR.html',
1372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block              expected_text="foo\r\r\r\n", actual_text="foo\n")
1382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    tests.add('failures/expected/text.html', actual_text='text_fail-png')
139ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    tests.add('failures/unexpected/crash.html', crash=True)
140ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    tests.add('failures/unexpected/text-image-checksum.html',
1412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block              actual_text='text-image-checksum_fail-txt',
1422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block              actual_checksum='text-image-checksum_fail-checksum')
143ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    tests.add('failures/unexpected/timeout.html', timeout=True)
144ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    tests.add('http/tests/passes/text.html')
1452bde8e466a4451c7319e3a072d118917957d6554Steve Block    tests.add('http/tests/passes/image.html')
146ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    tests.add('http/tests/ssl/text.html')
147ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    tests.add('passes/error.html', error='stuff going to stderr')
148ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    tests.add('passes/image.html')
1492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    tests.add('passes/audio.html',
1502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch              actual_audio=base64.b64encode('audio-wav'), expected_audio='audio-wav',
1512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch              actual_text=None, expected_text=None,
1522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch              actual_image=None, expected_image=None,
1532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch              actual_checksum=None, expected_checksum=None)
154ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    tests.add('passes/platform_image.html')
1552bde8e466a4451c7319e3a072d118917957d6554Steve Block    tests.add('passes/checksum_in_image.html',
1562bde8e466a4451c7319e3a072d118917957d6554Steve Block              expected_checksum=None,
1572bde8e466a4451c7319e3a072d118917957d6554Steve Block              expected_image='tEXtchecksum\x00checksum_in_image-checksum')
1582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
159ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    # Text output files contain "\r\n" on Windows.  This may be
160ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    # helpfully filtered to "\r\r\n" by our Python/Cygwin tooling.
161ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    tests.add('passes/text.html',
1622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block              expected_text='\nfoo\n\n', actual_text='\nfoo\r\n\r\r\n')
1632bde8e466a4451c7319e3a072d118917957d6554Steve Block
1642bde8e466a4451c7319e3a072d118917957d6554Steve Block    # For reftests.
1652bde8e466a4451c7319e3a072d118917957d6554Steve Block    tests.add_reftest('passes/reftest.html', 'passes/reftest-expected.html', same_image=True)
1662bde8e466a4451c7319e3a072d118917957d6554Steve Block    tests.add_reftest('passes/mismatch.html', 'passes/mismatch-expected-mismatch.html', same_image=False)
1672bde8e466a4451c7319e3a072d118917957d6554Steve Block    tests.add_reftest('failures/expected/reftest.html', 'failures/expected/reftest-expected.html', same_image=False)
1682bde8e466a4451c7319e3a072d118917957d6554Steve Block    tests.add_reftest('failures/expected/mismatch.html', 'failures/expected/mismatch-expected-mismatch.html', same_image=True)
1692bde8e466a4451c7319e3a072d118917957d6554Steve Block    tests.add_reftest('failures/unexpected/reftest.html', 'failures/unexpected/reftest-expected.html', same_image=False)
1702bde8e466a4451c7319e3a072d118917957d6554Steve Block    tests.add_reftest('failures/unexpected/mismatch.html', 'failures/unexpected/mismatch-expected-mismatch.html', same_image=True)
1712bde8e466a4451c7319e3a072d118917957d6554Steve Block    # FIXME: Add a reftest which crashes.
1722bde8e466a4451c7319e3a072d118917957d6554Steve Block
173ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    tests.add('websocket/tests/passes/text.html')
174ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    return tests
175ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
176ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
177ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch# Here we use a non-standard location for the layout tests, to ensure that
178ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch# this works. The path contains a '.' in the name because we've seen bugs
179ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch# related to this before.
180ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
181ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen MurdochLAYOUT_TEST_DIR = '/test.checkout/LayoutTests'
182ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
183ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
184ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch# Here we synthesize an in-memory filesystem from the test list
185ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch# in order to fully control the test output and to demonstrate that
186ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch# we don't need a real filesystem to run the tests.
187ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
188ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochdef unit_test_filesystem(files=None):
189ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    """Return the FileSystem object used by the unit tests."""
190ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    test_list = unit_test_list()
191ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    files = files or {}
192ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
193ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    def add_file(files, test, suffix, contents):
194ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        dirname = test.name[0:test.name.rfind('/')]
195ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        base = test.base
196ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        path = LAYOUT_TEST_DIR + '/' + dirname + '/' + base + suffix
197ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        files[path] = contents
198ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
199ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    # Add each test and the expected output, if any.
200ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    for test in test_list.tests.values():
201ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        add_file(files, test, '.html', '')
2022bde8e466a4451c7319e3a072d118917957d6554Steve Block        if test.is_reftest:
2032bde8e466a4451c7319e3a072d118917957d6554Steve Block            continue
2042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if test.actual_audio:
2052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            add_file(files, test, '-expected.wav', test.expected_audio)
2062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            continue
2072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
208ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        add_file(files, test, '-expected.txt', test.expected_text)
209ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        add_file(files, test, '-expected.checksum', test.expected_checksum)
210ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        add_file(files, test, '-expected.png', test.expected_image)
211ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
2122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
213ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    # Add the test_expectations file.
214ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    files[LAYOUT_TEST_DIR + '/platform/test/test_expectations.txt'] = """
215ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen MurdochWONTFIX : failures/expected/checksum.html = IMAGE
216ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen MurdochWONTFIX : failures/expected/crash.html = CRASH
217ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch// This one actually passes because the checksums will match.
218ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen MurdochWONTFIX : failures/expected/image.html = PASS
2192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochWONTFIX : failures/expected/audio.html = AUDIO
220ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen MurdochWONTFIX : failures/expected/image_checksum.html = IMAGE
2212bde8e466a4451c7319e3a072d118917957d6554Steve BlockWONTFIX : failures/expected/mismatch.html = IMAGE
222ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen MurdochWONTFIX : failures/expected/missing_check.html = MISSING PASS
223ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen MurdochWONTFIX : failures/expected/missing_image.html = MISSING PASS
2242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochWONTFIX : failures/expected/missing_audio.html = MISSING PASS
225ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen MurdochWONTFIX : failures/expected/missing_text.html = MISSING PASS
226ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen MurdochWONTFIX : failures/expected/newlines_leading.html = TEXT
227ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen MurdochWONTFIX : failures/expected/newlines_trailing.html = TEXT
228ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen MurdochWONTFIX : failures/expected/newlines_with_excess_CR.html = TEXT
2292bde8e466a4451c7319e3a072d118917957d6554Steve BlockWONTFIX : failures/expected/reftest.html = IMAGE
230ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen MurdochWONTFIX : failures/expected/text.html = TEXT
231ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen MurdochWONTFIX : failures/expected/timeout.html = TIMEOUT
232ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen MurdochWONTFIX SKIP : failures/expected/hang.html = TIMEOUT
233ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen MurdochWONTFIX SKIP : failures/expected/keyboard.html = CRASH
234ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen MurdochWONTFIX SKIP : failures/expected/exception.html = CRASH
235ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch"""
236ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
2372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    # Add in a file should be ignored by test_files.find().
2382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    files[LAYOUT_TEST_DIR + 'userscripts/resources/iframe.html'] = 'iframe'
2392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
240ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    fs = filesystem_mock.MockFileSystem(files)
241ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    fs._tests = test_list
242ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    return fs
243ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
244ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
2458a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Blockclass TestPort(base.Port):
2468a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    """Test implementation of the Port interface."""
2472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    ALL_BASELINE_VARIANTS = (
2482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        'test-mac-snowleopard', 'test-mac-leopard',
2492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        'test-win-win7', 'test-win-vista', 'test-win-xp',
2502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        'test-linux-x86',
2512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    )
2528a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
2532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    def __init__(self, port_name=None, user=None, filesystem=None, **kwargs):
2542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if not port_name or port_name == 'test':
2552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            port_name = 'test-mac-leopard'
2562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        user = user or mocktool.MockUser()
2572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        filesystem = filesystem or unit_test_filesystem()
2582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        base.Port.__init__(self, port_name=port_name, filesystem=filesystem, user=user,
2592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                           **kwargs)
2602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        self._results_directory = None
2612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        assert filesystem._tests
2632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        self._tests = filesystem._tests
2642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        self._operating_system = 'mac'
2662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if port_name.startswith('test-win'):
2672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            self._operating_system = 'win'
2682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        elif port_name.startswith('test-linux'):
2692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            self._operating_system = 'linux'
270ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
2712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        version_map = {
2722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            'test-win-xp': 'xp',
2732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            'test-win-win7': 'win7',
2742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            'test-win-vista': 'vista',
2752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            'test-mac-leopard': 'leopard',
2762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            'test-mac-snowleopard': 'snowleopard',
2772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            'test-linux-x86': '',
2782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
2792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        self._version = version_map[port_name]
280ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
2812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        self._expectations_path = LAYOUT_TEST_DIR + '/platform/test/test_expectations.txt'
2822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    def _path_to_driver(self):
2842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        # This routine shouldn't normally be called, but it is called by
2852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        # the mock_drt Driver. We return something, but make sure it's useless.
2862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return 'junk'
2878a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
2888a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    def baseline_path(self):
2892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        # We don't bother with a fallback path.
2902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return self._filesystem.join(self.layout_tests_dir(), 'platform', self.name())
2918a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
2928a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    def baseline_search_path(self):
2932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        search_paths = {
2942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            'test-mac-snowleopard': ['test-mac-snowleopard'],
2952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            'test-mac-leopard': ['test-mac-leopard', 'test-mac-snowleopard'],
2962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            'test-win-win7': ['test-win-win7'],
2972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            'test-win-vista': ['test-win-vista', 'test-win-win7'],
2982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            'test-win-xp': ['test-win-xp', 'test-win-vista', 'test-win-win7'],
2992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            'test-linux-x86': ['test-linux', 'test-win-win7'],
3002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
3012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return [self._webkit_baseline_path(d) for d in search_paths[self.name()]]
3028a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
3032bde8e466a4451c7319e3a072d118917957d6554Steve Block    def default_child_processes(self):
3042bde8e466a4451c7319e3a072d118917957d6554Steve Block        return 1
3052bde8e466a4451c7319e3a072d118917957d6554Steve Block
3062bde8e466a4451c7319e3a072d118917957d6554Steve Block    def default_worker_model(self):
3072bde8e466a4451c7319e3a072d118917957d6554Steve Block        return 'inline'
3082bde8e466a4451c7319e3a072d118917957d6554Steve Block
309dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    def check_build(self, needs_http):
3108a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        return True
3118a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
3122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    def default_configuration(self):
3132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return 'Release'
3142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
315bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    def diff_image(self, expected_contents, actual_contents,
316e14391e94c850b8bd03680c23b38978db68687a8John Reck                   diff_filename=None):
317e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        diffed = actual_contents != expected_contents
318e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        if diffed and diff_filename:
3192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            self._filesystem.write_binary_file(diff_filename,
320ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                "< %s\n---\n> %s\n" % (expected_contents, actual_contents))
321e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        return diffed
3228a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
323e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    def layout_tests_dir(self):
324ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return LAYOUT_TEST_DIR
325bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
3268a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    def name(self):
3278a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        return self._name
3288a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
329e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    def _path_to_wdiff(self):
330e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        return None
331e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
3322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    def default_results_directory(self):
3332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return '/tmp/layout-test-results'
3348a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
3358a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    def setup_test_run(self):
3368a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        pass
3378a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
3384576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    def create_driver(self, worker_number):
3394576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        return TestDriver(self, worker_number)
3408a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
3418a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    def start_http_server(self):
3428a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        pass
3438a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
3448a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    def start_websocket_server(self):
3458a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        pass
3468a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
3478a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    def stop_http_server(self):
3488a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        pass
3498a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
3508a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    def stop_websocket_server(self):
3518a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        pass
3528a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
3532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    def path_to_test_expectations_file(self):
3542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return self._expectations_path
355ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
3562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    def all_baseline_variants(self):
3572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return self.ALL_BASELINE_VARIANTS
3582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    # FIXME: These next two routines are copied from base.py with
3602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    # the calls to path.abspath_to_uri() removed. We shouldn't have
3612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    # to do this.
3622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    def filename_to_uri(self, filename):
3632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        """Convert a test file (which is an absolute path) to a URI."""
3642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        LAYOUTTEST_HTTP_DIR = "http/tests/"
3652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        LAYOUTTEST_WEBSOCKET_DIR = "http/tests/websocket/tests/"
3662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        relative_path = self.relative_test_filename(filename)
3682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        port = None
3692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        use_ssl = False
3702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (relative_path.startswith(LAYOUTTEST_WEBSOCKET_DIR)
3722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            or relative_path.startswith(LAYOUTTEST_HTTP_DIR)):
3732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            relative_path = relative_path[len(LAYOUTTEST_HTTP_DIR):]
3742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            port = 8000
3752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        # Make http/tests/local run as local files. This is to mimic the
3772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        # logic in run-webkit-tests.
3782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        #
3792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        # TODO(dpranke): remove the media reference and the SSL reference?
3802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (port and not relative_path.startswith("local/") and
3812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            not relative_path.startswith("media/")):
3822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            if relative_path.startswith("ssl/"):
3832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                port += 443
3842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                protocol = "https"
3852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            else:
3862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                protocol = "http"
3872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            return "%s://127.0.0.1:%u/%s" % (protocol, port, relative_path)
3882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return "file://" + self._filesystem.abspath(filename)
3902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    def uri_to_test_name(self, uri):
3922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        """Return the base layout test name for a given URI.
3932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        This returns the test name for a given URI, e.g., if you passed in
3952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        "file:///src/LayoutTests/fast/html/keygen.html" it would return
3962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        "fast/html/keygen.html".
3972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        """
3992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        test = uri
4002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if uri.startswith("file:///"):
4012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            prefix = "file://" + self.layout_tests_dir() + "/"
4022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            return test[len(prefix):]
4032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
4042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if uri.startswith("http://127.0.0.1:8880/"):
4052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            # websocket tests
4062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            return test.replace('http://127.0.0.1:8880/', '')
4072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
4082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if uri.startswith("http://"):
4092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            # regular HTTP test
4102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            return test.replace('http://127.0.0.1:8000/', 'http/tests/')
4112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
4122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if uri.startswith("https://"):
4132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            return test.replace('https://127.0.0.1:8443/', 'http/tests/')
4142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
4152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        raise NotImplementedError('unknown url type: %s' % uri)
416f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
4178a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
4188a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Blockclass TestDriver(base.Driver):
4198a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    """Test/Dummy implementation of the DumpRenderTree interface."""
4208a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
4214576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    def __init__(self, port, worker_number):
4228a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        self._port = port
4234576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
4244576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    def cmd_line(self):
4252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return [self._port._path_to_driver()] + self._port.get_option('additional_drt_flag', [])
4268a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
4278a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    def poll(self):
4288a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        return True
4298a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
4304576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    def run_test(self, test_input):
4316b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        start_time = time.time()
4324576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        test_name = self._port.relative_test_filename(test_input.filename)
433bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        test = self._port._tests[test_name]
434bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if test.keyboard:
435bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            raise KeyboardInterrupt
436bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if test.exception:
437bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            raise ValueError('exception from ' + test_name)
438bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if test.hang:
4394576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            time.sleep((float(test_input.timeout) * 4) / 1000.0)
4402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
4412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        audio = None
4422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if test.actual_audio:
4432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            audio = base64.b64decode(test.actual_audio)
4442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return base.DriverOutput(test.actual_text, test.actual_image,
4452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            test.actual_checksum, audio, crash=test.crash,
4462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            test_time=time.time() - start_time, timeout=test.timeout, error=test.error)
4478a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
44821939df44de1705786c545cd1bf519d47250322dBen Murdoch    def start(self):
44921939df44de1705786c545cd1bf519d47250322dBen Murdoch        pass
45021939df44de1705786c545cd1bf519d47250322dBen Murdoch
4518a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    def stop(self):
4528a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        pass
453