Clean up ChunkedUpdateDrawingAreaProxy
[WebKit-https.git] / WebKitTools / Scripts / webkitpy / layout_tests / update_webgl_conformance_tests.py
1 #!/usr/bin/env python
2
3 # Copyright (C) 2010 Google Inc. 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 # 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 COMPUTER, INC. ``AS IS'' AND ANY
15 # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17 # PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
18 # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19 # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20 # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21 # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22 # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25
26 from __future__ import with_statement
27
28 import glob
29 import logging
30 import optparse
31 import os
32 import re
33 import sys
34 import webkitpy.common.checkout.scm as scm
35
36 _log = logging.getLogger("webkitpy.layout_tests."
37                          "update-webgl-conformance-tests")
38
39
40 def remove_first_line_comment(text):
41     return re.compile(r'^<!--.*?-->\s*', re.DOTALL).sub('', text)
42
43
44 def translate_includes(text):
45     # Mapping of single filename to relative path under WebKit root.
46     # Assumption: these filenames are globally unique.
47     include_mapping = {
48         "js-test-style.css": "../../js/resources",
49         "js-test-pre.js": "../../js/resources",
50         "js-test-post.js": "../../js/resources",
51         "desktop-gl-constants.js": "resources",
52     }
53
54     for filename, path in include_mapping.items():
55         search = r'(?:[^"\'= ]*/)?' + re.escape(filename)
56         replace = os.path.join(path, filename)
57         text = re.sub(search, replace, text)
58
59     return text
60
61
62 def translate_khronos_test(text):
63     """
64     This method translates the contents of a Khronos test to a WebKit test.
65     """
66
67     translateFuncs = [
68         remove_first_line_comment,
69         translate_includes,
70     ]
71
72     for f in translateFuncs:
73         text = f(text)
74
75     return text
76
77
78 def update_file(in_filename, out_dir):
79     # check in_filename exists
80     # check out_dir exists
81     out_filename = os.path.join(out_dir, os.path.basename(in_filename))
82
83     _log.debug("Processing " + in_filename)
84     with open(in_filename, 'r') as in_file:
85         with open(out_filename, 'w') as out_file:
86             out_file.write(translate_khronos_test(in_file.read()))
87
88
89 def update_directory(in_dir, out_dir):
90     for filename in glob.glob(os.path.join(in_dir, '*.html')):
91         update_file(os.path.join(in_dir, filename), out_dir)
92
93
94 def default_out_dir():
95     current_scm = scm.detect_scm_system(os.path.dirname(sys.argv[0]))
96     if not current_scm:
97         return os.getcwd()
98     root_dir = current_scm.checkout_root
99     if not root_dir:
100         return os.getcwd()
101     out_dir = os.path.join(root_dir, "LayoutTests/fast/canvas/webgl")
102     if os.path.isdir(out_dir):
103         return out_dir
104     return os.getcwd()
105
106
107 def configure_logging(options):
108     """Configures the logging system."""
109     log_fmt = '%(levelname)s: %(message)s'
110     log_datefmt = '%y%m%d %H:%M:%S'
111     log_level = logging.INFO
112     if options.verbose:
113         log_fmt = ('%(asctime)s %(filename)s:%(lineno)-4d %(levelname)s '
114                    '%(message)s')
115         log_level = logging.DEBUG
116     logging.basicConfig(level=log_level, format=log_fmt,
117                         datefmt=log_datefmt)
118
119
120 def option_parser():
121     usage = "usage: %prog [options] (input file or directory)"
122     parser = optparse.OptionParser(usage=usage)
123     parser.add_option('-v', '--verbose',
124                              action='store_true',
125                              default=False,
126                              help='include debug-level logging')
127     parser.add_option('-o', '--output',
128                              action='store',
129                              type='string',
130                              default=default_out_dir(),
131                              metavar='DIR',
132                              help='specify an output directory to place files '
133                                   'in [default: %default]')
134     return parser
135
136
137 def main():
138     parser = option_parser()
139     (options, args) = parser.parse_args()
140     configure_logging(options)
141
142     if len(args) == 0:
143         _log.error("Must specify an input directory or filename.")
144         parser.print_help()
145         return 1
146
147     in_name = args[0]
148     if os.path.isfile(in_name):
149         update_file(in_name, options.output)
150     elif os.path.isdir(in_name):
151         update_directory(in_name, options.output)
152     else:
153         _log.error("'%s' is not a directory or a file.", in_name)
154         return 2
155
156     return 0
157
158
159 if __name__ == "__main__":
160     sys.exit(main())