python-tldp/tests/tldptesttools.py

264 lines
7.9 KiB
Python
Raw Normal View History

2016-04-30 21:49:20 +00:00
# -*- coding: utf8 -*-
#
# Copyright (c) 2016 Linux Documentation Project
from __future__ import absolute_import, division, print_function
2016-03-27 09:11:30 +00:00
from __future__ import unicode_literals
import os
import codecs
import random
import shutil
import unittest
2016-02-17 03:55:40 +00:00
from tempfile import mkdtemp
from tempfile import NamedTemporaryFile as ntf
import tldp.config
from tldp.outputs import OutputNamingConvention
from tldp.utils import writemd5sums, md5file
# -- short names
#
opa = os.path.abspath
opb = os.path.basename
opd = os.path.dirname
opj = os.path.join
extras = opa(opj(opd(opd(__file__)), 'extras'))
2016-02-17 03:55:40 +00:00
def stem_and_ext(name):
stem, ext = os.path.splitext(os.path.basename(name))
assert ext != ''
return stem, ext
2016-02-17 03:55:40 +00:00
def dir_to_components(reldir):
2016-02-16 22:12:42 +00:00
reldir, basename = os.path.split(os.path.normpath(reldir))
components = [basename]
while reldir != '':
reldir, basename = os.path.split(reldir)
components.append(basename)
assert len(components) >= 1
components.reverse()
return components
class TestToolsFilesystem(unittest.TestCase):
def setUp(self):
self.makeTempdir()
def tearDown(self):
self.removeTempdir()
def makeTempdir(self):
self.tempdir = mkdtemp(prefix='tldp-test-')
def removeTempdir(self):
shutil.rmtree(self.tempdir)
def adddir(self, reldir):
components = dir_to_components(reldir)
absdir = self.tempdir
while components:
absdir = os.path.join(absdir, components.pop(0))
if not os.path.isdir(absdir):
os.mkdir(absdir)
self.assertTrue(os.path.isdir(absdir))
relpath = os.path.relpath(absdir, self.tempdir)
return relpath, absdir
def addfile(self, reldir, filename, stem=None, ext=None):
dirname = os.path.join(self.tempdir, reldir)
assert os.path.isdir(dirname)
if stem is None:
2016-02-16 22:12:42 +00:00
stem, _ = stem_and_ext(filename)
if ext is None:
2016-02-16 22:12:42 +00:00
_, ext = stem_and_ext(filename)
newname = os.path.join(dirname, stem + ext)
2016-02-16 22:12:42 +00:00
if os.path.isfile(filename):
shutil.copy(filename, newname)
else:
2016-03-02 06:47:15 +00:00
with open(newname, 'w'):
pass
relname = os.path.relpath(newname, self.tempdir)
return relname, newname
class CCTestTools(unittest.TestCase):
def setUp(self):
self.makeTempdir()
def tearDown(self):
self.removeTempdir()
def makeTempdir(self):
self.tempdir = mkdtemp(prefix='tldp-test-')
def removeTempdir(self):
shutil.rmtree(self.tempdir)
def writeconfig(self, case):
tf = ntf(prefix=case.tag, suffix='.cfg', dir=self.tempdir, delete=False)
tf.close()
with codecs.open(tf.name, 'w', encoding='utf-8') as f:
2016-04-28 16:12:27 +00:00
f.write(case.cfg)
case.configfile = tf.name
class TestOutputDirSkeleton(OutputNamingConvention):
def mkdir(self):
if not os.path.isdir(self.dirname):
os.mkdir(self.dirname)
def create_md5sum_file(self, md5s):
writemd5sums(self.MD5SUMS, md5s)
def create_expected_docs(self):
for name in self.expected:
fname = getattr(self, name)
with open(fname, 'w'):
pass
class TestSourceDocSkeleton(object):
def __init__(self, dirname):
if isinstance(dirname, list):
dirname = dirname[0]
if not os.path.abspath(dirname):
raise Exception("Please use absolute path in unit tests....")
self.dirname = dirname
if not os.path.isdir(self.dirname):
os.mkdir(self.dirname)
self.md5s = dict()
def copytree(self, source):
dst = opj(self.dirname, opb(source))
shutil.copytree(source, dst)
def create_stale(self, fname):
l = list(self.md5s[fname])
random.shuffle(l)
if l == self.md5s[fname]:
self.invalidate_checksum(fname)
self.md5s[fname] = ''.join(l)
@property
def md5sums(self):
return self.md5s
def addsourcefile(self, filename, content):
fname = os.path.join(self.dirname, filename)
if os.path.isfile(content):
shutil.copy(content, fname)
else:
2016-03-15 22:49:01 +00:00
with codecs.open(fname, 'w', encoding='utf-8') as f:
f.write(content)
relpath = os.path.relpath(fname, start=self.dirname)
self.md5s[relpath] = md5file(fname)
class TestInventoryBase(unittest.TestCase):
def setUp(self):
self.makeTempdir()
tldp.config.DEFAULT_CONFIGFILE = None
self.config, _ = tldp.config.collectconfiguration('ldptool', [])
c = self.config
c.pubdir = os.path.join(self.tempdir, 'outputs')
c.builddir = os.path.join(self.tempdir, 'builddir')
c.sourcedir = os.path.join(self.tempdir, 'sources')
2016-03-10 04:52:45 +00:00
argv = list()
argv.extend(['--builddir', c.builddir])
argv.extend(['--pubdir', c.pubdir])
argv.extend(['--sourcedir', c.sourcedir])
self.argv = argv
# -- and make some directories
for d in (c.sourcedir, c.pubdir, c.builddir):
if not os.path.isdir(d):
os.mkdir(d)
c.sourcedir = [c.sourcedir]
def tearDown(self):
self.removeTempdir()
def makeTempdir(self):
self.tempdir = mkdtemp(prefix='tldp-test-')
def removeTempdir(self):
shutil.rmtree(self.tempdir)
def add_stale(self, stem, ex):
c = self.config
mysource = TestSourceDocSkeleton(c.sourcedir)
fname = stem + ex.ext
mysource.addsourcefile(fname, ex.filename)
mysource.create_stale(fname)
myoutput = TestOutputDirSkeleton(os.path.join(c.pubdir, stem), stem)
myoutput.mkdir()
myoutput.create_expected_docs()
myoutput.create_md5sum_file(mysource.md5sums)
def add_broken(self, stem, ex):
c = self.config
mysource = TestSourceDocSkeleton(c.sourcedir)
fname = stem + ex.ext
mysource.addsourcefile(fname, ex.filename)
myoutput = TestOutputDirSkeleton(os.path.join(c.pubdir, stem), stem)
myoutput.mkdir()
myoutput.create_expected_docs()
myoutput.create_md5sum_file(mysource.md5sums)
prop = random.choice(myoutput.expected)
fname = getattr(myoutput, prop, None)
assert fname is not None
os.unlink(fname)
def add_new(self, stem, ex, content=None):
c = self.config
mysource = TestSourceDocSkeleton(c.sourcedir)
if content:
mysource.addsourcefile(stem + ex.ext, content)
else:
mysource.addsourcefile(stem + ex.ext, ex.filename)
2016-03-08 06:13:38 +00:00
def add_unknown(self, stem, ext, content=None):
c = self.config
mysource = TestSourceDocSkeleton(c.sourcedir)
if content:
mysource.addsourcefile(stem + ext, content)
else:
mysource.addsourcefile(stem + ext, '')
def add_orphan(self, stem, ex):
c = self.config
myoutput = TestOutputDirSkeleton(os.path.join(c.pubdir, stem), stem)
myoutput.mkdir()
myoutput.create_expected_docs()
def add_published(self, stem, ex):
c = self.config
mysource = TestSourceDocSkeleton(c.sourcedir)
mysource.addsourcefile(stem + ex.ext, ex.filename)
myoutput = TestOutputDirSkeleton(os.path.join(c.pubdir, stem), stem)
myoutput.mkdir()
myoutput.create_expected_docs()
myoutput.create_md5sum_file(mysource.md5sums)
def add_docbooksgml_support_to_config(self):
c = self.config
c.docbooksgml_collateindex = opj(extras, 'collateindex.pl')
c.docbooksgml_ldpdsl = opj(extras, 'dsssl', 'ldp.dsl')
def add_docbook4xml_xsl_to_config(self):
c = self.config
c.docbook4xml_xslprint = opj(extras, 'xsl', 'tldp-print.xsl')
c.docbook4xml_xslsingle = opj(extras, 'xsl', 'tldp-one-page.xsl')
c.docbook4xml_xslchunk = opj(extras, 'xsl', 'tldp-chapters.xsl')
#
# -- end of file