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
1=== modified file 'debian/control'
2--- debian/control 2014-01-06 21:48:08 +0000
3+++ debian/control 2014-12-16 09:17:30 +0000
4@@ -19,7 +19,6 @@
5 python-distro-info (>= 0.4~),
6 python-httplib2,
7 python-launchpadlib (>= 1.5.7),
8- python-mox,
9 python-setuptools,
10 python-soappy,
11 python-unittest2
12
13=== modified file 'ubuntutools/test/test_archive.py'
14--- ubuntutools/test/test_archive.py 2014-02-25 20:46:10 +0000
15+++ ubuntutools/test/test_archive.py 2014-12-16 09:17:30 +0000
16@@ -20,13 +20,14 @@
17 import os.path
18 import shutil
19 import StringIO
20+from io import BytesIO
21 import tempfile
22 import types
23 import urllib2
24
25 import debian.deb822
26 import httplib2
27-import mox
28+import mock
29
30 import ubuntutools.archive
31 from ubuntutools.config import UDTConfig
32@@ -44,15 +45,11 @@
33 ex_pkg.cleanup()
34
35
36-class DscVerificationTestCase(mox.MoxTestBase, unittest.TestCase):
37+class DscVerificationTestCase(unittest.TestCase):
38 def setUp(self):
39- super(DscVerificationTestCase, self).setUp()
40 with open('test-data/example_1.0-1.dsc', 'rb') as f:
41 self.dsc = ubuntutools.archive.Dsc(f.read())
42
43- def tearDown(self):
44- super(DscVerificationTestCase, self).tearDown()
45-
46 def test_good(self):
47 self.assertTrue(self.dsc.verify_file(
48 'test-data/example_1.0.orig.tar.gz'))
49@@ -68,10 +65,10 @@
50 with open(fn, 'rb') as f:
51 data = f.read()
52 data = data[:-1] + chr(ord(data[-1]) ^ 8)
53- self.mox.StubOutWithMock(__builtin__, 'open')
54- open(fn, 'rb').AndReturn(StringIO.StringIO(data))
55- self.mox.ReplayAll()
56- self.assertFalse(self.dsc.verify_file(fn))
57+ m = mock.MagicMock(name='open', spec=open)
58+ m.return_value = BytesIO(data)
59+ with mock.patch('__builtin__.open', m):
60+ self.assertFalse(self.dsc.verify_file(fn))
61
62 def test_sha1(self):
63 del self.dsc['Checksums-Sha256']
64@@ -85,26 +82,31 @@
65 self.test_bad()
66
67
68-class LocalSourcePackageTestCase(mox.MoxTestBase, unittest.TestCase):
69+class LocalSourcePackageTestCase(unittest.TestCase):
70 SourcePackage = ubuntutools.archive.UbuntuSourcePackage
71
72 def setUp(self):
73- super(LocalSourcePackageTestCase, self).setUp()
74 self.workdir = tempfile.mkdtemp(prefix='udt-test')
75
76- self.mox.StubOutWithMock(ubuntutools.archive, 'Distribution')
77- self.mox.StubOutWithMock(ubuntutools.archive, 'rmadison')
78-
79- self.real_http = httplib2.Http()
80- self.mox.StubOutWithMock(httplib2, 'Http')
81- self.mock_http = self.mox.CreateMock(httplib2.Http)
82+ self._stubout('ubuntutools.archive.Distribution')
83+ self._stubout('ubuntutools.archive.rmadison')
84+
85+ self.mock_http = self._stubout('httplib2.Http.request')
86+ self.mock_http.side_effect = self.request_proxy
87+
88+ self.url_opener = mock.MagicMock(spec=urllib2.OpenerDirector)
89+ self.url_opener.open.side_effect = self.urlopen_proxy
90
91 # Silence the tests a little:
92- self.mox.stubs.Set(Logger, 'stdout', StringIO.StringIO())
93- self.mox.stubs.Set(Logger, 'stderr', StringIO.StringIO())
94+ self._stubout('ubuntutools.logger.Logger.stdout')
95+ self._stubout('ubuntutools.logger.Logger.stderr')
96+
97+ def _stubout(self, stub):
98+ patcher = mock.patch(stub)
99+ self.addCleanup(patcher.stop)
100+ return patcher.start()
101
102 def tearDown(self):
103- super(LocalSourcePackageTestCase, self).tearDown()
104 shutil.rmtree(self.workdir)
105
106 def urlopen_proxy(self, url, destname=None):
107@@ -141,6 +143,12 @@
108 response = httplib2.Response({'status': 404})
109 return response, "I'm a 404 Error"
110
111+ def request_404_then_proxy(self, url, destname=None):
112+ "mock side_effect callable to chain request 404 & proxy"
113+ if self.mock_http.called:
114+ return self.request_proxy(url, destname)
115+ return self.request_404(url)
116+
117 def test_local_copy(self):
118 pkg = self.SourcePackage('example', '1.0-1', 'main',
119 dscfile='test-data/example_1.0-1.dsc',
120@@ -188,20 +196,11 @@
121 dist = self.SourcePackage.distribution
122 mirror = UDTConfig.defaults['%s_MIRROR' % dist.upper()]
123 urlbase = '/pool/main/e/example/'
124- httplib2.Http().AndReturn(self.mock_http)
125- self.mock_http.request('https://launchpad.net/%s/+archive/primary/'
126- '+files/example_1.0-1.dsc' % dist
127- ).WithSideEffects(self.request_proxy)
128- url_opener = self.mox.CreateMock(urllib2.OpenerDirector)
129- url_opener.open(mirror + urlbase + 'example_1.0.orig.tar.gz'
130- ).WithSideEffects(self.urlopen_proxy)
131- url_opener.open(mirror + urlbase + 'example_1.0-1.debian.tar.xz'
132- ).WithSideEffects(self.urlopen_proxy)
133- self.mox.ReplayAll()
134
135 pkg = self.SourcePackage('example', '1.0-1', 'main',
136 workdir=self.workdir)
137- pkg.url_opener = url_opener
138+
139+ pkg.url_opener = self.url_opener
140 pkg.pull()
141
142 def test_mirrors(self):
143@@ -209,19 +208,12 @@
144 mirror = 'http://mirror'
145 lpbase = 'https://launchpad.net/ubuntu/+archive/primary/+files/'
146 urlbase = '/pool/main/e/example/'
147- httplib2.Http().AndReturn(self.mock_http)
148- self.mock_http.request(lpbase + 'example_1.0-1.dsc'
149- ).WithSideEffects(self.request_proxy)
150- url_opener = self.mox.CreateMock(urllib2.OpenerDirector)
151- url_opener.open(mirror + urlbase + 'example_1.0.orig.tar.gz'
152- ).WithSideEffects(self.urlopen_null)
153- url_opener.open(master + urlbase + 'example_1.0.orig.tar.gz'
154- ).WithSideEffects(self.urlopen_404)
155- url_opener.open(lpbase + 'example_1.0.orig.tar.gz'
156- ).WithSideEffects(self.urlopen_proxy)
157- url_opener.open(mirror + urlbase + 'example_1.0-1.debian.tar.xz'
158- ).WithSideEffects(self.urlopen_proxy)
159- self.mox.ReplayAll()
160+ sequence = [self.urlopen_null, self.urlopen_404, self.urlopen_proxy,
161+ self.urlopen_proxy]
162+ def _callable_iter(*args, **kwargs):
163+ return sequence.pop(0)(*args, **kwargs)
164+ url_opener = mock.MagicMock(spec=urllib2.OpenerDirector)
165+ url_opener.open.side_effect = _callable_iter
166
167 pkg = self.SourcePackage('example', '1.0-1', 'main',
168 workdir=self.workdir, mirrors=[mirror])
169@@ -229,12 +221,7 @@
170 pkg.pull()
171
172 def test_dsc_missing(self):
173- lpbase = 'https://launchpad.net/ubuntu/+archive/primary/+files/'
174- httplib2.Http().AndReturn(self.mock_http)
175- self.mock_http.request(lpbase + 'example_1.0-1.dsc'
176- ).WithSideEffects(self.request_404)
177- self.mox.ReplayAll()
178-
179+ self.mock_http.side_effect = self.request_404
180 pkg = self.SourcePackage('example', '1.0-1', 'main',
181 workdir=self.workdir)
182 self.assertRaises(ubuntutools.archive.DownloadError, pkg.pull)
183@@ -251,31 +238,19 @@
184 lpbase = 'https://launchpad.net/debian/+archive/primary/+files/'
185 base = '/pool/main/e/example/'
186
187- httplib2.Http().AndReturn(self.mock_http)
188- self.mock_http.request(lpbase + 'example_1.0-1.dsc'
189- ).WithSideEffects(self.request_proxy)
190- url_opener = self.mox.CreateMock(urllib2.OpenerDirector)
191- url_opener.open(debian_mirror + base + 'example_1.0.orig.tar.gz'
192- ).WithSideEffects(self.urlopen_null)
193- url_opener.open(debsec_mirror + base + 'example_1.0.orig.tar.gz'
194- ).WithSideEffects(self.urlopen_404)
195- url_opener.open(debian_master + base + 'example_1.0.orig.tar.gz'
196- ).WithSideEffects(self.urlopen_404)
197- url_opener.open(debsec_master + base + 'example_1.0.orig.tar.gz'
198- ).WithSideEffects(self.urlopen_404)
199- url_opener.open(lpbase + 'example_1.0.orig.tar.gz'
200- ).WithSideEffects(self.urlopen_404)
201- url_opener.open('http://snapshot.debian.org/mr/package/example/1.0-1/'
202- 'srcfiles?fileinfo=1'
203- ).WithSideEffects(lambda x: StringIO.StringIO(
204- '{"fileinfo": {"hashabc": [{"name": "example_1.0.orig.tar.gz"}]}}'
205- ))
206- url_opener.open('http://snapshot.debian.org/file/hashabc'
207- ).WithSideEffects(self.urlopen_file(
208- 'example_1.0.orig.tar.gz'))
209- url_opener.open(debian_mirror + base + 'example_1.0-1.debian.tar.xz'
210- ).WithSideEffects(self.urlopen_proxy)
211- self.mox.ReplayAll()
212+ sequence = [self.urlopen_null,
213+ self.urlopen_404,
214+ self.urlopen_404,
215+ self.urlopen_404,
216+ self.urlopen_404,
217+ lambda x: BytesIO(
218+ '{"fileinfo": {"hashabc": [{"name": "example_1.0.orig.tar.gz"}]}}'),
219+ self.urlopen_file('example_1.0.orig.tar.gz'),
220+ self.urlopen_proxy]
221+ def _callable_iter(*args, **kwargs):
222+ return sequence.pop(0)(*args, **kwargs)
223+ url_opener = mock.MagicMock(spec=urllib2.OpenerDirector)
224+ url_opener.open.side_effect = _callable_iter
225
226 pkg = self.SourcePackage('example', '1.0-1', 'main',
227 workdir=self.workdir, mirrors=[debian_mirror,
228@@ -288,61 +263,32 @@
229 mirror = 'http://mirror'
230 lpbase = 'https://launchpad.net/debian/+archive/primary/+files/'
231 base = '/pool/main/e/example/'
232- httplib2.Http().AndReturn(self.mock_http)
233- self.mock_http.request(lpbase + 'example_1.0-1.dsc'
234- ).WithSideEffects(self.request_404)
235- httplib2.Http().AndReturn(self.mock_http)
236- self.mock_http.request(mirror + base + 'example_1.0-1.dsc'
237- ).WithSideEffects(self.request_proxy)
238- url_opener = self.mox.CreateMock(urllib2.OpenerDirector)
239- url_opener.open(mirror + base + 'example_1.0.orig.tar.gz'
240- ).WithSideEffects(self.urlopen_proxy)
241- url_opener.open(mirror + base + 'example_1.0-1.debian.tar.xz'
242- ).WithSideEffects(self.urlopen_proxy)
243-
244- def fake_gpg_info(self, message, keyrings=None):
245- return debian.deb822.GpgInfo.from_output(
246- '[GNUPG:] GOODSIG DEADBEEF Joe Developer '
247- '<joe@example.net>')
248- # We have to stub this out without mox because there some versions of
249- # python-debian will pass keyrings=None, others won't.
250- # http://code.google.com/p/pymox/issues/detail?id=37
251- self.mox.stubs.Set(debian.deb822.GpgInfo, 'from_sequence',
252- types.MethodType(fake_gpg_info,
253- debian.deb822.GpgInfo,
254- debian.deb822.GpgInfo))
255-
256- self.mox.ReplayAll()
257+ self.mock_http.side_effect = self.request_404_then_proxy
258+
259+ patcher = mock.patch.object(debian.deb822.GpgInfo, 'from_sequence')
260+ self.addCleanup(patcher.stop)
261+ mock_gpg_info = patcher.start()
262+ mock_gpg_info.return_value = debian.deb822.GpgInfo.from_output(
263+ '[GNUPG:] GOODSIG DEADBEEF Joe Developer '
264+ '<joe@example.net>')
265
266 pkg = self.SourcePackage('example', '1.0-1', 'main',
267 workdir=self.workdir, mirrors=[mirror])
268- pkg.url_opener = url_opener
269+ pkg.url_opener = self.url_opener
270 pkg.pull()
271
272 def test_dsc_badsig(self):
273 mirror = 'http://mirror'
274 lpbase = 'https://launchpad.net/debian/+archive/primary/+files/'
275 base = '/pool/main/e/example/'
276- httplib2.Http().AndReturn(self.mock_http)
277- self.mock_http.request(lpbase + 'example_1.0-1.dsc'
278- ).WithSideEffects(self.request_404)
279- httplib2.Http().AndReturn(self.mock_http)
280- self.mock_http.request(mirror + base + 'example_1.0-1.dsc'
281- ).WithSideEffects(self.request_proxy)
282-
283- def fake_gpg_info(self, message, keyrings=None):
284- return debian.deb822.GpgInfo.from_output(
285- '[GNUPG:] ERRSIG DEADBEEF')
286- # We have to stub this out without mox because there some versions of
287- # python-debian will pass keyrings=None, others won't.
288- # http://code.google.com/p/pymox/issues/detail?id=37
289- self.mox.stubs.Set(debian.deb822.GpgInfo, 'from_sequence',
290- types.MethodType(fake_gpg_info,
291- debian.deb822.GpgInfo,
292- debian.deb822.GpgInfo))
293-
294- self.mox.ReplayAll()
295-
296+ self.mock_http.side_effect = self.request_404_then_proxy
297+
298+ patcher = mock.patch.object(debian.deb822.GpgInfo, 'from_sequence')
299+ self.addCleanup(patcher.stop)
300+ mock_gpg_info = patcher.start()
301+ mock_gpg_info.return_value = debian.deb822.GpgInfo.from_output(
302+ '[GNUPG:] ERRSIG DEADBEEF')
303+
304 pkg = self.SourcePackage('example', '1.0-1', 'main',
305 workdir=self.workdir, mirrors=[mirror])
306 self.assertRaises(ubuntutools.archive.DownloadError, pkg.pull)
307
308=== modified file 'ubuntutools/test/test_config.py'
309--- ubuntutools/test/test_config.py 2013-05-15 00:18:50 +0000
310+++ ubuntutools/test/test_config.py 2014-12-16 09:17:30 +0000
311@@ -19,15 +19,16 @@
312 import os
313 import sys
314 import locale
315+from io import BytesIO
316 from StringIO import StringIO
317
318-import mox
319+import mock
320
321 from ubuntutools.config import UDTConfig, ubu_email
322 from ubuntutools.logger import Logger
323 from ubuntutools.test import unittest
324
325-class ConfigTestCase(mox.MoxTestBase, unittest.TestCase):
326+class ConfigTestCase(unittest.TestCase):
327 _config_files = {
328 'system': '',
329 'user': '',
330@@ -42,11 +43,16 @@
331 }
332 if filename not in files:
333 raise IOError("No such file or directory: '%s'" % filename)
334- return StringIO(files[filename])
335+ return BytesIO(files[filename])
336
337 def setUp(self):
338 super(ConfigTestCase, self).setUp()
339- self.mox.stubs.Set(__builtin__, 'open', self._fake_open)
340+ m = mock.mock_open()
341+ m.side_effect = self._fake_open
342+ patcher = mock.patch('__builtin__.open', m)
343+ self.addCleanup(patcher.stop)
344+ patcher.start()
345+
346 Logger.stdout = StringIO()
347 Logger.stderr = StringIO()
348
349
350=== modified file 'ubuntutools/test/test_pylint.py'
351--- ubuntutools/test/test_pylint.py 2011-06-24 14:32:07 +0000
352+++ ubuntutools/test/test_pylint.py 2014-12-16 09:17:30 +0000
353@@ -25,9 +25,6 @@
354 r"No name '\w+Error' in module 'launchpadlib\.errors'",
355 # http://www.logilab.org/ticket/51250:
356 r"Module 'hashlib' has no '(md5|sha(1|224|256|384|512))' member",
357- # mox:
358- r"Instance of '.+' has no '(WithSideEffects|MultipleTimes|AndReturn)' "
359- r"member",
360 # pylint doesn't like *args/**kwargs
361 r"Instance of 'Popen' has no '.*' member",
362 )]
363
364=== modified file 'ubuntutools/test/test_update_maintainer.py'
365--- ubuntutools/test/test_update_maintainer.py 2013-03-18 23:18:02 +0000
366+++ ubuntutools/test/test_update_maintainer.py 2014-12-16 09:17:30 +0000
367@@ -21,7 +21,7 @@
368 import StringIO
369 import sys
370
371-import mox
372+import mock
373
374 from ubuntutools.logger import Logger
375 from ubuntutools.test import unittest
376@@ -186,7 +186,7 @@
377 """
378
379 #pylint: disable=R0904
380-class UpdateMaintainerTestCase(mox.MoxTestBase, unittest.TestCase):
381+class UpdateMaintainerTestCase(unittest.TestCase):
382 """TestCase object for ubuntutools.update_maintainer"""
383
384 _directory = "/"
385@@ -216,9 +216,15 @@
386
387 #pylint: disable=C0103
388 def setUp(self):
389- super(UpdateMaintainerTestCase, self).setUp()
390- self.mox.stubs.Set(__builtin__, 'open', self._fake_open)
391- self.mox.stubs.Set(os.path, 'isfile', self._fake_isfile)
392+ m = mock.mock_open()
393+ m.side_effect = self._fake_open
394+ patcher = mock.patch('__builtin__.open', m)
395+ self.addCleanup(patcher.stop)
396+ patcher.start()
397+ m = mock.MagicMock(side_effect=self._fake_isfile)
398+ patcher = mock.patch('os.path.isfile', m)
399+ self.addCleanup(patcher.stop)
400+ patcher.start()
401 self._files["rules"] = StringIO.StringIO(_SIMPLE_RULES)
402 Logger.stdout = StringIO.StringIO()
403 Logger.stderr = StringIO.StringIO()