Merge lp:~xnox/ubuntu-dev-tools/drop-mox into lp:~ubuntu-dev/ubuntu-dev-tools/trunk
- drop-mox
- Merge into 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 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Stefano Rivera | Pending | ||
Ubuntu Development Team | Pending | ||
Review via email: mp+244832@code.launchpad.net |
Commit message
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 : | # |
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() |
This appears to have been merged already.