Home | History | Annotate | Download | only in net
      1 #!/usr/bin/env python
      2 # Copyright (C) 2010 Google Inc. All rights reserved.
      3 #
      4 # Redistribution and use in source and binary forms, with or without
      5 # modification, are permitted provided that the following conditions
      6 # are met:
      7 #
      8 # 1.  Redistributions of source code must retain the above copyright
      9 #     notice, this list of conditions and the following disclaimer.
     10 # 2.  Redistributions in binary form must reproduce the above copyright
     11 #     notice, this list of conditions and the following disclaimer in the
     12 #     documentation and/or other materials provided with the distribution.
     13 #
     14 # THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
     15 # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     16 # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     17 # DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
     18 # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     19 # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     20 # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
     21 # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     22 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     23 # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     24 
     25 import os
     26 import re
     27 import sys
     28 import testoutput
     29 import unittest
     30 
     31 
     32 class FakeFile(object):
     33     def __init__(self, filename, contents="fake contents"):
     34         self._filename = filename
     35         self._contents = contents
     36 
     37     def name(self):
     38         return self._filename
     39 
     40     def contents(self):
     41         return self._contents
     42 
     43 
     44 class FakeTestOutput(testoutput.TestOutput):
     45     def __init__(self, platform, output_type, contents, is_expected=False):
     46         self._output_type = output_type
     47         self._contents = contents
     48         self._is_expected = is_expected
     49         actual = 'actual'
     50         if is_expected:
     51             actual = 'expected'
     52         test_name = 'anonymous-test-%s.txt' % actual
     53         file = FakeFile(test_name, contents)
     54         super(FakeTestOutput, self).__init__(platform, output_type, [file])
     55 
     56     def contents(self):
     57         return self._contents
     58 
     59     def retarget(self, platform):
     60         return FakeTestOutput(platform, self._output_type, self._contents, self._is_expected)
     61 
     62 
     63 class TestOutputTest(unittest.TestCase):
     64     def _check_name(self, filename, expected_test_name):
     65         # FIXME: should consider using MockFileSystem here so as to not
     66         # have to worry about platform-specific path separators.
     67         if sys.platform == 'win32':
     68             filename = filename.replace('/', os.path.sep)
     69             expected_test_name = expected_test_name.replace('/', os.path.sep)
     70         r = testoutput.TextTestOutput(None, FakeFile(filename))
     71         self.assertEquals(expected_test_name, r.name())
     72 
     73     def _check_platform(self, filename, expected_platform):
     74         # FIXME: should consider using MockFileSystem here so as to not
     75         # have to worry about platform-specific path separators.
     76         if sys.platform == 'win32':
     77             filename = filename.replace('/', os.path.sep)
     78         r = testoutput.TextTestOutput(None, FakeFile(filename))
     79         self.assertEquals(expected_platform, r.platform())
     80 
     81     def test_extracts_name_correctly(self):
     82         self._check_name('LayoutTests/fast/dom/a-expected.txt', 'fast/dom/a')
     83         self._check_name('LayoutTests/fast/dom/a-actual.txt', 'fast/dom/a')
     84         self._check_name('LayoutTests/platform/win/fast/a-expected.txt', 'fast/a')
     85         self._check_name('LayoutTests/platform/win/fast/a-expected.checksum', 'fast/a')
     86         self._check_name('fast/dom/test-expected.txt', 'fast/dom/test')
     87         self._check_name('layout-test-results/fast/a-actual.checksum', 'fast/a')
     88 
     89     def test_extracts_platform_correctly(self):
     90         self._check_platform('LayoutTests/platform/win/fast/a-expected.txt', 'win')
     91         self._check_platform('platform/win/fast/a-expected.txt', 'win')
     92         self._check_platform('platform/mac/fast/a-expected.txt', 'mac')
     93         self._check_platform('fast/a-expected.txt', None)
     94 
     95     def test_outputs_from_an_actual_file_are_marked_as_such(self):
     96         r = testoutput.TextTestOutput(None, FakeFile('test-actual.txt'))
     97         self.assertTrue(r.is_actual())
     98 
     99     def test_outputs_from_an_expected_file_are_not_actual(self):
    100         r = testoutput.TextTestOutput(None, FakeFile('test-expected.txt'))
    101         self.assertFalse(r.is_actual())
    102 
    103     def test_is_new_baseline_for(self):
    104         expected = testoutput.TextTestOutput('mac', FakeFile('test-expected.txt'))
    105         actual = testoutput.TextTestOutput('mac', FakeFile('test-actual.txt'))
    106         self.assertTrue(actual.is_new_baseline_for(expected))
    107         self.assertFalse(expected.is_new_baseline_for(actual))
    108 
    109     def test__eq__(self):
    110         r1 = testoutput.TextTestOutput('mac', FakeFile('test-expected.txt', 'contents'))
    111         r2 = testoutput.TextTestOutput('mac', FakeFile('test-expected.txt', 'contents'))
    112         r3 = testoutput.TextTestOutput('win', FakeFile('test-expected.txt', 'contents'))
    113 
    114         self.assertEquals(r1, r2)
    115         self.assertEquals(r1, r2.retarget('mac'))
    116         self.assertNotEquals(r1, r2.retarget('win'))
    117 
    118     def test__hash__(self):
    119         r1 = testoutput.TextTestOutput('mac', FakeFile('test-expected.txt', 'contents'))
    120         r2 = testoutput.TextTestOutput('mac', FakeFile('test-expected.txt', 'contents'))
    121         r3 = testoutput.TextTestOutput(None, FakeFile('test-expected.txt', None))
    122 
    123         x = set([r1, r2])
    124         self.assertEquals(1, len(set([r1, r2])))
    125         self.assertEquals(2, len(set([r1, r2, r3])))
    126 
    127     def test_image_diff_is_invoked_for_image_outputs_without_checksum(self):
    128         r1 = testoutput.ImageTestOutput('mac', FakeFile('test-expected.png', 'asdf'), FakeFile('test-expected.checksum', 'check'))
    129         r2 = testoutput.ImageTestOutput('mac', FakeFile('test-expected.png', 'asdf'), None)
    130 
    131         # Default behaviour is to just compare on image contents.
    132         self.assertTrue(r1.same_content(r2))
    133 
    134         class AllImagesAreDifferent(object):
    135             def same_image(self, image1, image2):
    136                 return False
    137 
    138         # But we can install other image differs.
    139         testoutput.ImageTestOutput.image_differ = AllImagesAreDifferent()
    140 
    141         self.assertFalse(r1.same_content(r2))
    142 
    143 if __name__ == "__main__":
    144     unittest.main()
    145