diff options
Diffstat (limited to 'tests/test_wrapper.py')
-rw-r--r-- | tests/test_wrapper.py | 156 |
1 files changed, 154 insertions, 2 deletions
diff --git a/tests/test_wrapper.py b/tests/test_wrapper.py index 73c62cc1..136f7f11 100644 --- a/tests/test_wrapper.py +++ b/tests/test_wrapper.py | |||
@@ -18,12 +18,14 @@ | |||
18 | 18 | ||
19 | from __future__ import print_function | 19 | from __future__ import print_function |
20 | 20 | ||
21 | import contextlib | ||
21 | import os | 22 | import os |
22 | import re | 23 | import re |
23 | import shutil | 24 | import shutil |
24 | import tempfile | 25 | import tempfile |
25 | import unittest | 26 | import unittest |
26 | 27 | ||
28 | import platform_utils | ||
27 | from pyversion import is_python3 | 29 | from pyversion import is_python3 |
28 | import wrapper | 30 | import wrapper |
29 | 31 | ||
@@ -36,6 +38,18 @@ else: | |||
36 | from StringIO import StringIO | 38 | from StringIO import StringIO |
37 | 39 | ||
38 | 40 | ||
41 | @contextlib.contextmanager | ||
42 | def TemporaryDirectory(): | ||
43 | """Create a new empty git checkout for testing.""" | ||
44 | # TODO(vapier): Convert this to tempfile.TemporaryDirectory once we drop | ||
45 | # Python 2 support entirely. | ||
46 | try: | ||
47 | tempdir = tempfile.mkdtemp(prefix='repo-tests') | ||
48 | yield tempdir | ||
49 | finally: | ||
50 | platform_utils.rmtree(tempdir) | ||
51 | |||
52 | |||
39 | def fixture(*paths): | 53 | def fixture(*paths): |
40 | """Return a path relative to tests/fixtures. | 54 | """Return a path relative to tests/fixtures. |
41 | """ | 55 | """ |
@@ -243,8 +257,93 @@ class CheckGitVersion(RepoWrapperTestCase): | |||
243 | self.wrapper._CheckGitVersion() | 257 | self.wrapper._CheckGitVersion() |
244 | 258 | ||
245 | 259 | ||
246 | class ResolveRepoRev(RepoWrapperTestCase): | 260 | class NeedSetupGnuPG(RepoWrapperTestCase): |
247 | """Check resolve_repo_rev behavior.""" | 261 | """Check NeedSetupGnuPG behavior.""" |
262 | |||
263 | def test_missing_dir(self): | ||
264 | """The ~/.repoconfig tree doesn't exist yet.""" | ||
265 | with TemporaryDirectory() as tempdir: | ||
266 | self.wrapper.home_dot_repo = os.path.join(tempdir, 'foo') | ||
267 | self.assertTrue(self.wrapper.NeedSetupGnuPG()) | ||
268 | |||
269 | def test_missing_keyring(self): | ||
270 | """The keyring-version file doesn't exist yet.""" | ||
271 | with TemporaryDirectory() as tempdir: | ||
272 | self.wrapper.home_dot_repo = tempdir | ||
273 | self.assertTrue(self.wrapper.NeedSetupGnuPG()) | ||
274 | |||
275 | def test_empty_keyring(self): | ||
276 | """The keyring-version file exists, but is empty.""" | ||
277 | with TemporaryDirectory() as tempdir: | ||
278 | self.wrapper.home_dot_repo = tempdir | ||
279 | with open(os.path.join(tempdir, 'keyring-version'), 'w'): | ||
280 | pass | ||
281 | self.assertTrue(self.wrapper.NeedSetupGnuPG()) | ||
282 | |||
283 | def test_old_keyring(self): | ||
284 | """The keyring-version file exists, but it's old.""" | ||
285 | with TemporaryDirectory() as tempdir: | ||
286 | self.wrapper.home_dot_repo = tempdir | ||
287 | with open(os.path.join(tempdir, 'keyring-version'), 'w') as fp: | ||
288 | fp.write('1.0\n') | ||
289 | self.assertTrue(self.wrapper.NeedSetupGnuPG()) | ||
290 | |||
291 | def test_new_keyring(self): | ||
292 | """The keyring-version file exists, and is up-to-date.""" | ||
293 | with TemporaryDirectory() as tempdir: | ||
294 | self.wrapper.home_dot_repo = tempdir | ||
295 | with open(os.path.join(tempdir, 'keyring-version'), 'w') as fp: | ||
296 | fp.write('1000.0\n') | ||
297 | self.assertFalse(self.wrapper.NeedSetupGnuPG()) | ||
298 | |||
299 | |||
300 | class SetupGnuPG(RepoWrapperTestCase): | ||
301 | """Check SetupGnuPG behavior.""" | ||
302 | |||
303 | def test_full(self): | ||
304 | """Make sure it works completely.""" | ||
305 | with TemporaryDirectory() as tempdir: | ||
306 | self.wrapper.home_dot_repo = tempdir | ||
307 | self.assertTrue(self.wrapper.SetupGnuPG(True)) | ||
308 | with open(os.path.join(tempdir, 'keyring-version'), 'r') as fp: | ||
309 | data = fp.read() | ||
310 | self.assertEqual('.'.join(str(x) for x in self.wrapper.KEYRING_VERSION), | ||
311 | data.strip()) | ||
312 | |||
313 | |||
314 | class VerifyRev(RepoWrapperTestCase): | ||
315 | """Check verify_rev behavior.""" | ||
316 | |||
317 | def test_verify_passes(self): | ||
318 | """Check when we have a valid signed tag.""" | ||
319 | desc_result = self.wrapper.RunResult(0, 'v1.0\n', '') | ||
320 | gpg_result = self.wrapper.RunResult(0, '', '') | ||
321 | with mock.patch.object(self.wrapper, 'run_git', | ||
322 | side_effect=(desc_result, gpg_result)): | ||
323 | ret = self.wrapper.verify_rev('/', 'refs/heads/stable', '1234', True) | ||
324 | self.assertEqual('v1.0^0', ret) | ||
325 | |||
326 | def test_unsigned_commit(self): | ||
327 | """Check we fall back to signed tag when we have an unsigned commit.""" | ||
328 | desc_result = self.wrapper.RunResult(0, 'v1.0-10-g1234\n', '') | ||
329 | gpg_result = self.wrapper.RunResult(0, '', '') | ||
330 | with mock.patch.object(self.wrapper, 'run_git', | ||
331 | side_effect=(desc_result, gpg_result)): | ||
332 | ret = self.wrapper.verify_rev('/', 'refs/heads/stable', '1234', True) | ||
333 | self.assertEqual('v1.0^0', ret) | ||
334 | |||
335 | def test_verify_fails(self): | ||
336 | """Check we fall back to signed tag when we have an unsigned commit.""" | ||
337 | desc_result = self.wrapper.RunResult(0, 'v1.0-10-g1234\n', '') | ||
338 | gpg_result = Exception | ||
339 | with mock.patch.object(self.wrapper, 'run_git', | ||
340 | side_effect=(desc_result, gpg_result)): | ||
341 | with self.assertRaises(Exception): | ||
342 | self.wrapper.verify_rev('/', 'refs/heads/stable', '1234', True) | ||
343 | |||
344 | |||
345 | class GitCheckoutTestCase(RepoWrapperTestCase): | ||
346 | """Tests that use a real/small git checkout.""" | ||
248 | 347 | ||
249 | GIT_DIR = None | 348 | GIT_DIR = None |
250 | REV_LIST = None | 349 | REV_LIST = None |
@@ -274,6 +373,10 @@ class ResolveRepoRev(RepoWrapperTestCase): | |||
274 | 373 | ||
275 | shutil.rmtree(cls.GIT_DIR) | 374 | shutil.rmtree(cls.GIT_DIR) |
276 | 375 | ||
376 | |||
377 | class ResolveRepoRev(GitCheckoutTestCase): | ||
378 | """Check resolve_repo_rev behavior.""" | ||
379 | |||
277 | def test_explicit_branch(self): | 380 | def test_explicit_branch(self): |
278 | """Check refs/heads/branch argument.""" | 381 | """Check refs/heads/branch argument.""" |
279 | rrev, lrev = self.wrapper.resolve_repo_rev(self.GIT_DIR, 'refs/heads/stable') | 382 | rrev, lrev = self.wrapper.resolve_repo_rev(self.GIT_DIR, 'refs/heads/stable') |
@@ -328,5 +431,54 @@ class ResolveRepoRev(RepoWrapperTestCase): | |||
328 | self.wrapper.resolve_repo_rev(self.GIT_DIR, 'boooooooya') | 431 | self.wrapper.resolve_repo_rev(self.GIT_DIR, 'boooooooya') |
329 | 432 | ||
330 | 433 | ||
434 | class CheckRepoVerify(RepoWrapperTestCase): | ||
435 | """Check check_repo_verify behavior.""" | ||
436 | |||
437 | def test_no_verify(self): | ||
438 | """Always fail with --no-repo-verify.""" | ||
439 | self.assertFalse(self.wrapper.check_repo_verify(False)) | ||
440 | |||
441 | def test_gpg_initialized(self): | ||
442 | """Should pass if gpg is setup already.""" | ||
443 | with mock.patch.object(self.wrapper, 'NeedSetupGnuPG', return_value=False): | ||
444 | self.assertTrue(self.wrapper.check_repo_verify(True)) | ||
445 | |||
446 | def test_need_gpg_setup(self): | ||
447 | """Should pass/fail based on gpg setup.""" | ||
448 | with mock.patch.object(self.wrapper, 'NeedSetupGnuPG', return_value=True): | ||
449 | with mock.patch.object(self.wrapper, 'SetupGnuPG') as m: | ||
450 | m.return_value = True | ||
451 | self.assertTrue(self.wrapper.check_repo_verify(True)) | ||
452 | |||
453 | m.return_value = False | ||
454 | self.assertFalse(self.wrapper.check_repo_verify(True)) | ||
455 | |||
456 | |||
457 | class CheckRepoRev(GitCheckoutTestCase): | ||
458 | """Check check_repo_rev behavior.""" | ||
459 | |||
460 | def test_verify_works(self): | ||
461 | """Should pass when verification passes.""" | ||
462 | with mock.patch.object(self.wrapper, 'check_repo_verify', return_value=True): | ||
463 | with mock.patch.object(self.wrapper, 'verify_rev', return_value='12345'): | ||
464 | rrev, lrev = self.wrapper.check_repo_rev(self.GIT_DIR, 'stable') | ||
465 | self.assertEqual('refs/heads/stable', rrev) | ||
466 | self.assertEqual('12345', lrev) | ||
467 | |||
468 | def test_verify_fails(self): | ||
469 | """Should fail when verification fails.""" | ||
470 | with mock.patch.object(self.wrapper, 'check_repo_verify', return_value=True): | ||
471 | with mock.patch.object(self.wrapper, 'verify_rev', side_effect=Exception): | ||
472 | with self.assertRaises(Exception): | ||
473 | self.wrapper.check_repo_rev(self.GIT_DIR, 'stable') | ||
474 | |||
475 | def test_verify_ignore(self): | ||
476 | """Should pass when verification is disabled.""" | ||
477 | with mock.patch.object(self.wrapper, 'verify_rev', side_effect=Exception): | ||
478 | rrev, lrev = self.wrapper.check_repo_rev(self.GIT_DIR, 'stable', repo_verify=False) | ||
479 | self.assertEqual('refs/heads/stable', rrev) | ||
480 | self.assertEqual(self.REV_LIST[1], lrev) | ||
481 | |||
482 | |||
331 | if __name__ == '__main__': | 483 | if __name__ == '__main__': |
332 | unittest.main() | 484 | unittest.main() |