Hash :
4d2a362f
Author :
Date :
2025-03-25T15:35:00
[test/subset] Remove tempdir Was creating a tempdir in /tmp for every single test item, and not removing it. Create one per test file, and remove if test successful.
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 129 130 131
#!/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(out_dir, 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.")
out_dir = tempfile.mkdtemp()
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; output left in %s" % (fails, out_dir))
else:
print("All tests passed.")
shutil.rmtree(out_dir)