Merge lp:~xnox/ubuntu-dev-tools/drop-mox into lp:~ubuntu-dev/ubuntu-dev-tools/trunk

Proposed by Dimitri John Ledkov
Status: Merged
Merge reported by: Daniel Holbach
Merged at revision: not available
Proposed branch: lp:~xnox/ubuntu-dev-tools/drop-mox
Merge into: lp:~ubuntu-dev/ubuntu-dev-tools/trunk
Diff against target: 403 lines (+89/-135)
5 files modified
debian/control (+0/-1)
ubuntutools/test/test_archive.py (+68/-122)
ubuntutools/test/test_config.py (+10/-4)
ubuntutools/test/test_pylint.py (+0/-3)
ubuntutools/test/test_update_maintainer.py (+11/-5)
To merge this branch: bzr merge lp:~xnox/ubuntu-dev-tools/drop-mox
Reviewer Review Type Date Requested Status
Stefano Rivera Pending
Ubuntu Development Team Pending
Review via email: mp+244832@code.launchpad.net

Description of the change

Drop mox.

mox is not ported to python3, everything else is.

This is mostly equivalent, however, I do not assert call counts / call list of mocks. If this is critical, let me know and I can expand the tests to include that.

To post a comment you must log in.
Revision history for this message
Daniel Holbach (dholbach) wrote :

