Clean up ChunkedUpdateDrawingAreaProxy
[WebKit-https.git] / Tools / Scripts / webkitpy / layout_tests / deduplicate_tests_unittest.py
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 """Unit tests for deduplicate_tests.py."""
26
27 import deduplicate_tests
28 import os
29 import unittest
30 import webkitpy.common.checkout.scm as scm
31
32
33 class MockExecutive(object):
34     last_run_command = []
35     response = ''
36
37     class Executive(object):
38         def run_command(self,
39                         args,
40                         cwd=None,
41                         input=None,
42                         error_handler=None,
43                         return_exit_code=False,
44                         return_stderr=True,
45                         decode_output=True):
46             MockExecutive.last_run_command += [args]
47             return MockExecutive.response
48
49
50 class ListDuplicatesTest(unittest.TestCase):
51     def setUp(self):
52         MockExecutive.last_run_command = []
53         MockExecutive.response = ''
54         deduplicate_tests.executive = MockExecutive
55         self._original_cwd = os.getcwd()
56         checkout_root = scm.find_checkout_root()
57         self.assertNotEqual(checkout_root, None)
58         os.chdir(checkout_root)
59
60     def tearDown(self):
61         os.chdir(self._original_cwd)
62
63     def test_parse_git_output(self):
64         git_output = (
65             '100644 blob 5053240b3353f6eb39f7cb00259785f16d121df2\tLayoutTests/mac/foo-expected.txt\n'
66             '100644 blob a004548d107ecc4e1ea08019daf0a14e8634a1ff\tLayoutTests/platform/chromium/foo-expected.txt\n'
67             '100644 blob d6bb0bc762e3aec5df03b5c04485b2cb3b65ffb1\tLayoutTests/platform/chromium-linux/foo-expected.txt\n'
68             '100644 blob abcdebc762e3aec5df03b5c04485b2cb3b65ffb1\tLayoutTests/platform/chromium-linux/animage.png\n'
69             '100644 blob d6bb0bc762e3aec5df03b5c04485b2cb3b65ffb1\tLayoutTests/platform/chromium-win/foo-expected.txt\n'
70             '100644 blob abcdebc762e3aec5df03b5c04485b2cb3b65ffb1\tLayoutTests/platform/chromium-win/animage.png\n'
71             '100644 blob 4303df5389ca87cae83dd3236b8dd84e16606517\tLayoutTests/platform/mac/foo-expected.txt\n')
72         hashes = deduplicate_tests.parse_git_output(git_output, '*')
73         expected = {('mac/foo-expected.txt', '5053240b3353f6eb39f7cb00259785f16d121df2'): set(['mac/foo-expected.txt']),
74                     ('animage.png', 'abcdebc762e3aec5df03b5c04485b2cb3b65ffb1'): set(['platform/chromium-linux/animage.png', 'platform/chromium-win/animage.png']),
75                     ('foo-expected.txt', '4303df5389ca87cae83dd3236b8dd84e16606517'): set(['platform/mac/foo-expected.txt']),
76                     ('foo-expected.txt', 'd6bb0bc762e3aec5df03b5c04485b2cb3b65ffb1'): set(['platform/chromium-linux/foo-expected.txt', 'platform/chromium-win/foo-expected.txt']),
77                     ('foo-expected.txt', 'a004548d107ecc4e1ea08019daf0a14e8634a1ff'): set(['platform/chromium/foo-expected.txt'])}
78         self.assertEquals(expected, hashes)
79
80         hashes = deduplicate_tests.parse_git_output(git_output, '*.png')
81         expected = {('animage.png', 'abcdebc762e3aec5df03b5c04485b2cb3b65ffb1'): set(['platform/chromium-linux/animage.png', 'platform/chromium-win/animage.png'])}
82         self.assertEquals(expected, hashes)
83
84     def test_extract_platforms(self):
85         self.assertEquals({'foo': 'platform/foo/bar',
86                            'zoo': 'platform/zoo/com'},
87                            deduplicate_tests.extract_platforms(['platform/foo/bar', 'platform/zoo/com']))
88         self.assertEquals({'foo': 'platform/foo/bar',
89                            deduplicate_tests._BASE_PLATFORM: 'what/'},
90                            deduplicate_tests.extract_platforms(['platform/foo/bar', 'what/']))
91
92     def test_has_intermediate_results(self):
93         test_cases = (
94             # If we found a duplicate in our first fallback, we have no
95             # intermediate results.
96             (False, ('fast/foo-expected.txt',
97                      ['chromium-win', 'chromium', 'base'],
98                      'chromium-win',
99                      lambda path: True)),
100             # Since chromium-win has a result, we have an intermediate result.
101             (True,  ('fast/foo-expected.txt',
102                      ['chromium-win', 'chromium', 'base'],
103                      'chromium',
104                      lambda path: True)),
105             # There are no intermediate results.
106             (False, ('fast/foo-expected.txt',
107                      ['chromium-win', 'chromium', 'base'],
108                      'chromium',
109                      lambda path: False)),
110             # There are no intermediate results since a result for chromium is
111             # our duplicate file.
112             (False, ('fast/foo-expected.txt',
113                      ['chromium-win', 'chromium', 'base'],
114                      'chromium',
115                      lambda path: path == 'LayoutTests/platform/chromium/fast/foo-expected.txt')),
116             # We have an intermediate result in 'chromium' even though our
117             # duplicate is with the file in 'base'.
118             (True,  ('fast/foo-expected.txt',
119                      ['chromium-win', 'chromium', 'base'],
120                      'base',
121                      lambda path: path == 'LayoutTests/platform/chromium/fast/foo-expected.txt')),
122             # We have an intermediate result in 'chromium-win' even though our
123             # duplicate is in 'base'.
124             (True,  ('fast/foo-expected.txt',
125                      ['chromium-win', 'chromium', 'base'],
126                      'base',
127                      lambda path: path == 'LayoutTests/platform/chromium-win/fast/foo-expected.txt')),
128         )
129         for expected, inputs in test_cases:
130             self.assertEquals(expected,
131                 deduplicate_tests.has_intermediate_results(*inputs))
132
133     def test_unique(self):
134         MockExecutive.response = (
135             '100644 blob 5053240b3353f6eb39f7cb00259785f16d121df2\tLayoutTests/mac/foo-expected.txt\n'
136             '100644 blob a004548d107ecc4e1ea08019daf0a14e8634a1ff\tLayoutTests/platform/chromium/foo-expected.txt\n'
137             '100644 blob abcd0bc762e3aec5df03b5c04485b2cb3b65ffb1\tLayoutTests/platform/chromium-linux/foo-expected.txt\n'
138             '100644 blob d6bb0bc762e3aec5df03b5c04485b2cb3b65ffb1\tLayoutTests/platform/chromium-win/foo-expected.txt\n'
139             '100644 blob 4303df5389ca87cae83dd3236b8dd84e16606517\tLayoutTests/platform/mac/foo-expected.txt\n')
140         result = deduplicate_tests.deduplicate('*')
141         self.assertEquals(1, len(MockExecutive.last_run_command))
142         self.assertEquals(('git', 'ls-tree', '-r', 'HEAD', 'LayoutTests'), MockExecutive.last_run_command[-1])
143         self.assertEquals(0, len(result))
144
145     def test_duplicates(self):
146         MockExecutive.response = (
147             '100644 blob 5053240b3353f6eb39f7cb00259785f16d121df2\tLayoutTests/mac/foo-expected.txt\n'
148             '100644 blob a004548d107ecc4e1ea08019daf0a14e8634a1ff\tLayoutTests/platform/chromium/foo-expected.txt\n'
149             '100644 blob d6bb0bc762e3aec5df03b5c04485b2cb3b65ffb1\tLayoutTests/platform/chromium-linux/foo-expected.txt\n'
150             '100644 blob abcdebc762e3aec5df03b5c04485b2cb3b65ffb1\tLayoutTests/platform/chromium-linux/animage.png\n'
151             '100644 blob d6bb0bc762e3aec5df03b5c04485b2cb3b65ffb1\tLayoutTests/platform/chromium-win/foo-expected.txt\n'
152             '100644 blob abcdebc762e3aec5df03b5c04485b2cb3b65ffb1\tLayoutTests/platform/chromium-win/animage.png\n'
153             '100644 blob 4303df5389ca87cae83dd3236b8dd84e16606517\tLayoutTests/platform/mac/foo-expected.txt\n')
154
155         result = deduplicate_tests.deduplicate('*')
156         self.assertEquals(1, len(MockExecutive.last_run_command))
157         self.assertEquals(('git', 'ls-tree', '-r', 'HEAD', 'LayoutTests'), MockExecutive.last_run_command[-1])
158         self.assertEquals(2, len(result))
159         self.assertEquals({'test': 'animage.png',
160                            'path': 'LayoutTests/platform/chromium-linux/animage.png',
161                            'fallback': 'chromium-win',
162                            'platform': 'chromium-linux'},
163                           result[0])
164         self.assertEquals({'test': 'foo-expected.txt',
165                            'path': 'LayoutTests/platform/chromium-linux/foo-expected.txt',
166                            'fallback': 'chromium-win',
167                            'platform': 'chromium-linux'},
168                           result[1])
169
170         result = deduplicate_tests.deduplicate('*.txt')
171         self.assertEquals(2, len(MockExecutive.last_run_command))
172         self.assertEquals(('git', 'ls-tree', '-r', 'HEAD', 'LayoutTests'), MockExecutive.last_run_command[-1])
173         self.assertEquals(1, len(result))
174         self.assertEquals({'test': 'foo-expected.txt',
175                            'path': 'LayoutTests/platform/chromium-linux/foo-expected.txt',
176                            'fallback': 'chromium-win',
177                            'platform': 'chromium-linux'},
178                           result[0])
179
180         result = deduplicate_tests.deduplicate('*.png')
181         self.assertEquals(3, len(MockExecutive.last_run_command))
182         self.assertEquals(('git', 'ls-tree', '-r', 'HEAD', 'LayoutTests'), MockExecutive.last_run_command[-1])
183         self.assertEquals(1, len(result))
184         self.assertEquals({'test': 'animage.png',
185                            'path': 'LayoutTests/platform/chromium-linux/animage.png',
186                            'fallback': 'chromium-win',
187                            'platform': 'chromium-linux'},
188                           result[0])
189
190     def test_get_relative_test_path(self):
191         checkout_root = scm.find_checkout_root()
192         layout_test_dir = os.path.join(checkout_root, 'LayoutTests')
193         test_cases = (
194             ('platform/mac/test.html',
195              ('platform/mac/test.html', layout_test_dir)),
196             ('LayoutTests/platform/mac/test.html',
197              ('platform/mac/test.html', checkout_root)),
198             (None,
199              ('platform/mac/test.html', os.path.join(checkout_root, 'WebCore'))),
200             ('test.html',
201              ('platform/mac/test.html', os.path.join(layout_test_dir, 'platform/mac'))),
202             (None,
203              ('platform/mac/test.html', os.path.join(layout_test_dir, 'platform/win'))),
204         )
205         for expected, inputs in test_cases:
206             self.assertEquals(expected,
207                               deduplicate_tests.get_relative_test_path(*inputs))
208
209 if __name__ == '__main__':
210     unittest.main()