diff options
Diffstat (limited to 'tests/test_wrapper.py')
-rw-r--r-- | tests/test_wrapper.py | 511 |
1 files changed, 501 insertions, 10 deletions
diff --git a/tests/test_wrapper.py b/tests/test_wrapper.py index 8ef8d48d..e9a1f64a 100644 --- a/tests/test_wrapper.py +++ b/tests/test_wrapper.py | |||
@@ -1,5 +1,3 @@ | |||
1 | # -*- coding:utf-8 -*- | ||
2 | # | ||
3 | # Copyright (C) 2015 The Android Open Source Project | 1 | # Copyright (C) 2015 The Android Open Source Project |
4 | # | 2 | # |
5 | # Licensed under the Apache License, Version 2.0 (the "License"); | 3 | # Licensed under the Apache License, Version 2.0 (the "License"); |
@@ -16,27 +14,87 @@ | |||
16 | 14 | ||
17 | """Unittests for the wrapper.py module.""" | 15 | """Unittests for the wrapper.py module.""" |
18 | 16 | ||
19 | from __future__ import print_function | 17 | import contextlib |
20 | 18 | from io import StringIO | |
21 | import os | 19 | import os |
20 | import re | ||
21 | import shutil | ||
22 | import sys | ||
23 | import tempfile | ||
22 | import unittest | 24 | import unittest |
25 | from unittest import mock | ||
23 | 26 | ||
27 | import git_command | ||
28 | import main | ||
29 | import platform_utils | ||
24 | import wrapper | 30 | import wrapper |
25 | 31 | ||
32 | |||
33 | @contextlib.contextmanager | ||
34 | def TemporaryDirectory(): | ||
35 | """Create a new empty git checkout for testing.""" | ||
36 | # TODO(vapier): Convert this to tempfile.TemporaryDirectory once we drop | ||
37 | # Python 2 support entirely. | ||
38 | try: | ||
39 | tempdir = tempfile.mkdtemp(prefix='repo-tests') | ||
40 | yield tempdir | ||
41 | finally: | ||
42 | platform_utils.rmtree(tempdir) | ||
43 | |||
44 | |||
26 | def fixture(*paths): | 45 | def fixture(*paths): |
27 | """Return a path relative to tests/fixtures. | 46 | """Return a path relative to tests/fixtures. |
28 | """ | 47 | """ |
29 | return os.path.join(os.path.dirname(__file__), 'fixtures', *paths) | 48 | return os.path.join(os.path.dirname(__file__), 'fixtures', *paths) |
30 | 49 | ||
31 | class RepoWrapperUnitTest(unittest.TestCase): | 50 | |
32 | """Tests helper functions in the repo wrapper | 51 | class RepoWrapperTestCase(unittest.TestCase): |
33 | """ | 52 | """TestCase for the wrapper module.""" |
53 | |||
34 | def setUp(self): | 54 | def setUp(self): |
35 | """Load the wrapper module every time | 55 | """Load the wrapper module every time.""" |
36 | """ | ||
37 | wrapper._wrapper_module = None | 56 | wrapper._wrapper_module = None |
38 | self.wrapper = wrapper.Wrapper() | 57 | self.wrapper = wrapper.Wrapper() |
39 | 58 | ||
59 | |||
60 | class RepoWrapperUnitTest(RepoWrapperTestCase): | ||
61 | """Tests helper functions in the repo wrapper | ||
62 | """ | ||
63 | |||
64 | def test_version(self): | ||
65 | """Make sure _Version works.""" | ||
66 | with self.assertRaises(SystemExit) as e: | ||
67 | with mock.patch('sys.stdout', new_callable=StringIO) as stdout: | ||
68 | with mock.patch('sys.stderr', new_callable=StringIO) as stderr: | ||
69 | self.wrapper._Version() | ||
70 | self.assertEqual(0, e.exception.code) | ||
71 | self.assertEqual('', stderr.getvalue()) | ||
72 | self.assertIn('repo launcher version', stdout.getvalue()) | ||
73 | |||
74 | def test_python_constraints(self): | ||
75 | """The launcher should never require newer than main.py.""" | ||
76 | self.assertGreaterEqual(main.MIN_PYTHON_VERSION_HARD, | ||
77 | wrapper.MIN_PYTHON_VERSION_HARD) | ||
78 | self.assertGreaterEqual(main.MIN_PYTHON_VERSION_SOFT, | ||
79 | wrapper.MIN_PYTHON_VERSION_SOFT) | ||
80 | # Make sure the versions are themselves in sync. | ||
81 | self.assertGreaterEqual(wrapper.MIN_PYTHON_VERSION_SOFT, | ||
82 | wrapper.MIN_PYTHON_VERSION_HARD) | ||
83 | |||
84 | def test_init_parser(self): | ||
85 | """Make sure 'init' GetParser works.""" | ||
86 | parser = self.wrapper.GetParser(gitc_init=False) | ||
87 | opts, args = parser.parse_args([]) | ||
88 | self.assertEqual([], args) | ||
89 | self.assertIsNone(opts.manifest_url) | ||
90 | |||
91 | def test_gitc_init_parser(self): | ||
92 | """Make sure 'gitc-init' GetParser works.""" | ||
93 | parser = self.wrapper.GetParser(gitc_init=True) | ||
94 | opts, args = parser.parse_args([]) | ||
95 | self.assertEqual([], args) | ||
96 | self.assertIsNone(opts.manifest_file) | ||
97 | |||
40 | def test_get_gitc_manifest_dir_no_gitc(self): | 98 | def test_get_gitc_manifest_dir_no_gitc(self): |
41 | """ | 99 | """ |
42 | Test reading a missing gitc config file | 100 | Test reading a missing gitc config file |
@@ -72,9 +130,442 @@ class RepoWrapperUnitTest(unittest.TestCase): | |||
72 | self.assertEqual(self.wrapper.gitc_parse_clientdir('/gitc/manifest-rw/test/extra'), 'test') | 130 | self.assertEqual(self.wrapper.gitc_parse_clientdir('/gitc/manifest-rw/test/extra'), 'test') |
73 | self.assertEqual(self.wrapper.gitc_parse_clientdir('/test/usr/local/google/gitc/test'), 'test') | 131 | self.assertEqual(self.wrapper.gitc_parse_clientdir('/test/usr/local/google/gitc/test'), 'test') |
74 | self.assertEqual(self.wrapper.gitc_parse_clientdir('/test/usr/local/google/gitc/test/'), 'test') | 132 | self.assertEqual(self.wrapper.gitc_parse_clientdir('/test/usr/local/google/gitc/test/'), 'test') |
75 | self.assertEqual(self.wrapper.gitc_parse_clientdir('/test/usr/local/google/gitc/test/extra'), 'test') | 133 | self.assertEqual(self.wrapper.gitc_parse_clientdir('/test/usr/local/google/gitc/test/extra'), |
134 | 'test') | ||
76 | self.assertEqual(self.wrapper.gitc_parse_clientdir('/gitc/manifest-rw/'), None) | 135 | self.assertEqual(self.wrapper.gitc_parse_clientdir('/gitc/manifest-rw/'), None) |
77 | self.assertEqual(self.wrapper.gitc_parse_clientdir('/test/usr/local/google/gitc/'), None) | 136 | self.assertEqual(self.wrapper.gitc_parse_clientdir('/test/usr/local/google/gitc/'), None) |
78 | 137 | ||
138 | |||
139 | class SetGitTrace2ParentSid(RepoWrapperTestCase): | ||
140 | """Check SetGitTrace2ParentSid behavior.""" | ||
141 | |||
142 | KEY = 'GIT_TRACE2_PARENT_SID' | ||
143 | VALID_FORMAT = re.compile(r'^repo-[0-9]{8}T[0-9]{6}Z-P[0-9a-f]{8}$') | ||
144 | |||
145 | def test_first_set(self): | ||
146 | """Test env var not yet set.""" | ||
147 | env = {} | ||
148 | self.wrapper.SetGitTrace2ParentSid(env) | ||
149 | self.assertIn(self.KEY, env) | ||
150 | value = env[self.KEY] | ||
151 | self.assertRegex(value, self.VALID_FORMAT) | ||
152 | |||
153 | def test_append(self): | ||
154 | """Test env var is appended.""" | ||
155 | env = {self.KEY: 'pfx'} | ||
156 | self.wrapper.SetGitTrace2ParentSid(env) | ||
157 | self.assertIn(self.KEY, env) | ||
158 | value = env[self.KEY] | ||
159 | self.assertTrue(value.startswith('pfx/')) | ||
160 | self.assertRegex(value[4:], self.VALID_FORMAT) | ||
161 | |||
162 | def test_global_context(self): | ||
163 | """Check os.environ gets updated by default.""" | ||
164 | os.environ.pop(self.KEY, None) | ||
165 | self.wrapper.SetGitTrace2ParentSid() | ||
166 | self.assertIn(self.KEY, os.environ) | ||
167 | value = os.environ[self.KEY] | ||
168 | self.assertRegex(value, self.VALID_FORMAT) | ||
169 | |||
170 | |||
171 | class RunCommand(RepoWrapperTestCase): | ||
172 | """Check run_command behavior.""" | ||
173 | |||
174 | def test_capture(self): | ||
175 | """Check capture_output handling.""" | ||
176 | ret = self.wrapper.run_command(['echo', 'hi'], capture_output=True) | ||
177 | self.assertEqual(ret.stdout, 'hi\n') | ||
178 | |||
179 | def test_check(self): | ||
180 | """Check check handling.""" | ||
181 | self.wrapper.run_command(['true'], check=False) | ||
182 | self.wrapper.run_command(['true'], check=True) | ||
183 | self.wrapper.run_command(['false'], check=False) | ||
184 | with self.assertRaises(self.wrapper.RunError): | ||
185 | self.wrapper.run_command(['false'], check=True) | ||
186 | |||
187 | |||
188 | class RunGit(RepoWrapperTestCase): | ||
189 | """Check run_git behavior.""" | ||
190 | |||
191 | def test_capture(self): | ||
192 | """Check capture_output handling.""" | ||
193 | ret = self.wrapper.run_git('--version') | ||
194 | self.assertIn('git', ret.stdout) | ||
195 | |||
196 | def test_check(self): | ||
197 | """Check check handling.""" | ||
198 | with self.assertRaises(self.wrapper.CloneFailure): | ||
199 | self.wrapper.run_git('--version-asdfasdf') | ||
200 | self.wrapper.run_git('--version-asdfasdf', check=False) | ||
201 | |||
202 | |||
203 | class ParseGitVersion(RepoWrapperTestCase): | ||
204 | """Check ParseGitVersion behavior.""" | ||
205 | |||
206 | def test_autoload(self): | ||
207 | """Check we can load the version from the live git.""" | ||
208 | ret = self.wrapper.ParseGitVersion() | ||
209 | self.assertIsNotNone(ret) | ||
210 | |||
211 | def test_bad_ver(self): | ||
212 | """Check handling of bad git versions.""" | ||
213 | ret = self.wrapper.ParseGitVersion(ver_str='asdf') | ||
214 | self.assertIsNone(ret) | ||
215 | |||
216 | def test_normal_ver(self): | ||
217 | """Check handling of normal git versions.""" | ||
218 | ret = self.wrapper.ParseGitVersion(ver_str='git version 2.25.1') | ||
219 | self.assertEqual(2, ret.major) | ||
220 | self.assertEqual(25, ret.minor) | ||
221 | self.assertEqual(1, ret.micro) | ||
222 | self.assertEqual('2.25.1', ret.full) | ||
223 | |||
224 | def test_extended_ver(self): | ||
225 | """Check handling of extended distro git versions.""" | ||
226 | ret = self.wrapper.ParseGitVersion( | ||
227 | ver_str='git version 1.30.50.696.g5e7596f4ac-goog') | ||
228 | self.assertEqual(1, ret.major) | ||
229 | self.assertEqual(30, ret.minor) | ||
230 | self.assertEqual(50, ret.micro) | ||
231 | self.assertEqual('1.30.50.696.g5e7596f4ac-goog', ret.full) | ||
232 | |||
233 | |||
234 | class CheckGitVersion(RepoWrapperTestCase): | ||
235 | """Check _CheckGitVersion behavior.""" | ||
236 | |||
237 | def test_unknown(self): | ||
238 | """Unknown versions should abort.""" | ||
239 | with mock.patch.object(self.wrapper, 'ParseGitVersion', return_value=None): | ||
240 | with self.assertRaises(self.wrapper.CloneFailure): | ||
241 | self.wrapper._CheckGitVersion() | ||
242 | |||
243 | def test_old(self): | ||
244 | """Old versions should abort.""" | ||
245 | with mock.patch.object( | ||
246 | self.wrapper, 'ParseGitVersion', | ||
247 | return_value=self.wrapper.GitVersion(1, 0, 0, '1.0.0')): | ||
248 | with self.assertRaises(self.wrapper.CloneFailure): | ||
249 | self.wrapper._CheckGitVersion() | ||
250 | |||
251 | def test_new(self): | ||
252 | """Newer versions should run fine.""" | ||
253 | with mock.patch.object( | ||
254 | self.wrapper, 'ParseGitVersion', | ||
255 | return_value=self.wrapper.GitVersion(100, 0, 0, '100.0.0')): | ||
256 | self.wrapper._CheckGitVersion() | ||
257 | |||
258 | |||
259 | class Requirements(RepoWrapperTestCase): | ||
260 | """Check Requirements handling.""" | ||
261 | |||
262 | def test_missing_file(self): | ||
263 | """Don't crash if the file is missing (old version).""" | ||
264 | testdir = os.path.dirname(os.path.realpath(__file__)) | ||
265 | self.assertIsNone(self.wrapper.Requirements.from_dir(testdir)) | ||
266 | self.assertIsNone(self.wrapper.Requirements.from_file( | ||
267 | os.path.join(testdir, 'xxxxxxxxxxxxxxxxxxxxxxxx'))) | ||
268 | |||
269 | def test_corrupt_data(self): | ||
270 | """If the file can't be parsed, don't blow up.""" | ||
271 | self.assertIsNone(self.wrapper.Requirements.from_file(__file__)) | ||
272 | self.assertIsNone(self.wrapper.Requirements.from_data(b'x')) | ||
273 | |||
274 | def test_valid_data(self): | ||
275 | """Make sure we can parse the file we ship.""" | ||
276 | self.assertIsNotNone(self.wrapper.Requirements.from_data(b'{}')) | ||
277 | rootdir = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) | ||
278 | self.assertIsNotNone(self.wrapper.Requirements.from_dir(rootdir)) | ||
279 | self.assertIsNotNone(self.wrapper.Requirements.from_file(os.path.join( | ||
280 | rootdir, 'requirements.json'))) | ||
281 | |||
282 | def test_format_ver(self): | ||
283 | """Check format_ver can format.""" | ||
284 | self.assertEqual('1.2.3', self.wrapper.Requirements._format_ver((1, 2, 3))) | ||
285 | self.assertEqual('1', self.wrapper.Requirements._format_ver([1])) | ||
286 | |||
287 | def test_assert_all_unknown(self): | ||
288 | """Check assert_all works with incompatible file.""" | ||
289 | reqs = self.wrapper.Requirements({}) | ||
290 | reqs.assert_all() | ||
291 | |||
292 | def test_assert_all_new_repo(self): | ||
293 | """Check assert_all accepts new enough repo.""" | ||
294 | reqs = self.wrapper.Requirements({'repo': {'hard': [1, 0]}}) | ||
295 | reqs.assert_all() | ||
296 | |||
297 | def test_assert_all_old_repo(self): | ||
298 | """Check assert_all rejects old repo.""" | ||
299 | reqs = self.wrapper.Requirements({'repo': {'hard': [99999, 0]}}) | ||
300 | with self.assertRaises(SystemExit): | ||
301 | reqs.assert_all() | ||
302 | |||
303 | def test_assert_all_new_python(self): | ||
304 | """Check assert_all accepts new enough python.""" | ||
305 | reqs = self.wrapper.Requirements({'python': {'hard': sys.version_info}}) | ||
306 | reqs.assert_all() | ||
307 | |||
308 | def test_assert_all_old_python(self): | ||
309 | """Check assert_all rejects old python.""" | ||
310 | reqs = self.wrapper.Requirements({'python': {'hard': [99999, 0]}}) | ||
311 | with self.assertRaises(SystemExit): | ||
312 | reqs.assert_all() | ||
313 | |||
314 | def test_assert_ver_unknown(self): | ||
315 | """Check assert_ver works with incompatible file.""" | ||
316 | reqs = self.wrapper.Requirements({}) | ||
317 | reqs.assert_ver('xxx', (1, 0)) | ||
318 | |||
319 | def test_assert_ver_new(self): | ||
320 | """Check assert_ver allows new enough versions.""" | ||
321 | reqs = self.wrapper.Requirements({'git': {'hard': [1, 0], 'soft': [2, 0]}}) | ||
322 | reqs.assert_ver('git', (1, 0)) | ||
323 | reqs.assert_ver('git', (1, 5)) | ||
324 | reqs.assert_ver('git', (2, 0)) | ||
325 | reqs.assert_ver('git', (2, 5)) | ||
326 | |||
327 | def test_assert_ver_old(self): | ||
328 | """Check assert_ver rejects old versions.""" | ||
329 | reqs = self.wrapper.Requirements({'git': {'hard': [1, 0], 'soft': [2, 0]}}) | ||
330 | with self.assertRaises(SystemExit): | ||
331 | reqs.assert_ver('git', (0, 5)) | ||
332 | |||
333 | |||
334 | class NeedSetupGnuPG(RepoWrapperTestCase): | ||
335 | """Check NeedSetupGnuPG behavior.""" | ||
336 | |||
337 | def test_missing_dir(self): | ||
338 | """The ~/.repoconfig tree doesn't exist yet.""" | ||
339 | with TemporaryDirectory() as tempdir: | ||
340 | self.wrapper.home_dot_repo = os.path.join(tempdir, 'foo') | ||
341 | self.assertTrue(self.wrapper.NeedSetupGnuPG()) | ||
342 | |||
343 | def test_missing_keyring(self): | ||
344 | """The keyring-version file doesn't exist yet.""" | ||
345 | with TemporaryDirectory() as tempdir: | ||
346 | self.wrapper.home_dot_repo = tempdir | ||
347 | self.assertTrue(self.wrapper.NeedSetupGnuPG()) | ||
348 | |||
349 | def test_empty_keyring(self): | ||
350 | """The keyring-version file exists, but is empty.""" | ||
351 | with TemporaryDirectory() as tempdir: | ||
352 | self.wrapper.home_dot_repo = tempdir | ||
353 | with open(os.path.join(tempdir, 'keyring-version'), 'w'): | ||
354 | pass | ||
355 | self.assertTrue(self.wrapper.NeedSetupGnuPG()) | ||
356 | |||
357 | def test_old_keyring(self): | ||
358 | """The keyring-version file exists, but it's old.""" | ||
359 | with TemporaryDirectory() as tempdir: | ||
360 | self.wrapper.home_dot_repo = tempdir | ||
361 | with open(os.path.join(tempdir, 'keyring-version'), 'w') as fp: | ||
362 | fp.write('1.0\n') | ||
363 | self.assertTrue(self.wrapper.NeedSetupGnuPG()) | ||
364 | |||
365 | def test_new_keyring(self): | ||
366 | """The keyring-version file exists, and is up-to-date.""" | ||
367 | with TemporaryDirectory() as tempdir: | ||
368 | self.wrapper.home_dot_repo = tempdir | ||
369 | with open(os.path.join(tempdir, 'keyring-version'), 'w') as fp: | ||
370 | fp.write('1000.0\n') | ||
371 | self.assertFalse(self.wrapper.NeedSetupGnuPG()) | ||
372 | |||
373 | |||
374 | class SetupGnuPG(RepoWrapperTestCase): | ||
375 | """Check SetupGnuPG behavior.""" | ||
376 | |||
377 | def test_full(self): | ||
378 | """Make sure it works completely.""" | ||
379 | with TemporaryDirectory() as tempdir: | ||
380 | self.wrapper.home_dot_repo = tempdir | ||
381 | self.wrapper.gpg_dir = os.path.join(self.wrapper.home_dot_repo, 'gnupg') | ||
382 | self.assertTrue(self.wrapper.SetupGnuPG(True)) | ||
383 | with open(os.path.join(tempdir, 'keyring-version'), 'r') as fp: | ||
384 | data = fp.read() | ||
385 | self.assertEqual('.'.join(str(x) for x in self.wrapper.KEYRING_VERSION), | ||
386 | data.strip()) | ||
387 | |||
388 | |||
389 | class VerifyRev(RepoWrapperTestCase): | ||
390 | """Check verify_rev behavior.""" | ||
391 | |||
392 | def test_verify_passes(self): | ||
393 | """Check when we have a valid signed tag.""" | ||
394 | desc_result = self.wrapper.RunResult(0, 'v1.0\n', '') | ||
395 | gpg_result = self.wrapper.RunResult(0, '', '') | ||
396 | with mock.patch.object(self.wrapper, 'run_git', | ||
397 | side_effect=(desc_result, gpg_result)): | ||
398 | ret = self.wrapper.verify_rev('/', 'refs/heads/stable', '1234', True) | ||
399 | self.assertEqual('v1.0^0', ret) | ||
400 | |||
401 | def test_unsigned_commit(self): | ||
402 | """Check we fall back to signed tag when we have an unsigned commit.""" | ||
403 | desc_result = self.wrapper.RunResult(0, 'v1.0-10-g1234\n', '') | ||
404 | gpg_result = self.wrapper.RunResult(0, '', '') | ||
405 | with mock.patch.object(self.wrapper, 'run_git', | ||
406 | side_effect=(desc_result, gpg_result)): | ||
407 | ret = self.wrapper.verify_rev('/', 'refs/heads/stable', '1234', True) | ||
408 | self.assertEqual('v1.0^0', ret) | ||
409 | |||
410 | def test_verify_fails(self): | ||
411 | """Check we fall back to signed tag when we have an unsigned commit.""" | ||
412 | desc_result = self.wrapper.RunResult(0, 'v1.0-10-g1234\n', '') | ||
413 | gpg_result = Exception | ||
414 | with mock.patch.object(self.wrapper, 'run_git', | ||
415 | side_effect=(desc_result, gpg_result)): | ||
416 | with self.assertRaises(Exception): | ||
417 | self.wrapper.verify_rev('/', 'refs/heads/stable', '1234', True) | ||
418 | |||
419 | |||
420 | class GitCheckoutTestCase(RepoWrapperTestCase): | ||
421 | """Tests that use a real/small git checkout.""" | ||
422 | |||
423 | GIT_DIR = None | ||
424 | REV_LIST = None | ||
425 | |||
426 | @classmethod | ||
427 | def setUpClass(cls): | ||
428 | # Create a repo to operate on, but do it once per-class. | ||
429 | cls.GIT_DIR = tempfile.mkdtemp(prefix='repo-rev-tests') | ||
430 | run_git = wrapper.Wrapper().run_git | ||
431 | |||
432 | remote = os.path.join(cls.GIT_DIR, 'remote') | ||
433 | os.mkdir(remote) | ||
434 | |||
435 | # Tests need to assume, that main is default branch at init, | ||
436 | # which is not supported in config until 2.28. | ||
437 | if git_command.git_require((2, 28, 0)): | ||
438 | initstr = '--initial-branch=main' | ||
439 | else: | ||
440 | # Use template dir for init. | ||
441 | templatedir = tempfile.mkdtemp(prefix='.test-template') | ||
442 | with open(os.path.join(templatedir, 'HEAD'), 'w') as fp: | ||
443 | fp.write('ref: refs/heads/main\n') | ||
444 | initstr = '--template=' + templatedir | ||
445 | |||
446 | run_git('init', initstr, cwd=remote) | ||
447 | run_git('commit', '--allow-empty', '-minit', cwd=remote) | ||
448 | run_git('branch', 'stable', cwd=remote) | ||
449 | run_git('tag', 'v1.0', cwd=remote) | ||
450 | run_git('commit', '--allow-empty', '-m2nd commit', cwd=remote) | ||
451 | cls.REV_LIST = run_git('rev-list', 'HEAD', cwd=remote).stdout.splitlines() | ||
452 | |||
453 | run_git('init', cwd=cls.GIT_DIR) | ||
454 | run_git('fetch', remote, '+refs/heads/*:refs/remotes/origin/*', cwd=cls.GIT_DIR) | ||
455 | |||
456 | @classmethod | ||
457 | def tearDownClass(cls): | ||
458 | if not cls.GIT_DIR: | ||
459 | return | ||
460 | |||
461 | shutil.rmtree(cls.GIT_DIR) | ||
462 | |||
463 | |||
464 | class ResolveRepoRev(GitCheckoutTestCase): | ||
465 | """Check resolve_repo_rev behavior.""" | ||
466 | |||
467 | def test_explicit_branch(self): | ||
468 | """Check refs/heads/branch argument.""" | ||
469 | rrev, lrev = self.wrapper.resolve_repo_rev(self.GIT_DIR, 'refs/heads/stable') | ||
470 | self.assertEqual('refs/heads/stable', rrev) | ||
471 | self.assertEqual(self.REV_LIST[1], lrev) | ||
472 | |||
473 | with self.assertRaises(wrapper.CloneFailure): | ||
474 | self.wrapper.resolve_repo_rev(self.GIT_DIR, 'refs/heads/unknown') | ||
475 | |||
476 | def test_explicit_tag(self): | ||
477 | """Check refs/tags/tag argument.""" | ||
478 | rrev, lrev = self.wrapper.resolve_repo_rev(self.GIT_DIR, 'refs/tags/v1.0') | ||
479 | self.assertEqual('refs/tags/v1.0', rrev) | ||
480 | self.assertEqual(self.REV_LIST[1], lrev) | ||
481 | |||
482 | with self.assertRaises(wrapper.CloneFailure): | ||
483 | self.wrapper.resolve_repo_rev(self.GIT_DIR, 'refs/tags/unknown') | ||
484 | |||
485 | def test_branch_name(self): | ||
486 | """Check branch argument.""" | ||
487 | rrev, lrev = self.wrapper.resolve_repo_rev(self.GIT_DIR, 'stable') | ||
488 | self.assertEqual('refs/heads/stable', rrev) | ||
489 | self.assertEqual(self.REV_LIST[1], lrev) | ||
490 | |||
491 | rrev, lrev = self.wrapper.resolve_repo_rev(self.GIT_DIR, 'main') | ||
492 | self.assertEqual('refs/heads/main', rrev) | ||
493 | self.assertEqual(self.REV_LIST[0], lrev) | ||
494 | |||
495 | def test_tag_name(self): | ||
496 | """Check tag argument.""" | ||
497 | rrev, lrev = self.wrapper.resolve_repo_rev(self.GIT_DIR, 'v1.0') | ||
498 | self.assertEqual('refs/tags/v1.0', rrev) | ||
499 | self.assertEqual(self.REV_LIST[1], lrev) | ||
500 | |||
501 | def test_full_commit(self): | ||
502 | """Check specific commit argument.""" | ||
503 | commit = self.REV_LIST[0] | ||
504 | rrev, lrev = self.wrapper.resolve_repo_rev(self.GIT_DIR, commit) | ||
505 | self.assertEqual(commit, rrev) | ||
506 | self.assertEqual(commit, lrev) | ||
507 | |||
508 | def test_partial_commit(self): | ||
509 | """Check specific (partial) commit argument.""" | ||
510 | commit = self.REV_LIST[0][0:20] | ||
511 | rrev, lrev = self.wrapper.resolve_repo_rev(self.GIT_DIR, commit) | ||
512 | self.assertEqual(self.REV_LIST[0], rrev) | ||
513 | self.assertEqual(self.REV_LIST[0], lrev) | ||
514 | |||
515 | def test_unknown(self): | ||
516 | """Check unknown ref/commit argument.""" | ||
517 | with self.assertRaises(wrapper.CloneFailure): | ||
518 | self.wrapper.resolve_repo_rev(self.GIT_DIR, 'boooooooya') | ||
519 | |||
520 | |||
521 | class CheckRepoVerify(RepoWrapperTestCase): | ||
522 | """Check check_repo_verify behavior.""" | ||
523 | |||
524 | def test_no_verify(self): | ||
525 | """Always fail with --no-repo-verify.""" | ||
526 | self.assertFalse(self.wrapper.check_repo_verify(False)) | ||
527 | |||
528 | def test_gpg_initialized(self): | ||
529 | """Should pass if gpg is setup already.""" | ||
530 | with mock.patch.object(self.wrapper, 'NeedSetupGnuPG', return_value=False): | ||
531 | self.assertTrue(self.wrapper.check_repo_verify(True)) | ||
532 | |||
533 | def test_need_gpg_setup(self): | ||
534 | """Should pass/fail based on gpg setup.""" | ||
535 | with mock.patch.object(self.wrapper, 'NeedSetupGnuPG', return_value=True): | ||
536 | with mock.patch.object(self.wrapper, 'SetupGnuPG') as m: | ||
537 | m.return_value = True | ||
538 | self.assertTrue(self.wrapper.check_repo_verify(True)) | ||
539 | |||
540 | m.return_value = False | ||
541 | self.assertFalse(self.wrapper.check_repo_verify(True)) | ||
542 | |||
543 | |||
544 | class CheckRepoRev(GitCheckoutTestCase): | ||
545 | """Check check_repo_rev behavior.""" | ||
546 | |||
547 | def test_verify_works(self): | ||
548 | """Should pass when verification passes.""" | ||
549 | with mock.patch.object(self.wrapper, 'check_repo_verify', return_value=True): | ||
550 | with mock.patch.object(self.wrapper, 'verify_rev', return_value='12345'): | ||
551 | rrev, lrev = self.wrapper.check_repo_rev(self.GIT_DIR, 'stable') | ||
552 | self.assertEqual('refs/heads/stable', rrev) | ||
553 | self.assertEqual('12345', lrev) | ||
554 | |||
555 | def test_verify_fails(self): | ||
556 | """Should fail when verification fails.""" | ||
557 | with mock.patch.object(self.wrapper, 'check_repo_verify', return_value=True): | ||
558 | with mock.patch.object(self.wrapper, 'verify_rev', side_effect=Exception): | ||
559 | with self.assertRaises(Exception): | ||
560 | self.wrapper.check_repo_rev(self.GIT_DIR, 'stable') | ||
561 | |||
562 | def test_verify_ignore(self): | ||
563 | """Should pass when verification is disabled.""" | ||
564 | with mock.patch.object(self.wrapper, 'verify_rev', side_effect=Exception): | ||
565 | rrev, lrev = self.wrapper.check_repo_rev(self.GIT_DIR, 'stable', repo_verify=False) | ||
566 | self.assertEqual('refs/heads/stable', rrev) | ||
567 | self.assertEqual(self.REV_LIST[1], lrev) | ||
568 | |||
569 | |||
79 | if __name__ == '__main__': | 570 | if __name__ == '__main__': |
80 | unittest.main() | 571 | unittest.main() |