blob: 2ba4b9c2f627ad7ff04926f7ba377af8455af73d [file] [log] [blame]
#!/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)