Chromium Code Reviews| 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 |