diff options
author | Gavin Mak <gavinmak@google.com> | 2023-03-11 06:46:20 +0000 |
---|---|---|
committer | LUCI <gerrit-scoped@luci-project-accounts.iam.gserviceaccount.com> | 2023-03-22 17:46:28 +0000 |
commit | ea2e330e43c182dc16b0111ebc69ee5a71ee4ce1 (patch) | |
tree | dc33ba0e56825b3e007d0589891756724725a465 /tests/test_wrapper.py | |
parent | 1604cf255f8c1786a23388db6d5277ac7949a24a (diff) | |
download | git-repo-ea2e330e43c182dc16b0111ebc69ee5a71ee4ce1.tar.gz |
Format codebase with black and check formatting in CQ
Apply rules set by https://gerrit-review.googlesource.com/c/git-repo/+/362954/ across the codebase and fix any lingering errors caught
by flake8. Also check black formatting in run_tests (and CQ).
Bug: b/267675342
Change-Id: I972d77649dac351150dcfeb1cd1ad0ea2efc1956
Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/363474
Reviewed-by: Mike Frysinger <vapier@google.com>
Tested-by: Gavin Mak <gavinmak@google.com>
Commit-Queue: Gavin Mak <gavinmak@google.com>
Diffstat (limited to 'tests/test_wrapper.py')
-rw-r--r-- | tests/test_wrapper.py | 1029 |
1 files changed, 558 insertions, 471 deletions
diff --git a/tests/test_wrapper.py b/tests/test_wrapper.py index ef879a5d..21fa094d 100644 --- a/tests/test_wrapper.py +++ b/tests/test_wrapper.py | |||
@@ -28,528 +28,615 @@ import wrapper | |||
28 | 28 | ||
29 | 29 | ||
30 | def fixture(*paths): | 30 | def fixture(*paths): |
31 | """Return a path relative to tests/fixtures. | 31 | """Return a path relative to tests/fixtures.""" |
32 | """ | 32 | return os.path.join(os.path.dirname(__file__), "fixtures", *paths) |
33 | return os.path.join(os.path.dirname(__file__), 'fixtures', *paths) | ||
34 | 33 | ||
35 | 34 | ||
36 | class RepoWrapperTestCase(unittest.TestCase): | 35 | class RepoWrapperTestCase(unittest.TestCase): |
37 | """TestCase for the wrapper module.""" | 36 | """TestCase for the wrapper module.""" |
38 | 37 | ||
39 | def setUp(self): | 38 | def setUp(self): |
40 | """Load the wrapper module every time.""" | 39 | """Load the wrapper module every time.""" |
41 | wrapper.Wrapper.cache_clear() | 40 | wrapper.Wrapper.cache_clear() |
42 | self.wrapper = wrapper.Wrapper() | 41 | self.wrapper = wrapper.Wrapper() |
43 | 42 | ||
44 | 43 | ||
45 | class RepoWrapperUnitTest(RepoWrapperTestCase): | 44 | class RepoWrapperUnitTest(RepoWrapperTestCase): |
46 | """Tests helper functions in the repo wrapper | 45 | """Tests helper functions in the repo wrapper""" |
47 | """ | 46 | |
48 | 47 | def test_version(self): | |
49 | def test_version(self): | 48 | """Make sure _Version works.""" |
50 | """Make sure _Version works.""" | 49 | with self.assertRaises(SystemExit) as e: |
51 | with self.assertRaises(SystemExit) as e: | 50 | with mock.patch("sys.stdout", new_callable=StringIO) as stdout: |
52 | with mock.patch('sys.stdout', new_callable=StringIO) as stdout: | 51 | with mock.patch("sys.stderr", new_callable=StringIO) as stderr: |
53 | with mock.patch('sys.stderr', new_callable=StringIO) as stderr: | 52 | self.wrapper._Version() |
54 | self.wrapper._Version() | 53 | self.assertEqual(0, e.exception.code) |
55 | self.assertEqual(0, e.exception.code) | 54 | self.assertEqual("", stderr.getvalue()) |
56 | self.assertEqual('', stderr.getvalue()) | 55 | self.assertIn("repo launcher version", stdout.getvalue()) |
57 | self.assertIn('repo launcher version', stdout.getvalue()) | 56 | |
58 | 57 | def test_python_constraints(self): | |
59 | def test_python_constraints(self): | 58 | """The launcher should never require newer than main.py.""" |
60 | """The launcher should never require newer than main.py.""" | 59 | self.assertGreaterEqual( |
61 | self.assertGreaterEqual(main.MIN_PYTHON_VERSION_HARD, | 60 | main.MIN_PYTHON_VERSION_HARD, self.wrapper.MIN_PYTHON_VERSION_HARD |
62 | self.wrapper.MIN_PYTHON_VERSION_HARD) | 61 | ) |
63 | self.assertGreaterEqual(main.MIN_PYTHON_VERSION_SOFT, | 62 | self.assertGreaterEqual( |
64 | self.wrapper.MIN_PYTHON_VERSION_SOFT) | 63 | main.MIN_PYTHON_VERSION_SOFT, self.wrapper.MIN_PYTHON_VERSION_SOFT |
65 | # Make sure the versions are themselves in sync. | 64 | ) |
66 | self.assertGreaterEqual(self.wrapper.MIN_PYTHON_VERSION_SOFT, | 65 | # Make sure the versions are themselves in sync. |
67 | self.wrapper.MIN_PYTHON_VERSION_HARD) | 66 | self.assertGreaterEqual( |
68 | 67 | self.wrapper.MIN_PYTHON_VERSION_SOFT, | |
69 | def test_init_parser(self): | 68 | self.wrapper.MIN_PYTHON_VERSION_HARD, |
70 | """Make sure 'init' GetParser works.""" | 69 | ) |
71 | parser = self.wrapper.GetParser(gitc_init=False) | 70 | |
72 | opts, args = parser.parse_args([]) | 71 | def test_init_parser(self): |
73 | self.assertEqual([], args) | 72 | """Make sure 'init' GetParser works.""" |
74 | self.assertIsNone(opts.manifest_url) | 73 | parser = self.wrapper.GetParser(gitc_init=False) |
75 | 74 | opts, args = parser.parse_args([]) | |
76 | def test_gitc_init_parser(self): | 75 | self.assertEqual([], args) |
77 | """Make sure 'gitc-init' GetParser works.""" | 76 | self.assertIsNone(opts.manifest_url) |
78 | parser = self.wrapper.GetParser(gitc_init=True) | 77 | |
79 | opts, args = parser.parse_args([]) | 78 | def test_gitc_init_parser(self): |
80 | self.assertEqual([], args) | 79 | """Make sure 'gitc-init' GetParser works.""" |
81 | self.assertIsNone(opts.manifest_file) | 80 | parser = self.wrapper.GetParser(gitc_init=True) |
82 | 81 | opts, args = parser.parse_args([]) | |
83 | def test_get_gitc_manifest_dir_no_gitc(self): | 82 | self.assertEqual([], args) |
84 | """ | 83 | self.assertIsNone(opts.manifest_file) |
85 | Test reading a missing gitc config file | 84 | |
86 | """ | 85 | def test_get_gitc_manifest_dir_no_gitc(self): |
87 | self.wrapper.GITC_CONFIG_FILE = fixture('missing_gitc_config') | 86 | """ |
88 | val = self.wrapper.get_gitc_manifest_dir() | 87 | Test reading a missing gitc config file |
89 | self.assertEqual(val, '') | 88 | """ |
90 | 89 | self.wrapper.GITC_CONFIG_FILE = fixture("missing_gitc_config") | |
91 | def test_get_gitc_manifest_dir(self): | 90 | val = self.wrapper.get_gitc_manifest_dir() |
92 | """ | 91 | self.assertEqual(val, "") |
93 | Test reading the gitc config file and parsing the directory | 92 | |
94 | """ | 93 | def test_get_gitc_manifest_dir(self): |
95 | self.wrapper.GITC_CONFIG_FILE = fixture('gitc_config') | 94 | """ |
96 | val = self.wrapper.get_gitc_manifest_dir() | 95 | Test reading the gitc config file and parsing the directory |
97 | self.assertEqual(val, '/test/usr/local/google/gitc') | 96 | """ |
98 | 97 | self.wrapper.GITC_CONFIG_FILE = fixture("gitc_config") | |
99 | def test_gitc_parse_clientdir_no_gitc(self): | 98 | val = self.wrapper.get_gitc_manifest_dir() |
100 | """ | 99 | self.assertEqual(val, "/test/usr/local/google/gitc") |
101 | Test parsing the gitc clientdir without gitc running | 100 | |
102 | """ | 101 | def test_gitc_parse_clientdir_no_gitc(self): |
103 | self.wrapper.GITC_CONFIG_FILE = fixture('missing_gitc_config') | 102 | """ |
104 | self.assertEqual(self.wrapper.gitc_parse_clientdir('/something'), None) | 103 | Test parsing the gitc clientdir without gitc running |
105 | self.assertEqual(self.wrapper.gitc_parse_clientdir('/gitc/manifest-rw/test'), 'test') | 104 | """ |
106 | 105 | self.wrapper.GITC_CONFIG_FILE = fixture("missing_gitc_config") | |
107 | def test_gitc_parse_clientdir(self): | 106 | self.assertEqual(self.wrapper.gitc_parse_clientdir("/something"), None) |
108 | """ | 107 | self.assertEqual( |
109 | Test parsing the gitc clientdir | 108 | self.wrapper.gitc_parse_clientdir("/gitc/manifest-rw/test"), "test" |
110 | """ | 109 | ) |
111 | self.wrapper.GITC_CONFIG_FILE = fixture('gitc_config') | 110 | |
112 | self.assertEqual(self.wrapper.gitc_parse_clientdir('/something'), None) | 111 | def test_gitc_parse_clientdir(self): |
113 | self.assertEqual(self.wrapper.gitc_parse_clientdir('/gitc/manifest-rw/test'), 'test') | 112 | """ |
114 | self.assertEqual(self.wrapper.gitc_parse_clientdir('/gitc/manifest-rw/test/'), 'test') | 113 | Test parsing the gitc clientdir |
115 | self.assertEqual(self.wrapper.gitc_parse_clientdir('/gitc/manifest-rw/test/extra'), 'test') | 114 | """ |
116 | self.assertEqual(self.wrapper.gitc_parse_clientdir('/test/usr/local/google/gitc/test'), 'test') | 115 | self.wrapper.GITC_CONFIG_FILE = fixture("gitc_config") |
117 | self.assertEqual(self.wrapper.gitc_parse_clientdir('/test/usr/local/google/gitc/test/'), 'test') | 116 | self.assertEqual(self.wrapper.gitc_parse_clientdir("/something"), None) |
118 | self.assertEqual(self.wrapper.gitc_parse_clientdir('/test/usr/local/google/gitc/test/extra'), | 117 | self.assertEqual( |
119 | 'test') | 118 | self.wrapper.gitc_parse_clientdir("/gitc/manifest-rw/test"), "test" |
120 | self.assertEqual(self.wrapper.gitc_parse_clientdir('/gitc/manifest-rw/'), None) | 119 | ) |
121 | self.assertEqual(self.wrapper.gitc_parse_clientdir('/test/usr/local/google/gitc/'), None) | 120 | self.assertEqual( |
121 | self.wrapper.gitc_parse_clientdir("/gitc/manifest-rw/test/"), "test" | ||
122 | ) | ||
123 | self.assertEqual( | ||
124 | self.wrapper.gitc_parse_clientdir("/gitc/manifest-rw/test/extra"), | ||
125 | "test", | ||
126 | ) | ||
127 | self.assertEqual( | ||
128 | self.wrapper.gitc_parse_clientdir( | ||
129 | "/test/usr/local/google/gitc/test" | ||
130 | ), | ||
131 | "test", | ||
132 | ) | ||
133 | self.assertEqual( | ||
134 | self.wrapper.gitc_parse_clientdir( | ||
135 | "/test/usr/local/google/gitc/test/" | ||
136 | ), | ||
137 | "test", | ||
138 | ) | ||
139 | self.assertEqual( | ||
140 | self.wrapper.gitc_parse_clientdir( | ||
141 | "/test/usr/local/google/gitc/test/extra" | ||
142 | ), | ||
143 | "test", | ||
144 | ) | ||
145 | self.assertEqual( | ||
146 | self.wrapper.gitc_parse_clientdir("/gitc/manifest-rw/"), None | ||
147 | ) | ||
148 | self.assertEqual( | ||
149 | self.wrapper.gitc_parse_clientdir("/test/usr/local/google/gitc/"), | ||
150 | None, | ||
151 | ) | ||
122 | 152 | ||
123 | 153 | ||
124 | class SetGitTrace2ParentSid(RepoWrapperTestCase): | 154 | class SetGitTrace2ParentSid(RepoWrapperTestCase): |
125 | """Check SetGitTrace2ParentSid behavior.""" | 155 | """Check SetGitTrace2ParentSid behavior.""" |
126 | 156 | ||
127 | KEY = 'GIT_TRACE2_PARENT_SID' | 157 | 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}$') | 158 | VALID_FORMAT = re.compile(r"^repo-[0-9]{8}T[0-9]{6}Z-P[0-9a-f]{8}$") |
129 | 159 | ||
130 | def test_first_set(self): | 160 | def test_first_set(self): |
131 | """Test env var not yet set.""" | 161 | """Test env var not yet set.""" |
132 | env = {} | 162 | env = {} |
133 | self.wrapper.SetGitTrace2ParentSid(env) | 163 | self.wrapper.SetGitTrace2ParentSid(env) |
134 | self.assertIn(self.KEY, env) | 164 | self.assertIn(self.KEY, env) |
135 | value = env[self.KEY] | 165 | value = env[self.KEY] |
136 | self.assertRegex(value, self.VALID_FORMAT) | 166 | self.assertRegex(value, self.VALID_FORMAT) |
137 | 167 | ||
138 | def test_append(self): | 168 | def test_append(self): |
139 | """Test env var is appended.""" | 169 | """Test env var is appended.""" |
140 | env = {self.KEY: 'pfx'} | 170 | env = {self.KEY: "pfx"} |
141 | self.wrapper.SetGitTrace2ParentSid(env) | 171 | self.wrapper.SetGitTrace2ParentSid(env) |
142 | self.assertIn(self.KEY, env) | 172 | self.assertIn(self.KEY, env) |
143 | value = env[self.KEY] | 173 | value = env[self.KEY] |
144 | self.assertTrue(value.startswith('pfx/')) | 174 | self.assertTrue(value.startswith("pfx/")) |
145 | self.assertRegex(value[4:], self.VALID_FORMAT) | 175 | self.assertRegex(value[4:], self.VALID_FORMAT) |
146 | 176 | ||
147 | def test_global_context(self): | 177 | def test_global_context(self): |
148 | """Check os.environ gets updated by default.""" | 178 | """Check os.environ gets updated by default.""" |
149 | os.environ.pop(self.KEY, None) | 179 | os.environ.pop(self.KEY, None) |
150 | self.wrapper.SetGitTrace2ParentSid() | 180 | self.wrapper.SetGitTrace2ParentSid() |
151 | self.assertIn(self.KEY, os.environ) | 181 | self.assertIn(self.KEY, os.environ) |
152 | value = os.environ[self.KEY] | 182 | value = os.environ[self.KEY] |
153 | self.assertRegex(value, self.VALID_FORMAT) | 183 | self.assertRegex(value, self.VALID_FORMAT) |
154 | 184 | ||
155 | 185 | ||
156 | class RunCommand(RepoWrapperTestCase): | 186 | class RunCommand(RepoWrapperTestCase): |
157 | """Check run_command behavior.""" | 187 | """Check run_command behavior.""" |
158 | 188 | ||
159 | def test_capture(self): | 189 | def test_capture(self): |
160 | """Check capture_output handling.""" | 190 | """Check capture_output handling.""" |
161 | ret = self.wrapper.run_command(['echo', 'hi'], capture_output=True) | 191 | ret = self.wrapper.run_command(["echo", "hi"], capture_output=True) |
162 | # echo command appends OS specific linesep, but on Windows + Git Bash | 192 | # echo command appends OS specific linesep, but on Windows + Git Bash |
163 | # we get UNIX ending, so we allow both. | 193 | # we get UNIX ending, so we allow both. |
164 | self.assertIn(ret.stdout, ['hi' + os.linesep, 'hi\n']) | 194 | self.assertIn(ret.stdout, ["hi" + os.linesep, "hi\n"]) |
165 | 195 | ||
166 | def test_check(self): | 196 | def test_check(self): |
167 | """Check check handling.""" | 197 | """Check check handling.""" |
168 | self.wrapper.run_command(['true'], check=False) | 198 | self.wrapper.run_command(["true"], check=False) |
169 | self.wrapper.run_command(['true'], check=True) | 199 | self.wrapper.run_command(["true"], check=True) |
170 | self.wrapper.run_command(['false'], check=False) | 200 | self.wrapper.run_command(["false"], check=False) |
171 | with self.assertRaises(self.wrapper.RunError): | 201 | with self.assertRaises(self.wrapper.RunError): |
172 | self.wrapper.run_command(['false'], check=True) | 202 | self.wrapper.run_command(["false"], check=True) |
173 | 203 | ||
174 | 204 | ||
175 | class RunGit(RepoWrapperTestCase): | 205 | class RunGit(RepoWrapperTestCase): |
176 | """Check run_git behavior.""" | 206 | """Check run_git behavior.""" |
177 | 207 | ||
178 | def test_capture(self): | 208 | def test_capture(self): |
179 | """Check capture_output handling.""" | 209 | """Check capture_output handling.""" |
180 | ret = self.wrapper.run_git('--version') | 210 | ret = self.wrapper.run_git("--version") |
181 | self.assertIn('git', ret.stdout) | 211 | self.assertIn("git", ret.stdout) |
182 | 212 | ||
183 | def test_check(self): | 213 | def test_check(self): |
184 | """Check check handling.""" | 214 | """Check check handling.""" |
185 | with self.assertRaises(self.wrapper.CloneFailure): | 215 | with self.assertRaises(self.wrapper.CloneFailure): |
186 | self.wrapper.run_git('--version-asdfasdf') | 216 | self.wrapper.run_git("--version-asdfasdf") |
187 | self.wrapper.run_git('--version-asdfasdf', check=False) | 217 | self.wrapper.run_git("--version-asdfasdf", check=False) |
188 | 218 | ||
189 | 219 | ||
190 | class ParseGitVersion(RepoWrapperTestCase): | 220 | class ParseGitVersion(RepoWrapperTestCase): |
191 | """Check ParseGitVersion behavior.""" | 221 | """Check ParseGitVersion behavior.""" |
192 | 222 | ||
193 | def test_autoload(self): | 223 | def test_autoload(self): |
194 | """Check we can load the version from the live git.""" | 224 | """Check we can load the version from the live git.""" |
195 | ret = self.wrapper.ParseGitVersion() | 225 | ret = self.wrapper.ParseGitVersion() |
196 | self.assertIsNotNone(ret) | 226 | self.assertIsNotNone(ret) |
197 | 227 | ||
198 | def test_bad_ver(self): | 228 | def test_bad_ver(self): |
199 | """Check handling of bad git versions.""" | 229 | """Check handling of bad git versions.""" |
200 | ret = self.wrapper.ParseGitVersion(ver_str='asdf') | 230 | ret = self.wrapper.ParseGitVersion(ver_str="asdf") |
201 | self.assertIsNone(ret) | 231 | self.assertIsNone(ret) |
202 | 232 | ||
203 | def test_normal_ver(self): | 233 | def test_normal_ver(self): |
204 | """Check handling of normal git versions.""" | 234 | """Check handling of normal git versions.""" |
205 | ret = self.wrapper.ParseGitVersion(ver_str='git version 2.25.1') | 235 | ret = self.wrapper.ParseGitVersion(ver_str="git version 2.25.1") |
206 | self.assertEqual(2, ret.major) | 236 | self.assertEqual(2, ret.major) |
207 | self.assertEqual(25, ret.minor) | 237 | self.assertEqual(25, ret.minor) |
208 | self.assertEqual(1, ret.micro) | 238 | self.assertEqual(1, ret.micro) |
209 | self.assertEqual('2.25.1', ret.full) | 239 | self.assertEqual("2.25.1", ret.full) |
210 | 240 | ||
211 | def test_extended_ver(self): | 241 | def test_extended_ver(self): |
212 | """Check handling of extended distro git versions.""" | 242 | """Check handling of extended distro git versions.""" |
213 | ret = self.wrapper.ParseGitVersion( | 243 | ret = self.wrapper.ParseGitVersion( |
214 | ver_str='git version 1.30.50.696.g5e7596f4ac-goog') | 244 | ver_str="git version 1.30.50.696.g5e7596f4ac-goog" |
215 | self.assertEqual(1, ret.major) | 245 | ) |
216 | self.assertEqual(30, ret.minor) | 246 | self.assertEqual(1, ret.major) |
217 | self.assertEqual(50, ret.micro) | 247 | self.assertEqual(30, ret.minor) |
218 | self.assertEqual('1.30.50.696.g5e7596f4ac-goog', ret.full) | 248 | self.assertEqual(50, ret.micro) |
249 | self.assertEqual("1.30.50.696.g5e7596f4ac-goog", ret.full) | ||
219 | 250 | ||
220 | 251 | ||
221 | class CheckGitVersion(RepoWrapperTestCase): | 252 | class CheckGitVersion(RepoWrapperTestCase): |
222 | """Check _CheckGitVersion behavior.""" | 253 | """Check _CheckGitVersion behavior.""" |
223 | 254 | ||
224 | def test_unknown(self): | 255 | def test_unknown(self): |
225 | """Unknown versions should abort.""" | 256 | """Unknown versions should abort.""" |
226 | with mock.patch.object(self.wrapper, 'ParseGitVersion', return_value=None): | 257 | with mock.patch.object( |
227 | with self.assertRaises(self.wrapper.CloneFailure): | 258 | self.wrapper, "ParseGitVersion", return_value=None |
228 | self.wrapper._CheckGitVersion() | 259 | ): |
229 | 260 | with self.assertRaises(self.wrapper.CloneFailure): | |
230 | def test_old(self): | 261 | self.wrapper._CheckGitVersion() |
231 | """Old versions should abort.""" | 262 | |
232 | with mock.patch.object( | 263 | def test_old(self): |
233 | self.wrapper, 'ParseGitVersion', | 264 | """Old versions should abort.""" |
234 | return_value=self.wrapper.GitVersion(1, 0, 0, '1.0.0')): | 265 | with mock.patch.object( |
235 | with self.assertRaises(self.wrapper.CloneFailure): | 266 | self.wrapper, |
236 | self.wrapper._CheckGitVersion() | 267 | "ParseGitVersion", |
237 | 268 | return_value=self.wrapper.GitVersion(1, 0, 0, "1.0.0"), | |
238 | def test_new(self): | 269 | ): |
239 | """Newer versions should run fine.""" | 270 | with self.assertRaises(self.wrapper.CloneFailure): |
240 | with mock.patch.object( | 271 | self.wrapper._CheckGitVersion() |
241 | self.wrapper, 'ParseGitVersion', | 272 | |
242 | return_value=self.wrapper.GitVersion(100, 0, 0, '100.0.0')): | 273 | def test_new(self): |
243 | self.wrapper._CheckGitVersion() | 274 | """Newer versions should run fine.""" |
275 | with mock.patch.object( | ||
276 | self.wrapper, | ||
277 | "ParseGitVersion", | ||
278 | return_value=self.wrapper.GitVersion(100, 0, 0, "100.0.0"), | ||
279 | ): | ||
280 | self.wrapper._CheckGitVersion() | ||
244 | 281 | ||
245 | 282 | ||
246 | class Requirements(RepoWrapperTestCase): | 283 | class Requirements(RepoWrapperTestCase): |
247 | """Check Requirements handling.""" | 284 | """Check Requirements handling.""" |
248 | 285 | ||
249 | def test_missing_file(self): | 286 | def test_missing_file(self): |
250 | """Don't crash if the file is missing (old version).""" | 287 | """Don't crash if the file is missing (old version).""" |
251 | testdir = os.path.dirname(os.path.realpath(__file__)) | 288 | testdir = os.path.dirname(os.path.realpath(__file__)) |
252 | self.assertIsNone(self.wrapper.Requirements.from_dir(testdir)) | 289 | self.assertIsNone(self.wrapper.Requirements.from_dir(testdir)) |
253 | self.assertIsNone(self.wrapper.Requirements.from_file( | 290 | self.assertIsNone( |
254 | os.path.join(testdir, 'xxxxxxxxxxxxxxxxxxxxxxxx'))) | 291 | self.wrapper.Requirements.from_file( |
255 | 292 | os.path.join(testdir, "xxxxxxxxxxxxxxxxxxxxxxxx") | |
256 | def test_corrupt_data(self): | 293 | ) |
257 | """If the file can't be parsed, don't blow up.""" | 294 | ) |
258 | self.assertIsNone(self.wrapper.Requirements.from_file(__file__)) | 295 | |
259 | self.assertIsNone(self.wrapper.Requirements.from_data(b'x')) | 296 | def test_corrupt_data(self): |
260 | 297 | """If the file can't be parsed, don't blow up.""" | |
261 | def test_valid_data(self): | 298 | self.assertIsNone(self.wrapper.Requirements.from_file(__file__)) |
262 | """Make sure we can parse the file we ship.""" | 299 | self.assertIsNone(self.wrapper.Requirements.from_data(b"x")) |
263 | self.assertIsNotNone(self.wrapper.Requirements.from_data(b'{}')) | 300 | |
264 | rootdir = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) | 301 | def test_valid_data(self): |
265 | self.assertIsNotNone(self.wrapper.Requirements.from_dir(rootdir)) | 302 | """Make sure we can parse the file we ship.""" |
266 | self.assertIsNotNone(self.wrapper.Requirements.from_file(os.path.join( | 303 | self.assertIsNotNone(self.wrapper.Requirements.from_data(b"{}")) |
267 | rootdir, 'requirements.json'))) | 304 | rootdir = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) |
268 | 305 | self.assertIsNotNone(self.wrapper.Requirements.from_dir(rootdir)) | |
269 | def test_format_ver(self): | 306 | self.assertIsNotNone( |
270 | """Check format_ver can format.""" | 307 | self.wrapper.Requirements.from_file( |
271 | self.assertEqual('1.2.3', self.wrapper.Requirements._format_ver((1, 2, 3))) | 308 | os.path.join(rootdir, "requirements.json") |
272 | self.assertEqual('1', self.wrapper.Requirements._format_ver([1])) | 309 | ) |
273 | 310 | ) | |
274 | def test_assert_all_unknown(self): | 311 | |
275 | """Check assert_all works with incompatible file.""" | 312 | def test_format_ver(self): |
276 | reqs = self.wrapper.Requirements({}) | 313 | """Check format_ver can format.""" |
277 | reqs.assert_all() | 314 | self.assertEqual( |
278 | 315 | "1.2.3", self.wrapper.Requirements._format_ver((1, 2, 3)) | |
279 | def test_assert_all_new_repo(self): | 316 | ) |
280 | """Check assert_all accepts new enough repo.""" | 317 | self.assertEqual("1", self.wrapper.Requirements._format_ver([1])) |
281 | reqs = self.wrapper.Requirements({'repo': {'hard': [1, 0]}}) | 318 | |
282 | reqs.assert_all() | 319 | def test_assert_all_unknown(self): |
283 | 320 | """Check assert_all works with incompatible file.""" | |
284 | def test_assert_all_old_repo(self): | 321 | reqs = self.wrapper.Requirements({}) |
285 | """Check assert_all rejects old repo.""" | 322 | reqs.assert_all() |
286 | reqs = self.wrapper.Requirements({'repo': {'hard': [99999, 0]}}) | 323 | |
287 | with self.assertRaises(SystemExit): | 324 | def test_assert_all_new_repo(self): |
288 | reqs.assert_all() | 325 | """Check assert_all accepts new enough repo.""" |
289 | 326 | reqs = self.wrapper.Requirements({"repo": {"hard": [1, 0]}}) | |
290 | def test_assert_all_new_python(self): | 327 | reqs.assert_all() |
291 | """Check assert_all accepts new enough python.""" | 328 | |
292 | reqs = self.wrapper.Requirements({'python': {'hard': sys.version_info}}) | 329 | def test_assert_all_old_repo(self): |
293 | reqs.assert_all() | 330 | """Check assert_all rejects old repo.""" |
294 | 331 | reqs = self.wrapper.Requirements({"repo": {"hard": [99999, 0]}}) | |
295 | def test_assert_all_old_python(self): | 332 | with self.assertRaises(SystemExit): |
296 | """Check assert_all rejects old python.""" | 333 | reqs.assert_all() |
297 | reqs = self.wrapper.Requirements({'python': {'hard': [99999, 0]}}) | 334 | |
298 | with self.assertRaises(SystemExit): | 335 | def test_assert_all_new_python(self): |
299 | reqs.assert_all() | 336 | """Check assert_all accepts new enough python.""" |
300 | 337 | reqs = self.wrapper.Requirements({"python": {"hard": sys.version_info}}) | |
301 | def test_assert_ver_unknown(self): | 338 | reqs.assert_all() |
302 | """Check assert_ver works with incompatible file.""" | 339 | |
303 | reqs = self.wrapper.Requirements({}) | 340 | def test_assert_all_old_python(self): |
304 | reqs.assert_ver('xxx', (1, 0)) | 341 | """Check assert_all rejects old python.""" |
305 | 342 | reqs = self.wrapper.Requirements({"python": {"hard": [99999, 0]}}) | |
306 | def test_assert_ver_new(self): | 343 | with self.assertRaises(SystemExit): |
307 | """Check assert_ver allows new enough versions.""" | 344 | reqs.assert_all() |
308 | reqs = self.wrapper.Requirements({'git': {'hard': [1, 0], 'soft': [2, 0]}}) | 345 | |
309 | reqs.assert_ver('git', (1, 0)) | 346 | def test_assert_ver_unknown(self): |
310 | reqs.assert_ver('git', (1, 5)) | 347 | """Check assert_ver works with incompatible file.""" |
311 | reqs.assert_ver('git', (2, 0)) | 348 | reqs = self.wrapper.Requirements({}) |
312 | reqs.assert_ver('git', (2, 5)) | 349 | reqs.assert_ver("xxx", (1, 0)) |
313 | 350 | ||
314 | def test_assert_ver_old(self): | 351 | def test_assert_ver_new(self): |
315 | """Check assert_ver rejects old versions.""" | 352 | """Check assert_ver allows new enough versions.""" |
316 | reqs = self.wrapper.Requirements({'git': {'hard': [1, 0], 'soft': [2, 0]}}) | 353 | reqs = self.wrapper.Requirements( |
317 | with self.assertRaises(SystemExit): | 354 | {"git": {"hard": [1, 0], "soft": [2, 0]}} |
318 | reqs.assert_ver('git', (0, 5)) | 355 | ) |
356 | reqs.assert_ver("git", (1, 0)) | ||
357 | reqs.assert_ver("git", (1, 5)) | ||
358 | reqs.assert_ver("git", (2, 0)) | ||
359 | reqs.assert_ver("git", (2, 5)) | ||
360 | |||
361 | def test_assert_ver_old(self): | ||
362 | """Check assert_ver rejects old versions.""" | ||
363 | reqs = self.wrapper.Requirements( | ||
364 | {"git": {"hard": [1, 0], "soft": [2, 0]}} | ||
365 | ) | ||
366 | with self.assertRaises(SystemExit): | ||
367 | reqs.assert_ver("git", (0, 5)) | ||
319 | 368 | ||
320 | 369 | ||
321 | class NeedSetupGnuPG(RepoWrapperTestCase): | 370 | class NeedSetupGnuPG(RepoWrapperTestCase): |
322 | """Check NeedSetupGnuPG behavior.""" | 371 | """Check NeedSetupGnuPG behavior.""" |
323 | 372 | ||
324 | def test_missing_dir(self): | 373 | def test_missing_dir(self): |
325 | """The ~/.repoconfig tree doesn't exist yet.""" | 374 | """The ~/.repoconfig tree doesn't exist yet.""" |
326 | with tempfile.TemporaryDirectory(prefix='repo-tests') as tempdir: | 375 | with tempfile.TemporaryDirectory(prefix="repo-tests") as tempdir: |
327 | self.wrapper.home_dot_repo = os.path.join(tempdir, 'foo') | 376 | self.wrapper.home_dot_repo = os.path.join(tempdir, "foo") |
328 | self.assertTrue(self.wrapper.NeedSetupGnuPG()) | 377 | self.assertTrue(self.wrapper.NeedSetupGnuPG()) |
329 | 378 | ||
330 | def test_missing_keyring(self): | 379 | def test_missing_keyring(self): |
331 | """The keyring-version file doesn't exist yet.""" | 380 | """The keyring-version file doesn't exist yet.""" |
332 | with tempfile.TemporaryDirectory(prefix='repo-tests') as tempdir: | 381 | with tempfile.TemporaryDirectory(prefix="repo-tests") as tempdir: |
333 | self.wrapper.home_dot_repo = tempdir | 382 | self.wrapper.home_dot_repo = tempdir |
334 | self.assertTrue(self.wrapper.NeedSetupGnuPG()) | 383 | self.assertTrue(self.wrapper.NeedSetupGnuPG()) |
335 | 384 | ||
336 | def test_empty_keyring(self): | 385 | def test_empty_keyring(self): |
337 | """The keyring-version file exists, but is empty.""" | 386 | """The keyring-version file exists, but is empty.""" |
338 | with tempfile.TemporaryDirectory(prefix='repo-tests') as tempdir: | 387 | with tempfile.TemporaryDirectory(prefix="repo-tests") as tempdir: |
339 | self.wrapper.home_dot_repo = tempdir | 388 | self.wrapper.home_dot_repo = tempdir |
340 | with open(os.path.join(tempdir, 'keyring-version'), 'w'): | 389 | with open(os.path.join(tempdir, "keyring-version"), "w"): |
341 | pass | 390 | pass |
342 | self.assertTrue(self.wrapper.NeedSetupGnuPG()) | 391 | self.assertTrue(self.wrapper.NeedSetupGnuPG()) |
343 | 392 | ||
344 | def test_old_keyring(self): | 393 | def test_old_keyring(self): |
345 | """The keyring-version file exists, but it's old.""" | 394 | """The keyring-version file exists, but it's old.""" |
346 | with tempfile.TemporaryDirectory(prefix='repo-tests') as tempdir: | 395 | with tempfile.TemporaryDirectory(prefix="repo-tests") as tempdir: |
347 | self.wrapper.home_dot_repo = tempdir | 396 | self.wrapper.home_dot_repo = tempdir |
348 | with open(os.path.join(tempdir, 'keyring-version'), 'w') as fp: | 397 | with open(os.path.join(tempdir, "keyring-version"), "w") as fp: |
349 | fp.write('1.0\n') | 398 | fp.write("1.0\n") |
350 | self.assertTrue(self.wrapper.NeedSetupGnuPG()) | 399 | self.assertTrue(self.wrapper.NeedSetupGnuPG()) |
351 | 400 | ||
352 | def test_new_keyring(self): | 401 | def test_new_keyring(self): |
353 | """The keyring-version file exists, and is up-to-date.""" | 402 | """The keyring-version file exists, and is up-to-date.""" |
354 | with tempfile.TemporaryDirectory(prefix='repo-tests') as tempdir: | 403 | with tempfile.TemporaryDirectory(prefix="repo-tests") as tempdir: |
355 | self.wrapper.home_dot_repo = tempdir | 404 | self.wrapper.home_dot_repo = tempdir |
356 | with open(os.path.join(tempdir, 'keyring-version'), 'w') as fp: | 405 | with open(os.path.join(tempdir, "keyring-version"), "w") as fp: |
357 | fp.write('1000.0\n') | 406 | fp.write("1000.0\n") |
358 | self.assertFalse(self.wrapper.NeedSetupGnuPG()) | 407 | self.assertFalse(self.wrapper.NeedSetupGnuPG()) |
359 | 408 | ||
360 | 409 | ||
361 | class SetupGnuPG(RepoWrapperTestCase): | 410 | class SetupGnuPG(RepoWrapperTestCase): |
362 | """Check SetupGnuPG behavior.""" | 411 | """Check SetupGnuPG behavior.""" |
363 | 412 | ||
364 | def test_full(self): | 413 | def test_full(self): |
365 | """Make sure it works completely.""" | 414 | """Make sure it works completely.""" |
366 | with tempfile.TemporaryDirectory(prefix='repo-tests') as tempdir: | 415 | with tempfile.TemporaryDirectory(prefix="repo-tests") as tempdir: |
367 | self.wrapper.home_dot_repo = tempdir | 416 | self.wrapper.home_dot_repo = tempdir |
368 | self.wrapper.gpg_dir = os.path.join(self.wrapper.home_dot_repo, 'gnupg') | 417 | self.wrapper.gpg_dir = os.path.join( |
369 | self.assertTrue(self.wrapper.SetupGnuPG(True)) | 418 | self.wrapper.home_dot_repo, "gnupg" |
370 | with open(os.path.join(tempdir, 'keyring-version'), 'r') as fp: | 419 | ) |
371 | data = fp.read() | 420 | self.assertTrue(self.wrapper.SetupGnuPG(True)) |
372 | self.assertEqual('.'.join(str(x) for x in self.wrapper.KEYRING_VERSION), | 421 | with open(os.path.join(tempdir, "keyring-version"), "r") as fp: |
373 | data.strip()) | 422 | data = fp.read() |
423 | self.assertEqual( | ||
424 | ".".join(str(x) for x in self.wrapper.KEYRING_VERSION), | ||
425 | data.strip(), | ||
426 | ) | ||
374 | 427 | ||
375 | 428 | ||
376 | class VerifyRev(RepoWrapperTestCase): | 429 | class VerifyRev(RepoWrapperTestCase): |
377 | """Check verify_rev behavior.""" | 430 | """Check verify_rev behavior.""" |
378 | 431 | ||
379 | def test_verify_passes(self): | 432 | def test_verify_passes(self): |
380 | """Check when we have a valid signed tag.""" | 433 | """Check when we have a valid signed tag.""" |
381 | desc_result = self.wrapper.RunResult(0, 'v1.0\n', '') | 434 | desc_result = self.wrapper.RunResult(0, "v1.0\n", "") |
382 | gpg_result = self.wrapper.RunResult(0, '', '') | 435 | gpg_result = self.wrapper.RunResult(0, "", "") |
383 | with mock.patch.object(self.wrapper, 'run_git', | 436 | with mock.patch.object( |
384 | side_effect=(desc_result, gpg_result)): | 437 | self.wrapper, "run_git", side_effect=(desc_result, gpg_result) |
385 | ret = self.wrapper.verify_rev('/', 'refs/heads/stable', '1234', True) | 438 | ): |
386 | self.assertEqual('v1.0^0', ret) | 439 | ret = self.wrapper.verify_rev( |
387 | 440 | "/", "refs/heads/stable", "1234", True | |
388 | def test_unsigned_commit(self): | 441 | ) |
389 | """Check we fall back to signed tag when we have an unsigned commit.""" | 442 | self.assertEqual("v1.0^0", ret) |
390 | desc_result = self.wrapper.RunResult(0, 'v1.0-10-g1234\n', '') | 443 | |
391 | gpg_result = self.wrapper.RunResult(0, '', '') | 444 | def test_unsigned_commit(self): |
392 | with mock.patch.object(self.wrapper, 'run_git', | 445 | """Check we fall back to signed tag when we have an unsigned commit.""" |
393 | side_effect=(desc_result, gpg_result)): | 446 | desc_result = self.wrapper.RunResult(0, "v1.0-10-g1234\n", "") |
394 | ret = self.wrapper.verify_rev('/', 'refs/heads/stable', '1234', True) | 447 | gpg_result = self.wrapper.RunResult(0, "", "") |
395 | self.assertEqual('v1.0^0', ret) | 448 | with mock.patch.object( |
396 | 449 | self.wrapper, "run_git", side_effect=(desc_result, gpg_result) | |
397 | def test_verify_fails(self): | 450 | ): |
398 | """Check we fall back to signed tag when we have an unsigned commit.""" | 451 | ret = self.wrapper.verify_rev( |
399 | desc_result = self.wrapper.RunResult(0, 'v1.0-10-g1234\n', '') | 452 | "/", "refs/heads/stable", "1234", True |
400 | gpg_result = Exception | 453 | ) |
401 | with mock.patch.object(self.wrapper, 'run_git', | 454 | self.assertEqual("v1.0^0", ret) |
402 | side_effect=(desc_result, gpg_result)): | 455 | |
403 | with self.assertRaises(Exception): | 456 | def test_verify_fails(self): |
404 | self.wrapper.verify_rev('/', 'refs/heads/stable', '1234', True) | 457 | """Check we fall back to signed tag when we have an unsigned commit.""" |
458 | desc_result = self.wrapper.RunResult(0, "v1.0-10-g1234\n", "") | ||
459 | gpg_result = Exception | ||
460 | with mock.patch.object( | ||
461 | self.wrapper, "run_git", side_effect=(desc_result, gpg_result) | ||
462 | ): | ||
463 | with self.assertRaises(Exception): | ||
464 | self.wrapper.verify_rev("/", "refs/heads/stable", "1234", True) | ||
405 | 465 | ||
406 | 466 | ||
407 | class GitCheckoutTestCase(RepoWrapperTestCase): | 467 | class GitCheckoutTestCase(RepoWrapperTestCase): |
408 | """Tests that use a real/small git checkout.""" | 468 | """Tests that use a real/small git checkout.""" |
409 | 469 | ||
410 | GIT_DIR = None | 470 | GIT_DIR = None |
411 | REV_LIST = None | 471 | REV_LIST = None |
412 | 472 | ||
413 | @classmethod | 473 | @classmethod |
414 | def setUpClass(cls): | 474 | def setUpClass(cls): |
415 | # Create a repo to operate on, but do it once per-class. | 475 | # Create a repo to operate on, but do it once per-class. |
416 | cls.tempdirobj = tempfile.TemporaryDirectory(prefix='repo-rev-tests') | 476 | cls.tempdirobj = tempfile.TemporaryDirectory(prefix="repo-rev-tests") |
417 | cls.GIT_DIR = cls.tempdirobj.name | 477 | cls.GIT_DIR = cls.tempdirobj.name |
418 | run_git = wrapper.Wrapper().run_git | 478 | run_git = wrapper.Wrapper().run_git |
419 | 479 | ||
420 | remote = os.path.join(cls.GIT_DIR, 'remote') | 480 | remote = os.path.join(cls.GIT_DIR, "remote") |
421 | os.mkdir(remote) | 481 | os.mkdir(remote) |
422 | 482 | ||
423 | # Tests need to assume, that main is default branch at init, | 483 | # Tests need to assume, that main is default branch at init, |
424 | # which is not supported in config until 2.28. | 484 | # which is not supported in config until 2.28. |
425 | if git_command.git_require((2, 28, 0)): | 485 | if git_command.git_require((2, 28, 0)): |
426 | initstr = '--initial-branch=main' | 486 | initstr = "--initial-branch=main" |
427 | else: | 487 | else: |
428 | # Use template dir for init. | 488 | # Use template dir for init. |
429 | templatedir = tempfile.mkdtemp(prefix='.test-template') | 489 | templatedir = tempfile.mkdtemp(prefix=".test-template") |
430 | with open(os.path.join(templatedir, 'HEAD'), 'w') as fp: | 490 | with open(os.path.join(templatedir, "HEAD"), "w") as fp: |
431 | fp.write('ref: refs/heads/main\n') | 491 | fp.write("ref: refs/heads/main\n") |
432 | initstr = '--template=' + templatedir | 492 | initstr = "--template=" + templatedir |
433 | 493 | ||
434 | run_git('init', initstr, cwd=remote) | 494 | run_git("init", initstr, cwd=remote) |
435 | run_git('commit', '--allow-empty', '-minit', cwd=remote) | 495 | run_git("commit", "--allow-empty", "-minit", cwd=remote) |
436 | run_git('branch', 'stable', cwd=remote) | 496 | run_git("branch", "stable", cwd=remote) |
437 | run_git('tag', 'v1.0', cwd=remote) | 497 | run_git("tag", "v1.0", cwd=remote) |
438 | run_git('commit', '--allow-empty', '-m2nd commit', cwd=remote) | 498 | run_git("commit", "--allow-empty", "-m2nd commit", cwd=remote) |
439 | cls.REV_LIST = run_git('rev-list', 'HEAD', cwd=remote).stdout.splitlines() | 499 | cls.REV_LIST = run_git( |
440 | 500 | "rev-list", "HEAD", cwd=remote | |
441 | run_git('init', cwd=cls.GIT_DIR) | 501 | ).stdout.splitlines() |
442 | run_git('fetch', remote, '+refs/heads/*:refs/remotes/origin/*', cwd=cls.GIT_DIR) | 502 | |
443 | 503 | run_git("init", cwd=cls.GIT_DIR) | |
444 | @classmethod | 504 | run_git( |
445 | def tearDownClass(cls): | 505 | "fetch", |
446 | if not cls.tempdirobj: | 506 | remote, |
447 | return | 507 | "+refs/heads/*:refs/remotes/origin/*", |
448 | 508 | cwd=cls.GIT_DIR, | |
449 | cls.tempdirobj.cleanup() | 509 | ) |
510 | |||
511 | @classmethod | ||
512 | def tearDownClass(cls): | ||
513 | if not cls.tempdirobj: | ||
514 | return | ||
515 | |||
516 | cls.tempdirobj.cleanup() | ||
450 | 517 | ||
451 | 518 | ||
452 | class ResolveRepoRev(GitCheckoutTestCase): | 519 | class ResolveRepoRev(GitCheckoutTestCase): |
453 | """Check resolve_repo_rev behavior.""" | 520 | """Check resolve_repo_rev behavior.""" |
454 | 521 | ||
455 | def test_explicit_branch(self): | 522 | def test_explicit_branch(self): |
456 | """Check refs/heads/branch argument.""" | 523 | """Check refs/heads/branch argument.""" |
457 | rrev, lrev = self.wrapper.resolve_repo_rev(self.GIT_DIR, 'refs/heads/stable') | 524 | rrev, lrev = self.wrapper.resolve_repo_rev( |
458 | self.assertEqual('refs/heads/stable', rrev) | 525 | self.GIT_DIR, "refs/heads/stable" |
459 | self.assertEqual(self.REV_LIST[1], lrev) | 526 | ) |
460 | 527 | self.assertEqual("refs/heads/stable", rrev) | |
461 | with self.assertRaises(self.wrapper.CloneFailure): | 528 | self.assertEqual(self.REV_LIST[1], lrev) |
462 | self.wrapper.resolve_repo_rev(self.GIT_DIR, 'refs/heads/unknown') | 529 | |
463 | 530 | with self.assertRaises(self.wrapper.CloneFailure): | |
464 | def test_explicit_tag(self): | 531 | self.wrapper.resolve_repo_rev(self.GIT_DIR, "refs/heads/unknown") |
465 | """Check refs/tags/tag argument.""" | 532 | |
466 | rrev, lrev = self.wrapper.resolve_repo_rev(self.GIT_DIR, 'refs/tags/v1.0') | 533 | def test_explicit_tag(self): |
467 | self.assertEqual('refs/tags/v1.0', rrev) | 534 | """Check refs/tags/tag argument.""" |
468 | self.assertEqual(self.REV_LIST[1], lrev) | 535 | rrev, lrev = self.wrapper.resolve_repo_rev( |
469 | 536 | self.GIT_DIR, "refs/tags/v1.0" | |
470 | with self.assertRaises(self.wrapper.CloneFailure): | 537 | ) |
471 | self.wrapper.resolve_repo_rev(self.GIT_DIR, 'refs/tags/unknown') | 538 | self.assertEqual("refs/tags/v1.0", rrev) |
472 | 539 | self.assertEqual(self.REV_LIST[1], lrev) | |
473 | def test_branch_name(self): | 540 | |
474 | """Check branch argument.""" | 541 | with self.assertRaises(self.wrapper.CloneFailure): |
475 | rrev, lrev = self.wrapper.resolve_repo_rev(self.GIT_DIR, 'stable') | 542 | self.wrapper.resolve_repo_rev(self.GIT_DIR, "refs/tags/unknown") |
476 | self.assertEqual('refs/heads/stable', rrev) | 543 | |
477 | self.assertEqual(self.REV_LIST[1], lrev) | 544 | def test_branch_name(self): |
478 | 545 | """Check branch argument.""" | |
479 | rrev, lrev = self.wrapper.resolve_repo_rev(self.GIT_DIR, 'main') | 546 | rrev, lrev = self.wrapper.resolve_repo_rev(self.GIT_DIR, "stable") |
480 | self.assertEqual('refs/heads/main', rrev) | 547 | self.assertEqual("refs/heads/stable", rrev) |
481 | self.assertEqual(self.REV_LIST[0], lrev) | 548 | self.assertEqual(self.REV_LIST[1], lrev) |
482 | 549 | ||
483 | def test_tag_name(self): | 550 | rrev, lrev = self.wrapper.resolve_repo_rev(self.GIT_DIR, "main") |
484 | """Check tag argument.""" | 551 | self.assertEqual("refs/heads/main", rrev) |
485 | rrev, lrev = self.wrapper.resolve_repo_rev(self.GIT_DIR, 'v1.0') | 552 | self.assertEqual(self.REV_LIST[0], lrev) |
486 | self.assertEqual('refs/tags/v1.0', rrev) | 553 | |
487 | self.assertEqual(self.REV_LIST[1], lrev) | 554 | def test_tag_name(self): |
488 | 555 | """Check tag argument.""" | |
489 | def test_full_commit(self): | 556 | rrev, lrev = self.wrapper.resolve_repo_rev(self.GIT_DIR, "v1.0") |
490 | """Check specific commit argument.""" | 557 | self.assertEqual("refs/tags/v1.0", rrev) |
491 | commit = self.REV_LIST[0] | 558 | self.assertEqual(self.REV_LIST[1], lrev) |
492 | rrev, lrev = self.wrapper.resolve_repo_rev(self.GIT_DIR, commit) | 559 | |
493 | self.assertEqual(commit, rrev) | 560 | def test_full_commit(self): |
494 | self.assertEqual(commit, lrev) | 561 | """Check specific commit argument.""" |
495 | 562 | commit = self.REV_LIST[0] | |
496 | def test_partial_commit(self): | 563 | rrev, lrev = self.wrapper.resolve_repo_rev(self.GIT_DIR, commit) |
497 | """Check specific (partial) commit argument.""" | 564 | self.assertEqual(commit, rrev) |
498 | commit = self.REV_LIST[0][0:20] | 565 | self.assertEqual(commit, lrev) |
499 | rrev, lrev = self.wrapper.resolve_repo_rev(self.GIT_DIR, commit) | 566 | |
500 | self.assertEqual(self.REV_LIST[0], rrev) | 567 | def test_partial_commit(self): |
501 | self.assertEqual(self.REV_LIST[0], lrev) | 568 | """Check specific (partial) commit argument.""" |
502 | 569 | commit = self.REV_LIST[0][0:20] | |
503 | def test_unknown(self): | 570 | rrev, lrev = self.wrapper.resolve_repo_rev(self.GIT_DIR, commit) |
504 | """Check unknown ref/commit argument.""" | 571 | self.assertEqual(self.REV_LIST[0], rrev) |
505 | with self.assertRaises(self.wrapper.CloneFailure): | 572 | self.assertEqual(self.REV_LIST[0], lrev) |
506 | self.wrapper.resolve_repo_rev(self.GIT_DIR, 'boooooooya') | 573 | |
574 | def test_unknown(self): | ||
575 | """Check unknown ref/commit argument.""" | ||
576 | with self.assertRaises(self.wrapper.CloneFailure): | ||
577 | self.wrapper.resolve_repo_rev(self.GIT_DIR, "boooooooya") | ||
507 | 578 | ||
508 | 579 | ||
509 | class CheckRepoVerify(RepoWrapperTestCase): | 580 | class CheckRepoVerify(RepoWrapperTestCase): |
510 | """Check check_repo_verify behavior.""" | 581 | """Check check_repo_verify behavior.""" |
511 | 582 | ||
512 | def test_no_verify(self): | 583 | def test_no_verify(self): |
513 | """Always fail with --no-repo-verify.""" | 584 | """Always fail with --no-repo-verify.""" |
514 | self.assertFalse(self.wrapper.check_repo_verify(False)) | 585 | self.assertFalse(self.wrapper.check_repo_verify(False)) |
515 | 586 | ||
516 | def test_gpg_initialized(self): | 587 | def test_gpg_initialized(self): |
517 | """Should pass if gpg is setup already.""" | 588 | """Should pass if gpg is setup already.""" |
518 | with mock.patch.object(self.wrapper, 'NeedSetupGnuPG', return_value=False): | 589 | with mock.patch.object( |
519 | self.assertTrue(self.wrapper.check_repo_verify(True)) | 590 | self.wrapper, "NeedSetupGnuPG", return_value=False |
591 | ): | ||
592 | self.assertTrue(self.wrapper.check_repo_verify(True)) | ||
520 | 593 | ||
521 | def test_need_gpg_setup(self): | 594 | def test_need_gpg_setup(self): |
522 | """Should pass/fail based on gpg setup.""" | 595 | """Should pass/fail based on gpg setup.""" |
523 | with mock.patch.object(self.wrapper, 'NeedSetupGnuPG', return_value=True): | 596 | with mock.patch.object( |
524 | with mock.patch.object(self.wrapper, 'SetupGnuPG') as m: | 597 | self.wrapper, "NeedSetupGnuPG", return_value=True |
525 | m.return_value = True | 598 | ): |
526 | self.assertTrue(self.wrapper.check_repo_verify(True)) | 599 | with mock.patch.object(self.wrapper, "SetupGnuPG") as m: |
600 | m.return_value = True | ||
601 | self.assertTrue(self.wrapper.check_repo_verify(True)) | ||
527 | 602 | ||
528 | m.return_value = False | 603 | m.return_value = False |
529 | self.assertFalse(self.wrapper.check_repo_verify(True)) | 604 | self.assertFalse(self.wrapper.check_repo_verify(True)) |
530 | 605 | ||
531 | 606 | ||
532 | class CheckRepoRev(GitCheckoutTestCase): | 607 | class CheckRepoRev(GitCheckoutTestCase): |
533 | """Check check_repo_rev behavior.""" | 608 | """Check check_repo_rev behavior.""" |
534 | 609 | ||
535 | def test_verify_works(self): | 610 | def test_verify_works(self): |
536 | """Should pass when verification passes.""" | 611 | """Should pass when verification passes.""" |
537 | with mock.patch.object(self.wrapper, 'check_repo_verify', return_value=True): | 612 | with mock.patch.object( |
538 | with mock.patch.object(self.wrapper, 'verify_rev', return_value='12345'): | 613 | self.wrapper, "check_repo_verify", return_value=True |
539 | rrev, lrev = self.wrapper.check_repo_rev(self.GIT_DIR, 'stable') | 614 | ): |
540 | self.assertEqual('refs/heads/stable', rrev) | 615 | with mock.patch.object( |
541 | self.assertEqual('12345', lrev) | 616 | self.wrapper, "verify_rev", return_value="12345" |
542 | 617 | ): | |
543 | def test_verify_fails(self): | 618 | rrev, lrev = self.wrapper.check_repo_rev(self.GIT_DIR, "stable") |
544 | """Should fail when verification fails.""" | 619 | self.assertEqual("refs/heads/stable", rrev) |
545 | with mock.patch.object(self.wrapper, 'check_repo_verify', return_value=True): | 620 | self.assertEqual("12345", lrev) |
546 | with mock.patch.object(self.wrapper, 'verify_rev', side_effect=Exception): | 621 | |
547 | with self.assertRaises(Exception): | 622 | def test_verify_fails(self): |
548 | self.wrapper.check_repo_rev(self.GIT_DIR, 'stable') | 623 | """Should fail when verification fails.""" |
549 | 624 | with mock.patch.object( | |
550 | def test_verify_ignore(self): | 625 | self.wrapper, "check_repo_verify", return_value=True |
551 | """Should pass when verification is disabled.""" | 626 | ): |
552 | with mock.patch.object(self.wrapper, 'verify_rev', side_effect=Exception): | 627 | with mock.patch.object( |
553 | rrev, lrev = self.wrapper.check_repo_rev(self.GIT_DIR, 'stable', repo_verify=False) | 628 | self.wrapper, "verify_rev", side_effect=Exception |
554 | self.assertEqual('refs/heads/stable', rrev) | 629 | ): |
555 | self.assertEqual(self.REV_LIST[1], lrev) | 630 | with self.assertRaises(Exception): |
631 | self.wrapper.check_repo_rev(self.GIT_DIR, "stable") | ||
632 | |||
633 | def test_verify_ignore(self): | ||
634 | """Should pass when verification is disabled.""" | ||
635 | with mock.patch.object( | ||
636 | self.wrapper, "verify_rev", side_effect=Exception | ||
637 | ): | ||
638 | rrev, lrev = self.wrapper.check_repo_rev( | ||
639 | self.GIT_DIR, "stable", repo_verify=False | ||
640 | ) | ||
641 | self.assertEqual("refs/heads/stable", rrev) | ||
642 | self.assertEqual(self.REV_LIST[1], lrev) | ||