Hash :
e0aee581
Author :
Date :
2025-03-22T13:07:10
[test] Respect MESON_EXE_WRAPPER in more test runners It's not working for me though. Meson doesn't seem to set WINEPATH during testing.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
#!/usr/bin/env python3
# Runs a subsetting test suite. Compares the results of subsetting via harfbuzz
# to subsetting via fonttools.
from difflib import unified_diff
import os
import re
import subprocess
import sys
import tempfile
import shutil
import io
from repack_test import RepackTest
try:
from fontTools.ttLib import TTFont
except ImportError:
print("fonttools is not present, skipping test.")
sys.exit(77)
ots_sanitize = shutil.which("ots-sanitize")
EXE_WRAPPER = os.environ.get("MESON_EXE_WRAPPER")
def subset_cmd(command):
global hb_subset, process
print(hb_subset + " " + " ".join(command))
process.stdin.write((";".join(command) + "\n").encode("utf-8"))
process.stdin.flush()
return process.stdout.readline().decode("utf-8").strip()
def cmd(command):
p = subprocess.Popen(
command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True
)
(stdoutdata, stderrdata) = p.communicate()
print(stderrdata, end="", file=sys.stderr)
return stdoutdata, p.returncode
def fail_test(test, cli_args, message):
print("ERROR: %s" % message)
print("Test State:")
print(" test.font_name %s" % test.font_name)
print(" test.test_path %s" % os.path.abspath(test.test_path))
return 1
def run_test(test, should_check_ots):
out_file = os.path.join(tempfile.mkdtemp(), test.font_name + "-subset.ttf")
cli_args = [
"--font-file=" + test.font_path(),
"--output-file=" + out_file,
"--unicodes=%s" % test.codepoints_string(),
"--drop-tables-=GPOS,GSUB,GDEF",
]
print(" ".join(cli_args))
ret = subset_cmd(cli_args)
if ret != "success":
return fail_test(test, cli_args, "%s failed" % " ".join(cli_args))
try:
with TTFont(out_file) as font:
pass
except Exception as e:
print(e)
return fail_test(test, cli_args, "ttx failed to parse the result")
if should_check_ots:
print("Checking output with ots-sanitize.")
if not check_ots(out_file):
return fail_test(test, cli_args, "ots for subsetted file fails.")
return 0
def has_ots():
if not ots_sanitize:
print("OTS is not present, skipping all ots checks.")
return False
return True
def check_ots(path):
ots_report, returncode = cmd([ots_sanitize, path])
if returncode:
print("OTS Failure: %s" % ots_report)
return False
return True
args = sys.argv[1:]
if not args or sys.argv[1].find("hb-subset") == -1 or not os.path.exists(sys.argv[1]):
sys.exit("First argument does not seem to point to usable hb-subset.")
hb_subset, args = args[0], args[1:]
if len(args) != 1:
sys.exit("No tests supplied.")
has_ots = has_ots()
batch_cmd = [hb_subset, "--batch"]
if EXE_WRAPPER:
batch_cmd = [EXE_WRAPPER] + batch_cmd
process = subprocess.Popen(
batch_cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=sys.stdout
)
fails = 0
path = args[0]
if not path.endswith(".tests"):
sys.exit("Not a valid test case path.")
with open(path, mode="r", encoding="utf-8") as f:
# TODO(garretrieger): re-enable OTS checking.
fails += run_test(RepackTest(path, f.read()), False)
if fails != 0:
sys.exit("%d test(s) failed." % fails)
else:
print("All tests passed.")