Home | History | Annotate | Download | only in servers
      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 import json
     30 import webkitpy.thirdparty.unittest2 as unittest
     31 
     32 from webkitpy.common.net import layouttestresults_unittest
     33 from webkitpy.common.host_mock import MockHost
     34 from webkitpy.layout_tests.layout_package.json_results_generator import strip_json_wrapper
     35 from webkitpy.layout_tests.port.base import Port
     36 from webkitpy.tool.commands.rebaselineserver import TestConfig, RebaselineServer
     37 from webkitpy.tool.servers import rebaselineserver
     38 
     39 
     40 class RebaselineTestTest(unittest.TestCase):
     41     def test_text_rebaseline_update(self):
     42         self._assertRebaseline(
     43             test_files=(
     44                 'fast/text-expected.txt',
     45                 'platform/mac/fast/text-expected.txt',
     46             ),
     47             results_files=(
     48                 'fast/text-actual.txt',
     49             ),
     50             test_name='fast/text.html',
     51             baseline_target='mac',
     52             baseline_move_to='none',
     53             expected_success=True,
     54             expected_log=[
     55                 'Rebaselining fast/text...',
     56                 '  Updating baselines for mac',
     57                 '    Updated text-expected.txt',
     58             ])
     59 
     60     def test_text_rebaseline_new(self):
     61         self._assertRebaseline(
     62             test_files=(
     63                 'fast/text-expected.txt',
     64             ),
     65             results_files=(
     66                 'fast/text-actual.txt',
     67             ),
     68             test_name='fast/text.html',
     69             baseline_target='mac',
     70             baseline_move_to='none',
     71             expected_success=True,
     72             expected_log=[
     73                 'Rebaselining fast/text...',
     74                 '  Updating baselines for mac',
     75                 '    Updated text-expected.txt',
     76             ])
     77 
     78     def test_text_rebaseline_move_no_op_1(self):
     79         self._assertRebaseline(
     80             test_files=(
     81                 'fast/text-expected.txt',
     82                 'platform/win/fast/text-expected.txt',
     83             ),
     84             results_files=(
     85                 'fast/text-actual.txt',
     86             ),
     87             test_name='fast/text.html',
     88             baseline_target='mac',
     89             baseline_move_to='mac-leopard',
     90             expected_success=True,
     91             expected_log=[
     92                 'Rebaselining fast/text...',
     93                 '  Updating baselines for mac',
     94                 '    Updated text-expected.txt',
     95             ])
     96 
     97     def test_text_rebaseline_move_no_op_2(self):
     98         self._assertRebaseline(
     99             test_files=(
    100                 'fast/text-expected.txt',
    101                 'platform/mac/fast/text-expected.checksum',
    102             ),
    103             results_files=(
    104                 'fast/text-actual.txt',
    105             ),
    106             test_name='fast/text.html',
    107             baseline_target='mac',
    108             baseline_move_to='mac-leopard',
    109             expected_success=True,
    110             expected_log=[
    111                 'Rebaselining fast/text...',
    112                 '  Moving current mac baselines to mac-leopard',
    113                 '    No current baselines to move',
    114                 '  Updating baselines for mac',
    115                 '    Updated text-expected.txt',
    116             ])
    117 
    118     def test_text_rebaseline_move(self):
    119         self._assertRebaseline(
    120             test_files=(
    121                 'fast/text-expected.txt',
    122                 'platform/mac/fast/text-expected.txt',
    123             ),
    124             results_files=(
    125                 'fast/text-actual.txt',
    126             ),
    127             test_name='fast/text.html',
    128             baseline_target='mac',
    129             baseline_move_to='mac-leopard',
    130             expected_success=True,
    131             expected_log=[
    132                 'Rebaselining fast/text...',
    133                 '  Moving current mac baselines to mac-leopard',
    134                 '    Moved text-expected.txt',
    135                 '  Updating baselines for mac',
    136                 '    Updated text-expected.txt',
    137             ])
    138 
    139     def test_text_rebaseline_move_only_images(self):
    140         self._assertRebaseline(
    141             test_files=(
    142                 'fast/image-expected.txt',
    143                 'platform/mac/fast/image-expected.txt',
    144                 'platform/mac/fast/image-expected.png',
    145                 'platform/mac/fast/image-expected.checksum',
    146             ),
    147             results_files=(
    148                 'fast/image-actual.png',
    149                 'fast/image-actual.checksum',
    150             ),
    151             test_name='fast/image.html',
    152             baseline_target='mac',
    153             baseline_move_to='mac-leopard',
    154             expected_success=True,
    155             expected_log=[
    156                 'Rebaselining fast/image...',
    157                 '  Moving current mac baselines to mac-leopard',
    158                 '    Moved image-expected.checksum',
    159                 '    Moved image-expected.png',
    160                 '  Updating baselines for mac',
    161                 '    Updated image-expected.checksum',
    162                 '    Updated image-expected.png',
    163             ])
    164 
    165     def test_text_rebaseline_move_already_exist(self):
    166         self._assertRebaseline(
    167             test_files=(
    168                 'fast/text-expected.txt',
    169                 'platform/mac-leopard/fast/text-expected.txt',
    170                 'platform/mac/fast/text-expected.txt',
    171             ),
    172             results_files=(
    173                 'fast/text-actual.txt',
    174             ),
    175             test_name='fast/text.html',
    176             baseline_target='mac',
    177             baseline_move_to='mac-leopard',
    178             expected_success=False,
    179             expected_log=[
    180                 'Rebaselining fast/text...',
    181                 '  Moving current mac baselines to mac-leopard',
    182                 '    Already had baselines in mac-leopard, could not move existing mac ones',
    183             ])
    184 
    185     def test_image_rebaseline(self):
    186         self._assertRebaseline(
    187             test_files=(
    188                 'fast/image-expected.txt',
    189                 'platform/mac/fast/image-expected.png',
    190                 'platform/mac/fast/image-expected.checksum',
    191             ),
    192             results_files=(
    193                 'fast/image-actual.png',
    194                 'fast/image-actual.checksum',
    195             ),
    196             test_name='fast/image.html',
    197             baseline_target='mac',
    198             baseline_move_to='none',
    199             expected_success=True,
    200             expected_log=[
    201                 'Rebaselining fast/image...',
    202                 '  Updating baselines for mac',
    203                 '    Updated image-expected.checksum',
    204                 '    Updated image-expected.png',
    205             ])
    206 
    207     def test_gather_baselines(self):
    208         example_json = layouttestresults_unittest.LayoutTestResultsTest.example_full_results_json
    209         results_json = json.loads(strip_json_wrapper(example_json))
    210         server = RebaselineServer()
    211         server._test_config = get_test_config()
    212         server._gather_baselines(results_json)
    213         self.assertEqual(results_json['tests']['svg/dynamic-updates/SVGFEDropShadowElement-dom-stdDeviation-attr.html']['state'], 'needs_rebaseline')
    214         self.assertNotIn('prototype-chocolate.html', results_json['tests'])
    215 
    216     def _assertRebaseline(self, test_files, results_files, test_name, baseline_target, baseline_move_to, expected_success, expected_log):
    217         log = []
    218         test_config = get_test_config(test_files, results_files)
    219         success = rebaselineserver._rebaseline_test(
    220             test_name,
    221             baseline_target,
    222             baseline_move_to,
    223             test_config,
    224             log=lambda l: log.append(l))
    225         self.assertEqual(expected_log, log)
    226         self.assertEqual(expected_success, success)
    227 
    228 
    229 class GetActualResultFilesTest(unittest.TestCase):
    230     def test(self):
    231         test_config = get_test_config(result_files=(
    232             'fast/text-actual.txt',
    233             'fast2/text-actual.txt',
    234             'fast/text2-actual.txt',
    235             'fast/text-notactual.txt',
    236         ))
    237         self.assertItemsEqual(
    238             ('text-actual.txt',),
    239             rebaselineserver._get_actual_result_files(
    240                 'fast/text.html', test_config))
    241 
    242 
    243 class GetBaselinesTest(unittest.TestCase):
    244     def test_no_baselines(self):
    245         self._assertBaselines(
    246             test_files=(),
    247             test_name='fast/missing.html',
    248             expected_baselines={})
    249 
    250     def test_text_baselines(self):
    251         self._assertBaselines(
    252             test_files=(
    253                 'fast/text-expected.txt',
    254                 'platform/mac/fast/text-expected.txt',
    255             ),
    256             test_name='fast/text.html',
    257             expected_baselines={
    258                 'mac': {'.txt': True},
    259                 'base': {'.txt': False},
    260             })
    261 
    262     def test_image_and_text_baselines(self):
    263         self._assertBaselines(
    264             test_files=(
    265                 'fast/image-expected.txt',
    266                 'platform/mac/fast/image-expected.png',
    267                 'platform/mac/fast/image-expected.checksum',
    268                 'platform/win/fast/image-expected.png',
    269                 'platform/win/fast/image-expected.checksum',
    270             ),
    271             test_name='fast/image.html',
    272             expected_baselines={
    273                 'base': {'.txt': True},
    274                 'mac': {'.checksum': True, '.png': True},
    275                 'win': {'.checksum': False, '.png': False},
    276             })
    277 
    278     def test_extra_baselines(self):
    279         self._assertBaselines(
    280             test_files=(
    281                 'fast/text-expected.txt',
    282                 'platform/nosuchplatform/fast/text-expected.txt',
    283             ),
    284             test_name='fast/text.html',
    285             expected_baselines={'base': {'.txt': True}})
    286 
    287     def _assertBaselines(self, test_files, test_name, expected_baselines):
    288         actual_baselines = rebaselineserver.get_test_baselines(test_name, get_test_config(test_files))
    289         self.assertEqual(expected_baselines, actual_baselines)
    290 
    291 
    292 def get_test_config(test_files=[], result_files=[]):
    293     host = MockHost()
    294     port = host.port_factory.get()
    295     layout_tests_directory = port.layout_tests_dir()
    296     results_directory = port.results_directory()
    297 
    298     for file in test_files:
    299         host.filesystem.write_binary_file(host.filesystem.join(layout_tests_directory, file), '')
    300     for file in result_files:
    301         host.filesystem.write_binary_file(host.filesystem.join(results_directory, file), '')
    302 
    303     class TestMacPort(Port):
    304         port_name = "mac"
    305         FALLBACK_PATHS = {'': ['mac']}
    306 
    307     return TestConfig(
    308         TestMacPort(host, 'mac'),
    309         layout_tests_directory,
    310         results_directory,
    311         ('mac', 'mac-leopard', 'win', 'linux'),
    312         host.filesystem,
    313         host.scm())
    314