93b03119da
Suppress progress messages of ttx. This avoids comparing this output to the reference file which lets the test fail.
137 lines
3.8 KiB
Python
Executable File
137 lines
3.8 KiB
Python
Executable File
#!/usr/bin/env python
|
|
|
|
# Runs a subsetting test suite. Compares the results of subsetting via harfbuz
|
|
# to subsetting via fonttools.
|
|
|
|
from __future__ import print_function, division, absolute_import
|
|
|
|
import io
|
|
from difflib import unified_diff
|
|
import os
|
|
import re
|
|
import subprocess
|
|
import sys
|
|
import tempfile
|
|
|
|
from subset_test_suite import SubsetTestSuite
|
|
|
|
|
|
def cmd(command):
|
|
p = subprocess.Popen (
|
|
command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
|
(stdoutdata, stderrdata) = p.communicate()
|
|
print (stderrdata, end="") # file=sys.stderr
|
|
return stdoutdata, p.returncode
|
|
|
|
def read_binary(file_path):
|
|
with open(file_path, 'rb') as f:
|
|
return f.read()
|
|
|
|
def fail_test(test, cli_args, message):
|
|
print ('ERROR: %s' % message)
|
|
print ('Test State:')
|
|
print (' test.font_path %s' % os.path.abspath(test.font_path))
|
|
print (' test.profile_path %s' % os.path.abspath(test.profile_path))
|
|
print (' test.unicodes %s' % test.unicodes())
|
|
expected_file = os.path.join(test_suite.get_output_directory(),
|
|
test.get_font_name())
|
|
print (' expected_file %s' % os.path.abspath(expected_file))
|
|
return 1
|
|
|
|
def run_test(test, should_check_ots):
|
|
out_file = os.path.join(tempfile.mkdtemp(), test.get_font_name() + '-subset.ttf')
|
|
cli_args = [hb_subset,
|
|
"--font-file=" + test.font_path,
|
|
"--output-file=" + out_file,
|
|
"--unicodes=%s" % test.unicodes()]
|
|
cli_args.extend (test.get_profile_flags())
|
|
print (' '.join(cli_args))
|
|
_, return_code = cmd(cli_args)
|
|
|
|
if return_code:
|
|
return fail_test(test, cli_args, "%s returned %d" % (' '.join(cli_args), return_code))
|
|
|
|
expected_ttx, return_code = run_ttx(os.path.join(test_suite.get_output_directory(),
|
|
test.get_font_name()))
|
|
if return_code:
|
|
return fail_test(test, cli_args, "ttx (expected) returned %d" % (return_code))
|
|
|
|
actual_ttx, return_code = run_ttx(out_file)
|
|
if return_code:
|
|
return fail_test(test, cli_args, "ttx (actual) returned %d" % (return_code))
|
|
|
|
print ("stripping checksums.")
|
|
expected_ttx = strip_check_sum (expected_ttx)
|
|
actual_ttx = strip_check_sum (actual_ttx)
|
|
|
|
if not actual_ttx == expected_ttx:
|
|
for line in unified_diff(expected_ttx.splitlines(1), actual_ttx.splitlines(1)):
|
|
sys.stdout.write(line)
|
|
sys.stdout.flush()
|
|
return fail_test(test, cli_args, 'ttx for expected and actual does not match.')
|
|
|
|
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 run_ttx(file):
|
|
print ("ttx %s" % file)
|
|
cli_args = ["ttx",
|
|
"-q",
|
|
"-o-",
|
|
file]
|
|
return cmd(cli_args)
|
|
|
|
def strip_check_sum (ttx_string):
|
|
return re.sub ('checkSumAdjustment value=["]0x([0-9a-fA-F])+["]',
|
|
'checkSumAdjustment value="0x00000000"',
|
|
ttx_string.decode (), count=1)
|
|
|
|
def has_ots ():
|
|
_, returncode = cmd(["which", "ots-sanitize"])
|
|
if returncode:
|
|
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]):
|
|
print ("First argument does not seem to point to usable hb-subset.")
|
|
sys.exit (1)
|
|
hb_subset, args = args[0], args[1:]
|
|
|
|
if not len(args):
|
|
print ("No tests supplied.")
|
|
sys.exit (1)
|
|
|
|
_, returncode = cmd(["which", "ttx"])
|
|
if returncode:
|
|
print("TTX is not present, skipping test.")
|
|
sys.exit (77)
|
|
|
|
has_ots = has_ots()
|
|
|
|
fails = 0
|
|
for path in args:
|
|
with io.open(path, mode="r", encoding="utf-8") as f:
|
|
print ("Running tests in " + path)
|
|
test_suite = SubsetTestSuite(path, f.read())
|
|
for test in test_suite.tests():
|
|
fails += run_test(test, has_ots)
|
|
|
|
if fails != 0:
|
|
print (str (fails) + " test(s) failed.")
|
|
sys.exit(1)
|
|
else:
|
|
print ("All tests passed.")
|