FattView/fpdf/tests/cover/test_cache.py
# -*- coding: utf-8 -*-
"Test caching"
#PyFPDF-cover-test:res=font/DejaVuSansCondensed.ttf
#PyFPDF-cover-test:res=font/DejaVuSans.ttf
import common
import fpdf
import os, shutil, time
def testfile(f1, f2):
# create pdf
pdf = fpdf.FPDF()
if f1:
pdf.add_font('DejaVuSansCondensed', '', f1, uni = True)
if f2:
pdf.add_font('DejaVuSans', '', f2, uni = True)
pdf.set_font('DejaVuSans', "", 10)
return pdf
def trashfile(fn):
f = open(fn, "w")
f.write("1234567890")
f.close()
try:
from hashlib import md5
except ImportError:
try:
from md5 import md5
except ImportError:
md5 = None
def hashfn(fn):
h = md5()
if common.PY3K:
h.update(fn.encode("UTF-8"))
else:
h.update(fn)
return h.hexdigest()
def dotest(outputname, nostamp):
cachepath = os.path.join(os.path.dirname(__file__), "cache")
if os.path.exists(cachepath):
# cleanup dest
for item in os.listdir(cachepath):
os.remove(os.path.join(cachepath, item))
else:
# create font dir
os.makedirs(cachepath)
hashpath = os.path.join(os.path.dirname(__file__), "hash")
if os.path.exists(hashpath):
# cleanup dest
for item in os.listdir(hashpath):
os.remove(os.path.join(hashpath, item))
else:
# create font dir
os.makedirs(hashpath)
# copy font files
shutil.copy(os.path.join(common.basepath, "font", "DejaVuSansCondensed.ttf"), cachepath)
shutil.copy(os.path.join(common.basepath, "font", "DejaVuSans.ttf"), cachepath)
f1 = os.path.join(cachepath, "DejaVuSansCondensed.ttf")
f2 = os.path.join(cachepath, "DejaVuSans.ttf")
# --- normal cache mode ---
fpdf.set_global("FPDF_CACHE_MODE", 0)
# first load
t0 = time.time()
pdf = testfile(f1, f2)
t1 = time.time()
assert os.path.exists(f1[:-3] + "pkl")
assert os.path.exists(f2[:-3] + "pkl")
# load cached
t2 = time.time()
pdf = testfile(f1, f2)
t3 = time.time()
if not nostamp:
common.log("Cache fonts: ", t1 - t0)
common.log("Reload fonts: ", t3 - t2)
pdf.add_page()
# trigger cw127
#pdf.write(5, "Γειά σου κόσμος")
pdf.write(5, "Привет!")
pdf.write(10, "Hello")
pdf.output(os.path.join(cachepath, "pdf0.pdf"), "F")
# check cw127
assert not os.path.exists(f1[:-3] + "cw127.pkl")
assert os.path.exists(f2[:-3] + "cw127.pkl")
# --- disable cache reading ---
fpdf.set_global("FPDF_CACHE_MODE", 1)
# put garbage data to cache files - fpdf should not read pkl
trashfile(f1[:-3] + "pkl")
trashfile(f2[:-3] + "pkl")
trashfile(f2[:-3] + "cw127.pkl")
# test same file
t0 = time.time()
pdf = testfile(f1, f2)
t1 = time.time()
# remove pkl files
os.remove(f1[:-3] + "pkl")
os.remove(f2[:-3] + "pkl")
os.remove(f2[:-3] + "cw127.pkl")
# test reload
t2 = time.time()
pdf = testfile(f1, f2)
t3 = time.time()
if not nostamp:
common.log("No cache 1st: ", t1 - t0)
common.log("No cache 2nd: ", t3 - t2)
pdf.add_page()
pdf.write(5, "Γειά σου κόσμος")
pdf.write(10, "Hello")
pdf.output(os.path.join(cachepath, "pdf1.pdf"), "F")
# test no files created
assert not os.path.exists(f1[:-3] + "pkl")
assert not os.path.exists(f2[:-3] + "pkl")
assert not os.path.exists(f1[:-3] + "cw127.pkl")
assert not os.path.exists(f2[:-3] + "cw127.pkl")
# --- hash cache ---
fpdf.set_global("FPDF_CACHE_MODE", 2)
fpdf.set_global("FPDF_CACHE_DIR", hashpath)
t0 = time.time()
pdf = testfile(f1, f2)
t1 = time.time()
assert not os.path.exists(f1[:-3] + "pkl")
assert not os.path.exists(f2[:-3] + "pkl")
# load cached
t2 = time.time()
pdf = testfile(f1, f2)
t3 = time.time()
# test reload
if not nostamp:
common.log("Hash load 1st:", t1 - t0)
common.log("Hash load 2nd:", t3 - t2)
# check hash
assert os.path.exists(os.path.join(hashpath, hashfn(f1) + ".pkl"))
assert os.path.exists(os.path.join(hashpath, hashfn(f2) + ".pkl"))
pdf.add_page()
pdf.write(5, "Хешировали, хешировали, да выдохешиовали.")
pdf.write(10, "Hello")
pdf.output(os.path.join(cachepath, "pdf2.pdf"), "F")
assert not os.path.exists(os.path.join(hashpath, hashfn(f1) + ".cw127.pkl"))
assert os.path.exists(os.path.join(hashpath, hashfn(f2) + ".cw127.pkl"))
if __name__ == "__main__":
common.testmain(__file__, dotest)