This appears to have been merged already.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'debian/control'
--- debian/control 2014-01-06 21:48:08 +0000
+++ debian/control 2014-12-16 09:17:30 +0000
@@ -19,7 +19,6 @@
19 python-distro-info (>= 0.4~),19 python-distro-info (>= 0.4~),
20 python-httplib2,20 python-httplib2,
21 python-launchpadlib (>= 1.5.7),21 python-launchpadlib (>= 1.5.7),
22 python-mox,
23 python-setuptools,22 python-setuptools,
24 python-soappy,23 python-soappy,
25 python-unittest224 python-unittest2
2625
=== modified file 'ubuntutools/test/test_archive.py'
--- ubuntutools/test/test_archive.py 2014-02-25 20:46:10 +0000
+++ ubuntutools/test/test_archive.py 2014-12-16 09:17:30 +0000
@@ -20,13 +20,14 @@
20import os.path20import os.path
21import shutil21import shutil
22import StringIO22import StringIO
23from io import BytesIO
23import tempfile24import tempfile
24import types25import types
25import urllib226import urllib2
2627
27import debian.deb82228import debian.deb822
28import httplib229import httplib2
29import mox30import mock
3031
31import ubuntutools.archive32import ubuntutools.archive
32from ubuntutools.config import UDTConfig33from ubuntutools.config import UDTConfig
@@ -44,15 +45,11 @@
44 ex_pkg.cleanup()45 ex_pkg.cleanup()
4546
4647
47class DscVerificationTestCase(mox.MoxTestBase, unittest.TestCase):48class DscVerificationTestCase(unittest.TestCase):
48 def setUp(self):49 def setUp(self):
49 super(DscVerificationTestCase, self).setUp()
50 with open('test-data/example_1.0-1.dsc', 'rb') as f:50 with open('test-data/example_1.0-1.dsc', 'rb') as f:
51 self.dsc = ubuntutools.archive.Dsc(f.read())51 self.dsc = ubuntutools.archive.Dsc(f.read())
5252
53 def tearDown(self):
54 super(DscVerificationTestCase, self).tearDown()
55
56 def test_good(self):53 def test_good(self):
57 self.assertTrue(self.dsc.verify_file(54 self.assertTrue(self.dsc.verify_file(
58 'test-data/example_1.0.orig.tar.gz'))55 'test-data/example_1.0.orig.tar.gz'))
@@ -68,10 +65,10 @@
68 with open(fn, 'rb') as f:65 with open(fn, 'rb') as f:
69 data = f.read()66 data = f.read()
70 data = data[:-1] + chr(ord(data[-1]) ^ 8)67 data = data[:-1] + chr(ord(data[-1]) ^ 8)
71 self.mox.StubOutWithMock(__builtin__, 'open')68 m = mock.MagicMock(name='open', spec=open)
72 open(fn, 'rb').AndReturn(StringIO.StringIO(data))69 m.return_value = BytesIO(data)
73 self.mox.ReplayAll()70 with mock.patch('__builtin__.open', m):
74 self.assertFalse(self.dsc.verify_file(fn))71 self.assertFalse(self.dsc.verify_file(fn))
7572
76 def test_sha1(self):73 def test_sha1(self):
77 del self.dsc['Checksums-Sha256']74 del self.dsc['Checksums-Sha256']
@@ -85,26 +82,31 @@
85 self.test_bad()82 self.test_bad()
8683
8784
88class LocalSourcePackageTestCase(mox.MoxTestBase, unittest.TestCase):85class LocalSourcePackageTestCase(unittest.TestCase):
89 SourcePackage = ubuntutools.archive.UbuntuSourcePackage86 SourcePackage = ubuntutools.archive.UbuntuSourcePackage
9087
91 def setUp(self):88 def setUp(self):
92 super(LocalSourcePackageTestCase, self).setUp()
93 self.workdir = tempfile.mkdtemp(prefix='udt-test')89 self.workdir = tempfile.mkdtemp(prefix='udt-test')
9490
95 self.mox.StubOutWithMock(ubuntutools.archive, 'Distribution')91 self._stubout('ubuntutools.archive.Distribution')
96 self.mox.StubOutWithMock(ubuntutools.archive, 'rmadison')92 self._stubout('ubuntutools.archive.rmadison')
9793
98 self.real_http = httplib2.Http()94 self.mock_http = self._stubout('httplib2.Http.request')
99 self.mox.StubOutWithMock(httplib2, 'Http')95 self.mock_http.side_effect = self.request_proxy
100 self.mock_http = self.mox.CreateMock(httplib2.Http)96
97 self.url_opener = mock.MagicMock(spec=urllib2.OpenerDirector)
98 self.url_opener.open.side_effect = self.urlopen_proxy
10199
102 # Silence the tests a little:100 # Silence the tests a little:
103 self.mox.stubs.Set(Logger, 'stdout', StringIO.StringIO())101 self._stubout('ubuntutools.logger.Logger.stdout')
104 self.mox.stubs.Set(Logger, 'stderr', StringIO.StringIO())102 self._stubout('ubuntutools.logger.Logger.stderr')
103
104 def _stubout(self, stub):
105 patcher = mock.patch(stub)
106 self.addCleanup(patcher.stop)
107 return patcher.start()
105108
106 def tearDown(self):109 def tearDown(self):
107 super(LocalSourcePackageTestCase, self).tearDown()
108 shutil.rmtree(self.workdir)110 shutil.rmtree(self.workdir)
109111
110 def urlopen_proxy(self, url, destname=None):112 def urlopen_proxy(self, url, destname=None):
@@ -141,6 +143,12 @@
141 response = httplib2.Response({'status': 404})143 response = httplib2.Response({'status': 404})
142 return response, "I'm a 404 Error"144 return response, "I'm a 404 Error"
143145
146 def request_404_then_proxy(self, url, destname=None):
147 "mock side_effect callable to chain request 404 & proxy"
148 if self.mock_http.called:
149 return self.request_proxy(url, destname)
150 return self.request_404(url)
151
144 def test_local_copy(self):152 def test_local_copy(self):
145 pkg = self.SourcePackage('example', '1.0-1', 'main',153 pkg = self.SourcePackage('example', '1.0-1', 'main',
146 dscfile='test-data/example_1.0-1.dsc',154 dscfile='test-data/example_1.0-1.dsc',
@@ -188,20 +196,11 @@
188 dist = self.SourcePackage.distribution196 dist = self.SourcePackage.distribution
189 mirror = UDTConfig.defaults['%s_MIRROR' % dist.upper()]197 mirror = UDTConfig.defaults['%s_MIRROR' % dist.upper()]
190 urlbase = '/pool/main/e/example/'198 urlbase = '/pool/main/e/example/'
191 httplib2.Http().AndReturn(self.mock_http)
192 self.mock_http.request('https://launchpad.net/%s/+archive/primary/'
193 '+files/example_1.0-1.dsc' % dist
194 ).WithSideEffects(self.request_proxy)
195 url_opener = self.mox.CreateMock(urllib2.OpenerDirector)
196 url_opener.open(mirror + urlbase + 'example_1.0.orig.tar.gz'
197 ).WithSideEffects(self.urlopen_proxy)
198 url_opener.open(mirror + urlbase + 'example_1.0-1.debian.tar.xz'
199 ).WithSideEffects(self.urlopen_proxy)
200 self.mox.ReplayAll()
201199
202 pkg = self.SourcePackage('example', '1.0-1', 'main',200 pkg = self.SourcePackage('example', '1.0-1', 'main',
203 workdir=self.workdir)201 workdir=self.workdir)
204 pkg.url_opener = url_opener202
203 pkg.url_opener = self.url_opener
205 pkg.pull()204 pkg.pull()
206205
207 def test_mirrors(self):206 def test_mirrors(self):
@@ -209,19 +208,12 @@
209 mirror = 'http://mirror'208 mirror = 'http://mirror'
210 lpbase = 'https://launchpad.net/ubuntu/+archive/primary/+files/'209 lpbase = 'https://launchpad.net/ubuntu/+archive/primary/+files/'
211 urlbase = '/pool/main/e/example/'210 urlbase = '/pool/main/e/example/'
212 httplib2.Http().AndReturn(self.mock_http)211 sequence = [self.urlopen_null, self.urlopen_404, self.urlopen_proxy,
213 self.mock_http.request(lpbase + 'example_1.0-1.dsc'212 self.urlopen_proxy]
214 ).WithSideEffects(self.request_proxy)213 def _callable_iter(*args, **kwargs):
215 url_opener = self.mox.CreateMock(urllib2.OpenerDirector)214 return sequence.pop(0)(*args, **kwargs)
216 url_opener.open(mirror + urlbase + 'example_1.0.orig.tar.gz'215 url_opener = mock.MagicMock(spec=urllib2.OpenerDirector)
217 ).WithSideEffects(self.urlopen_null)216 url_opener.open.side_effect = _callable_iter
218 url_opener.open(master + urlbase + 'example_1.0.orig.tar.gz'
219 ).WithSideEffects(self.urlopen_404)
220 url_opener.open(lpbase + 'example_1.0.orig.tar.gz'
221 ).WithSideEffects(self.urlopen_proxy)
222 url_opener.open(mirror + urlbase + 'example_1.0-1.debian.tar.xz'
223 ).WithSideEffects(self.urlopen_proxy)
224 self.mox.ReplayAll()
225217
226 pkg = self.SourcePackage('example', '1.0-1', 'main',218 pkg = self.SourcePackage('example', '1.0-1', 'main',
227 workdir=self.workdir, mirrors=[mirror])219 workdir=self.workdir, mirrors=[mirror])
@@ -229,12 +221,7 @@
229 pkg.pull()221 pkg.pull()
230222
231 def test_dsc_missing(self):223 def test_dsc_missing(self):
232 lpbase = 'https://launchpad.net/ubuntu/+archive/primary/+files/'224 self.mock_http.side_effect = self.request_404
233 httplib2.Http().AndReturn(self.mock_http)
234 self.mock_http.request(lpbase + 'example_1.0-1.dsc'
235 ).WithSideEffects(self.request_404)
236 self.mox.ReplayAll()
237
238 pkg = self.SourcePackage('example', '1.0-1', 'main',225 pkg = self.SourcePackage('example', '1.0-1', 'main',
239 workdir=self.workdir)226 workdir=self.workdir)
240 self.assertRaises(ubuntutools.archive.DownloadError, pkg.pull)227 self.assertRaises(ubuntutools.archive.DownloadError, pkg.pull)
@@ -251,31 +238,19 @@
251 lpbase = 'https://launchpad.net/debian/+archive/primary/+files/'238 lpbase = 'https://launchpad.net/debian/+archive/primary/+files/'
252 base = '/pool/main/e/example/'239 base = '/pool/main/e/example/'
253240
254 httplib2.Http().AndReturn(self.mock_http)241 sequence = [self.urlopen_null,
255 self.mock_http.request(lpbase + 'example_1.0-1.dsc'242 self.urlopen_404,
256 ).WithSideEffects(self.request_proxy)243 self.urlopen_404,
257 url_opener = self.mox.CreateMock(urllib2.OpenerDirector)244 self.urlopen_404,
258 url_opener.open(debian_mirror + base + 'example_1.0.orig.tar.gz'245 self.urlopen_404,
259 ).WithSideEffects(self.urlopen_null)246 lambda x: BytesIO(
260 url_opener.open(debsec_mirror + base + 'example_1.0.orig.tar.gz'247 '{"fileinfo": {"hashabc": [{"name": "example_1.0.orig.tar.gz"}]}}'),
261 ).WithSideEffects(self.urlopen_404)248 self.urlopen_file('example_1.0.orig.tar.gz'),
262 url_opener.open(debian_master + base + 'example_1.0.orig.tar.gz'249 self.urlopen_proxy]
263 ).WithSideEffects(self.urlopen_404)250 def _callable_iter(*args, **kwargs):
264 url_opener.open(debsec_master + base + 'example_1.0.orig.tar.gz'251 return sequence.pop(0)(*args, **kwargs)
265 ).WithSideEffects(self.urlopen_404)252 url_opener = mock.MagicMock(spec=urllib2.OpenerDirector)
266 url_opener.open(lpbase + 'example_1.0.orig.tar.gz'253 url_opener.open.side_effect = _callable_iter
267 ).WithSideEffects(self.urlopen_404)
268 url_opener.open('http://snapshot.debian.org/mr/package/example/1.0-1/'
269 'srcfiles?fileinfo=1'
270 ).WithSideEffects(lambda x: StringIO.StringIO(
271 '{"fileinfo": {"hashabc": [{"name": "example_1.0.orig.tar.gz"}]}}'
272 ))
273 url_opener.open('http://snapshot.debian.org/file/hashabc'
274 ).WithSideEffects(self.urlopen_file(
275 'example_1.0.orig.tar.gz'))
276 url_opener.open(debian_mirror + base + 'example_1.0-1.debian.tar.xz'
277 ).WithSideEffects(self.urlopen_proxy)
278 self.mox.ReplayAll()
279254
280 pkg = self.SourcePackage('example', '1.0-1', 'main',255 pkg = self.SourcePackage('example', '1.0-1', 'main',
281 workdir=self.workdir, mirrors=[debian_mirror,256 workdir=self.workdir, mirrors=[debian_mirror,
@@ -288,61 +263,32 @@
288 mirror = 'http://mirror'263 mirror = 'http://mirror'
289 lpbase = 'https://launchpad.net/debian/+archive/primary/+files/'264 lpbase = 'https://launchpad.net/debian/+archive/primary/+files/'
290 base = '/pool/main/e/example/'265 base = '/pool/main/e/example/'
291 httplib2.Http().AndReturn(self.mock_http)266 self.mock_http.side_effect = self.request_404_then_proxy
292 self.mock_http.request(lpbase + 'example_1.0-1.dsc'267
293 ).WithSideEffects(self.request_404)268 patcher = mock.patch.object(debian.deb822.GpgInfo, 'from_sequence')
294 httplib2.Http().AndReturn(self.mock_http)269 self.addCleanup(patcher.stop)
295 self.mock_http.request(mirror + base + 'example_1.0-1.dsc'270 mock_gpg_info = patcher.start()
296 ).WithSideEffects(self.request_proxy)271 mock_gpg_info.return_value = debian.deb822.GpgInfo.from_output(
297 url_opener = self.mox.CreateMock(urllib2.OpenerDirector)272 '[GNUPG:] GOODSIG DEADBEEF Joe Developer '
298 url_opener.open(mirror + base + 'example_1.0.orig.tar.gz'273 '<joe@example.net>')
299 ).WithSideEffects(self.urlopen_proxy)
300 url_opener.open(mirror + base + 'example_1.0-1.debian.tar.xz'
301 ).WithSideEffects(self.urlopen_proxy)
302
303 def fake_gpg_info(self, message, keyrings=None):
304 return debian.deb822.GpgInfo.from_output(
305 '[GNUPG:] GOODSIG DEADBEEF Joe Developer '
306 '<joe@example.net>')
307 # We have to stub this out without mox because there some versions of
308 # python-debian will pass keyrings=None, others won't.
309 # http://code.google.com/p/pymox/issues/detail?id=37
310 self.mox.stubs.Set(debian.deb822.GpgInfo, 'from_sequence',
311 types.MethodType(fake_gpg_info,
312 debian.deb822.GpgInfo,
313 debian.deb822.GpgInfo))
314
315 self.mox.ReplayAll()
316274
317 pkg = self.SourcePackage('example', '1.0-1', 'main',275 pkg = self.SourcePackage('example', '1.0-1', 'main',
318 workdir=self.workdir, mirrors=[mirror])276 workdir=self.workdir, mirrors=[mirror])
319 pkg.url_opener = url_opener277 pkg.url_opener = self.url_opener
320 pkg.pull()278 pkg.pull()
321279
322 def test_dsc_badsig(self):280 def test_dsc_badsig(self):
323 mirror = 'http://mirror'281 mirror = 'http://mirror'
324 lpbase = 'https://launchpad.net/debian/+archive/primary/+files/'282 lpbase = 'https://launchpad.net/debian/+archive/primary/+files/'
325 base = '/pool/main/e/example/'283 base = '/pool/main/e/example/'
326 httplib2.Http().AndReturn(self.mock_http)284 self.mock_http.side_effect = self.request_404_then_proxy
327 self.mock_http.request(lpbase + 'example_1.0-1.dsc'285
328 ).WithSideEffects(self.request_404)286 patcher = mock.patch.object(debian.deb822.GpgInfo, 'from_sequence')
329 httplib2.Http().AndReturn(self.mock_http)287 self.addCleanup(patcher.stop)
330 self.mock_http.request(mirror + base + 'example_1.0-1.dsc'288 mock_gpg_info = patcher.start()
331 ).WithSideEffects(self.request_proxy)289 mock_gpg_info.return_value = debian.deb822.GpgInfo.from_output(
332290 '[GNUPG:] ERRSIG DEADBEEF')
333 def fake_gpg_info(self, message, keyrings=None):291
334 return debian.deb822.GpgInfo.from_output(
335 '[GNUPG:] ERRSIG DEADBEEF')
336 # We have to stub this out without mox because there some versions of
337 # python-debian will pass keyrings=None, others won't.
338 # http://code.google.com/p/pymox/issues/detail?id=37
339 self.mox.stubs.Set(debian.deb822.GpgInfo, 'from_sequence',
340 types.MethodType(fake_gpg_info,
341 debian.deb822.GpgInfo,
342 debian.deb822.GpgInfo))
343
344 self.mox.ReplayAll()
345
346 pkg = self.SourcePackage('example', '1.0-1', 'main',292 pkg = self.SourcePackage('example', '1.0-1', 'main',
347 workdir=self.workdir, mirrors=[mirror])293 workdir=self.workdir, mirrors=[mirror])
348 self.assertRaises(ubuntutools.archive.DownloadError, pkg.pull)294 self.assertRaises(ubuntutools.archive.DownloadError, pkg.pull)
349295
=== modified file 'ubuntutools/test/test_config.py'
--- ubuntutools/test/test_config.py 2013-05-15 00:18:50 +0000
+++ ubuntutools/test/test_config.py 2014-12-16 09:17:30 +0000
@@ -19,15 +19,16 @@
19import os19import os
20import sys20import sys
21import locale21import locale
22from io import BytesIO
22from StringIO import StringIO23from StringIO import StringIO
2324
24import mox25import mock
2526
26from ubuntutools.config import UDTConfig, ubu_email27from ubuntutools.config import UDTConfig, ubu_email
27from ubuntutools.logger import Logger28from ubuntutools.logger import Logger
28from ubuntutools.test import unittest29from ubuntutools.test import unittest
2930
30class ConfigTestCase(mox.MoxTestBase, unittest.TestCase):31class ConfigTestCase(unittest.TestCase):
31 _config_files = {32 _config_files = {
32 'system': '',33 'system': '',
33 'user': '',34 'user': '',
@@ -42,11 +43,16 @@
42 }43 }
43 if filename not in files:44 if filename not in files:
44 raise IOError("No such file or directory: '%s'" % filename)45 raise IOError("No such file or directory: '%s'" % filename)
45 return StringIO(files[filename])46 return BytesIO(files[filename])
4647
47 def setUp(self):48 def setUp(self):
48 super(ConfigTestCase, self).setUp()49 super(ConfigTestCase, self).setUp()
49 self.mox.stubs.Set(__builtin__, 'open', self._fake_open)50 m = mock.mock_open()
51 m.side_effect = self._fake_open
52 patcher = mock.patch('__builtin__.open', m)
53 self.addCleanup(patcher.stop)
54 patcher.start()
55
50 Logger.stdout = StringIO()56 Logger.stdout = StringIO()
51 Logger.stderr = StringIO()57 Logger.stderr = StringIO()
5258
5359
=== modified file 'ubuntutools/test/test_pylint.py'
--- ubuntutools/test/test_pylint.py 2011-06-24 14:32:07 +0000
+++ ubuntutools/test/test_pylint.py 2014-12-16 09:17:30 +0000
@@ -25,9 +25,6 @@
25 r"No name '\w+Error' in module 'launchpadlib\.errors'",25 r"No name '\w+Error' in module 'launchpadlib\.errors'",
26 # http://www.logilab.org/ticket/51250:26 # http://www.logilab.org/ticket/51250:
27 r"Module 'hashlib' has no '(md5|sha(1|224|256|384|512))' member",27 r"Module 'hashlib' has no '(md5|sha(1|224|256|384|512))' member",
28 # mox:
29 r"Instance of '.+' has no '(WithSideEffects|MultipleTimes|AndReturn)' "
30 r"member",
31 # pylint doesn't like *args/**kwargs28 # pylint doesn't like *args/**kwargs
32 r"Instance of 'Popen' has no '.*' member",29 r"Instance of 'Popen' has no '.*' member",
33)]30)]
3431
=== modified file 'ubuntutools/test/test_update_maintainer.py'
--- ubuntutools/test/test_update_maintainer.py 2013-03-18 23:18:02 +0000
+++ ubuntutools/test/test_update_maintainer.py 2014-12-16 09:17:30 +0000
@@ -21,7 +21,7 @@
21import StringIO21import StringIO
22import sys22import sys
2323
24import mox24import mock
2525
26from ubuntutools.logger import Logger26from ubuntutools.logger import Logger
27from ubuntutools.test import unittest27from ubuntutools.test import unittest
@@ -186,7 +186,7 @@
186"""186"""
187187
188#pylint: disable=R0904188#pylint: disable=R0904
189class UpdateMaintainerTestCase(mox.MoxTestBase, unittest.TestCase):189class UpdateMaintainerTestCase(unittest.TestCase):
190 """TestCase object for ubuntutools.update_maintainer"""190 """TestCase object for ubuntutools.update_maintainer"""
191191
192 _directory = "/"192 _directory = "/"
@@ -216,9 +216,15 @@
216216
217 #pylint: disable=C0103217 #pylint: disable=C0103
218 def setUp(self):218 def setUp(self):
219 super(UpdateMaintainerTestCase, self).setUp()219 m = mock.mock_open()
220 self.mox.stubs.Set(__builtin__, 'open', self._fake_open)220 m.side_effect = self._fake_open
221 self.mox.stubs.Set(os.path, 'isfile', self._fake_isfile)221 patcher = mock.patch('__builtin__.open', m)
222 self.addCleanup(patcher.stop)
223 patcher.start()
224 m = mock.MagicMock(side_effect=self._fake_isfile)
225 patcher = mock.patch('os.path.isfile', m)
226 self.addCleanup(patcher.stop)
227 patcher.start()
222 self._files["rules"] = StringIO.StringIO(_SIMPLE_RULES)228 self._files["rules"] = StringIO.StringIO(_SIMPLE_RULES)
223 Logger.stdout = StringIO.StringIO()229 Logger.stdout = StringIO.StringIO()
224 Logger.stderr = StringIO.StringIO()230 Logger.stderr = StringIO.StringIO()