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

View File

@ -1,6 +1,6 @@
# test_archive.py - Test suite for ubuntutools.archive # 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 # Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above # 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 from ubuntutools.test.example_package import ExamplePackage
def setUpModule(): def setUpModule():
if not os.path.exists('test-data/example-0.1-1.dsc'): if not os.path.exists('test-data/example-0.1-1.dsc'):
ex_pkg = ExamplePackage() ex_pkg = ExamplePackage()
@ -67,7 +68,7 @@ class DscVerificationTestCase(mox.MoxTestBase, unittest.TestCase):
fn = 'test-data/example_1.0.orig.tar.gz' fn = 'test-data/example_1.0.orig.tar.gz'
with open(fn, 'rb') as f: with open(fn, 'rb') as f:
data = f.read() data = f.read()
data = data[:-1] + chr(ord(data[-1]) ^ 8) data = data[:-1] + chr(ord(data[-1]) ^ 8)
self.mox.StubOutWithMock(__builtin__, 'open') self.mox.StubOutWithMock(__builtin__, 'open')
open(fn, 'rb').AndReturn(StringIO.StringIO(data)) open(fn, 'rb').AndReturn(StringIO.StringIO(data))
self.mox.ReplayAll() self.mox.ReplayAll()
@ -95,9 +96,6 @@ class LocalSourcePackageTestCase(mox.MoxTestBase, unittest.TestCase):
self.mox.StubOutWithMock(ubuntutools.archive, 'Distribution') self.mox.StubOutWithMock(ubuntutools.archive, 'Distribution')
self.mox.StubOutWithMock(ubuntutools.archive, 'rmadison') self.mox.StubOutWithMock(ubuntutools.archive, 'rmadison')
self.real_urlopen = urllib2.urlopen
self.mox.StubOutWithMock(urllib2, 'urlopen')
self.real_http = httplib2.Http() self.real_http = httplib2.Http()
self.mox.StubOutWithMock(httplib2, 'Http') self.mox.StubOutWithMock(httplib2, 'Http')
self.mock_http = self.mox.CreateMock(httplib2.Http) self.mock_http = self.mox.CreateMock(httplib2.Http)
@ -115,7 +113,7 @@ class LocalSourcePackageTestCase(mox.MoxTestBase, unittest.TestCase):
if destname is None: if destname is None:
destname = os.path.basename(url) destname = os.path.basename(url)
destpath = os.path.join(os.path.abspath('test-data'), destname) 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): def urlopen_file(self, filename):
"Wrapper for urlopen_proxy for named files" "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/' self.mock_http.request('https://launchpad.net/%s/+archive/primary/'
'+files/example_1.0-1.dsc' % dist '+files/example_1.0-1.dsc' % dist
).WithSideEffects(self.request_proxy) ).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) ).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) ).WithSideEffects(self.urlopen_proxy)
self.mox.ReplayAll() self.mox.ReplayAll()
pkg = self.SourcePackage('example', '1.0-1', 'main', pkg = self.SourcePackage('example', '1.0-1', 'main',
workdir=self.workdir) workdir=self.workdir)
pkg.url_opener = url_opener
pkg.pull() pkg.pull()
def test_mirrors(self): def test_mirrors(self):
@ -213,18 +213,20 @@ class LocalSourcePackageTestCase(mox.MoxTestBase, unittest.TestCase):
httplib2.Http().AndReturn(self.mock_http) httplib2.Http().AndReturn(self.mock_http)
self.mock_http.request(lpbase + 'example_1.0-1.dsc' self.mock_http.request(lpbase + 'example_1.0-1.dsc'
).WithSideEffects(self.request_proxy) ).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) ).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) ).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) ).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) ).WithSideEffects(self.urlopen_proxy)
self.mox.ReplayAll() self.mox.ReplayAll()
pkg = self.SourcePackage('example', '1.0-1', 'main', pkg = self.SourcePackage('example', '1.0-1', 'main',
workdir=self.workdir, mirrors=[mirror]) workdir=self.workdir, mirrors=[mirror])
pkg.url_opener = url_opener
pkg.pull() pkg.pull()
def test_dsc_missing(self): def test_dsc_missing(self):
@ -253,31 +255,33 @@ class DebianLocalSourcePackageTestCase(LocalSourcePackageTestCase):
httplib2.Http().AndReturn(self.mock_http) httplib2.Http().AndReturn(self.mock_http)
self.mock_http.request(lpbase + 'example_1.0-1.dsc' self.mock_http.request(lpbase + 'example_1.0-1.dsc'
).WithSideEffects(self.request_proxy) ).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) ).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) ).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) ).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) ).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) ).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' 'srcfiles?fileinfo=1'
).WithSideEffects(lambda x: StringIO.StringIO( ).WithSideEffects(lambda x: StringIO.StringIO(
'{"fileinfo": {"hashabc": [{"name": "example_1.0.orig.tar.gz"}]}}' '{"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( ).WithSideEffects(self.urlopen_file(
'example_1.0.orig.tar.gz')) '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) ).WithSideEffects(self.urlopen_proxy)
self.mox.ReplayAll() self.mox.ReplayAll()
pkg = self.SourcePackage('example', '1.0-1', 'main', pkg = self.SourcePackage('example', '1.0-1', 'main',
workdir=self.workdir, mirrors=[debian_mirror, workdir=self.workdir, mirrors=[debian_mirror,
debsec_mirror]) debsec_mirror])
pkg.url_opener = url_opener
pkg.pull() pkg.pull()
pkg.unpack() pkg.unpack()
@ -291,9 +295,10 @@ class DebianLocalSourcePackageTestCase(LocalSourcePackageTestCase):
httplib2.Http().AndReturn(self.mock_http) httplib2.Http().AndReturn(self.mock_http)
self.mock_http.request(mirror + base + 'example_1.0-1.dsc' self.mock_http.request(mirror + base + 'example_1.0-1.dsc'
).WithSideEffects(self.request_proxy) ).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) ).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) ).WithSideEffects(self.urlopen_proxy)
def fake_gpg_info(self, message, keyrings=None): def fake_gpg_info(self, message, keyrings=None):
@ -312,6 +317,7 @@ class DebianLocalSourcePackageTestCase(LocalSourcePackageTestCase):
pkg = self.SourcePackage('example', '1.0-1', 'main', pkg = self.SourcePackage('example', '1.0-1', 'main',
workdir=self.workdir, mirrors=[mirror]) workdir=self.workdir, mirrors=[mirror])
pkg.url_opener = url_opener
pkg.pull() pkg.pull()
def test_dsc_badsig(self): def test_dsc_badsig(self):