Make ubuntutools.archive a little more testable, by making its urlopener an

instance property.

Replace these with mocks, as needed, rather than mocking out urllib2.urlopen.

Makes the test suite pass again.
This commit is contained in:
Stefano Rivera 2012-03-26 10:00:46 +02:00
parent 872957da4e
commit 52fc42ca8f
2 changed files with 34 additions and 27 deletions

View File

@ -154,6 +154,10 @@ class SourcePackage(object):
self.version = debian.debian_support.Version(version)
# uses default proxies from the environment
proxy = urllib2.ProxyHandler()
self.url_opener = urllib2.build_opener(proxy)
@property
def lp_spph(self):
"Return the LP Source Package Publishing History entry"
@ -317,11 +321,8 @@ class SourcePackage(object):
if parsed.scheme == 'file':
in_ = open(parsed.path, 'r')
else:
# uses default proxy from environment
proxy = urllib2.ProxyHandler()
opener = urllib2.build_opener(proxy)
try:
in_ = opener.open(url)
in_ = self.url_opener.open(url)
except urllib2.URLError:
return False
@ -499,7 +500,7 @@ class DebianSourcePackage(SourcePackage):
"python-simplejson")
try:
srcfiles = json.load(urllib2.urlopen(
srcfiles = json.load(self.url_opener.open(
'http://snapshot.debian.org'
'/mr/package/%s/%s/srcfiles?fileinfo=1'
% (self.source, self.version.full_version)))

View File

@ -1,6 +1,6 @@
# test_archive.py - Test suite for ubuntutools.archive
#
# Copyright (C) 2010, Stefano Rivera <stefanor@ubuntu.com>
# Copyright (C) 2010-2012, Stefano Rivera <stefanor@ubuntu.com>
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
@ -36,6 +36,7 @@ from ubuntutools.test import unittest
from ubuntutools.test.example_package import ExamplePackage
def setUpModule():
if not os.path.exists('test-data/example-0.1-1.dsc'):
ex_pkg = ExamplePackage()
@ -95,9 +96,6 @@ class LocalSourcePackageTestCase(mox.MoxTestBase, unittest.TestCase):
self.mox.StubOutWithMock(ubuntutools.archive, 'Distribution')
self.mox.StubOutWithMock(ubuntutools.archive, 'rmadison')
self.real_urlopen = urllib2.urlopen
self.mox.StubOutWithMock(urllib2, 'urlopen')
self.real_http = httplib2.Http()
self.mox.StubOutWithMock(httplib2, 'Http')
self.mock_http = self.mox.CreateMock(httplib2.Http)
@ -115,7 +113,7 @@ class LocalSourcePackageTestCase(mox.MoxTestBase, unittest.TestCase):
if destname is None:
destname = os.path.basename(url)
destpath = os.path.join(os.path.abspath('test-data'), destname)
return self.real_urlopen('file://' + destpath)
return urllib2.urlopen('file://' + destpath)
def urlopen_file(self, filename):
"Wrapper for urlopen_proxy for named files"
@ -195,14 +193,16 @@ class LocalSourcePackageTestCase(mox.MoxTestBase, unittest.TestCase):
self.mock_http.request('https://launchpad.net/%s/+archive/primary/'
'+files/example_1.0-1.dsc' % dist
).WithSideEffects(self.request_proxy)
urllib2.urlopen(mirror + urlbase + 'example_1.0.orig.tar.gz'
url_opener = self.mox.CreateMock(urllib2.OpenerDirector)
url_opener.open(mirror + urlbase + 'example_1.0.orig.tar.gz'
).WithSideEffects(self.urlopen_proxy)
urllib2.urlopen(mirror + urlbase + 'example_1.0-1.debian.tar.gz'
url_opener.open(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.url_opener = url_opener
pkg.pull()
def test_mirrors(self):
@ -213,18 +213,20 @@ class LocalSourcePackageTestCase(mox.MoxTestBase, unittest.TestCase):
httplib2.Http().AndReturn(self.mock_http)
self.mock_http.request(lpbase + 'example_1.0-1.dsc'
).WithSideEffects(self.request_proxy)
urllib2.urlopen(mirror + urlbase + 'example_1.0.orig.tar.gz'
url_opener = self.mox.CreateMock(urllib2.OpenerDirector)
url_opener.open(mirror + urlbase + 'example_1.0.orig.tar.gz'
).WithSideEffects(self.urlopen_null)
urllib2.urlopen(master + urlbase + 'example_1.0.orig.tar.gz'
url_opener.open(master + urlbase + 'example_1.0.orig.tar.gz'
).WithSideEffects(self.urlopen_404)
urllib2.urlopen(lpbase + 'example_1.0.orig.tar.gz'
url_opener.open(lpbase + 'example_1.0.orig.tar.gz'
).WithSideEffects(self.urlopen_proxy)
urllib2.urlopen(mirror + urlbase + 'example_1.0-1.debian.tar.gz'
url_opener.open(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.url_opener = url_opener
pkg.pull()
def test_dsc_missing(self):
@ -253,31 +255,33 @@ class DebianLocalSourcePackageTestCase(LocalSourcePackageTestCase):
httplib2.Http().AndReturn(self.mock_http)
self.mock_http.request(lpbase + 'example_1.0-1.dsc'
).WithSideEffects(self.request_proxy)
urllib2.urlopen(debian_mirror + base + 'example_1.0.orig.tar.gz'
url_opener = self.mox.CreateMock(urllib2.OpenerDirector)
url_opener.open(debian_mirror + base + 'example_1.0.orig.tar.gz'
).WithSideEffects(self.urlopen_null)
urllib2.urlopen(debsec_mirror + base + 'example_1.0.orig.tar.gz'
url_opener.open(debsec_mirror + base + 'example_1.0.orig.tar.gz'
).WithSideEffects(self.urlopen_404)
urllib2.urlopen(debian_master + base + 'example_1.0.orig.tar.gz'
url_opener.open(debian_master + base + 'example_1.0.orig.tar.gz'
).WithSideEffects(self.urlopen_404)
urllib2.urlopen(debsec_master + base + 'example_1.0.orig.tar.gz'
url_opener.open(debsec_master + base + 'example_1.0.orig.tar.gz'
).WithSideEffects(self.urlopen_404)
urllib2.urlopen(lpbase + 'example_1.0.orig.tar.gz'
url_opener.open(lpbase + 'example_1.0.orig.tar.gz'
).WithSideEffects(self.urlopen_404)
urllib2.urlopen('http://snapshot.debian.org/mr/package/example/1.0-1/'
url_opener.open('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'
url_opener.open('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'
url_opener.open(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.url_opener = url_opener
pkg.pull()
pkg.unpack()
@ -291,9 +295,10 @@ class DebianLocalSourcePackageTestCase(LocalSourcePackageTestCase):
httplib2.Http().AndReturn(self.mock_http)
self.mock_http.request(mirror + base + 'example_1.0-1.dsc'
).WithSideEffects(self.request_proxy)
urllib2.urlopen(mirror + base + 'example_1.0.orig.tar.gz'
url_opener = self.mox.CreateMock(urllib2.OpenerDirector)
url_opener.open(mirror + base + 'example_1.0.orig.tar.gz'
).WithSideEffects(self.urlopen_proxy)
urllib2.urlopen(mirror + base + 'example_1.0-1.debian.tar.gz'
url_opener.open(mirror + base + 'example_1.0-1.debian.tar.gz'
).WithSideEffects(self.urlopen_proxy)
def fake_gpg_info(self, message, keyrings=None):
@ -312,6 +317,7 @@ class DebianLocalSourcePackageTestCase(LocalSourcePackageTestCase):
pkg = self.SourcePackage('example', '1.0-1', 'main',
workdir=self.workdir, mirrors=[mirror])
pkg.url_opener = url_opener
pkg.pull()
def test_dsc_badsig(self):