python-tldp/tests/test_driver.py

474 lines
16 KiB
Python
Raw Permalink Normal View History

2016-04-30 21:49:20 +00:00
# -*- coding: utf8 -*-
#
# Copyright (c) 2016 Linux Documentation Project
2016-03-01 05:31:55 +00:00
from __future__ import absolute_import, division, print_function
2016-03-27 09:14:10 +00:00
from __future__ import unicode_literals
2016-03-01 05:31:55 +00:00
import io
2016-03-01 05:31:55 +00:00
import os
2016-03-08 06:13:38 +00:00
import uuid
import errno
import codecs
2016-03-08 06:13:38 +00:00
import random
2016-05-16 16:38:09 +00:00
import unittest
2016-03-08 06:13:38 +00:00
from tempfile import NamedTemporaryFile as ntf
2016-03-01 05:31:55 +00:00
from argparse import Namespace
2016-03-08 06:13:38 +00:00
from tldptesttools import TestInventoryBase, TestToolsFilesystem
from tldp.typeguesser import knowndoctypes
from tldp.inventory import stypes, status_types
from tldp.sources import SourceDocument
2016-03-09 17:35:11 +00:00
from tldp.outputs import OutputDirectory
2016-05-16 16:38:09 +00:00
from tldp import VERSION
2016-03-01 05:31:55 +00:00
# -- Test Data
import example
# -- SUT
import tldp.config
import tldp.driver
2016-04-02 19:17:48 +00:00
# -- shorthand
opj = os.path.join
opd = os.path.dirname
opa = os.path.abspath
2016-03-08 06:13:38 +00:00
sampledocs = opj(opd(__file__), 'sample-documents')
2016-03-01 05:31:55 +00:00
widths = Namespace(status=20, stem=50)
class TestDriverDetail(TestInventoryBase):
def test_stale_detail_verbosity(self):
c = self.config
2016-03-08 04:01:26 +00:00
self.add_stale('Stale-HOWTO', example.ex_docbook4xml)
c.verbose = True,
inv = tldp.inventory.Inventory(c.pubdir, c.sourcedir)
2016-03-01 21:32:38 +00:00
docs = inv.all.values()
stdout = io.StringIO()
tldp.driver.detail(c, docs, file=stdout)
2016-03-01 05:31:55 +00:00
stdout.seek(0)
2016-04-02 17:54:20 +00:00
self.assertTrue('changed source' in stdout.read())
2016-03-01 05:31:55 +00:00
def test_broken_detail_verbosity(self):
c = self.config
2016-03-08 04:01:26 +00:00
self.add_broken('Broken-HOWTO', example.ex_docbook4xml)
c.verbose = True,
inv = tldp.inventory.Inventory(c.pubdir, c.sourcedir)
2016-03-01 21:32:38 +00:00
docs = inv.all.values()
stdout = io.StringIO()
tldp.driver.detail(c, docs, file=stdout)
2016-03-01 05:31:55 +00:00
stdout.seek(0)
2016-03-02 04:12:01 +00:00
self.assertTrue('missing output' in stdout.read())
2016-03-01 05:31:55 +00:00
2016-03-08 04:01:26 +00:00
def test_orphan_verbosity(self):
c = self.config
self.add_orphan('Orphan-HOWTO', example.ex_docbook4xml)
c.verbose = True,
inv = tldp.inventory.Inventory(c.pubdir, c.sourcedir)
docs = inv.all.values()
stdout = io.StringIO()
2016-03-08 04:01:26 +00:00
tldp.driver.detail(c, docs, file=stdout)
stdout.seek(0)
self.assertTrue('missing source' in stdout.read())
def test_run_detail(self):
self.add_published('Published-HOWTO', example.ex_linuxdoc)
self.add_new('New-HOWTO', example.ex_linuxdoc)
self.add_stale('Stale-HOWTO', example.ex_linuxdoc)
self.add_orphan('Orphan-HOWTO', example.ex_linuxdoc)
self.add_broken('Broken-HOWTO', example.ex_linuxdoc)
argv = self.argv
argv.append('--detail')
exitcode = tldp.driver.run(argv)
self.assertEqual(exitcode, os.EX_OK)
2016-03-01 05:31:55 +00:00
2016-03-08 06:13:38 +00:00
class TestDriverShowDoctypes(TestToolsFilesystem):
def test_show_doctypes(self):
tf = ntf(dir=self.tempdir, prefix='doctypes-', delete=False)
tf.close()
with codecs.open(tf.name, 'w', encoding='utf-8') as f:
result = tldp.driver.show_doctypes(Namespace(), file=f)
self.assertEqual(result, os.EX_OK)
with codecs.open(f.name, encoding='utf-8') as x:
2016-03-08 06:13:38 +00:00
stdout = x.read()
for doctype in knowndoctypes:
self.assertTrue(doctype.formatname in stdout)
def test_show_doctypes_extraargs(self):
result = tldp.driver.show_doctypes(Namespace(), 'bogus')
self.assertTrue('Extra arguments' in result)
def test_run_doctypes(self):
exitcode = tldp.driver.run(['--doctypes'])
self.assertEqual(exitcode, os.EX_OK)
2016-03-08 06:13:38 +00:00
class TestDriverShowStatustypes(TestToolsFilesystem):
def test_show_statustypes(self):
stdout = io.StringIO()
2016-03-08 06:13:38 +00:00
result = tldp.driver.show_statustypes(Namespace(), file=stdout)
self.assertEqual(result, os.EX_OK)
2016-03-08 06:13:38 +00:00
stdout.seek(0)
data = stdout.read()
for status in status_types:
self.assertTrue(stypes[status] in data)
def test_show_statustypes_extraargs(self):
result = tldp.driver.show_statustypes(Namespace(), 'bogus')
self.assertTrue('Extra arguments' in result)
def test_run_statustypes(self):
exitcode = tldp.driver.run(['--statustypes'])
self.assertEqual(exitcode, os.EX_OK)
2016-03-08 06:13:38 +00:00
2016-05-16 16:38:09 +00:00
class TestDriverShowVersion(unittest.TestCase):
def test_show_version(self):
stdout = io.StringIO()
result = tldp.driver.show_version(Namespace(), file=stdout)
self.assertEqual(result, os.EX_OK)
stdout.seek(0)
data = stdout.read().strip()
for status in status_types:
self.assertEqual(VERSION, data)
def test_run_statustypes(self):
exitcode = tldp.driver.run(['--version'])
self.assertEqual(exitcode, os.EX_OK)
2016-03-01 05:31:55 +00:00
class TestDriverSummary(TestInventoryBase):
def test_run_summary(self):
self.add_published('Published-HOWTO', example.ex_linuxdoc)
self.add_new('New-HOWTO', example.ex_linuxdoc)
self.add_stale('Stale-HOWTO', example.ex_linuxdoc)
self.add_orphan('Orphan-HOWTO', example.ex_linuxdoc)
self.add_broken('Broken-HOWTO', example.ex_linuxdoc)
argv = self.argv
argv.append('--summary')
exitcode = tldp.driver.run(argv)
self.assertEqual(exitcode, os.EX_OK)
2016-03-08 06:13:38 +00:00
def test_summary_extraargs(self):
result = tldp.driver.summary(Namespace(), 'bogus')
self.assertTrue('Extra arguments' in result)
def test_summary_pubdir(self):
self.config.pubdir = None
result = tldp.driver.summary(self.config)
self.assertTrue('Option --pubdir' in result)
def test_summary_sourcedir(self):
self.config.sourcedir = None
result = tldp.driver.summary(self.config)
self.assertTrue('Option --sourcedir' in result)
def publishDocumentsWithLongNames(self, count):
names = list()
for _ in range(count):
x = str(uuid.uuid4())
names.append(x)
self.add_published(x, random.choice(example.sources))
return names
def test_summary_longnames(self):
c = self.config
2016-03-08 06:13:38 +00:00
names = self.publishDocumentsWithLongNames(5)
stdout = io.StringIO()
2016-03-08 06:13:38 +00:00
result = tldp.driver.summary(c, file=stdout)
self.assertEqual(result, os.EX_OK)
2016-03-01 05:31:55 +00:00
stdout.seek(0)
2016-03-08 06:13:38 +00:00
data = stdout.read()
self.assertTrue('and 4 more' in data)
c.verbose = True
stdout = io.StringIO()
2016-03-08 06:13:38 +00:00
result = tldp.driver.summary(c, file=stdout)
self.assertEqual(result, os.EX_OK)
2016-03-08 06:13:38 +00:00
stdout.seek(0)
data = stdout.read()
for name in names:
self.assertTrue(name in data)
def publishDocumentsWithShortNames(self, count):
names = list()
for _ in range(count):
x = hex(random.randint(0, 2**32))
names.append(x)
self.add_published(x, random.choice(example.sources))
return names
def test_summary_short(self):
c = self.config
names = self.publishDocumentsWithShortNames(20)
stdout = io.StringIO()
2016-03-08 06:13:38 +00:00
result = tldp.driver.summary(c, file=stdout)
self.assertEqual(result, os.EX_OK)
2016-03-08 06:13:38 +00:00
stdout.seek(0)
data = stdout.read()
self.assertTrue('and 16 more' in data)
c.verbose = True
stdout = io.StringIO()
2016-03-08 06:13:38 +00:00
result = tldp.driver.summary(c, file=stdout)
self.assertEqual(result, os.EX_OK)
2016-03-08 06:13:38 +00:00
stdout.seek(0)
data = stdout.read()
for name in names:
self.assertTrue(name in data)
class TestcreateBuildDirectory(TestToolsFilesystem):
def test_createBuildDirectory(self):
d = os.path.join(self.tempdir, 'child', 'grandchild')
ready, error = tldp.driver.createBuildDirectory(d)
self.assertFalse(ready)
self.assertEqual(error, errno.ENOENT)
2016-03-08 06:13:38 +00:00
class Testbuilddir_setup(TestToolsFilesystem):
def test_builddir_setup_default(self):
config = Namespace()
_, config.pubdir = self.adddir('pubdir')
config.builddir = None
ready, error = tldp.driver.builddir_setup(config)
self.assertTrue(ready)
def test_builddir_setup_specified(self):
config = Namespace()
_, config.pubdir = self.adddir('pubdir')
_, config.builddir = self.adddir('builddir')
ready, error = tldp.driver.builddir_setup(config)
self.assertTrue(ready)
2016-03-08 06:13:38 +00:00
class TestremoveUnknownDoctypes(TestToolsFilesystem):
def test_removeUnknownDoctypes(self):
docs = list()
docs.append(SourceDocument(opj(sampledocs, 'Unknown-Doctype.xqf')))
docs.append(SourceDocument(opj(sampledocs, 'linuxdoc-simple.sgml')))
result = tldp.driver.removeUnknownDoctypes(docs)
self.assertEqual(1, len(result))
2016-03-01 05:31:55 +00:00
2016-03-09 17:35:11 +00:00
class Test_prepare_docs_script_mode(TestToolsFilesystem):
2016-03-10 02:11:38 +00:00
def test_prepare_docs_script_mode_basic(self):
2016-03-09 17:35:11 +00:00
config = Namespace(pubdir=self.tempdir)
doc = SourceDocument(opj(sampledocs, 'linuxdoc-simple.sgml'))
self.assertIsNone(doc.working)
tldp.driver.prepare_docs_script_mode(config, [doc])
self.assertIsInstance(doc.working, OutputDirectory)
2016-03-10 02:11:38 +00:00
def test_prepare_docs_script_mode_existing_output(self):
config = Namespace(pubdir=self.tempdir)
doc = SourceDocument(opj(sampledocs, 'linuxdoc-simple.sgml'))
doc.output = OutputDirectory.fromsource(config.pubdir, doc)
self.assertIsNone(doc.working)
tldp.driver.prepare_docs_script_mode(config, [doc])
self.assertIs(doc.working, doc.output)
2016-03-09 17:35:11 +00:00
class Test_prepare_docs_build_mode(TestInventoryBase):
def test_prepare_docs_build_mode(self):
c = self.config
doc = SourceDocument(opj(sampledocs, 'linuxdoc-simple.sgml'))
self.assertIsNone(doc.working)
tldp.driver.prepare_docs_build_mode(c, [doc])
self.assertIsInstance(doc.working, OutputDirectory)
2016-03-10 02:11:38 +00:00
def test_prepare_docs_build_mode_nobuilddir(self):
c = self.config
os.rmdir(c.builddir)
doc = SourceDocument(opj(sampledocs, 'linuxdoc-simple.sgml'))
ready, error = tldp.driver.prepare_docs_build_mode(c, [doc])
self.assertFalse(ready)
class Test_post_publish_cleanup(TestInventoryBase):
def test_post_publish_cleanup_enotempty(self):
c = self.config
doc = SourceDocument(opj(sampledocs, 'linuxdoc-simple.sgml'))
tldp.driver.prepare_docs_build_mode(c, [doc])
with open(opj(doc.dtworkingdir, 'annoyance-file.txt'), 'w'):
pass
2016-04-18 19:25:31 +00:00
tldp.driver.post_publish_cleanup([doc.dtworkingdir])
2016-03-10 02:11:38 +00:00
self.assertTrue(os.path.isdir(doc.dtworkingdir))
2016-03-09 17:35:11 +00:00
2016-03-01 05:31:55 +00:00
class TestDriverRun(TestInventoryBase):
def test_run(self):
c = self.config
2016-03-01 05:31:55 +00:00
ex = example.ex_linuxdoc
self.add_published('Published-HOWTO', ex)
self.add_new('New-HOWTO', ex)
self.add_stale('Stale-HOWTO', ex)
self.add_orphan('Orphan-HOWTO', ex)
self.add_broken('Broken-HOWTO', ex)
2016-03-03 19:20:57 +00:00
fullpath = opj(self.tempdir, 'sources', 'New-HOWTO.sgml')
2016-03-10 04:52:45 +00:00
argv = self.argv
argv.extend(['--publish', 'stale', 'Orphan-HOWTO', fullpath])
exitcode = tldp.driver.run(argv)
self.assertEqual(exitcode, os.EX_OK)
inv = tldp.inventory.Inventory(c.pubdir, c.sourcedir)
self.assertEqual(4, len(inv.published.keys()))
self.assertEqual(1, len(inv.broken.keys()))
def test_run_no_work(self):
self.add_published('Published-HOWTO', example.ex_linuxdoc)
exitcode = tldp.driver.run(self.argv)
# -- improvement: check for 'No work to do.' from logger
self.assertEqual(exitcode, os.EX_OK)
def test_run_loglevel_resetting(self):
'''just exercise the loglevel settings'''
argv = ['--doctypes', '--loglevel', 'debug']
tldp.driver.run(argv)
def test_run_extra_args(self):
self.add_new('New-HOWTO', example.ex_linuxdoc)
2016-03-03 19:20:57 +00:00
fullpath = opj(self.tempdir, 'sources', 'New-HOWTO.sgml')
2016-03-10 04:52:45 +00:00
argv = self.argv
argv.extend(['--build', 'stale', 'Orphan-HOWTO', fullpath, 'extra'])
val = tldp.driver.run(argv)
self.assertTrue('Unknown arguments' in val)
2016-03-01 05:31:55 +00:00
def test_run_no_action(self):
c = self.config
ex = example.ex_linuxdoc
self.add_new('New-HOWTO', ex)
2016-03-10 04:52:45 +00:00
tldp.driver.run(self.argv)
docbuilddir = opj(c.builddir, ex.doctype.__name__)
inv = tldp.inventory.Inventory(docbuilddir, c.sourcedir)
self.assertEqual(1, len(inv.published.keys()))
def test_run_oops_no_sourcedir(self):
c = self.config
2016-03-10 04:52:45 +00:00
argv = ['--pubdir', c.pubdir]
ex = example.ex_linuxdoc
self.add_new('New-HOWTO', ex)
2016-03-10 04:52:45 +00:00
exitcode = tldp.driver.run(argv)
self.assertTrue('required for inventory' in exitcode)
def test_run_oops_no_pubdir(self):
c = self.config
2016-03-10 04:52:45 +00:00
argv = ['--sourcedir', c.sourcedir[0]]
self.add_new('New-HOWTO', example.ex_linuxdoc)
2016-03-10 04:52:45 +00:00
exitcode = tldp.driver.run(argv)
self.assertTrue('required for inventory' in exitcode)
def test_run_build_no_pubdir(self):
c = self.config
argv = ['--sourcedir', c.sourcedir[0]]
fname = opj(sampledocs, 'linuxdoc-simple.sgml')
argv.append(fname)
exitcode = tldp.driver.run(argv)
self.assertTrue('to --build' in exitcode)
2016-03-01 21:32:38 +00:00
class TestDriverProcessSkips(TestInventoryBase):
def test_skipDocuments_status(self):
c = self.config
ex = example.ex_linuxdoc
self.add_new('New-HOWTO', ex)
self.add_stale('Stale-HOWTO', ex)
c.skip = ['stale']
inv = tldp.inventory.Inventory(c.pubdir, c.sourcedir)
docs = inv.all.values()
inc, exc = tldp.driver.processSkips(c, docs)
self.assertTrue(1, len(exc))
excluded = exc.pop()
self.assertEqual(excluded.stem, 'Stale-HOWTO')
self.assertEqual(len(inc) + 1, len(inv.all.keys()))
def test_skipDocuments_stem(self):
c = self.config
ex = example.ex_linuxdoc
self.add_published('Published-HOWTO', ex)
self.add_new('New-HOWTO', ex)
c.skip = ['Published-HOWTO']
inv = tldp.inventory.Inventory(c.pubdir, c.sourcedir)
docs = inv.all.values()
inc, exc = tldp.driver.processSkips(c, docs)
self.assertTrue(1, len(exc))
excluded = exc.pop()
self.assertEqual(excluded.stem, 'Published-HOWTO')
self.assertEqual(len(inc) + 1, len(inv.all.keys()))
2016-03-01 21:32:38 +00:00
def test_skipDocuments_doctype(self):
c = self.config
self.add_published('Linuxdoc-HOWTO', example.ex_linuxdoc)
self.add_new('Docbook4XML-HOWTO', example.ex_docbook4xml)
c.skip = ['Docbook4XML']
inv = tldp.inventory.Inventory(c.pubdir, c.sourcedir)
docs = inv.all.values()
inc, exc = tldp.driver.processSkips(c, docs)
self.assertTrue(1, len(exc))
excluded = exc.pop()
self.assertEqual(excluded.stem, 'Docbook4XML-HOWTO')
self.assertEqual(len(inc) + 1, len(inv.all.keys()))
2016-03-10 02:11:38 +00:00
class TestDriverScript(TestInventoryBase):
def test_script(self):
c = self.config
c.script = True
stdout = io.StringIO()
2016-03-10 02:11:38 +00:00
self.add_published('Published-HOWTO', example.ex_linuxdoc)
inv = tldp.inventory.Inventory(c.pubdir, c.sourcedir)
tldp.driver.script(c, inv.all.values(), file=stdout)
stdout.seek(0)
data = stdout.read()
self.assertTrue('Published-HOWTO' in data)
def test_script_no_pubdir(self):
c = self.config
c.script = True
stdout = io.StringIO()
self.add_published('New-HOWTO', example.ex_linuxdoc)
c.pubdir = None
inv = tldp.inventory.Inventory(c.pubdir, c.sourcedir)
tldp.driver.script(c, inv.all.values(), file=stdout)
stdout.seek(0)
data = stdout.read()
self.assertTrue('New-HOWTO' in data)
2016-03-10 02:11:38 +00:00
def test_run_script(self):
self.add_published('Published-HOWTO', example.ex_linuxdoc)
self.add_new('New-HOWTO', example.ex_linuxdoc)
self.add_stale('Stale-HOWTO', example.ex_linuxdoc)
self.add_orphan('Orphan-HOWTO', example.ex_linuxdoc)
self.add_broken('Broken-HOWTO', example.ex_linuxdoc)
argv = self.argv
argv.append('--script')
exitcode = tldp.driver.run(argv)
self.assertEqual(exitcode, os.EX_OK)
2016-03-10 17:30:53 +00:00
def test_script_bad_invocation(self):
c = self.config
c.script = False
self.add_published('Published-HOWTO', example.ex_linuxdoc)
inv = tldp.inventory.Inventory(c.pubdir, c.sourcedir)
with self.assertRaises(Exception) as ecm:
tldp.driver.script(c, inv.all.values())
e = ecm.exception
self.assertTrue("neither --build nor --script" in e.args[0])
2016-03-10 17:30:53 +00:00
2016-03-01 05:31:55 +00:00
#
# -- end of file