#!/usr/bin/env python
import os
import subprocess
import sys
import tempfile
import shutil
import bisect
import argparse
KHRONOS_REPO_URL = "https://github.com/KhronosGroup/WebGL.git"
PATCHES = [
("js-test-pre.patch", "resources/js-test-pre.js"),
("unit.patch", "conformance/more/unit.js")
]
def usage():
print("Usage: {} version destination [existing_webgl_repo]".format(sys.argv[0]))
sys.exit(1)
def get_tests(base_dir, file_name, tests_list):
list_file = os.path.join(base_dir, file_name)
if not os.path.isfile(list_file):
print("Test list ({}) not found".format(list_file))
sys.exit(1)
print("Processing: {}".format(list_file))
with open(list_file, "r") as f:
for line in f:
line = line.strip()
if not line or line.startswith("#") or line.startswith("//"):
continue # It's an empty line or a comment
# Lines often are in the form:
# --min-version x.x.x abc.html
#
# We only care about the last part
line = line.split(" ")[-1]
if line.endswith(".html"):
tests_list.append(os.path.join(base_dir, line))
if line.endswith(".txt"):
(next_dir, file_name) = os.path.split(os.path.join(base_dir, line))
get_tests(next_dir, file_name, tests_list)
# Insert the test harness scripts before any other script
def process_test(test):
(new, new_path) = tempfile.mkstemp()
script_tag_found = False
with open(test, "r") as test_file:
for line in test_file:
if not script_tag_found and "\n".format(indent))
os.write(new, "{}\n".format(indent))
os.write(new, line)
os.close(new)
shutil.move(new_path, test)
def main():
parser = argparse.ArgumentParser()
parser.add_argument("version", help="WebGL test suite version (e.g.: 1.0.3)")
parser.add_argument("destination", help="Test suite destination")
parser.add_argument("-e", "--existing-repo", help="Path to an existing clone of the khronos WebGL repository")
args = parser.parse_args()
version = args.version
destination = args.destination
print("Trying to import WebGL conformance test suite {} into {}".format(version, destination))
if args.existing_repo:
directory = args.existing_repo
print("Using existing WebGL repository: {}".format(directory))
else:
directory = tempfile.mkdtemp()
print("Cloning WebGL repository into temporary directory {}".format(directory))
subprocess.check_call(["git", "clone", KHRONOS_REPO_URL, directory, "--depth", "1"])
suite_dir = os.path.join(directory, "conformance-suites", version)
print("Test suite directory: {}".format(suite_dir))
if not os.path.isdir(suite_dir):
print("Test suite directory ({}) not found, aborting...".format(suite_dir))
sys.exit(1)
# We recursively copy all the test suite to `destination`
shutil.copytree(suite_dir, destination)
# Get all the tests, remove any html file which is not in the list, and
# later process them.
tests = []
get_tests(destination, "00_test_list.txt", tests)
test_count = len(tests)
print("Found {} tests.".format(test_count))
print("Removing non-test html files")
# To use binary search, which speeds things up a little
# instead of f in tests
tests.sort()
# Remove html files that are not tests
for dirpath, dirnames, filenames in os.walk(destination):
if '/resources' in dirpath:
continue # Most of the files under resources directories are used
for f in filenames:
if not f.endswith('.html'):
continue
f = os.path.join(dirpath, f)
pos = bisect.bisect_left(tests, f)
if pos == test_count or tests[pos] != f:
print("Removing: {}".format(f))
os.remove(f)
# Insert our harness into the tests
for test in tests:
process_test(test)
# Try to apply the patches to the required files
this_dir = os.path.abspath(os.path.dirname(sys.argv[0]))
for patch, file_name in PATCHES:
try:
patch = os.path.join(this_dir, patch)
subprocess.check_call(["patch", "-d", destination, file_name, patch])
except subprocess.CalledProcessError:
print("Automatic patch failed for {}".format(file_name))
print("Please review the WPT integration and update {} accordingly".format(os.path.basename(patch)))
if __name__ == '__main__':
main()