blob: 8447bec1d571a6ae226add66e9c0c261c47e0a51 [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 Frysingeracf63b22019-06-13 02:24:21 -040017from io import StringIO
Dan Willemsen745b4ad2015-10-06 15:23:19 -070018import os
Mike Frysinger84094102020-02-11 02:10:28 -050019import re
Mike Frysingere5670c82021-01-07 22:14:25 -050020import sys
Mike Frysingercfc81112020-02-29 02:56:32 -050021import tempfile
Dan Willemsen745b4ad2015-10-06 15:23:19 -070022import unittest
Mike Frysingeracf63b22019-06-13 02:24:21 -040023from unittest import mock
Dan Willemsen745b4ad2015-10-06 15:23:19 -070024
Fredrik de Groot6342d562020-12-01 15:58:53 +010025import git_command
Mike Frysinger1379a9b2021-01-04 23:29:45 -050026import main
Dan Willemsen745b4ad2015-10-06 15:23:19 -070027import wrapper
28
David Pursehouse819827a2020-02-12 15:20:19 +090029
Dan Willemsen745b4ad2015-10-06 15:23:19 -070030def fixture(*paths):
31 """Return a path relative to tests/fixtures.
32 """
33 return os.path.join(os.path.dirname(__file__), 'fixtures', *paths)
34
David Pursehouse819827a2020-02-12 15:20:19 +090035
Mike Frysinger84094102020-02-11 02:10:28 -050036class RepoWrapperTestCase(unittest.TestCase):
37 """TestCase for the wrapper module."""
David Pursehouse819827a2020-02-12 15:20:19 +090038
Dan Willemsen745b4ad2015-10-06 15:23:19 -070039 def setUp(self):
Mike Frysinger84094102020-02-11 02:10:28 -050040 """Load the wrapper module every time."""
Dan Willemsen745b4ad2015-10-06 15:23:19 -070041 wrapper._wrapper_module = None
42 self.wrapper = wrapper.Wrapper()
43
Mike Frysinger84094102020-02-11 02:10:28 -050044
45class RepoWrapperUnitTest(RepoWrapperTestCase):
46 """Tests helper functions in the repo wrapper
47 """
48
Mike Frysinger8ddff5c2020-02-09 15:00:25 -050049 def test_version(self):
50 """Make sure _Version works."""
51 with self.assertRaises(SystemExit) as e:
52 with mock.patch('sys.stdout', new_callable=StringIO) as stdout:
53 with mock.patch('sys.stderr', new_callable=StringIO) as stderr:
54 self.wrapper._Version()
55 self.assertEqual(0, e.exception.code)
56 self.assertEqual('', stderr.getvalue())
57 self.assertIn('repo launcher version', stdout.getvalue())
58
Mike Frysinger1379a9b2021-01-04 23:29:45 -050059 def test_python_constraints(self):
60 """The launcher should never require newer than main.py."""
61 self.assertGreaterEqual(main.MIN_PYTHON_VERSION_HARD,
62 wrapper.MIN_PYTHON_VERSION_HARD)
63 self.assertGreaterEqual(main.MIN_PYTHON_VERSION_SOFT,
64 wrapper.MIN_PYTHON_VERSION_SOFT)
65 # Make sure the versions are themselves in sync.
66 self.assertGreaterEqual(wrapper.MIN_PYTHON_VERSION_SOFT,
67 wrapper.MIN_PYTHON_VERSION_HARD)
68
Mike Frysingerd8fda902020-02-14 00:24:38 -050069 def test_init_parser(self):
70 """Make sure 'init' GetParser works."""
71 parser = self.wrapper.GetParser(gitc_init=False)
72 opts, args = parser.parse_args([])
73 self.assertEqual([], args)
74 self.assertIsNone(opts.manifest_url)
75
76 def test_gitc_init_parser(self):
77 """Make sure 'gitc-init' GetParser works."""
78 parser = self.wrapper.GetParser(gitc_init=True)
79 opts, args = parser.parse_args([])
80 self.assertEqual([], args)
81 self.assertIsNone(opts.manifest_file)
82
Dan Willemsen745b4ad2015-10-06 15:23:19 -070083 def test_get_gitc_manifest_dir_no_gitc(self):
84 """
85 Test reading a missing gitc config file
86 """
87 self.wrapper.GITC_CONFIG_FILE = fixture('missing_gitc_config')
88 val = self.wrapper.get_gitc_manifest_dir()
89 self.assertEqual(val, '')
90
91 def test_get_gitc_manifest_dir(self):
92 """
93 Test reading the gitc config file and parsing the directory
94 """
95 self.wrapper.GITC_CONFIG_FILE = fixture('gitc_config')
96 val = self.wrapper.get_gitc_manifest_dir()
97 self.assertEqual(val, '/test/usr/local/google/gitc')
98
99 def test_gitc_parse_clientdir_no_gitc(self):
100 """
101 Test parsing the gitc clientdir without gitc running
102 """
103 self.wrapper.GITC_CONFIG_FILE = fixture('missing_gitc_config')
104 self.assertEqual(self.wrapper.gitc_parse_clientdir('/something'), None)
105 self.assertEqual(self.wrapper.gitc_parse_clientdir('/gitc/manifest-rw/test'), 'test')
106
107 def test_gitc_parse_clientdir(self):
108 """
109 Test parsing the gitc clientdir
110 """
111 self.wrapper.GITC_CONFIG_FILE = fixture('gitc_config')
112 self.assertEqual(self.wrapper.gitc_parse_clientdir('/something'), None)
113 self.assertEqual(self.wrapper.gitc_parse_clientdir('/gitc/manifest-rw/test'), 'test')
114 self.assertEqual(self.wrapper.gitc_parse_clientdir('/gitc/manifest-rw/test/'), 'test')
115 self.assertEqual(self.wrapper.gitc_parse_clientdir('/gitc/manifest-rw/test/extra'), 'test')
116 self.assertEqual(self.wrapper.gitc_parse_clientdir('/test/usr/local/google/gitc/test'), 'test')
117 self.assertEqual(self.wrapper.gitc_parse_clientdir('/test/usr/local/google/gitc/test/'), 'test')
David Pursehouse3cda50a2020-02-13 13:17:03 +0900118 self.assertEqual(self.wrapper.gitc_parse_clientdir('/test/usr/local/google/gitc/test/extra'),
119 'test')
Dan Willemsen745b4ad2015-10-06 15:23:19 -0700120 self.assertEqual(self.wrapper.gitc_parse_clientdir('/gitc/manifest-rw/'), None)
121 self.assertEqual(self.wrapper.gitc_parse_clientdir('/test/usr/local/google/gitc/'), None)
122
David Pursehouse819827a2020-02-12 15:20:19 +0900123
Mike Frysinger84094102020-02-11 02:10:28 -0500124class SetGitTrace2ParentSid(RepoWrapperTestCase):
125 """Check SetGitTrace2ParentSid behavior."""
126
127 KEY = 'GIT_TRACE2_PARENT_SID'
128 VALID_FORMAT = re.compile(r'^repo-[0-9]{8}T[0-9]{6}Z-P[0-9a-f]{8}$')
129
130 def test_first_set(self):
131 """Test env var not yet set."""
132 env = {}
133 self.wrapper.SetGitTrace2ParentSid(env)
134 self.assertIn(self.KEY, env)
135 value = env[self.KEY]
136 self.assertRegex(value, self.VALID_FORMAT)
137
138 def test_append(self):
139 """Test env var is appended."""
140 env = {self.KEY: 'pfx'}
141 self.wrapper.SetGitTrace2ParentSid(env)
142 self.assertIn(self.KEY, env)
143 value = env[self.KEY]
144 self.assertTrue(value.startswith('pfx/'))
145 self.assertRegex(value[4:], self.VALID_FORMAT)
146
147 def test_global_context(self):
148 """Check os.environ gets updated by default."""
149 os.environ.pop(self.KEY, None)
150 self.wrapper.SetGitTrace2ParentSid()
151 self.assertIn(self.KEY, os.environ)
152 value = os.environ[self.KEY]
153 self.assertRegex(value, self.VALID_FORMAT)
154
155
Mike Frysinger587f1622020-03-23 16:49:11 -0400156class RunCommand(RepoWrapperTestCase):
157 """Check run_command behavior."""
158
159 def test_capture(self):
160 """Check capture_output handling."""
161 ret = self.wrapper.run_command(['echo', 'hi'], capture_output=True)
162 self.assertEqual(ret.stdout, 'hi\n')
163
164 def test_check(self):
165 """Check check handling."""
166 self.wrapper.run_command(['true'], check=False)
167 self.wrapper.run_command(['true'], check=True)
168 self.wrapper.run_command(['false'], check=False)
169 with self.assertRaises(self.wrapper.RunError):
170 self.wrapper.run_command(['false'], check=True)
171
172
173class RunGit(RepoWrapperTestCase):
174 """Check run_git behavior."""
175
176 def test_capture(self):
177 """Check capture_output handling."""
178 ret = self.wrapper.run_git('--version')
179 self.assertIn('git', ret.stdout)
180
181 def test_check(self):
182 """Check check handling."""
183 with self.assertRaises(self.wrapper.CloneFailure):
184 self.wrapper.run_git('--version-asdfasdf')
185 self.wrapper.run_git('--version-asdfasdf', check=False)
186
187
188class ParseGitVersion(RepoWrapperTestCase):
189 """Check ParseGitVersion behavior."""
190
191 def test_autoload(self):
192 """Check we can load the version from the live git."""
193 ret = self.wrapper.ParseGitVersion()
194 self.assertIsNotNone(ret)
195
196 def test_bad_ver(self):
197 """Check handling of bad git versions."""
198 ret = self.wrapper.ParseGitVersion(ver_str='asdf')
199 self.assertIsNone(ret)
200
201 def test_normal_ver(self):
202 """Check handling of normal git versions."""
203 ret = self.wrapper.ParseGitVersion(ver_str='git version 2.25.1')
204 self.assertEqual(2, ret.major)
205 self.assertEqual(25, ret.minor)
206 self.assertEqual(1, ret.micro)
207 self.assertEqual('2.25.1', ret.full)
208
209 def test_extended_ver(self):
210 """Check handling of extended distro git versions."""
211 ret = self.wrapper.ParseGitVersion(
212 ver_str='git version 1.30.50.696.g5e7596f4ac-goog')
213 self.assertEqual(1, ret.major)
214 self.assertEqual(30, ret.minor)
215 self.assertEqual(50, ret.micro)
216 self.assertEqual('1.30.50.696.g5e7596f4ac-goog', ret.full)
217
218
219class CheckGitVersion(RepoWrapperTestCase):
220 """Check _CheckGitVersion behavior."""
221
222 def test_unknown(self):
223 """Unknown versions should abort."""
224 with mock.patch.object(self.wrapper, 'ParseGitVersion', return_value=None):
225 with self.assertRaises(self.wrapper.CloneFailure):
226 self.wrapper._CheckGitVersion()
227
228 def test_old(self):
229 """Old versions should abort."""
230 with mock.patch.object(
231 self.wrapper, 'ParseGitVersion',
232 return_value=self.wrapper.GitVersion(1, 0, 0, '1.0.0')):
233 with self.assertRaises(self.wrapper.CloneFailure):
234 self.wrapper._CheckGitVersion()
235
236 def test_new(self):
237 """Newer versions should run fine."""
238 with mock.patch.object(
239 self.wrapper, 'ParseGitVersion',
240 return_value=self.wrapper.GitVersion(100, 0, 0, '100.0.0')):
241 self.wrapper._CheckGitVersion()
242
243
Mike Frysingere5670c82021-01-07 22:14:25 -0500244class Requirements(RepoWrapperTestCase):
245 """Check Requirements handling."""
246
247 def test_missing_file(self):
248 """Don't crash if the file is missing (old version)."""
249 testdir = os.path.dirname(os.path.realpath(__file__))
250 self.assertIsNone(self.wrapper.Requirements.from_dir(testdir))
251 self.assertIsNone(self.wrapper.Requirements.from_file(
252 os.path.join(testdir, 'xxxxxxxxxxxxxxxxxxxxxxxx')))
253
254 def test_corrupt_data(self):
255 """If the file can't be parsed, don't blow up."""
256 self.assertIsNone(self.wrapper.Requirements.from_file(__file__))
257 self.assertIsNone(self.wrapper.Requirements.from_data(b'x'))
258
259 def test_valid_data(self):
260 """Make sure we can parse the file we ship."""
261 self.assertIsNotNone(self.wrapper.Requirements.from_data(b'{}'))
262 rootdir = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
263 self.assertIsNotNone(self.wrapper.Requirements.from_dir(rootdir))
264 self.assertIsNotNone(self.wrapper.Requirements.from_file(os.path.join(
265 rootdir, 'requirements.json')))
266
267 def test_format_ver(self):
268 """Check format_ver can format."""
269 self.assertEqual('1.2.3', self.wrapper.Requirements._format_ver((1, 2, 3)))
270 self.assertEqual('1', self.wrapper.Requirements._format_ver([1]))
271
272 def test_assert_all_unknown(self):
273 """Check assert_all works with incompatible file."""
274 reqs = self.wrapper.Requirements({})
275 reqs.assert_all()
276
277 def test_assert_all_new_repo(self):
278 """Check assert_all accepts new enough repo."""
279 reqs = self.wrapper.Requirements({'repo': {'hard': [1, 0]}})
280 reqs.assert_all()
281
282 def test_assert_all_old_repo(self):
283 """Check assert_all rejects old repo."""
284 reqs = self.wrapper.Requirements({'repo': {'hard': [99999, 0]}})
285 with self.assertRaises(SystemExit):
286 reqs.assert_all()
287
288 def test_assert_all_new_python(self):
289 """Check assert_all accepts new enough python."""
290 reqs = self.wrapper.Requirements({'python': {'hard': sys.version_info}})
291 reqs.assert_all()
292
Mike Frysinger934cb0a2021-03-04 02:47:49 -0500293 def test_assert_all_old_python(self):
294 """Check assert_all rejects old python."""
Mike Frysingere5670c82021-01-07 22:14:25 -0500295 reqs = self.wrapper.Requirements({'python': {'hard': [99999, 0]}})
296 with self.assertRaises(SystemExit):
297 reqs.assert_all()
298
299 def test_assert_ver_unknown(self):
300 """Check assert_ver works with incompatible file."""
301 reqs = self.wrapper.Requirements({})
302 reqs.assert_ver('xxx', (1, 0))
303
304 def test_assert_ver_new(self):
305 """Check assert_ver allows new enough versions."""
306 reqs = self.wrapper.Requirements({'git': {'hard': [1, 0], 'soft': [2, 0]}})
307 reqs.assert_ver('git', (1, 0))
308 reqs.assert_ver('git', (1, 5))
309 reqs.assert_ver('git', (2, 0))
310 reqs.assert_ver('git', (2, 5))
311
312 def test_assert_ver_old(self):
313 """Check assert_ver rejects old versions."""
314 reqs = self.wrapper.Requirements({'git': {'hard': [1, 0], 'soft': [2, 0]}})
315 with self.assertRaises(SystemExit):
316 reqs.assert_ver('git', (0, 5))
317
318
Mike Frysinger3599cc32020-02-29 02:53:41 -0500319class NeedSetupGnuPG(RepoWrapperTestCase):
320 """Check NeedSetupGnuPG behavior."""
321
322 def test_missing_dir(self):
323 """The ~/.repoconfig tree doesn't exist yet."""
Mike Frysinger74737da2022-05-20 06:26:50 -0400324 with tempfile.TemporaryDirectory(prefix='repo-tests') as tempdir:
Mike Frysinger3599cc32020-02-29 02:53:41 -0500325 self.wrapper.home_dot_repo = os.path.join(tempdir, 'foo')
326 self.assertTrue(self.wrapper.NeedSetupGnuPG())
327
328 def test_missing_keyring(self):
329 """The keyring-version file doesn't exist yet."""
Mike Frysinger74737da2022-05-20 06:26:50 -0400330 with tempfile.TemporaryDirectory(prefix='repo-tests') as tempdir:
Mike Frysinger3599cc32020-02-29 02:53:41 -0500331 self.wrapper.home_dot_repo = tempdir
332 self.assertTrue(self.wrapper.NeedSetupGnuPG())
333
334 def test_empty_keyring(self):
335 """The keyring-version file exists, but is empty."""
Mike Frysinger74737da2022-05-20 06:26:50 -0400336 with tempfile.TemporaryDirectory(prefix='repo-tests') as tempdir:
Mike Frysinger3599cc32020-02-29 02:53:41 -0500337 self.wrapper.home_dot_repo = tempdir
338 with open(os.path.join(tempdir, 'keyring-version'), 'w'):
339 pass
340 self.assertTrue(self.wrapper.NeedSetupGnuPG())
341
342 def test_old_keyring(self):
343 """The keyring-version file exists, but it's old."""
Mike Frysinger74737da2022-05-20 06:26:50 -0400344 with tempfile.TemporaryDirectory(prefix='repo-tests') as tempdir:
Mike Frysinger3599cc32020-02-29 02:53:41 -0500345 self.wrapper.home_dot_repo = tempdir
346 with open(os.path.join(tempdir, 'keyring-version'), 'w') as fp:
347 fp.write('1.0\n')
348 self.assertTrue(self.wrapper.NeedSetupGnuPG())
349
350 def test_new_keyring(self):
351 """The keyring-version file exists, and is up-to-date."""
Mike Frysinger74737da2022-05-20 06:26:50 -0400352 with tempfile.TemporaryDirectory(prefix='repo-tests') as tempdir:
Mike Frysinger3599cc32020-02-29 02:53:41 -0500353 self.wrapper.home_dot_repo = tempdir
354 with open(os.path.join(tempdir, 'keyring-version'), 'w') as fp:
355 fp.write('1000.0\n')
356 self.assertFalse(self.wrapper.NeedSetupGnuPG())
357
358
359class SetupGnuPG(RepoWrapperTestCase):
360 """Check SetupGnuPG behavior."""
361
362 def test_full(self):
363 """Make sure it works completely."""
Mike Frysinger74737da2022-05-20 06:26:50 -0400364 with tempfile.TemporaryDirectory(prefix='repo-tests') as tempdir:
Mike Frysinger3599cc32020-02-29 02:53:41 -0500365 self.wrapper.home_dot_repo = tempdir
Marcos Marado2735bfc2020-04-09 19:44:28 +0100366 self.wrapper.gpg_dir = os.path.join(self.wrapper.home_dot_repo, 'gnupg')
Mike Frysinger3599cc32020-02-29 02:53:41 -0500367 self.assertTrue(self.wrapper.SetupGnuPG(True))
368 with open(os.path.join(tempdir, 'keyring-version'), 'r') as fp:
369 data = fp.read()
370 self.assertEqual('.'.join(str(x) for x in self.wrapper.KEYRING_VERSION),
371 data.strip())
372
373
374class VerifyRev(RepoWrapperTestCase):
375 """Check verify_rev behavior."""
376
377 def test_verify_passes(self):
378 """Check when we have a valid signed tag."""
379 desc_result = self.wrapper.RunResult(0, 'v1.0\n', '')
380 gpg_result = self.wrapper.RunResult(0, '', '')
381 with mock.patch.object(self.wrapper, 'run_git',
382 side_effect=(desc_result, gpg_result)):
383 ret = self.wrapper.verify_rev('/', 'refs/heads/stable', '1234', True)
384 self.assertEqual('v1.0^0', ret)
385
386 def test_unsigned_commit(self):
387 """Check we fall back to signed tag when we have an unsigned commit."""
388 desc_result = self.wrapper.RunResult(0, 'v1.0-10-g1234\n', '')
389 gpg_result = self.wrapper.RunResult(0, '', '')
390 with mock.patch.object(self.wrapper, 'run_git',
391 side_effect=(desc_result, gpg_result)):
392 ret = self.wrapper.verify_rev('/', 'refs/heads/stable', '1234', True)
393 self.assertEqual('v1.0^0', ret)
394
395 def test_verify_fails(self):
396 """Check we fall back to signed tag when we have an unsigned commit."""
397 desc_result = self.wrapper.RunResult(0, 'v1.0-10-g1234\n', '')
398 gpg_result = Exception
399 with mock.patch.object(self.wrapper, 'run_git',
400 side_effect=(desc_result, gpg_result)):
401 with self.assertRaises(Exception):
402 self.wrapper.verify_rev('/', 'refs/heads/stable', '1234', True)
403
404
405class GitCheckoutTestCase(RepoWrapperTestCase):
406 """Tests that use a real/small git checkout."""
Mike Frysingercfc81112020-02-29 02:56:32 -0500407
408 GIT_DIR = None
409 REV_LIST = None
410
411 @classmethod
412 def setUpClass(cls):
413 # Create a repo to operate on, but do it once per-class.
Mike Frysinger74737da2022-05-20 06:26:50 -0400414 cls.tempdirobj = tempfile.TemporaryDirectory(prefix='repo-rev-tests')
415 cls.GIT_DIR = cls.tempdirobj.name
Mike Frysingercfc81112020-02-29 02:56:32 -0500416 run_git = wrapper.Wrapper().run_git
417
418 remote = os.path.join(cls.GIT_DIR, 'remote')
419 os.mkdir(remote)
Fredrik de Groot6342d562020-12-01 15:58:53 +0100420
421 # Tests need to assume, that main is default branch at init,
422 # which is not supported in config until 2.28.
423 if git_command.git_require((2, 28, 0)):
424 initstr = '--initial-branch=main'
425 else:
426 # Use template dir for init.
427 templatedir = tempfile.mkdtemp(prefix='.test-template')
428 with open(os.path.join(templatedir, 'HEAD'), 'w') as fp:
429 fp.write('ref: refs/heads/main\n')
430 initstr = '--template=' + templatedir
431
432 run_git('init', initstr, cwd=remote)
Mike Frysingercfc81112020-02-29 02:56:32 -0500433 run_git('commit', '--allow-empty', '-minit', cwd=remote)
434 run_git('branch', 'stable', cwd=remote)
435 run_git('tag', 'v1.0', cwd=remote)
436 run_git('commit', '--allow-empty', '-m2nd commit', cwd=remote)
437 cls.REV_LIST = run_git('rev-list', 'HEAD', cwd=remote).stdout.splitlines()
438
439 run_git('init', cwd=cls.GIT_DIR)
440 run_git('fetch', remote, '+refs/heads/*:refs/remotes/origin/*', cwd=cls.GIT_DIR)
441
442 @classmethod
443 def tearDownClass(cls):
Mike Frysinger74737da2022-05-20 06:26:50 -0400444 if not cls.tempdirobj:
Mike Frysingercfc81112020-02-29 02:56:32 -0500445 return
446
Mike Frysinger74737da2022-05-20 06:26:50 -0400447 cls.tempdirobj.cleanup()
Mike Frysingercfc81112020-02-29 02:56:32 -0500448
Mike Frysinger3599cc32020-02-29 02:53:41 -0500449
450class ResolveRepoRev(GitCheckoutTestCase):
451 """Check resolve_repo_rev behavior."""
452
Mike Frysingercfc81112020-02-29 02:56:32 -0500453 def test_explicit_branch(self):
454 """Check refs/heads/branch argument."""
455 rrev, lrev = self.wrapper.resolve_repo_rev(self.GIT_DIR, 'refs/heads/stable')
456 self.assertEqual('refs/heads/stable', rrev)
457 self.assertEqual(self.REV_LIST[1], lrev)
458
459 with self.assertRaises(wrapper.CloneFailure):
460 self.wrapper.resolve_repo_rev(self.GIT_DIR, 'refs/heads/unknown')
461
462 def test_explicit_tag(self):
463 """Check refs/tags/tag argument."""
464 rrev, lrev = self.wrapper.resolve_repo_rev(self.GIT_DIR, 'refs/tags/v1.0')
465 self.assertEqual('refs/tags/v1.0', rrev)
466 self.assertEqual(self.REV_LIST[1], lrev)
467
468 with self.assertRaises(wrapper.CloneFailure):
469 self.wrapper.resolve_repo_rev(self.GIT_DIR, 'refs/tags/unknown')
470
471 def test_branch_name(self):
472 """Check branch argument."""
473 rrev, lrev = self.wrapper.resolve_repo_rev(self.GIT_DIR, 'stable')
474 self.assertEqual('refs/heads/stable', rrev)
475 self.assertEqual(self.REV_LIST[1], lrev)
476
Mike Frysingere283b952020-11-16 22:56:35 -0500477 rrev, lrev = self.wrapper.resolve_repo_rev(self.GIT_DIR, 'main')
478 self.assertEqual('refs/heads/main', rrev)
Mike Frysingercfc81112020-02-29 02:56:32 -0500479 self.assertEqual(self.REV_LIST[0], lrev)
480
481 def test_tag_name(self):
482 """Check tag argument."""
483 rrev, lrev = self.wrapper.resolve_repo_rev(self.GIT_DIR, 'v1.0')
484 self.assertEqual('refs/tags/v1.0', rrev)
485 self.assertEqual(self.REV_LIST[1], lrev)
486
487 def test_full_commit(self):
488 """Check specific commit argument."""
489 commit = self.REV_LIST[0]
490 rrev, lrev = self.wrapper.resolve_repo_rev(self.GIT_DIR, commit)
491 self.assertEqual(commit, rrev)
492 self.assertEqual(commit, lrev)
493
494 def test_partial_commit(self):
495 """Check specific (partial) commit argument."""
496 commit = self.REV_LIST[0][0:20]
497 rrev, lrev = self.wrapper.resolve_repo_rev(self.GIT_DIR, commit)
498 self.assertEqual(self.REV_LIST[0], rrev)
499 self.assertEqual(self.REV_LIST[0], lrev)
500
501 def test_unknown(self):
502 """Check unknown ref/commit argument."""
503 with self.assertRaises(wrapper.CloneFailure):
504 self.wrapper.resolve_repo_rev(self.GIT_DIR, 'boooooooya')
505
506
Mike Frysinger3599cc32020-02-29 02:53:41 -0500507class CheckRepoVerify(RepoWrapperTestCase):
508 """Check check_repo_verify behavior."""
509
510 def test_no_verify(self):
511 """Always fail with --no-repo-verify."""
512 self.assertFalse(self.wrapper.check_repo_verify(False))
513
514 def test_gpg_initialized(self):
515 """Should pass if gpg is setup already."""
516 with mock.patch.object(self.wrapper, 'NeedSetupGnuPG', return_value=False):
517 self.assertTrue(self.wrapper.check_repo_verify(True))
518
519 def test_need_gpg_setup(self):
520 """Should pass/fail based on gpg setup."""
521 with mock.patch.object(self.wrapper, 'NeedSetupGnuPG', return_value=True):
522 with mock.patch.object(self.wrapper, 'SetupGnuPG') as m:
523 m.return_value = True
524 self.assertTrue(self.wrapper.check_repo_verify(True))
525
526 m.return_value = False
527 self.assertFalse(self.wrapper.check_repo_verify(True))
528
529
530class CheckRepoRev(GitCheckoutTestCase):
531 """Check check_repo_rev behavior."""
532
533 def test_verify_works(self):
534 """Should pass when verification passes."""
535 with mock.patch.object(self.wrapper, 'check_repo_verify', return_value=True):
536 with mock.patch.object(self.wrapper, 'verify_rev', return_value='12345'):
537 rrev, lrev = self.wrapper.check_repo_rev(self.GIT_DIR, 'stable')
538 self.assertEqual('refs/heads/stable', rrev)
539 self.assertEqual('12345', lrev)
540
541 def test_verify_fails(self):
542 """Should fail when verification fails."""
543 with mock.patch.object(self.wrapper, 'check_repo_verify', return_value=True):
544 with mock.patch.object(self.wrapper, 'verify_rev', side_effect=Exception):
545 with self.assertRaises(Exception):
546 self.wrapper.check_repo_rev(self.GIT_DIR, 'stable')
547
548 def test_verify_ignore(self):
549 """Should pass when verification is disabled."""
550 with mock.patch.object(self.wrapper, 'verify_rev', side_effect=Exception):
551 rrev, lrev = self.wrapper.check_repo_rev(self.GIT_DIR, 'stable', repo_verify=False)
552 self.assertEqual('refs/heads/stable', rrev)
553 self.assertEqual(self.REV_LIST[1], lrev)
554
555
Dan Willemsen745b4ad2015-10-06 15:23:19 -0700556if __name__ == '__main__':
557 unittest.main()