[subset] add tests that check for successful repacking of a real font file.

This commit is contained in:
Garret Rieger 2020-11-10 11:56:09 -08:00
parent 6e9468fcfb
commit b8b8c58b9f
13 changed files with 498 additions and 1 deletions

View File

@ -432,6 +432,7 @@ test/shaping/data/in-house/Makefile
test/shaping/data/text-rendering-tests/Makefile test/shaping/data/text-rendering-tests/Makefile
test/subset/Makefile test/subset/Makefile
test/subset/data/Makefile test/subset/data/Makefile
test/subset/data/repack_tests/Makefile
docs/Makefile docs/Makefile
docs/version.xml docs/version.xml
]) ])

View File

@ -13,7 +13,9 @@ libs:
EXTRA_DIST += \ EXTRA_DIST += \
meson.build \ meson.build \
run-tests.py \ run-tests.py \
run-repack-tests.py \
subset_test_suite.py \ subset_test_suite.py \
repack_test.py \
$(NULL) $(NULL)
CLEANFILES += \ CLEANFILES += \

View File

@ -3,7 +3,7 @@
NULL = NULL =
EXTRA_DIST = EXTRA_DIST =
CLEANFILES = CLEANFILES =
SUBDIRS = SUBDIRS = repack_tests
EXTRA_DIST += \ EXTRA_DIST += \
$(TESTS) \ $(TESTS) \

Binary file not shown.

View File

@ -0,0 +1,22 @@
# Process this file with automake to produce Makefile.in
NULL =
EXTRA_DIST =
CLEANFILES =
SUBDIRS =
EXTRA_DIST +=
$(TESTS) \
$(NULL)
# Convenience targets:
lib: libs # Always build subsetter lib in this subdir
libs:
@$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libs
TEST_EXTENSIONS = .tests
TESTS_LOG_COMPILER = $(srcdir)/../../run-repack-tests.py $(top_builddir)/util/hb-subset$(EXEEXT)
include Makefile.sources
-include $(top_srcdir)/git.mk

View File

@ -0,0 +1,12 @@
TESTS = \
basic.tests \
prioritization.tests \
table_duplication.tests \
$(NULL)
XFAIL_TESTS = \
advanced_prioritization.tests \
$(NULL)
DISABLED_TESTS = \
$(NULL)

View File

@ -0,0 +1,72 @@
NotoNastaliqUrdu-Bold.ttf
0x0020
0x0028
0x0029
0x002C
0x002D
0x002E
0x0030
0x0031
0x0032
0x0033
0x0034
0x0035
0x0036
0x0037
0x0038
0x0039
0x003A
0x060C
0x061F
0x0621
0x0622
0x0623
0x0624
0x0625
0x0626
0x0627
0x0628
0x0629
0x062A
0x062B
0x062C
0x062D
0x062E
0x062F
0x0630
0x0631
0x0632
0x0633
0x0634
0x0635
0x0636
0x0637
0x0638
0x0639
0x063A
0x0640
0x0641
0x0642
0x0643
0x0644
0x0645
0x0646
0x0647
0x0648
0x0649
0x064A
0x064B
0x064C
0x064F
0x0651
0x067E
0x0686
0x0698
0x06A9
0x06AF
0x06BE
0x06CC
0x200C
0x200D
0x200E

View File

@ -0,0 +1,52 @@
NotoNastaliqUrdu-Bold.ttf
0x060C
0x061F
0x0621
0x0622
0x0623
0x0624
0x0625
0x0626
0x0627
0x0628
0x0629
0x062A
0x062B
0x062C
0x062D
0x062E
0x062F
0x0630
0x0631
0x0632
0x0633
0x0634
0x0635
0x0636
0x0637
0x0638
0x0639
0x063A
0x0640
0x0641
0x0642
0x0643
0x0644
0x0645
0x0646
0x0647
0x0648
0x0649
0x064A
0x064B
0x064F
0x0651
0x067E
0x0686
0x0698
0x06A9
0x06AF
0x06CC
0x200C
0x200D
0x200E

View File

