| #!/usr/bin/env vpython3 |
| # Copyright 2021 The Chromium Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import argparse |
| import ast |
| import errno |
| import tempfile |
| import os |
| import shutil |
| import subprocess |
| import sys |
| import logging |
| |
| |
| third_party_dir = os.path.dirname( |
| os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) |
| |
| def check_or_write_file(filepath, content, check): |
| if check: |
| with open(filepath, 'rb') as dst: |
| if dst.read() != content: |
| raise RuntimeError( |
| '%s is out of date. Please re-run //third_party/webgpu-cts/scripts/run_regenerate_internal_cts_html.py\n' |
| % filepath) |
| else: |
| with open(filepath, 'wb') as dst: |
| dst.write(content) |
| |
| def generate_reftest_html(check): |
| # Update this to add/remove subdirectories to check. |
| sub_dirs = [os.path.join('web_platform', 'reftests')] |
| |
| for sub_dir in sub_dirs: |
| html_search_dir = os.path.join(third_party_dir, 'webgpu-cts', 'src', |
| 'src', 'webgpu', sub_dir) |
| wpt_internal_dir = os.path.join(third_party_dir, 'blink', 'web_tests', |
| 'wpt_internal', 'webgpu', sub_dir) |
| |
| if not check: |
| shutil.rmtree(wpt_internal_dir) |
| logging.info('WebGPU CTS: Generating HTML tests from %s...' % html_search_dir) |
| for root, dirnames, filenames in os.walk(html_search_dir): |
| for filename in filenames: |
| if filename.endswith('.html'): |
| filepath = os.path.join(root, filename) |
| relative_dir = os.path.relpath(os.path.dirname(filepath), |
| html_search_dir) |
| dst_dir = os.path.join(wpt_internal_dir, relative_dir) |
| gen_base_dir = os.path.join( |
| '/gen/third_party/webgpu-cts/src/webgpu', sub_dir) |
| if relative_dir != '.': |
| # If we don't do this then tests directly under webplatform/reftests will have ./ in their path |
| gen_base_dir = os.path.join(gen_base_dir, relative_dir) |
| gen_base_dir = gen_base_dir.replace('\\', '/') + '/' |
| |
| try: |
| os.makedirs(dst_dir) |
| except OSError as e: |
| if e.errno == errno.EEXIST and os.path.isdir(dst_dir): |
| pass |
| else: |
| raise |
| |
| with open(filepath, 'rb') as src: |
| src_content = src.read() |
| |
| # Find the starting html tag |
| i = src_content.find(b'<html') |
| assert i != -1 |
| |
| # Then find the end of the starting html tag |
| i = src_content.find(b'>', i) |
| assert i != -1 |
| |
| # Bump the index just past the starting <html> tag |
| i = i + 1 |
| |
| base_tag = b'\n <base href="%s" />' % gen_base_dir.encode( |
| ) |
| dst_content = src_content[:i] + base_tag + src_content[i:] |
| |
| check_or_write_file(os.path.join(dst_dir, filename), |
| dst_content, |
| check=check) |
| |
| |
| if __name__ == '__main__': |
| parser = argparse.ArgumentParser() |
| parser.add_argument('--check', |
| action='store_true', |
| help='Check that the output file is up to date.') |
| parser.add_argument('--stamp', help='Stamp file to write after success.') |
| args = parser.parse_args() |
| |
| generate_reftest_html(check=args.check) |
| |
| if args.stamp: |
| with open(args.stamp, 'w') as f: |
| f.write('') |