blob: f77ae1eff8413dbec939e6fd89ccff9ad1b1e2a9 [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)
Daniel Kutike287fa72022-11-27 13:42:50 +0100162 # echo command appends OS specific linesep, but on Windows + Git Bash
163 # we get UNIX ending, so we allow both.
164 self.assertIn(ret.stdout, ['hi' + os.linesep, 'hi\n'])
Mike Frysinger587f1622020-03-23 16:49:11 -0400165
166 def test_check(self):
167 """Check check handling."""
168 self.wrapper.run_command(['true'], check=False)
169 self.wrapper.run_command(['true'], check=True)
170 self.wrapper.run_command(['false'], check=False)
171 with self.assertRaises(self.wrapper.RunError):
172 self.wrapper.run_command(['false'], check=True)
173
174
175class RunGit(RepoWrapperTestCase):
176 """Check run_git behavior."""
177
178 def test_capture(self):
179 """Check capture_output handling."""
180 ret = self.wrapper.run_git('--version')
181 self.assertIn('git', ret.stdout)
182
183 def test_check(self):
184 """Check check handling."""
185 with self.assertRaises(self.wrapper.CloneFailure):
186 self.wrapper.run_git('--version-asdfasdf')
187 self.wrapper.run_git('--version-asdfasdf', check=False)
188
189
190class ParseGitVersion(RepoWrapperTestCase):
191 """Check ParseGitVersion behavior."""
192
193 def test_autoload(self):
194 """Check we can load the version from the live git."""
195 ret = self.wrapper.ParseGitVersion()
196 self.assertIsNotNone(ret)
197
198 def test_bad_ver(self):
199 """Check handling of bad git versions."""
200 ret = self.wrapper.ParseGitVersion(ver_str='asdf')
201 self.assertIsNone(ret)
202
203 def test_normal_ver(self):
204 """Check handling of normal git versions."""
205 ret = self.wrapper.ParseGitVersion(ver_str='git version 2.25.1')
206 self.assertEqual(2, ret.major)
207 self.assertEqual(25, ret.minor)
208 self.assertEqual(1, ret.micro)
209 self.assertEqual('2.25.1', ret.full)
210
211 def test_extended_ver(self):
212 """Check handling of extended distro git versions."""
213 ret = self.wrapper.ParseGitVersion(
214 ver_str='git version 1.30.50.696.g5e7596f4ac-goog')
215 self.assertEqual(1, ret.major)
216 self.assertEqual(30, ret.minor)
217 self.assertEqual(50, ret.micro)
218 self.assertEqual('1.30.50.696.g5e7596f4ac-goog', ret.full)
219
220
221class CheckGitVersion(RepoWrapperTestCase):
222 """Check _CheckGitVersion behavior."""
223
224 def test_unknown(self):
225 """Unknown versions should abort."""
226 with mock.patch.object(self.wrapper, 'ParseGitVersion', return_value=None):
227 with self.assertRaises(self.wrapper.CloneFailure):
228 self.wrapper._CheckGitVersion()
229
230 def test_old(self):
231 """Old versions should abort."""
232 with mock.patch.object(
233 self.wrapper, 'ParseGitVersion',
234 return_value=self.wrapper.GitVersion(1, 0, 0, '1.0.0')):
235 with self.assertRaises(self.wrapper.CloneFailure):
236 self.wrapper._CheckGitVersion()
237
238 def test_new(self):
239 """Newer versions should run fine."""
240 with mock.patch.object(
241 self.wrapper, 'ParseGitVersion',
242 return_value=self.wrapper.GitVersion(100, 0, 0, '100.0.0')):
243 self.wrapper._CheckGitVersion()
244
245
Mike Frysingere5670c82021-01-07 22:14:25 -0500246class Requirements(RepoWrapperTestCase):
247 """Check Requirements handling."""
248
249 def test_missing_file(self):
250 """Don't crash if the file is missing (old version)."""
251 testdir = os.path.dirname(os.path.realpath(__file__))
252 self.assertIsNone(self.wrapper.Requirements.from_dir(testdir))
253 self.assertIsNone(self.wrapper.Requirements.from_file(
254 os.path.join(testdir, 'xxxxxxxxxxxxxxxxxxxxxxxx')))
255
256 def test_corrupt_data(self):
257 """If the file can't be parsed, don't blow up."""
258 self.assertIsNone(self.wrapper.Requirements.from_file(__file__))
259 self.assertIsNone(self.wrapper.Requirements.from_data(b'x'))
260
261 def test_valid_data(self):
262 """Make sure we can parse the file we ship."""
263 self.assertIsNotNone(self.wrapper.Requirements.from_data(b'{}'))
264 rootdir = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
265 self.assertIsNotNone(self.wrapper.Requirements.from_dir(rootdir))
266 self.assertIsNotNone(self.wrapper.Requirements.from_file(os.path.join(
267 rootdir, 'requirements.json')))
268
269 def test_format_ver(self):
270 """Check format_ver can format."""
271 self.assertEqual('1.2.3', self.wrapper.Requirements._format_ver((1, 2, 3)))
272 self.assertEqual('1', self.wrapper.Requirements._format_ver([1]))
273
274 def test_assert_all_unknown(self):
275 """Check assert_all works with incompatible file."""
276 reqs = self.wrapper.Requirements({})
277 reqs.assert_all()
278
279 def test_assert_all_new_repo(self):
280 """Check assert_all accepts new enough repo."""
281 reqs = self.wrapper.Requirements({'repo': {'hard': [1, 0]}})
282 reqs.assert_all()
283
284 def test_assert_all_old_repo(self):
285 """Check assert_all rejects old repo."""
286 reqs = self.wrapper.Requirements({'repo': {'hard': [99999, 0]}})
287 with self.assertRaises(SystemExit):
288 reqs.assert_all()
289
290 def test_assert_all_new_python(self):
291 """Check assert_all accepts new enough python."""
292 reqs = self.wrapper.Requirements({'python': {'hard': sys.version_info}})
293 reqs.assert_all()
294
Mike Frysinger934cb0a2021-03-04 02:47:49 -0500295 def test_assert_all_old_python(self):
296 """Check assert_all rejects old python."""
Mike Frysingere5670c82021-01-07 22:14:25 -0500297 reqs = self.wrapper.Requirements({'python': {'hard': [99999, 0]}})
298 with self.assertRaises(SystemExit):
299 reqs.assert_all()
300
301 def test_assert_ver_unknown(self):
302 """Check assert_ver works with incompatible file."""
303 reqs = self.wrapper.Requirements({})
304 reqs.assert_ver('xxx', (1, 0))
305
306 def test_assert_ver_new(self):
307 """Check assert_ver allows new enough versions."""
308 reqs = self.wrapper.Requirements({'git': {'hard': [1, 0], 'soft': [2, 0]}})
309 reqs.assert_ver('git', (1, 0))
310 reqs.assert_ver('git', (1, 5))
311 reqs.assert_ver('git', (2, 0))
312 reqs.assert_ver('git', (2, 5))
313
314 def test_assert_ver_old(self):
315 """Check assert_ver rejects old versions."""
316 reqs = self.wrapper.Requirements({'git': {'hard': [1, 0], 'soft': [2, 0]}})
317 with self.assertRaises(SystemExit):
318 reqs.assert_ver('git', (0, 5))
319
320
Mike Frysinger3599cc32020-02-29 02:53:41 -0500321class NeedSetupGnuPG(RepoWrapperTestCase):
322 """Check NeedSetupGnuPG behavior."""
323
324 def test_missing_dir(self):
325 """The ~/.repoconfig tree doesn't exist yet."""
Mike Frysinger74737da2022-05-20 06:26:50 -0400326 with tempfile.TemporaryDirectory(prefix='repo-tests') as tempdir:
Mike Frysinger3599cc32020-02-29 02:53:41 -0500327 self.wrapper.home_dot_repo = os.path.join(tempdir, 'foo')
328 self.assertTrue(self.wrapper.NeedSetupGnuPG())
329
330 def test_missing_keyring(self):
331 """The keyring-version file doesn't exist yet."""
Mike Frysinger74737da2022-05-20 06:26:50 -0400332 with tempfile.TemporaryDirectory(prefix='repo-tests') as tempdir:
Mike Frysinger3599cc32020-02-29 02:53:41 -0500333 self.wrapper.home_dot_repo = tempdir
334 self.assertTrue(self.wrapper.NeedSetupGnuPG())
335
336 def test_empty_keyring(self):
337 """The keyring-version file exists, but is empty."""
Mike Frysinger74737da2022-05-20 06:26:50 -0400338 with tempfile.TemporaryDirectory(prefix='repo-tests') as tempdir:
Mike Frysinger3599cc32020-02-29 02:53:41 -0500339 self.wrapper.home_dot_repo = tempdir
340 with open(os.path.join(tempdir, 'keyring-version'), 'w'):
341 pass
342 self.assertTrue(self.wrapper.NeedSetupGnuPG())
343
344 def test_old_keyring(self):
345 """The keyring-version file exists, but it's old."""
Mike Frysinger74737da2022-05-20 06:26:50 -0400346 with tempfile.TemporaryDirectory(prefix='repo-tests') as tempdir:
Mike Frysinger3599cc32020-02-29 02:53:41 -0500347 self.wrapper.home_dot_repo = tempdir
348 with open(os.path.join(tempdir, 'keyring-version'), 'w') as fp:
349 fp.write('1.0\n')
350 self.assertTrue(self.wrapper.NeedSetupGnuPG())
351
352 def test_new_keyring(self):
353 """The keyring-version file exists, and is up-to-date."""
Mike Frysinger74737da2022-05-20 06:26:50 -0400354 with tempfile.TemporaryDirectory(prefix='repo-tests') as tempdir:
Mike Frysinger3599cc32020-02-29 02:53:41 -0500355 self.wrapper.home_dot_repo = tempdir
356 with open(os.path.join(tempdir, 'keyring-version'), 'w') as fp:
357 fp.write('1000.0\n')
358 self.assertFalse(self.wrapper.NeedSetupGnuPG())
359
360
361class SetupGnuPG(RepoWrapperTestCase):
362 """Check SetupGnuPG behavior."""
363
364 def test_full(self):
365 """Make sure it works completely."""
Mike Frysinger74737da2022-05-20 06:26:50 -0400366 with tempfile.TemporaryDirectory(prefix='repo-tests') as tempdir:
Mike Frysinger3599cc32020-02-29 02:53:41 -0500367 self.wrapper.home_dot_repo = tempdir
Marcos Marado2735bfc2020-04-09 19:44:28 +0100368 self.wrapper.gpg_dir = os.path.join(self.wrapper.home_dot_repo, 'gnupg')
Mike Frysinger3599cc32020-02-29 02:53:41 -0500369 self.assertTrue(self.wrapper.SetupGnuPG(True))
370 with open(os.path.join(tempdir, 'keyring-version'), 'r') as fp:
371 data = fp.read()
372 self.assertEqual('.'.join(str(x) for x in self.wrapper.KEYRING_VERSION),
373 data.strip())
374
375
376class VerifyRev(RepoWrapperTestCase):
377 """Check verify_rev behavior."""
378
379 def test_verify_passes(self):
380 """Check when we have a valid signed tag."""
381 desc_result = self.wrapper.RunResult(0, 'v1.0\n', '')
382 gpg_result = self.wrapper.RunResult(0, '', '')
383 with mock.patch.object(self.wrapper, 'run_git',
384 side_effect=(desc_result, gpg_result)):
385 ret = self.wrapper.verify_rev('/', 'refs/heads/stable', '1234', True)
386 self.assertEqual('v1.0^0', ret)
387
388 def test_unsigned_commit(self):
389 """Check we fall back to signed tag when we have an unsigned commit."""
390 desc_result = self.wrapper.RunResult(0, 'v1.0-10-g1234\n', '')
391 gpg_result = self.wrapper.RunResult(0, '', '')
392 with mock.patch.object(self.wrapper, 'run_git',
393 side_effect=(desc_result, gpg_result)):
394 ret = self.wrapper.verify_rev('/', 'refs/heads/stable', '1234', True)
395 self.assertEqual('v1.0^0', ret)
396
397 def test_verify_fails(self):
398 """Check we fall back to signed tag when we have an unsigned commit."""
399 desc_result = self.wrapper.RunResult(0, 'v1.0-10-g1234\n', '')
400 gpg_result = Exception
401 with mock.patch.object(self.wrapper, 'run_git',
402 side_effect=(desc_result, gpg_result)):
403 with self.assertRaises(Exception):
404 self.wrapper.verify_rev('/', 'refs/heads/stable', '1234', True)
405
406
407class GitCheckoutTestCase(RepoWrapperTestCase):
408 """Tests that use a real/small git checkout."""
Mike Frysingercfc81112020-02-29 02:56:32 -0500409
410 GIT_DIR = None
411 REV_LIST = None
412
413 @classmethod
414 def setUpClass(cls):
415 # Create a repo to operate on, but do it once per-class.
Mike Frysinger74737da2022-05-20 06:26:50 -0400416 cls.tempdirobj = tempfile.TemporaryDirectory(prefix='repo-rev-tests')
417 cls.GIT_DIR = cls.tempdirobj.name
Mike Frysingercfc81112020-02-29 02:56:32 -0500418 run_git = wrapper.Wrapper().run_git
419
420 remote = os.path.join(cls.GIT_DIR, 'remote')
421 os.mkdir(remote)
Fredrik de Groot6342d562020-12-01 15:58:53 +0100422
423 # Tests need to assume, that main is default branch at init,
424 # which is not supported in config until 2.28.
425 if git_command.git_require((2, 28, 0)):
426 initstr = '--initial-branch=main'
427 else:
428 # Use template dir for init.
429 templatedir = tempfile.mkdtemp(prefix='.test-template')
430 with open(os.path.join(templatedir, 'HEAD'), 'w') as fp:
431 fp.write('ref: refs/heads/main\n')
432 initstr = '--template=' + templatedir
433
434 run_git('init', initstr, cwd=remote)
Mike Frysingercfc81112020-02-29 02:56:32 -0500435 run_git('commit', '--allow-empty', '-minit', cwd=remote)
436 run_git('branch', 'stable', cwd=remote)
437 run_git('tag', 'v1.0', cwd=remote)
438 run_git('commit', '--allow-empty', '-m2nd commit', cwd=remote)
439 cls.REV_LIST = run_git('rev-list', 'HEAD', cwd=remote).stdout.splitlines()
440
441 run_git('init', cwd=cls.GIT_DIR)
442 run_git('fetch', remote, '+refs/heads/*:refs/remotes/origin/*', cwd=cls.GIT_DIR)
443
444 @classmethod
445 def tearDownClass(cls):
Mike Frysinger74737da2022-05-20 06:26:50 -0400446 if not cls.tempdirobj:
Mike Frysingercfc81112020-02-29 02:56:32 -0500447 return
448
Mike Frysinger74737da2022-05-20 06:26:50 -0400449 cls.tempdirobj.cleanup()
Mike Frysingercfc81112020-02-29 02:56:32 -0500450
Mike Frysinger3599cc32020-02-29 02:53:41 -0500451
452class ResolveRepoRev(GitCheckoutTestCase):
453 """Check resolve_repo_rev behavior."""
454
Mike Frysingercfc81112020-02-29 02:56:32 -0500455 def test_explicit_branch(self):
456 """Check refs/heads/branch argument."""
457 rrev, lrev = self.wrapper.resolve_repo_rev(self.GIT_DIR, 'refs/heads/stable')
458 self.assertEqual('refs/heads/stable', rrev)
459 self.assertEqual(self.REV_LIST[1], lrev)
460
461 with self.assertRaises(wrapper.CloneFailure):
462 self.wrapper.resolve_repo_rev(self.GIT_DIR, 'refs/heads/unknown')
463
464 def test_explicit_tag(self):
465 """Check refs/tags/tag argument."""
466 rrev, lrev = self.wrapper.resolve_repo_rev(self.GIT_DIR, 'refs/tags/v1.0')
467 self.assertEqual('refs/tags/v1.0', rrev)
468 self.assertEqual(self.REV_LIST[1], lrev)
469
470 with self.assertRaises(wrapper.CloneFailure):
471 self.wrapper.resolve_repo_rev(self.GIT_DIR, 'refs/tags/unknown')
472
473 def test_branch_name(self):
474 """Check branch argument."""
475 rrev, lrev = self.wrapper.resolve_repo_rev(self.GIT_DIR, 'stable')
476 self.assertEqual('refs/heads/stable', rrev)
477 self.assertEqual(self.REV_LIST[1], lrev)
478
Mike Frysingere283b952020-11-16 22:56:35 -0500479 rrev, lrev = self.wrapper.resolve_repo_rev(self.GIT_DIR, 'main')
480 self.assertEqual('refs/heads/main', rrev)
Mike Frysingercfc81112020-02-29 02:56:32 -0500481 self.assertEqual(self.REV_LIST[0], lrev)
482
483 def test_tag_name(self):
484 """Check tag argument."""
485 rrev, lrev = self.wrapper.resolve_repo_rev(self.GIT_DIR, 'v1.0')
486 self.assertEqual('refs/tags/v1.0', rrev)
487 self.assertEqual(self.REV_LIST[1], lrev)
488
489 def test_full_commit(self):
490 """Check specific commit argument."""
491 commit = self.REV_LIST[0]
492 rrev, lrev = self.wrapper.resolve_repo_rev(self.GIT_DIR, commit)
493 self.assertEqual(commit, rrev)
494 self.assertEqual(commit, lrev)
495
496 def test_partial_commit(self):
497 """Check specific (partial) commit argument."""
498 commit = self.REV_LIST[0][0:20]
499 rrev, lrev = self.wrapper.resolve_repo_rev(self.GIT_DIR, commit)
500 self.assertEqual(self.REV_LIST[0], rrev)
501 self.assertEqual(self.REV_LIST[0], lrev)
502
503 def test_unknown(self):
504 """Check unknown ref/commit argument."""
505 with self.assertRaises(wrapper.CloneFailure):
506 self.wrapper.resolve_repo_rev(self.GIT_DIR, 'boooooooya')
507
508
Mike Frysinger3599cc32020-02-29 02:53:41 -0500509class CheckRepoVerify(RepoWrapperTestCase):
510 """Check check_repo_verify behavior."""
511
512 def test_no_verify(self):
513 """Always fail with --no-repo-verify."""
514 self.assertFalse(self.wrapper.check_repo_verify(False))
515
516 def test_gpg_initialized(self):
517 """Should pass if gpg is setup already."""
518 with mock.patch.object(self.wrapper, 'NeedSetupGnuPG', return_value=False):
519 self.assertTrue(self.wrapper.check_repo_verify(True))
520
521 def test_need_gpg_setup(self):
522 """Should pass/fail based on gpg setup."""
523 with mock.patch.object(self.wrapper, 'NeedSetupGnuPG', return_value=True):
524 with mock.patch.object(self.wrapper, 'SetupGnuPG') as m:
525 m.return_value = True
526 self.assertTrue(self.wrapper.check_repo_verify(True))
527
528 m.return_value = False
529 self.assertFalse(self.wrapper.check_repo_verify(True))
530
531
532class CheckRepoRev(GitCheckoutTestCase):
533 """Check check_repo_rev behavior."""
534
535 def test_verify_works(self):
536 """Should pass when verification passes."""
537 with mock.patch.object(self.wrapper, 'check_repo_verify', return_value=True):
538 with mock.patch.object(self.wrapper, 'verify_rev', return_value='12345'):
539 rrev, lrev = self.wrapper.check_repo_rev(self.GIT_DIR, 'stable')
540 self.assertEqual('refs/heads/stable', rrev)
541 self.assertEqual('12345', lrev)
542
543 def test_verify_fails(self):
544 """Should fail when verification fails."""
545 with mock.patch.object(self.wrapper, 'check_repo_verify', return_value=True):
546 with mock.patch.object(self.wrapper, 'verify_rev', side_effect=Exception):
547 with self.assertRaises(Exception):
548 self.wrapper.check_repo_rev(self.GIT_DIR, 'stable')
549
550 def test_verify_ignore(self):
551 """Should pass when verification is disabled."""
552 with mock.patch.object(self.wrapper, 'verify_rev', side_effect=Exception):
553 rrev, lrev = self.wrapper.check_repo_rev(self.GIT_DIR, 'stable', repo_verify=False)
554 self.assertEqual('refs/heads/stable', rrev)
555 self.assertEqual(self.REV_LIST[1], lrev)
556
557
Dan Willemsen745b4ad2015-10-06 15:23:19 -0700558if __name__ == '__main__':
559 unittest.main()