Create a script to import W3C tests
[WebKit-https.git] / Tools / Scripts / webkitpy / w3c / test_parser_unittest.py
1 #!/usr/bin/env python
2
3 # Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved.
4 #
5 # Redistribution and use in source and binary forms, with or without
6 # modification, are permitted provided that the following conditions
7 # are met:
8 #
9 # 1. Redistributions of source code must retain the above
10 #    copyright notice, this list of conditions and the following
11 #    disclaimer.
12 # 2. Redistributions in binary form must reproduce the above
13 #    copyright notice, this list of conditions and the following
14 #    disclaimer in the documentation and/or other materials
15 #    provided with the distribution.
16 #
17 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER "AS IS" AND ANY
18 # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20 # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
21 # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
22 # OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23 # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
24 # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
26 # TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
27 # THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28 # SUCH DAMAGE.
29 import os
30 import StringIO
31 import sys
32 import unittest2 as unittest
33
34 from webkitpy.w3c.test_parser import TestParser
35
36
37 options = {'all': False, 'no_overwrite': False}
38
39
40 class TestParserTest(unittest.TestCase):
41
42     def test_analyzeTestReftestOneMatch(self):
43         """ Tests analyze_test() using a basic reftest with one match link and no mismatch links """
44
45         test_html = """<head>
46 <link rel="match" href="green-box-ref.xht" />
47 </head>
48 """
49         test_path = '/some/madeup/path/'
50         parser = TestParser(options, test_path + 'somefile.html')
51         test_info = parser.analyze_test(test_contents=test_html)
52
53         # Verify the correct test info was found
54         self.assertNotEqual(test_info, None, 'did not find a test')
55         self.assertTrue('test' in test_info.keys(), 'did not find a test file')
56         self.assertTrue('reference' in test_info.keys(), 'did not find a reference file')
57         self.assertTrue(test_info['reference'].startswith(test_path), 'reference path is not correct')
58         self.assertFalse('refsupport' in test_info.keys(), 'there should be no refsupport files for this test')
59         self.assertFalse('jstest' in test_info.keys(), 'test should not have been analyzed as a jstest')
60
61     def test_analyzeTestReftestMultipleMatches(self):
62         """ Tests analyze_test() using a reftest with multiple match links and no mismatch links """
63
64         test_html = """<head>
65 <link rel="match" href="green-box-ref.xht" />
66 <link rel="match" href="blue-box-ref.xht" />
67 <link rel="match" href="orange-box-ref.xht" />
68 </head>
69 """
70         # Capture stdout for this test
71         stdout = sys.stdout
72         output = StringIO.StringIO()
73         sys.stdout = output
74
75         # Analyze the test
76         test_path = '/some/madeup/path/'
77         parser = TestParser(options, test_path + 'somefile.html')
78         test_info = parser.analyze_test(test_contents=test_html)
79
80         # Restore stdout
81         sys.stdout = stdout
82
83         # Verify the correct test info was found
84         self.assertNotEqual(test_info, None, 'did not find a test')
85         self.assertTrue('test' in test_info.keys(), 'did not find a test file')
86         self.assertTrue('reference' in test_info.keys(), 'did not find a reference file')
87         self.assertTrue(test_info['reference'].startswith(test_path), 'reference path is not correct')
88         self.assertFalse('refsupport' in test_info.keys(), 'there should be no refsupport files for this test')
89         self.assertFalse('jstest' in test_info.keys(), 'test should not have been analyzed as a jstest')
90
91         # Verify we got the warning about multiple matches
92         self.assertTrue(output.getvalue().startswith('Warning'), 'no warning about multiple matches')
93
94     def test_analyzeTestReftestMatchAndMismatch(self):
95         """ Tests analyze_test() using a reftest with a one match link and one mismatch link """
96
97         test_html = """<head>
98 <link rel="match" href="green-box-ref.xht" />
99 <link rel="match" href="blue-box-ref.xht" />
100 <link rel="mismatch" href="orange-box-notref.xht" />
101 </head>
102 """
103         # Capture stdout for this test
104         stdout = sys.stdout
105         output = StringIO.StringIO()
106         sys.stdout = output
107
108         # Analyze the test
109         test_path = '/some/madeup/path/'
110         parser = TestParser(options, test_path + 'somefile.html')
111         test_info = parser.analyze_test(test_contents=test_html)
112
113         # Restore stdout
114         sys.stdout = stdout
115
116         # Verify the correct test info was found
117         self.assertNotEqual(test_info, None, 'did not find a test')
118         self.assertTrue('test' in test_info.keys(), 'did not find a test file')
119         self.assertTrue('reference' in test_info.keys(), 'did not find a reference file')
120         self.assertTrue(test_info['reference'].startswith(test_path), 'reference path is not correct')
121         self.assertFalse('refsupport' in test_info.keys(), 'there should be no refsupport files for this test')
122         self.assertFalse('jstest' in test_info.keys(), 'test should not have been analyzed as a jstest')
123
124         # Verify we got multiple warnings
125         warnings = output.getvalue().splitlines()
126         self.assertEquals(len(warnings), 2, 'all warnings were not displayed')
127         # Verify the both warnings mention the issue
128         self.assertTrue('multiple matches', 'no warning about multiple matches')
129         self.assertTrue('mismatch', 'no warning about mismatches')
130
131     def test_analyzeTestReftestWithRefSupportFiles(self):
132         """ Tests analyze_test() using a reftest that has refers to a reference file outside of the tests directory and the reference file has paths to other support files """
133
134         test_html = """<html>
135 <head>
136 <link rel="match" href="../reference/green-box-ref.xht" />
137 </head>
138 """
139         ref_html = """<head>
140 <link href="support/css/ref-stylesheet.css" rel="stylesheet" type="text/css">
141 <style type="text/css">
142     background-image: url("../../support/some-image.png")
143 </style>
144 </head>
145 <body>
146 <div><img src="../support/black96x96.png" alt="Image download support must be enabled" /></div>
147 </body>
148 </html>
149 """
150         # Analyze the test
151         test_path = '/some/madeup/path/'
152         parser = TestParser(options, test_path + 'somefile.html')
153         test_info = parser.analyze_test(test_contents=test_html, ref_contents=ref_html)
154
155         # Verify the correct test info was found
156         self.assertNotEqual(test_info, None, 'did not find a test')
157         self.assertTrue('test' in test_info.keys(), 'did not find a test file')
158         self.assertTrue('reference' in test_info.keys(), 'did not find a reference file')
159         self.assertTrue(test_info['reference'].startswith(test_path), 'reference path is not correct')
160         self.assertTrue('refsupport' in test_info.keys(), 'there should be refsupport files for this test')
161         self.assertEquals(len(test_info['refsupport']), 3, 'there should be 3 support files in this reference')
162         self.assertFalse('jstest' in test_info.keys(), 'test should not have been analyzed as a jstest')
163
164     def test_analyzeJSTest(self):
165         """ Tests analyze_test() using a jstest """
166
167         test_html = """<head>
168 <link href="/resources/testharness.css" rel="stylesheet" type="text/css">
169 <script src="/resources/testharness.js"></script>
170 </head>
171 """
172         # Analyze the test
173         test_path = '/some/madeup/path/'
174         parser = TestParser(options, test_path + 'somefile.html')
175         test_info = parser.analyze_test(test_contents=test_html)
176
177         # Verify the correct test info was found
178         self.assertNotEqual(test_info, None, 'test_info is None')
179         self.assertTrue('test' in test_info.keys(), 'did not find a test file')
180         self.assertFalse('reference' in test_info.keys(), 'shold not have found a reference file')
181         self.assertFalse('refsupport' in test_info.keys(), 'there should be no refsupport files for this test')
182         self.assertTrue('jstest' in test_info.keys(), 'test should be a jstest')
183
184     def test_analyzePixelTestAllTrue(self):
185         """ Tests analyze_test() using a test that is neither a reftest or jstest with all=False """
186
187         test_html = """<html>
188 <head>
189 <title>CSS Test: DESCRIPTION OF TEST</title>
190 <link rel="author" title="NAME_OF_AUTHOR" />
191 <style type="text/css"><![CDATA[
192 CSS FOR TEST
193 ]]></style>
194 </head>
195 <body>
196 CONTENT OF TEST
197 </body>
198 </html>
199 """
200         # Set options to 'all' so this gets found
201         options['all'] = True
202
203         # Analyze the test
204         test_path = '/some/madeup/path/'
205         parser = TestParser(options, test_path + 'somefile.html')
206         test_info = parser.analyze_test(test_contents=test_html)
207
208         # Verify the correct test info was found
209         self.assertNotEqual(test_info, None, 'test_info is None')
210         self.assertTrue('test' in test_info.keys(), 'did not find a test file')
211         self.assertFalse('reference' in test_info.keys(), 'shold not have found a reference file')
212         self.assertFalse('refsupport' in test_info.keys(), 'there should be no refsupport files for this test')
213         self.assertFalse('jstest' in test_info.keys(), 'test should not be a jstest')
214
215     def test_analyzePixelTestAllFalse(self):
216         """ Tests analyze_test() using a test that is neither a reftest or jstest, with -all=False """
217
218         test_html = """<html>
219 <head>
220 <title>CSS Test: DESCRIPTION OF TEST</title>
221 <link rel="author" title="NAME_OF_AUTHOR" />
222 <style type="text/css"><![CDATA[
223 CSS FOR TEST
224 ]]></style>
225 </head>
226 <body>
227 CONTENT OF TEST
228 </body>
229 </html>
230 """
231         # Set all to false so this gets skipped
232         options['all'] = False
233
234         # Analyze the test
235         test_path = '/some/madeup/path/'
236         parser = TestParser(options, test_path + 'somefile.html')
237         test_info = parser.analyze_test(test_contents=test_html)
238
239         # Verify the correct test info was found
240         self.assertEqual(test_info, None, 'test should have been skipped')
241
242     def test_analyzeNonHTMLFile(self):
243         """ Tests analyze_test() with a file this isn't html (this one!) """
244
245         # Try to analyze the script file we're testing (how meta)
246         test_parser_py_file = os.path.join(os.path.dirname(__file__), 'test_parser.py')
247
248         # Analyze the file
249         parser = TestParser(options, test_parser_py_file)
250         test_info = parser.analyze_test()
251
252         # Verify the correct test info was found
253         self.assertEqual(test_info, None, 'no tests should have been found in this file')