Complete test suite for ubuntutools.archive

This commit is contained in:
Stefano Rivera 2010-12-31 21:08:16 +02:00
parent 5ad9ee9f5b
commit d9a9b4cab4
2 changed files with 160 additions and 11 deletions

View File

@ -20,15 +20,14 @@ import __builtin__
import os.path import os.path
import shutil import shutil
import StringIO import StringIO
import subprocess
import sys
import tempfile import tempfile
import urllib2 import urllib2
import urlparse
import debian.deb822
import mox import mox
import ubuntutools.archive import ubuntutools.archive
from ubuntutools.config import UDTConfig
from ubuntutools.logger import Logger from ubuntutools.logger import Logger
from ubuntutools.test import unittest from ubuntutools.test import unittest
@ -74,7 +73,7 @@ class DscVerificationTestCase(mox.MoxTestBase, unittest.TestCase):
class LocalSourcePackageTestCase(mox.MoxTestBase, unittest.TestCase): class LocalSourcePackageTestCase(mox.MoxTestBase, unittest.TestCase):
SourcePackage = ubuntutools.archive.DebianSourcePackage SourcePackage = ubuntutools.archive.UbuntuSourcePackage
def setUp(self): def setUp(self):
super(LocalSourcePackageTestCase, self).setUp() super(LocalSourcePackageTestCase, self).setUp()
@ -84,12 +83,34 @@ class LocalSourcePackageTestCase(mox.MoxTestBase, unittest.TestCase):
self.mox.StubOutWithMock(ubuntutools.archive, 'rmadison') self.mox.StubOutWithMock(ubuntutools.archive, 'rmadison')
self.urlopen = urllib2.urlopen self.urlopen = urllib2.urlopen
self.mox.StubOutWithMock(urllib2, 'urlopen') self.mox.StubOutWithMock(urllib2, 'urlopen')
self.mox.StubOutWithMock(Logger, 'stdout') # Silence the tests a little:
self.mox.stubs.Set(Logger, 'stdout', StringIO.StringIO())
self.mox.stubs.Set(Logger, 'stderr', StringIO.StringIO())
def tearDown(self): def tearDown(self):
super(LocalSourcePackageTestCase, self).tearDown() super(LocalSourcePackageTestCase, self).tearDown()
shutil.rmtree(self.workdir) shutil.rmtree(self.workdir)
def urlopen_proxy(self, url, destname=None):
"Grab the file from test-data"
if destname is None:
destname = os.path.basename(url)
return self.urlopen('file://'
+ os.path.join(os.path.abspath('test-data'),
destname))
def urlopen_file(self, filename):
"Wrapper for urlopen_proxy for named files"
return lambda url: self.urlopen_proxy(url, filename)
def urlopen_null(self, url):
"urlopen for zero length files"
return StringIO.StringIO('')
def urlopen_404(self, url):
"urlopen for errors"
raise urllib2.HTTPError(url, 404, "Not Found", {}, None)
def test_local_copy(self): def test_local_copy(self):
urllib2.urlopen(mox.Regex('^file://.*\.dsc$') urllib2.urlopen(mox.Regex('^file://.*\.dsc$')
).WithSideEffects(self.urlopen) ).WithSideEffects(self.urlopen)
@ -97,8 +118,6 @@ class LocalSourcePackageTestCase(mox.MoxTestBase, unittest.TestCase):
).WithSideEffects(self.urlopen) ).WithSideEffects(self.urlopen)
urllib2.urlopen(mox.Regex('^file://.*\.debian\.tar\.gz$') urllib2.urlopen(mox.Regex('^file://.*\.debian\.tar\.gz$')
).WithSideEffects(self.urlopen) ).WithSideEffects(self.urlopen)
Logger.stdout.write(mox.IsA(basestring)).MultipleTimes()
Logger.stdout.flush().MultipleTimes()
self.mox.ReplayAll() self.mox.ReplayAll()
pkg = self.SourcePackage('example', '1.0-1', 'main', pkg = self.SourcePackage('example', '1.0-1', 'main',
@ -118,15 +137,143 @@ class LocalSourcePackageTestCase(mox.MoxTestBase, unittest.TestCase):
).WithSideEffects(self.urlopen) ).WithSideEffects(self.urlopen)
urllib2.urlopen(mox.Regex('^file://.*\.debian\.tar\.gz$') urllib2.urlopen(mox.Regex('^file://.*\.debian\.tar\.gz$')
).WithSideEffects(self.urlopen) ).WithSideEffects(self.urlopen)
Logger.stdout.write(mox.IsA(basestring)).MultipleTimes()
Logger.stdout.flush().MultipleTimes()
self.mox.ReplayAll() self.mox.ReplayAll()
pkg = self.SourcePackage('example', '1.0-1', 'main', pkg = self.SourcePackage('example', '1.0-1', 'main',
dscfile='test-data/example_1.0-1.dsc', dscfile='test-data/example_1.0-1.dsc',
workdir=self.workdir) workdir=self.workdir)
pkg.pull() pkg.pull()
def test_pull(self):
dist = self.SourcePackage.distribution
mirror = UDTConfig.defaults['%s_MIRROR' % dist.upper()]
urlbase = '/pool/main/e/example/'
urllib2.urlopen('https://launchpad.net/%s/+archive/primary/'
'+files/example_1.0-1.dsc' % dist
).WithSideEffects(self.urlopen_proxy)
urllib2.urlopen(mirror + urlbase + 'example_1.0.orig.tar.gz'
).WithSideEffects(self.urlopen_proxy)
urllib2.urlopen(mirror + urlbase + 'example_1.0-1.debian.tar.gz'
).WithSideEffects(self.urlopen_proxy)
self.mox.ReplayAll()
pkg = self.SourcePackage('example', '1.0-1', 'main',
workdir=self.workdir)
pkg.pull()
def test_mirrors(self):
master = UDTConfig.defaults['UBUNTU_MIRROR']
mirror = 'http://mirror'
lpbase = 'https://launchpad.net/ubuntu/+archive/primary/+files/'
urlbase = '/pool/main/e/example/'
urllib2.urlopen(lpbase + 'example_1.0-1.dsc'
).WithSideEffects(self.urlopen_proxy)
urllib2.urlopen(mirror + urlbase + 'example_1.0.orig.tar.gz'
).WithSideEffects(self.urlopen_null)
urllib2.urlopen(master + urlbase + 'example_1.0.orig.tar.gz'
).WithSideEffects(self.urlopen_404)
urllib2.urlopen(lpbase + 'example_1.0.orig.tar.gz'
).WithSideEffects(self.urlopen_proxy)
urllib2.urlopen(mirror + urlbase + 'example_1.0-1.debian.tar.gz'
).WithSideEffects(self.urlopen_proxy)
self.mox.ReplayAll()
pkg = self.SourcePackage('example', '1.0-1', 'main',
workdir=self.workdir, mirrors=[mirror])
pkg.pull()
def test_dsc_missing(self):
lpbase = 'https://launchpad.net/ubuntu/+archive/primary/+files/'
urllib2.urlopen(lpbase + 'example_1.0-1.dsc'
).WithSideEffects(self.urlopen_404)
self.mox.ReplayAll()
pkg = self.SourcePackage('example', '1.0-1', 'main',
workdir=self.workdir)
self.assertRaises(ubuntutools.archive.DownloadError, pkg.pull)
class DebianLocalSourcePackageTestCase(LocalSourcePackageTestCase):
SourcePackage = ubuntutools.archive.DebianSourcePackage
def test_mirrors(self):
debian_master = UDTConfig.defaults['DEBIAN_MIRROR']
debsec_master = UDTConfig.defaults['DEBSEC_MIRROR']
debian_mirror = 'http://mirror/debian'
debsec_mirror = 'http://mirror/debsec'
lpbase = 'https://launchpad.net/debian/+archive/primary/+files/'
base = '/pool/main/e/example/'
urllib2.urlopen(lpbase + 'example_1.0-1.dsc'
).WithSideEffects(self.urlopen_proxy)
urllib2.urlopen(debian_mirror + base + 'example_1.0.orig.tar.gz'
).WithSideEffects(self.urlopen_null)
urllib2.urlopen(debsec_mirror + base + 'example_1.0.orig.tar.gz'
).WithSideEffects(self.urlopen_404)
urllib2.urlopen(debian_master + base + 'example_1.0.orig.tar.gz'
).WithSideEffects(self.urlopen_404)
urllib2.urlopen(debsec_master + base + 'example_1.0.orig.tar.gz'
).WithSideEffects(self.urlopen_404)
urllib2.urlopen(lpbase + 'example_1.0.orig.tar.gz'
).WithSideEffects(self.urlopen_404)
urllib2.urlopen('http://snapshot.debian.org/mr/package/example/1.0-1/'
'srcfiles?fileinfo=1'
).WithSideEffects(lambda x: StringIO.StringIO(
'{"fileinfo": {"hashabc": [{"name": "example_1.0.orig.tar.gz"}]}}'
))
urllib2.urlopen('http://snapshot.debian.org/file/hashabc'
).WithSideEffects(self.urlopen_file(
'example_1.0.orig.tar.gz'))
urllib2.urlopen(debian_mirror + base + 'example_1.0-1.debian.tar.gz'
).WithSideEffects(self.urlopen_proxy)
self.mox.ReplayAll()
pkg = self.SourcePackage('example', '1.0-1', 'main',
workdir=self.workdir, mirrors=[debian_mirror,
debsec_mirror])
pkg.pull()
pkg.unpack() pkg.unpack()
class UbuntuLocalSourcePackageTestCase(LocalSourcePackageTestCase): def test_dsc_missing(self):
SourcePackage = ubuntutools.archive.UbuntuSourcePackage mirror = 'http://mirror'
lpbase = 'https://launchpad.net/debian/+archive/primary/+files/'
base = '/pool/main/e/example/'
urllib2.urlopen(lpbase + 'example_1.0-1.dsc'
).WithSideEffects(self.urlopen_404)
urllib2.urlopen(mirror + base + 'example_1.0-1.dsc'
).WithSideEffects(self.urlopen_proxy)
urllib2.urlopen(mirror + base + 'example_1.0.orig.tar.gz'
).WithSideEffects(self.urlopen_proxy)
urllib2.urlopen(mirror + base + 'example_1.0-1.debian.tar.gz'
).WithSideEffects(self.urlopen_proxy)
self.mox.StubOutWithMock(debian.deb822.GpgInfo, 'from_sequence')
debian.deb822.GpgInfo.from_sequence(mox.IsA(str)).WithSideEffects(
lambda x: debian.deb822.GpgInfo.from_output(
'[GNUPG:] GOODSIG DEADBEEF Joe Developer '
'<joe@example.net>'))
self.mox.ReplayAll()
pkg = self.SourcePackage('example', '1.0-1', 'main',
workdir=self.workdir, mirrors=[mirror])
pkg.pull()
def test_dsc_badsig(self):
mirror = 'http://mirror'
lpbase = 'https://launchpad.net/debian/+archive/primary/+files/'
base = '/pool/main/e/example/'
urllib2.urlopen(lpbase + 'example_1.0-1.dsc'
).WithSideEffects(self.urlopen_404)
urllib2.urlopen(mirror + base + 'example_1.0-1.dsc'
).WithSideEffects(self.urlopen_proxy)
self.mox.StubOutWithMock(debian.deb822.GpgInfo, 'from_sequence')
debian.deb822.GpgInfo.from_sequence(mox.IsA(str)).WithSideEffects(
lambda x: debian.deb822.GpgInfo.from_output(
'[GNUPG:] ERRSIG DEADBEEF'))
self.mox.ReplayAll()
pkg = self.SourcePackage('example', '1.0-1', 'main',
workdir=self.workdir, mirrors=[mirror])
self.assertRaises(ubuntutools.archive.DownloadError, pkg.pull)

View File

@ -25,6 +25,8 @@ WHITELIST = [re.compile(': %s$' % x) for x in (
r"No name '\w+Error' in module 'launchpadlib\.errors'", r"No name '\w+Error' in module 'launchpadlib\.errors'",
# http://www.logilab.org/ticket/51250: # http://www.logilab.org/ticket/51250:
r"Module 'hashlib' has no '(md5|sha(1|224|256|384|512))' member", r"Module 'hashlib' has no '(md5|sha(1|224|256|384|512))' member",
# mox:
r"Instance of 'GpgInfo' has no 'WithSideEffects' member",
)] )]
class PylintTestCase(unittest.TestCase): class PylintTestCase(unittest.TestCase):