3b697267c68a3d52b12a9361caa417aa43cbff89
[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
30 import os
31 import unittest2 as unittest
32
33 from webkitpy.common.system.outputcapture import OutputCapture
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_analyze_test_reftest_one_match(self):
43         test_html = """<head>
44 <link rel="match" href="green-box-ref.xht" />
45 </head>
46 """
47         test_path = '/some/madeup/path/'
48         parser = TestParser(options, test_path + 'somefile.html')
49         test_info = parser.analyze_test(test_contents=test_html)
50
51         self.assertNotEqual(test_info, None, 'did not find a test')
52         self.assertTrue('test' in test_info.keys(), 'did not find a test file')
53         self.assertTrue('reference' in test_info.keys(), 'did not find a reference file')
54         self.assertTrue(test_info['reference'].startswith(test_path), 'reference path is not correct')
55         self.assertFalse('refsupport' in test_info.keys(), 'there should be no refsupport files for this test')
56         self.assertFalse('jstest' in test_info.keys(), 'test should not have been analyzed as a jstest')
57
58     def test_analyze_test_reftest_multiple_matches(self):
59         test_html = """<head>
60 <link rel="match" href="green-box-ref.xht" />
61 <link rel="match" href="blue-box-ref.xht" />
62 <link rel="match" href="orange-box-ref.xht" />
63 </head>
64 """
65         oc = OutputCapture()
66         oc.capture_output()
67         try:
68             test_path = '/some/madeup/path/'
69             parser = TestParser(options, test_path + 'somefile.html')
70             test_info = parser.analyze_test(test_contents=test_html)
71         finally:
72             output, _, _ = oc.restore_output()
73
74         self.assertNotEqual(test_info, None, 'did not find a test')
75         self.assertTrue('test' in test_info.keys(), 'did not find a test file')
76         self.assertTrue('reference' in test_info.keys(), 'did not find a reference file')
77         self.assertTrue(test_info['reference'].startswith(test_path), 'reference path is not correct')
78         self.assertFalse('refsupport' in test_info.keys(), 'there should be no refsupport files for this test')
79         self.assertFalse('jstest' in test_info.keys(), 'test should not have been analyzed as a jstest')
80
81         self.assertTrue(output.startswith('Warning'), 'no warning about multiple matches')
82
83     def test_analyze_test_reftest_match_and_mismatch(self):
84         test_html = """<head>
85 <link rel="match" href="green-box-ref.xht" />
86 <link rel="match" href="blue-box-ref.xht" />
87 <link rel="mismatch" href="orange-box-notref.xht" />
88 </head>
89 """
90         oc = OutputCapture()
91         oc.capture_output()
92
93         try:
94             test_path = '/some/madeup/path/'
95             parser = TestParser(options, test_path + 'somefile.html')
96             test_info = parser.analyze_test(test_contents=test_html)
97         finally:
98             output, _, _ = oc.restore_output()
99
100         self.assertNotEqual(test_info, None, 'did not find a test')
101         self.assertTrue('test' in test_info.keys(), 'did not find a test file')
102         self.assertTrue('reference' in test_info.keys(), 'did not find a reference file')
103         self.assertTrue(test_info['reference'].startswith(test_path), 'reference path is not correct')
104         self.assertFalse('refsupport' in test_info.keys(), 'there should be no refsupport files for this test')
105         self.assertFalse('jstest' in test_info.keys(), 'test should not have been analyzed as a jstest')
106
107         warnings = output.splitlines()
108         self.assertEquals(warnings, ["Warning: Webkit does not support multiple references. Importing the first ref defined in somefile.html"])
109
110     def test_analyze_test_reftest_with_ref_support_Files(self):
111         """ 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 """
112
113         test_html = """<html>
114 <head>
115 <link rel="match" href="../reference/green-box-ref.xht" />
116 </head>
117 """
118         ref_html = """<head>
119 <link href="support/css/ref-stylesheet.css" rel="stylesheet" type="text/css">
120 <style type="text/css">
121     background-image: url("../../support/some-image.png")
122 </style>
123 </head>
124 <body>
125 <div><img src="../support/black96x96.png" alt="Image download support must be enabled" /></div>
126 </body>
127 </html>
128 """
129         test_path = '/some/madeup/path/'
130         parser = TestParser(options, test_path + 'somefile.html')
131         test_info = parser.analyze_test(test_contents=test_html, ref_contents=ref_html)
132
133         self.assertNotEqual(test_info, None, 'did not find a test')
134         self.assertTrue('test' in test_info.keys(), 'did not find a test file')
135         self.assertTrue('reference' in test_info.keys(), 'did not find a reference file')
136         self.assertTrue(test_info['reference'].startswith(test_path), 'reference path is not correct')
137         self.assertTrue('refsupport' in test_info.keys(), 'there should be refsupport files for this test')
138         self.assertEquals(len(test_info['refsupport']), 3, 'there should be 3 support files in this reference')
139         self.assertFalse('jstest' in test_info.keys(), 'test should not have been analyzed as a jstest')
140
141     def test_analyze_jstest(self):
142         """ Tests analyze_test() using a jstest """
143
144         test_html = """<head>
145 <link href="/resources/testharness.css" rel="stylesheet" type="text/css">
146 <script src="/resources/testharness.js"></script>
147 </head>
148 """
149         test_path = '/some/madeup/path/'
150         parser = TestParser(options, test_path + 'somefile.html')
151         test_info = parser.analyze_test(test_contents=test_html)
152
153         self.assertNotEqual(test_info, None, 'test_info is None')
154         self.assertTrue('test' in test_info.keys(), 'did not find a test file')
155         self.assertFalse('reference' in test_info.keys(), 'shold not have found a reference file')
156         self.assertFalse('refsupport' in test_info.keys(), 'there should be no refsupport files for this test')
157         self.assertTrue('jstest' in test_info.keys(), 'test should be a jstest')
158
159     def test_analyze_pixel_test_all_true(self):
160         """ Tests analyze_test() using a test that is neither a reftest or jstest with all=False """
161
162         test_html = """<html>
163 <head>
164 <title>CSS Test: DESCRIPTION OF TEST</title>
165 <link rel="author" title="NAME_OF_AUTHOR" />
166 <style type="text/css"><![CDATA[
167 CSS FOR TEST
168 ]]></style>
169 </head>
170 <body>
171 CONTENT OF TEST
172 </body>
173 </html>
174 """
175         # Set options to 'all' so this gets found
176         options['all'] = True
177
178         test_path = '/some/madeup/path/'
179         parser = TestParser(options, test_path + 'somefile.html')
180         test_info = parser.analyze_test(test_contents=test_html)
181
182         self.assertNotEqual(test_info, None, 'test_info is None')
183         self.assertTrue('test' in test_info.keys(), 'did not find a test file')
184         self.assertFalse('reference' in test_info.keys(), 'shold not have found a reference file')
185         self.assertFalse('refsupport' in test_info.keys(), 'there should be no refsupport files for this test')
186         self.assertFalse('jstest' in test_info.keys(), 'test should not be a jstest')
187
188     def test_analyze_pixel_test_all_false(self):
189         """ Tests analyze_test() using a test that is neither a reftest or jstest, with -all=False """
190
191         test_html = """<html>
192 <head>
193 <title>CSS Test: DESCRIPTION OF TEST</title>
194 <link rel="author" title="NAME_OF_AUTHOR" />
195 <style type="text/css"><![CDATA[
196 CSS FOR TEST
197 ]]></style>
198 </head>
199 <body>
200 CONTENT OF TEST
201 </body>
202 </html>
203 """
204         # Set all to false so this gets skipped
205         options['all'] = False
206
207         test_path = '/some/madeup/path/'
208         parser = TestParser(options, test_path + 'somefile.html')
209         test_info = parser.analyze_test(test_contents=test_html)
210
211         self.assertEqual(test_info, None, 'test should have been skipped')
212
213     def test_analyze_non_html_file(self):
214         """ Tests analyze_test() with a file that has no html"""
215         # FIXME: use a mock filesystem
216         parser = TestParser(options, os.path.join(os.path.dirname(__file__), 'test_parser.py'))
217         test_info = parser.analyze_test()
218         self.assertEqual(test_info, None, 'no tests should have been found in this file')