blob: e9a1f64a6513e0facf6be600d1b875865065d15b [file] [log] [blame]
Dan Willemsen745b4ad2015-10-06 15:23:19 -07001# Copyright (C) 2015 The Android Open Source Project
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14
Mike Frysinger87deaef2019-07-26 21:14:55 -040015"""Unittests for the wrapper.py module."""
16
Mike Frysinger3599cc32020-02-29 02:53:41 -050017import contextlib
Mike Frysingeracf63b22019-06-13 02:24:21 -040018from io import StringIO
Dan Willemsen745b4ad2015-10-06 15:23:19 -070019import os
Mike Frysinger84094102020-02-11 02:10:28 -050020import re
Mike Frysingercfc81112020-02-29 02:56:32 -050021import shutil
Mike Frysingere5670c82021-01-07 22:14:25 -050022import sys
Mike Frysingercfc81112020-02-29 02:56:32 -050023import tempfile
Dan Willemsen745b4ad2015-10-06 15:23:19 -070024import unittest
Mike Frysingeracf63b22019-06-13 02:24:21 -040025from unittest import mock
Dan Willemsen745b4ad2015-10-06 15:23:19 -070026
Fredrik de Groot6342d562020-12-01 15:58:53 +010027import git_command
Mike Frysinger1379a9b2021-01-04 23:29:45 -050028import main
Mike Frysinger3599cc32020-02-29 02:53:41 -050029import platform_utils
Dan Willemsen745b4ad2015-10-06 15:23:19 -070030import wrapper
31
David Pursehouse819827a2020-02-12 15:20:19 +090032
Mike Frysinger3599cc32020-02-29 02:53:41 -050033@contextlib.contextmanager
34def 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
Dan Willemsen745b4ad2015-10-06 15:23:19 -070045def fixture(*paths):
46 """Return a path relative to tests/fixtures.
47 """
48 return os.path.join(os.path.dirname(__file__), 'fixtures', *paths)
49
David Pursehouse819827a2020-02-12 15:20:19 +090050
Mike Frysinger84094102020-02-11 02:10:28 -050051class RepoWrapperTestCase(unittest.TestCase):
52 """TestCase for the wrapper module."""
David Pursehouse819827a2020-02-12 15:20:19 +090053
Dan Willemsen745b4ad2015-10-06 15:23:19 -070054 def setUp(self):
Mike Frysinger84094102020-02-11 02:10:28 -050055 """Load the wrapper module every time."""
Dan Willemsen745b4ad2015-10-06 15:23:19 -070056 wrapper._wrapper_module = None
57 self.wrapper = wrapper.Wrapper()
58
Mike Frysinger84094102020-02-11 02:10:28 -050059
60class RepoWrapperUnitTest(RepoWrapperTestCase):
61 """Tests helper functions in the repo wrapper
62 """
63
Mike Frysinger8ddff5c2020-02-09 15:00:25 -050064 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
Mike Frysinger1379a9b2021-01-04 23:29:45 -050074 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
Mike Frysingerd8fda902020-02-14 00:24:38 -050084 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
Dan Willemsen745b4ad2015-10-06 15:23:19 -070098 def test_get_gitc_manifest_dir_no_gitc(self):
99 """
100 Test reading a missing gitc config file
101 """
102 self.wrapper.GITC_CONFIG_FILE = fixture('missing_gitc_config')
103 val = self.wrapper.get_gitc_manifest_dir()
104 self.assertEqual(val, '')
105
106 def test_get_gitc_manifest_dir(self):
107 """
108 Test reading the gitc config file and parsing the directory
109 """
110 self.wrapper.GITC_CONFIG_FILE = fixture('gitc_config')
111 val = self.wrapper.get_gitc_manifest_dir()
112 self.assertEqual(val, '/test/usr/local/google/gitc')
113
114 def test_gitc_parse_clientdir_no_gitc(self):
115 """
116 Test parsing the gitc clientdir without gitc running
117 """
118 self.wrapper.GITC_CONFIG_FILE = fixture('missing_gitc_config')
119 self.assertEqual(self.wrapper.gitc_parse_clientdir('/something'), None)
120 self.assertEqual(self.wrapper.gitc_parse_clientdir('/gitc/manifest-rw/test'), 'test')
121
122 def test_gitc_parse_clientdir(self):
123 """
124 Test parsing the gitc clientdir
125 """
126 self.wrapper.GITC_CONFIG_FILE = fixture('gitc_config')
127 self.assertEqual(self.wrapper.gitc_parse_clientdir('/something'), None)
128 self.assertEqual(self.wrapper.gitc_parse_clientdir('/gitc/manifest-rw/test'), 'test')
129 self.assertEqual(self.wrapper.gitc_parse_clientdir('/gitc/manifest-rw/test/'), 'test')
130 self.assertEqual(self.wrapper.gitc_parse_clientdir('/gitc/manifest-rw/test/extra'), 'test')
131 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')
David Pursehouse3cda50a2020-02-13 13:17:03 +0900133 self.assertEqual(self.wrapper.gitc_parse_clientdir('/test/usr/local/google/gitc/test/extra'),
134 'test')
Dan Willemsen745b4ad2015-10-06 15:23:19 -0700135 self.assertEqual(self.wrapper.gitc_parse_clientdir('/gitc/manifest-rw/'), None)
136 self.assertEqual(self.wrapper.gitc_parse_clientdir('/test/usr/local/google/gitc/'), None)
137
David Pursehouse819827a2020-02-12 15:20:19 +0900138
Mike Frysinger84094102020-02-11 02:10:28 -0500139class 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
Mike Frysinger587f1622020-03-23 16:49:11 -0400171class 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
188class 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
203class 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
234class 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
Mike Frysingere5670c82021-01-07 22:14:25 -0500259class 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
Mike Frysinger934cb0a2021-03-04 02:47:49 -0500308 def test_assert_all_old_python(self):
309 """Check assert_all rejects old python."""
Mike Frysingere5670c82021-01-07 22:14:25 -0500310 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
Mike Frysinger3599cc32020-02-29 02:53:41 -0500334class 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
374class 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
Marcos Marado2735bfc2020-04-09 19:44:28 +0100381 self.wrapper.gpg_dir = os.path.join(self.wrapper.home_dot_repo, 'gnupg')
Mike Frysinger3599cc32020-02-29 02:53:41 -0500382 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
389class 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
420class GitCheckoutTestCase(RepoWrapperTestCase):
421 """Tests that use a real/small git checkout."""
Mike Frysingercfc81112020-02-29 02:56:32 -0500422
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)
Fredrik de Groot6342d562020-12-01 15:58:53 +0100434
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)
Mike Frysingercfc81112020-02-29 02:56:32 -0500447 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
Mike Frysinger3599cc32020-02-29 02:53:41 -0500463
464class ResolveRepoRev(GitCheckoutTestCase):
465 """Check resolve_repo_rev behavior."""
466
Mike Frysingercfc81112020-02-29 02:56:32 -0500467 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
Mike Frysingere283b952020-11-16 22:56:35 -0500491 rrev, lrev = self.wrapper.resolve_repo_rev(self.GIT_DIR, 'main')
492 self.assertEqual('refs/heads/main', rrev)
Mike Frysingercfc81112020-02-29 02:56:32 -0500493 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
Mike Frysinger3599cc32020-02-29 02:53:41 -0500521class 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
544class 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
Dan Willemsen745b4ad2015-10-06 15:23:19 -0700570if __name__ == '__main__':
571 unittest.main()