@ -0,0 +1,77 @@
NotoNastaliqUrdu-Bold.ttf
0x0020
0x0028
0x0029
0x002C
0x002D
0x002E
0x0030
0x0031
0x0032
0x0033
0x0034
0x0035
0x0036
0x0037
0x0038
0x0039
0x003A
0x060C
0x061F
0x0621
0x0622
0x0623
0x0624
0x0625
0x0626
0x0627
0x0628
0x0629
0x062A
0x062B
0x062C
0x062D
0x062E
0x062F
0x0630
0x0631
0x0632
0x0633
0x0634
0x0635
0x0636
0x0637
0x0638
0x0639
0x063A
0x0640
0x0641
0x0642
0x0643
0x0644
0x0645
0x0646
0x0647
0x0648
0x0649
0x064A
0x064B
0x064F
0x0651
0x0653
0x0679
0x067E
0x0686
0x0688
0x0691
0x0698
0x06A9
0x06AF
0x06BA
0x06BE
0x06C1
0x06CC
0x06D2
0x200C
0x200D
0x200E

View File

@ -0,0 +1,97 @@
NotoNastaliqUrdu-Bold.ttf
0x0028
0x0029
0x002C
0x002D
0x002E
0x0030
0x0031
0x0032
0x0033
0x0034
0x0035
0x0036
0x0037
0x0038
0x0039
0x003A
0x0041
0x0042
0x0043
0x0044
0x0045
0x0046
0x0047
0x0048
0x0049
0x004C
0x004D
0x004E
0x004F
0x0050
0x0052
0x0053
0x0054
0x0055
0x0056
0x0057
0x0061
0x0062
0x0063
0x0064
0x0065
0x0066
0x0067
0x0068
0x0069
0x006B
0x006C
0x006D
0x006E
0x006F
0x0070
0x0072
0x0073
0x0074
0x0075
0x0076
0x0077
0x0078
0x0079
0x060C
0x0626
0x0627
0x0628
0x062A
0x062C
0x062D
0x062E
0x062F
0x0631
0x0632
0x0633
0x0634
0x0635
0x0636
0x0637
0x0638
0x0639
0x0641
0x0642
0x0644
0x0645
0x0646
0x0648
0x0653
0x0679
0x067E
0x0686
0x0688
0x0691
0x06A9
0x06AF
0x06BA
0x06BE
0x06C1
0x06CC
0x06D2

View File

@ -28,6 +28,13 @@ tests = [
'cbdt', 'cbdt',
] ]
repack_tests = [
'basic',
'prioritization',
'table_duplication',
]
run_test = find_program('run-tests.py') run_test = find_program('run-tests.py')
foreach t : tests foreach t : tests
@ -45,3 +52,18 @@ foreach t : tests
suite: ['subset', 'slow'], suite: ['subset', 'slow'],
) )
endforeach endforeach
run_repack_test = find_program('run-repack-tests.py')
foreach t : repack_tests
fname = '@0@.tests'.format(t)
test(t, run_repack_test,
args: [
hb_subset,
join_paths(meson.current_source_dir(), 'data', 'repack_tests', fname),
],
workdir: join_paths(meson.current_build_dir(), '..', '..'),
suite: ['subset', 'repack'],
)
endforeach

View File

@ -0,0 +1,36 @@
#!/usr/bin/env python3
import os
# Parses a single repacking test file. The first line of the file is
# the name of the font to use and the remaining lines define the set of
# codepoints in the subset.
class RepackTest:
def __init__(self, test_path, definition):
self.test_path = test_path
self.font_name = None
self.codepoints = set ()
self._parse(definition)
def font_path(self):
return os.path.join (self._base_path (), "fonts", self.font_name)
def codepoints_string (self):
return ",".join (self.codepoints)
def _base_path(self):
return os.path.join(
os.path.dirname(self.test_path),
"../")
def _parse(self, definition):
lines = definition.splitlines ()
self.font_name = lines.pop (0)
for line in lines:
line = line.strip()
if not line:
continue
self.codepoints.add (line)

104
test/subset/run-repack-tests.py Executable file
View File

@ -0,0 +1,104 @@
#!/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")
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 = [hb_subset,
"--font-file=" + test.font_path (),
"--output-file=" + out_file,
"--unicodes=%s" % test.codepoints_string (),
"--drop-tables-=GPOS,GSUB,GDEF",]
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))
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()
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.")