| #!/usr/bin/env python3 |
| |
| # Copyright (C) 2022 Apple Inc. All rights reserved. |
| # |
| # Redistribution and use in source and binary forms, with or without |
| # modification, are permitted provided that the following conditions |
| # are met: |
| # |
| # 1. Redistributions of source code must retain the above copyright |
| # notice, this list of conditions and the following disclaimer. |
| # 2. Redistributions in binary form must reproduce the above copyright |
| # notice, this list of conditions and the following disclaimer in the |
| # documentation and/or other materials provided with the distribution. |
| # 3. Neither the name of Apple Inc. ("Apple") nor the names of |
| # its contributors may be used to endorse or promote products derived |
| # from this software without specific prior written permission. |
| # |
| # THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY |
| # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
| # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
| # DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY |
| # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
| # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
| # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
| # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
| # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| |
| import argparse |
| import json |
| import os |
| import pathlib |
| import shutil |
| import subprocess |
| import sys |
| import tempfile |
| |
| argumentParser = argparse.ArgumentParser(description="Import the WebGPU CTS.") |
| argumentParser.add_argument("--cts-checkout-dir", type=pathlib.Path, required=False, help="Path to a prebuilt CTS checkout directory") |
| arguments = argumentParser.parse_args() |
| |
| def generateTests(ctsCheckoutDir): |
| print("Generating tests...") |
| print("CTS Checkout dir: " + ctsCheckoutDir.as_posix()) |
| sourcePath = pathlib.Path(ctsCheckoutDir, "out-wpt") |
| print("Source path: " + sourcePath.as_posix()) |
| if not sourcePath.is_dir(): |
| print("Source path is not a directory") |
| sys.exit(1) |
| |
| wptDestinationPath = pathlib.Path(sys.argv[0], "..", "..", "..", "LayoutTests", "http", "tests").resolve() |
| if not wptDestinationPath.is_dir(): |
| print("Could not find WPT at " + wptDestinationPath.as_posix()) |
| sys.exit(1) |
| destinationPath = pathlib.Path(wptDestinationPath, "webgpu") |
| print("Destination path: " + destinationPath.as_posix()) |
| |
| shutil.copytree(sourcePath, destinationPath, dirs_exist_ok=True) |
| commonDestinationPath = pathlib.Path(destinationPath, "common") |
| if pathlib.Path(ctsCheckoutDir, "out", "common", "util").is_dir() and not pathlib.Path(destinationPath, "common", "util").is_dir(): |
| shutil.copytree(pathlib.Path(ctsCheckoutDir, "out", "common"), pathlib.Path(destinationPath, "common"), dirs_exist_ok=True) |
| |
| listing = "" |
| with open(pathlib.Path(sourcePath, "webgpu", "listing.js"), "r") as file: |
| listing = file.read() |
| listing += """ |
| for (let o of listing) { |
| console.log(JSON.stringify(o.file)); |
| }; |
| """ |
| listingJSONObjects = subprocess.run(["node", "--input-type=module"], input=listing, capture_output=True, text=True).stdout.split("\n") |
| for listingJSONObject in listingJSONObjects: |
| if len(listingJSONObject) == 0: |
| continue |
| listing = json.loads(listingJSONObject) |
| if len(listing) == 0: |
| continue |
| jsSubpath = listing[:] |
| jsSubpath[-1] += ".spec.js" |
| jsPath = pathlib.Path(destinationPath, "webgpu", *jsSubpath) |
| if not jsPath.is_file(): |
| continue |
| htmlSubpath = listing[:] |
| htmlSubpath[-1] += ".html" |
| htmlPath = pathlib.Path(destinationPath, "webgpu", *htmlSubpath) |
| with open(htmlPath, "w") as htmlFile: |
| htmlFile.write(""" |
| <script> |
| if (window.testRunner) |
| testRunner.waitUntilDone(); |
| window.location.href = "/webgpu/cts.https.html?q=webgpu:{}:*"; |
| </script> |
| """.format(",".join(listing))) |
| # FIXME: Import reftests |
| reftestsPath = pathlib.Path(destinationPath, "webgpu", "web_platform", "reftests") |
| if reftestsPath.is_dir(): |
| shutil.rmtree(reftestsPath) |
| |
| def checkoutAndBuildInTemporaryDirectory(continuation): |
| try: |
| subprocess.run(["npm", "--version"], capture_output=True) |
| except: |
| print("It looks like npm is not installed. Please install it from https://nodejs.org/.") |
| sys.exit(1) |
| |
| with tempfile.TemporaryDirectory() as temporaryDirectory: |
| checkoutFolder = "CTS" |
| checkoutDirectory = os.path.join(temporaryDirectory, checkoutFolder) |
| print("Checking out the CTS into " + checkoutDirectory) |
| result = subprocess.run(["git", "clone", "git@github.com:gpuweb/cts.git", checkoutFolder], cwd=temporaryDirectory) |
| if result.returncode != 0: |
| print("Could not checkout repository.") |
| sys.exit(1) |
| result = subprocess.run(["git", "rev-parse", "HEAD"], capture_output=True, text=True, cwd=checkoutDirectory) |
| if result.returncode != 0: |
| print("Could not determine git checkout commit.") |
| sys.exit(1) |
| print("Checked out git hash " + result.stdout.rstrip() + ".") |
| print("Installing CTS dependencies...") |
| result = subprocess.run(["npm", "ci"], cwd=checkoutDirectory) |
| if result.returncode != 0: |
| print("Could not install dependencies.") |
| sys.exit(1) |
| print("Building test suite...") |
| result = subprocess.run(["npm", "test"], cwd=checkoutDirectory) |
| if result.returncode != 0: |
| print("Could not build test suite.") |
| sys.exit(1) |
| continuation(pathlib.Path(checkoutDirectory)) |
| |
| if arguments.cts_checkout_dir is None: |
| print("You didn't specify --cts-checkout-dir on the command line.") |
| response = input("Would you like this script to checkout and build one in a temporary directory? [y/N] ") |
| if response.lower() == "y": |
| checkoutAndBuildInTemporaryDirectory(generateTests) |
| else: |
| sys.exit(1) |
| else: |
| generateTests(arguments.cts_checkout_dir) |
| |