diff --git a/test-data/example_1.0-1.debian.tar.gz b/test-data/example_1.0-1.debian.tar.gz deleted file mode 100644 index 0dfd3a7..0000000 Binary files a/test-data/example_1.0-1.debian.tar.gz and /dev/null differ diff --git a/test-data/example_1.0-1.dsc b/test-data/example_1.0-1.dsc deleted file mode 100644 index 9fe0bc4..0000000 --- a/test-data/example_1.0-1.dsc +++ /dev/null @@ -1,17 +0,0 @@ -Format: 3.0 (quilt) -Source: example -Binary: example -Architecture: all -Version: 1.0-1 -Maintainer: Stefano Rivera -Standards-Version: 3.9.1 -Build-Depends: debhelper (>= 7.0.50~) -Checksums-Sha1: - 13c309f70155ab5be50553ce72f3344c48851013 170 example_1.0.orig.tar.gz - ae9dcd225000d24128b8eccbdc472abcfa9b60ee 1170 example_1.0-1.debian.tar.gz -Checksums-Sha256: - 4908cb2ce47c9835fb74476ab5dba0298da7a56a389328b845d07575f5ea6276 170 example_1.0.orig.tar.gz - ca366dc1ae0efa1df6537f6882e87134a0409e1589ca18daf56d065beb9cfce3 1170 example_1.0-1.debian.tar.gz -Files: - 8054fdf3653160e13d9539ca36c2e311 170 example_1.0.orig.tar.gz - 8538e8b6cb8162d5c6886b18c132a1c8 1170 example_1.0-1.debian.tar.gz diff --git a/test-data/example_1.0.orig.tar.gz b/test-data/example_1.0.orig.tar.gz deleted file mode 100644 index 1d3482e..0000000 Binary files a/test-data/example_1.0.orig.tar.gz and /dev/null differ diff --git a/ubuntutools/test/example_package.py b/ubuntutools/test/example_package.py new file mode 100644 index 0000000..fffdb71 --- /dev/null +++ b/ubuntutools/test/example_package.py @@ -0,0 +1,133 @@ +# example_package.py - Creates an example package +# +# Copyright (C) 2010-2011, 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 os.path +import shutil +import subprocess +import tempfile + +import debian.debian_support + +_base_pkg = { + 'content': 'Boring file from upstream', + 'debian/control': +"""Source: example +Section: misc +Priority: extra +Maintainer: Example +Build-Depends: debhelper (>= 7.0.50~) +Standards-Version: 3.9.1 + +Package: example +Architecture: all +Depends: ${shlibs:Depends}, ${misc:Depends} +Description: Example package for testing purposes + An example package used by the test suite. Useless. +""", + 'debian/copyright': +"""Format: http://svn.debian.org/wsvn/dep/web/deps/dep5.mdwn?op=file&rev=152 +Source: https://launchpad.net/ubuntu-dev-tools + +Files: * +Copyright: 2010-2011, Stefano Rivera +License: ISC + 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. +""", + 'debian/compat': '7', + 'debian/rules': +"""#!/usr/bin/make -f +%: +\tdh $@ +""", + 'debian/source/format': '3.0 (quilt)', + 'debian/source/local-options': 'abort-on-upstream-changes', +} + +class ExamplePackage(object): + def __init__(self, source='example', version='1.0-1', workdir=None, + files=None): + self.source = source + self.version = debian.debian_support.Version(version) + + self.pkg = dict(_base_pkg) + if files is not None: + self.pkg.update(files) + + self.workdir = workdir or tempfile.mkdtemp(prefix='examplepkg') + self.srcdir = os.path.join(self.workdir, '%s-%s' % (source, + self.version.upstream_version)) + + def create_orig(self): + "Create .orig.tar.gz" + self._write_files(filter_=lambda fn: not fn.startswith('debian/')) + orig = '%s_%s.orig.tar.gz' % (self.source, + self.version.upstream_version) + subprocess.check_call(('tar', '-czf', orig, + os.path.basename(self.srcdir)), + cwd=self.workdir) + + def changelog_entry(self, version=None, create=False): + "Add a changelog entry" + cmd = ['dch', '--noconf', '--package', self.source] + if create: + cmd.append('--create') + cmd += ['--newversion', version or self.version.full_version] + cmd.append('') + env = dict(os.environ) + env['DEBFULLNAME'] = 'Example' + env['DEBEMAIL'] = 'example@example.net' + subprocess.check_call(cmd, env=env, cwd=self.srcdir) + + def create(self): + "Build source package" + self._write_files() + self.changelog_entry(create=True) + subprocess.check_call(('dpkg-buildpackage', '-rfakeroot', '-S', + '-uc', '-us'), + cwd=self.srcdir) + + def cleanup(self): + "Remove workdir" + shutil.rmtree(self.workdir) + + def pathname(self, fn): + "Return path to file in workdir" + return os.path.join(self.workdir, fn) + + def _write_files(self, filter_=None): + "Write files from self.pkg into src pkg dir, if filter_(fn)" + if filter_ is None: + filter_ = lambda x: True + + for fn, content in self.pkg.iteritems(): + if not filter_(fn): + continue + pathname = os.path.join(self.srcdir, fn) + dirname = os.path.dirname(pathname) + if not os.path.exists(dirname): + os.makedirs(dirname) + with open(pathname, 'wb') as f: + f.write(content) diff --git a/ubuntutools/test/test_archive.py b/ubuntutools/test/test_archive.py index 3412618..e5a07d9 100644 --- a/ubuntutools/test/test_archive.py +++ b/ubuntutools/test/test_archive.py @@ -30,28 +30,37 @@ import ubuntutools.archive from ubuntutools.config import UDTConfig from ubuntutools.logger import Logger from ubuntutools.test import unittest +from ubuntutools.test.example_package import ExamplePackage + +ex_pkg = ExamplePackage() +def setUpModule(): + ex_pkg.create_orig() + ex_pkg.create() + +def tearDownModule(): + ex_pkg.cleanup() class DscVerificationTestCase(mox.MoxTestBase, unittest.TestCase): def setUp(self): super(DscVerificationTestCase, self).setUp() - with open('test-data/example_1.0-1.dsc', 'rb') as f: + with open(ex_pkg.pathname('example_1.0-1.dsc'), 'rb') as f: self.dsc = ubuntutools.archive.Dsc(f.read()) def tearDown(self): super(DscVerificationTestCase, self).tearDown() def test_good(self): - self.assertTrue(self.dsc.verify_file( - 'test-data/example_1.0.orig.tar.gz')) - self.assertTrue(self.dsc.verify_file( - 'test-data/example_1.0-1.debian.tar.gz')) + self.assertTrue(self.dsc.verify_file(ex_pkg.pathname( + 'example_1.0.orig.tar.gz'))) + self.assertTrue(self.dsc.verify_file(ex_pkg.pathname( + 'example_1.0-1.debian.tar.gz'))) def test_missing(self): - self.assertFalse(self.dsc.verify_file( - 'test-data/does.not.exist')) + self.assertFalse(self.dsc.verify_file(ex_pkg.pathname( + 'does.not.exist'))) def test_bad(self): - fn = 'test-data/example_1.0.orig.tar.gz' + fn = ex_pkg.pathname('example_1.0.orig.tar.gz') with open(fn, 'rb') as f: data = f.read() data = data[:-1] + chr(ord(data[-1]) ^ 8) @@ -96,8 +105,7 @@ class LocalSourcePackageTestCase(mox.MoxTestBase, unittest.TestCase): if destname is None: destname = os.path.basename(url) return self.urlopen('file://' - + os.path.join(os.path.abspath('test-data'), - destname)) + + os.path.abspath(ex_pkg.pathname(destname))) def urlopen_file(self, filename): "Wrapper for urlopen_proxy for named files" @@ -121,15 +129,15 @@ class LocalSourcePackageTestCase(mox.MoxTestBase, unittest.TestCase): self.mox.ReplayAll() pkg = self.SourcePackage('example', '1.0-1', 'main', - dscfile='test-data/example_1.0-1.dsc', + dscfile=ex_pkg.pathname('example_1.0-1.dsc'), workdir=self.workdir) pkg.pull() pkg.unpack() def test_verification(self): - shutil.copy2('test-data/example_1.0-1.dsc', self.workdir) - shutil.copy2('test-data/example_1.0.orig.tar.gz', self.workdir) - shutil.copy2('test-data/example_1.0-1.debian.tar.gz', self.workdir) + for fn in ('example_1.0-1.dsc', 'example_1.0.orig.tar.gz', + 'example_1.0-1.debian.tar.gz'): + shutil.copy2(ex_pkg.pathname(fn), self.workdir) with open(os.path.join(self.workdir, 'example_1.0-1.debian.tar.gz'), 'r+b') as f: f.write('CORRUPTION') @@ -140,7 +148,7 @@ class LocalSourcePackageTestCase(mox.MoxTestBase, unittest.TestCase): self.mox.ReplayAll() pkg = self.SourcePackage('example', '1.0-1', 'main', - dscfile='test-data/example_1.0-1.dsc', + dscfile=ex_pkg.pathname('example_1.0-1.dsc'), workdir=self.workdir) pkg.pull()