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() |
