OLD | NEW |
---|---|
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright (c) 2011 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2011 The Chromium Authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
6 """Auto-generates the WebGL conformance test list header file. | 6 """Auto-generates the WebGL conformance test list header file. |
7 | 7 |
8 Parses the WebGL conformance test *.txt file, which contains a list of URLs | 8 Parses the WebGL conformance test *.txt file, which contains a list of URLs |
9 for individual conformance tests (each on a new line). It recursively parses | 9 for individual conformance tests (each on a new line). It recursively parses |
10 *.txt files. For each test URL, the matching gtest call is created and | 10 *.txt files. For each test URL, the matching gtest call is created and |
11 sent to the C++ header file. | 11 sent to the C++ header file. |
12 """ | 12 """ |
13 | 13 |
14 __author__ = 'jrt@chromium.org (Joe Tessler)' | |
15 | |
16 import getopt | 14 import getopt |
17 import os | 15 import os |
18 import re | 16 import re |
19 import sys | 17 import sys |
20 | 18 |
21 COPYRIGHT = """\ | 19 COPYRIGHT = """\ |
22 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 20 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
23 // Use of this source code is governed by a BSD-style license that can be | 21 // Use of this source code is governed by a BSD-style license that can be |
24 // found in the LICENSE file. | 22 // found in the LICENSE file. |
25 | 23 |
26 """ | 24 """ |
27 WARNING = """\ | 25 WARNING = """\ |
28 // This file is auto-generated from a script. DO NOT EDIT! | 26 // This file is auto-generated from a script. DO NOT EDIT! |
29 // It is included by webgl_conformance_tests.cc | 27 // It is included by webgl_conformance_tests.cc |
30 | 28 |
31 """ | 29 """ |
32 HEADER_GUARD = """\ | 30 HEADER_GUARD = """\ |
33 #ifndef CHROME_TEST_GPU_WEBGL_CONFORMANCE_TEST_LIST_AUTOGEN_H_ | 31 #ifndef CHROME_TEST_GPU_WEBGL_CONFORMANCE_TEST_LIST_AUTOGEN_H_ |
34 #define CHROME_TEST_GPU_WEBGL_CONFORMANCE_TEST_LIST_AUTOGEN_H_ | 32 #define CHROME_TEST_GPU_WEBGL_CONFORMANCE_TEST_LIST_AUTOGEN_H_ |
35 | 33 |
36 """ | 34 """ |
37 HEADER_GUARD_END = """ | 35 HEADER_GUARD_END = """ |
38 #endif // CHROME_TEST_GPU_WEBGL_CONFORMANCE_TEST_LIST_AUTOGEN_H_ | 36 #endif // CHROME_TEST_GPU_WEBGL_CONFORMANCE_TEST_LIST_AUTOGEN_H_ |
39 """ | 37 """ |
40 | 38 |
41 # Assume this script is run from the src/chrome/ directory. | 39 # Assume this script is run from the src/chrome/ directory. |
42 INPUT_DIR = "../third_party/webgl_conformance" | 40 INPUT_DIR = "../third_party/webgl_conformance" |
43 INPUT_FILE = "00_test_list.txt" | 41 INPUT_FILE = "00_test_list.txt" |
42 EXPECTATION_FILE = "test/gpu/webgl_conformance_test_expectations.txt" | |
43 EXPECTATION_REGEXP = re.compile( | |
44 r'^(?P<BUG>\d+)' | |
Zhenyao Mo
2011/08/04 17:56:11
<BUG> should allow more than numbers
jrt
2011/08/04 18:57:51
Done.
| |
45 '(?P<OS>(\s*(WIN|MAC|LINUX)\s*)+):' | |
46 '(?P<TEST>[^=]+)=' | |
47 '(?P<OUTCOME>(\s*(FAIL|TIMEOUT)\s*)+)') | |
Zhenyao Mo
2011/08/04 17:56:11
also PASS
jrt
2011/08/04 18:57:51
Done.
| |
48 | |
49 def is_matching_os(expected_os_list): | |
50 """Returns true if the current OS is in the given list. | |
51 | |
52 Given a list containing 'WIN', 'MAC' or 'LINUX', return true if the current | |
53 OS, represented as 'win32', 'darwin' or 'linux*', respectively, exists in the | |
54 list. | |
55 """ | |
56 if sys.platform.startswith('linux') and 'LINUX' in expected_os_list: | |
57 return True; | |
58 if sys.platform == 'darwin' and 'MAC' in expected_os_list: | |
59 return True; | |
60 if sys.platform == 'win32' and 'WIN' in expected_os_list: | |
61 return True; | |
62 return False; | |
44 | 63 |
45 def main(argv): | 64 def main(argv): |
46 """Main function for the WebGL conformance test list generator. | 65 """Main function for the WebGL conformance test list generator. |
47 | 66 |
48 If "-i" or "--input" is specified, the parsed *.txt files are printed to | 67 If "-i" or "--input" is specified, the parsed *.txt files are printed to |
49 standard output and no header file is generated. In this case, "output" | 68 standard output and no header file is generated. In this case, "output" |
50 is os.devnull, meaning all output.write() calls are NOPs. | 69 is os.devnull, meaning all output.write() calls are NOPs. |
51 """ | 70 """ |
52 try: | 71 try: |
53 opts, args = getopt.getopt(argv, "i", "input") | 72 opts, args = getopt.getopt(argv, "i", "input") |
(...skipping 11 matching lines...) Expand all Loading... | |
65 elif len(args) == 1: | 84 elif len(args) == 1: |
66 output_file = args[0] | 85 output_file = args[0] |
67 else: | 86 else: |
68 print >> sys.stderr, "ERROR: Specify a single output header file." | 87 print >> sys.stderr, "ERROR: Specify a single output header file." |
69 return 1 | 88 return 1 |
70 | 89 |
71 if not os.path.exists(os.path.join(INPUT_DIR, INPUT_FILE)): | 90 if not os.path.exists(os.path.join(INPUT_DIR, INPUT_FILE)): |
72 print >> sys.stderr, "ERROR: WebGL conformance tests do not exist." | 91 print >> sys.stderr, "ERROR: WebGL conformance tests do not exist." |
73 return 1 | 92 return 1 |
74 | 93 |
94 test_prefix = {} | |
95 if os.path.exists(EXPECTATION_FILE): | |
96 test_expectations = open(EXPECTATION_FILE) | |
97 for line in test_expectations: | |
98 line_match = EXPECTATION_REGEXP.match(line) | |
99 if line_match: | |
100 match_dict = line_match.groupdict() | |
101 os_list = match_dict['OS'].strip().split() | |
102 if not is_matching_os(os_list): | |
103 continue | |
104 test = match_dict['TEST'].strip() | |
105 outcome_list = match_dict['OUTCOME'].strip().split() | |
106 if 'TIMEOUT' in outcome_list: | |
107 test_prefix[test] = "DISABLED_" | |
108 elif 'FAIL' in outcome_list: | |
109 test_prefix[test] = "FAILS_" | |
Zhenyao Mo
2011/08/04 17:56:11
If both FAIL and PASS exist, map to FLAKY
jrt
2011/08/04 18:57:51
Done.
| |
110 test_expectations.close() | |
111 | |
75 output = open(output_file, "w") | 112 output = open(output_file, "w") |
76 output.write(COPYRIGHT) | 113 output.write(COPYRIGHT) |
77 output.write(WARNING) | 114 output.write(WARNING) |
78 output.write(HEADER_GUARD) | 115 output.write(HEADER_GUARD) |
79 | 116 |
80 unparsed_files = [INPUT_FILE] | 117 unparsed_files = [INPUT_FILE] |
81 while unparsed_files: | 118 while unparsed_files: |
82 filename = unparsed_files.pop(0) | 119 filename = unparsed_files.pop(0) |
83 try: | 120 try: |
84 input = open(os.path.join(INPUT_DIR, filename)) | 121 input = open(os.path.join(INPUT_DIR, filename)) |
(...skipping 14 matching lines...) Expand all Loading... | |
99 unparsed_files.append(url) | 136 unparsed_files.append(url) |
100 | 137 |
101 # Convert the filename to a valid test name and output the gtest code. | 138 # Convert the filename to a valid test name and output the gtest code. |
102 elif not print_input_files and url: | 139 elif not print_input_files and url: |
103 name = os.path.splitext(url)[0] | 140 name = os.path.splitext(url)[0] |
104 name = re.sub("\W+", "_", name) | 141 name = re.sub("\W+", "_", name) |
105 # Cannot use os.path.join() because Windows with use "\\" but this path | 142 # Cannot use os.path.join() because Windows with use "\\" but this path |
106 # is sent through javascript. | 143 # is sent through javascript. |
107 url = "%s/%s" % (os.path.dirname(filename), url) | 144 url = "%s/%s" % (os.path.dirname(filename), url) |
108 if os.path.exists(os.path.join(INPUT_DIR, url)): | 145 if os.path.exists(os.path.join(INPUT_DIR, url)): |
146 # Append "DISABLED_" or "FAILS_" if needed. | |
147 if name in test_prefix: | |
148 name = test_prefix[name] + name | |
109 output.write('CONFORMANCE_TEST(%s,\n "%s");\n' % (name, url)) | 149 output.write('CONFORMANCE_TEST(%s,\n "%s");\n' % (name, url)) |
110 else: | 150 else: |
111 print >> sys.stderr, "WARNING: %s does not exist (skipped)." % url | 151 print >> sys.stderr, "WARNING: %s does not exist (skipped)." % url |
112 input.close() | 152 input.close() |
113 | 153 |
114 output.write(HEADER_GUARD_END) | 154 output.write(HEADER_GUARD_END) |
115 output.close() | 155 output.close() |
116 return 0 | 156 return 0 |
117 | 157 |
118 if __name__ == "__main__": | 158 if __name__ == "__main__": |
119 sys.exit(main(sys.argv[1:])) | 159 sys.exit(main(sys.argv[1:])) |
OLD | NEW |