| # Copyright (C) 2010, 2012 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. |
| |
| """Unit tests for printing.py.""" |
| |
| import optparse |
| import sys |
| import time |
| import unittest |
| |
| from webkitpy.common.host_mock import MockHost |
| |
| from webkitpy.common.system import logtesting |
| from webkitpy.common.unicode_compatibility import StringIO |
| from webkitpy import port |
| from webkitpy.layout_tests.controllers import manager |
| from webkitpy.layout_tests.models import test_expectations |
| from webkitpy.layout_tests.models import test_failures |
| from webkitpy.layout_tests.models import test_results |
| from webkitpy.layout_tests.views import printing |
| |
| |
| def get_options(args): |
| print_options = printing.print_options() |
| option_parser = optparse.OptionParser(option_list=print_options) |
| return option_parser.parse_args(args) |
| |
| |
| class TestUtilityFunctions(unittest.TestCase): |
| def test_print_options(self): |
| options, args = get_options([]) |
| self.assertIsNotNone(options) |
| |
| |
| class Testprinter(unittest.TestCase): |
| def assertEmpty(self, stream): |
| self.assertFalse(stream.getvalue()) |
| |
| def assertNotEmpty(self, stream): |
| self.assertTrue(stream.getvalue()) |
| |
| def assertWritten(self, stream, contents): |
| self.assertEqual(stream.getvalue(), contents) |
| |
| def reset(self, stream): |
| stream.truncate(0) |
| stream.seek(0) |
| |
| def get_printer(self, args=None): |
| args = args or [] |
| printing_options = printing.print_options() |
| option_parser = optparse.OptionParser(option_list=printing_options) |
| options, args = option_parser.parse_args(args) |
| host = MockHost() |
| self._port = host.port_factory.get('test', options) |
| nproc = 2 |
| |
| regular_output = StringIO() |
| printer = printing.Printer(self._port, options, regular_output) |
| return printer, regular_output |
| |
| def get_result(self, test_name, result_type=test_expectations.PASS, run_time=0): |
| failures = [] |
| if result_type == test_expectations.TIMEOUT: |
| failures = [test_failures.FailureTimeout()] |
| elif result_type == test_expectations.CRASH: |
| failures = [test_failures.FailureCrash()] |
| return test_results.TestResult(test_name, failures=failures, test_run_time=run_time) |
| |
| def test_configure_and_cleanup(self): |
| # This test verifies that calling cleanup repeatedly and deleting |
| # the object is safe. |
| printer, err = self.get_printer() |
| printer.cleanup() |
| printer.cleanup() |
| printer = None |
| |
| def test_print_config(self): |
| printer, err = self.get_printer() |
| # FIXME: it's lame that i have to set these options directly. |
| printer._options.pixel_tests = True |
| printer._options.new_baseline = True |
| printer._options.time_out_ms = 6000 |
| printer._options.slow_time_out_ms = 12000 |
| printer.print_config('/tmp') |
| self.assertIn("Using port 'test-mac-leopard'", err.getvalue()) |
| self.assertIn('Test configuration: <leopard, x86, release>', err.getvalue()) |
| self.assertIn('Placing test results in /tmp', err.getvalue()) |
| self.assertIn('Using Release build', err.getvalue()) |
| self.assertIn('Pixel tests enabled', err.getvalue()) |
| self.assertIn('Command line:', err.getvalue()) |
| self.assertIn('Regular timeout: ', err.getvalue()) |
| |
| def test_print_baseline_search_path(self): |
| printer, err = self.get_printer() |
| printer.print_baseline_search_path() |
| |
| self.assertIn('Verbose baseline search path: platform/test-mac-leopard -> platform/test-mac-snowleopard -> generic', err.getvalue()) |
| self.assertIn('Baseline search path: platform/test-mac-leopard -> generic', err.getvalue()) |
| |
| self.reset(err) |
| printer._options.quiet = True |
| printer.print_baseline_search_path() |
| self.assertNotIn('Baseline search path: platform/test-mac-leopard -> platform/test-mac-snowleopard -> generic', err.getvalue()) |
| |
| def test_print_one_line_summary(self): |
| printer, err = self.get_printer() |
| printer._print_one_line_summary(1, 1, 0) |
| self.assertWritten(err, "The test ran as expected.\n\n") |
| |
| printer, err = self.get_printer() |
| printer._print_one_line_summary(1, 1, 0) |
| self.assertWritten(err, "The test ran as expected.\n\n") |
| |
| printer, err = self.get_printer() |
| printer._print_one_line_summary(2, 1, 1) |
| self.assertWritten(err, "\n1 test ran as expected, 1 didn't:\n\n") |
| |
| printer, err = self.get_printer() |
| printer._print_one_line_summary(3, 2, 1) |
| self.assertWritten(err, "\n2 tests ran as expected, 1 didn't:\n\n") |
| |
| printer, err = self.get_printer() |
| printer._print_one_line_summary(3, 2, 0) |
| self.assertWritten(err, "\n2 tests ran as expected (1 didn't run).\n\n") |
| |
| def test_test_status_line(self): |
| printer, _ = self.get_printer() |
| printer._meter.number_of_columns = lambda: 80 |
| actual = printer._test_status_line('fast/dom/HTMLFormElement/associated-elements-after-index-assertion-fail1.html', ' passed') |
| self.assertEqual(80, len(actual)) |
| self.assertEqual(actual, '[0/0] fast/dom/HTMLFormElement/associa...after-index-assertion-fail1.html passed') |
| |
| printer._meter.number_of_columns = lambda: 80 |
| actual = printer._test_status_line('fast/dom/HTMLFormElement/associated-elements-after-index-assertion-fail1.html', ' passed', truncate=False) |
| self.assertEqual(90, len(actual)) |
| self.assertEqual(actual, '[0/0] fast/dom/HTMLFormElement/associated-elements-after-index-assertion-fail1.html passed') |
| |
| printer._meter.number_of_columns = lambda: 89 |
| actual = printer._test_status_line('fast/dom/HTMLFormElement/associated-elements-after-index-assertion-fail1.html', ' passed') |
| self.assertEqual(89, len(actual)) |
| self.assertEqual(actual, '[0/0] fast/dom/HTMLFormElement/associated-...ents-after-index-assertion-fail1.html passed') |
| |
| printer._meter.number_of_columns = lambda: sys.maxsize |
| actual = printer._test_status_line('fast/dom/HTMLFormElement/associated-elements-after-index-assertion-fail1.html', ' passed') |
| self.assertEqual(90, len(actual)) |
| self.assertEqual(actual, '[0/0] fast/dom/HTMLFormElement/associated-elements-after-index-assertion-fail1.html passed') |
| |
| printer._meter.number_of_columns = lambda: 18 |
| actual = printer._test_status_line('fast/dom/HTMLFormElement/associated-elements-after-index-assertion-fail1.html', ' passed') |
| self.assertEqual(18, len(actual)) |
| self.assertEqual(actual, '[0/0] f...l passed') |
| |
| printer._meter.number_of_columns = lambda: 10 |
| actual = printer._test_status_line('fast/dom/HTMLFormElement/associated-elements-after-index-assertion-fail1.html', ' passed') |
| self.assertEqual(actual, '[0/0] associated-elements-after-index-assertion-fail1.html passed') |
| |
| def test_details(self): |
| printer, err = self.get_printer(['--details']) |
| result = self.get_result('passes/image.html') |
| printer.print_started_test('passes/image.html') |
| printer.print_finished_test(result, expected=False, exp_str='', got_str='') |
| self.assertNotEmpty(err) |
| |
| def test_print_found(self): |
| printer, err = self.get_printer() |
| |
| printer.print_found(100, 10, 1, 1) |
| self.assertWritten(err, "Found 100 tests; running 10, skipping 90.\n") |
| |
| self.reset(err) |
| printer.print_found(100, 10, 2, 3) |
| self.assertWritten(err, "Found 100 tests; running 10 (6 times each: --repeat-each=2 --iterations=3), skipping 90.\n") |