From 3ac706401fd97c9e830e1a18cc8c674f6ee155d5 Mon Sep 17 00:00:00 2001 From: Stefano Rivera Date: Wed, 22 Dec 2010 15:05:55 +0200 Subject: [PATCH] Test for that every script can run --help and return 0. --- debian/changelog | 3 +- setup.py | 111 +++++++++++++++++----------------- ubuntutools/test/test_help.py | 77 +++++++++++++++++++++++ 3 files changed, 136 insertions(+), 55 deletions(-) create mode 100644 ubuntutools/test/test_help.py diff --git a/debian/changelog b/debian/changelog index ae628b0..bda6af3 100644 --- a/debian/changelog +++ b/debian/changelog @@ -15,6 +15,7 @@ ubuntu-dev-tools (0.109) UNRELEASED; urgency=low DEBEMAIL. (LP: #665202) * Add the beginnings of a test suite. (LP: #690386) - Switch to setuptools, to support setup.py test. + - Test for that every script can run --help and return 0. * ubuntutools/common.py: Remove https_proxy unsetting code, working around LP: #94130. @@ -29,7 +30,7 @@ ubuntu-dev-tools (0.109) UNRELEASED; urgency=low - Fix 'str' object has no attribute 'startwith' crash caused by a typo. - Fix crash if uploading to ubuntu without building the package before. - -- Benjamin Drung Wed, 22 Dec 2010 00:51:48 +0100 + -- Stefano Rivera Wed, 22 Dec 2010 15:02:45 +0200 ubuntu-dev-tools (0.108) experimental; urgency=low diff --git a/setup.py b/setup.py index 938857e..fe1ae0f 100755 --- a/setup.py +++ b/setup.py @@ -13,57 +13,60 @@ if os.path.exists(changelog): if match: version = match.group(1) -setup(name='ubuntu-dev-tools', - version=version, - scripts=['404main', - 'backportpackage', - 'check-symbols', - 'dch-repeat', - 'dgetlp', - 'edit-patch', - 'errno', - 'get-branches', - 'get-build-deps', - 'grab-attachments', - 'grab-merge', - 'grep-merges', - 'hugdaylist', - 'import-bug-from-debian', - 'lp-list-bugs', - 'lp-project-upload', - 'lp-set-dup', - 'lp-shell', - 'manage-credentials', - 'massfile', - 'merge-changelog', - 'mk-sbuild', - 'pbuilder-dist', - 'pbuilder-dist-simple', - 'pull-debian-debdiff', - 'pull-debian-source', - 'pull-lp-source', - 'pull-revu-source', - 'requestsync', - 'reverse-build-depends', - 'setup-packaging-environment', - 'sponsor-patch', - 'submittodebian', - 'suspicious-source', - 'syncpackage', - 'ubuntu-build', - 'ubuntu-iso', - 'update-maintainer', - 'what-patch', - 'wrap-and-sort', - ], - packages=['ubuntutools', - 'ubuntutools/lp', - 'ubuntutools/requestsync', - 'ubuntutools/sponsor_patch', - 'ubuntutools/test', - ], - data_files=[('share/man/man1', glob.glob("doc/*.1")), - ('share/man/man5', glob.glob("doc/*.5")), - ], - test_suite='ubuntutools.test.discover', -) +scripts = ['404main', + 'backportpackage', + 'check-symbols', + 'dch-repeat', + 'dgetlp', + 'edit-patch', + 'errno', + 'get-branches', + 'get-build-deps', + 'grab-attachments', + 'grab-merge', + 'grep-merges', + 'hugdaylist', + 'import-bug-from-debian', + 'lp-list-bugs', + 'lp-project-upload', + 'lp-set-dup', + 'lp-shell', + 'manage-credentials', + 'massfile', + 'merge-changelog', + 'mk-sbuild', + 'pbuilder-dist', + 'pbuilder-dist-simple', + 'pull-debian-debdiff', + 'pull-debian-source', + 'pull-lp-source', + 'pull-revu-source', + 'requestsync', + 'reverse-build-depends', + 'setup-packaging-environment', + 'sponsor-patch', + 'submittodebian', + 'suspicious-source', + 'syncpackage', + 'ubuntu-build', + 'ubuntu-iso', + 'update-maintainer', + 'what-patch', + 'wrap-and-sort', + ] + +if __name__ == '__main__': + setup(name='ubuntu-dev-tools', + version=version, + scripts=scripts, + packages=['ubuntutools', + 'ubuntutools/lp', + 'ubuntutools/requestsync', + 'ubuntutools/sponsor_patch', + 'ubuntutools/test', + ], + data_files=[('share/man/man1', glob.glob("doc/*.1")), + ('share/man/man5', glob.glob("doc/*.5")), + ], + test_suite='ubuntutools.test.discover', + ) diff --git a/ubuntutools/test/test_help.py b/ubuntutools/test/test_help.py new file mode 100644 index 0000000..71627ba --- /dev/null +++ b/ubuntutools/test/test_help.py @@ -0,0 +1,77 @@ +# test_help.py - Ensure scripts can run --help. +# +# Copyright (C) 2010, Stefano Rivera +# +# Permission to use, copy, modify, and/or distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +# AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. + +import fcntl +import os +import select +import signal +import subprocess +import time + +import setup +from ubuntutools.test import unittest + +BLACKLIST = ['grep-merges', 'submittodebian'] +TIMEOUT = 5 + +def load_tests(loader, tests, pattern): + "Give HelpTestCase a chance to populate before loading its test cases" + suite = unittest.TestSuite() + HelpTestCase.populate() + suite.addTests(loader.loadTestsFromTestCase(HelpTestCase)) + return suite + +class HelpTestCase(unittest.TestCase): + @classmethod + def populate(cls): + for script in setup.scripts: + setattr(cls, 'test_' + script, cls.makeHelpTester(script)) + + @classmethod + def makeHelpTester(cls, script): + def tester(self): + if script in BLACKLIST: + raise unittest.SkipTest("Blacklisted") + + null = open('/dev/null', 'r') + p = subprocess.Popen(['./' + script, '--help'], + close_fds=True, stdin=null, + stdout=subprocess.PIPE, stderr=subprocess.PIPE) + started = time.time() + out = [] + + fds = [p.stdout.fileno(), p.stderr.fileno()] + for fd in fds: + fcntl.fcntl(fd, fcntl.F_SETFL, + fcntl.fcntl(fd, fcntl.F_GETFL) | os.O_NONBLOCK) + + while time.time() - started < TIMEOUT: + for fd in select.select(fds, [], fds, TIMEOUT)[0]: + out.append(os.read(fd, 1024)) + if p.poll() is not None: + break + + if p.poll() is None: + os.kill(signal.SIG_TERM) + time.sleep(1) + if p.poll() is None: + os.kill(signal.SIG_KILL) + + self.assertEqual(p.poll(), 0, + "%s failed to return usage within %i seconds.\n" + "Output:\n%s" + % (script, TIMEOUT, ''.join(out))) + return tester