blob: 6cc0e61f57f513c6fbf8813aa5332cf80a47a3a7 [file] [log] [blame]
Lann Martin10f3ee92018-08-22 15:48:10 -06001# Copyright 2018 The Chromium OS Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5"""Tests for scripts/repo_sync_manifest."""
6
Lann Martin10f3ee92018-08-22 15:48:10 -06007import os
Mike Frysinger166fea02021-02-12 05:30:33 -05008from unittest import mock
Lann Martin10f3ee92018-08-22 15:48:10 -06009
Don Garrett903fedc2018-11-02 17:04:26 -070010from chromite.cbuildbot import manifest_version
11from chromite.cbuildbot import repository
Lann Martin10f3ee92018-08-22 15:48:10 -060012from chromite.lib import cros_test_lib
Lann Martin10f3ee92018-08-22 15:48:10 -060013from chromite.scripts import repo_sync_manifest
14
15
Don Garrett903fedc2018-11-02 17:04:26 -070016class RepoSyncManifestTest(cros_test_lib.RunCommandTempDirTestCase):
Lann Martin10f3ee92018-08-22 15:48:10 -060017 """Unit tests for repo_sync_manifest."""
18
Don Garrett903fedc2018-11-02 17:04:26 -070019 INT_MANIFEST_URL = ('https://chrome-internal-review.googlesource.com/'
20 'chromeos/manifest-internal')
21 EXT_MANIFEST_URL = ('https://chromium.googlesource.com/chromiumos/manifest')
22
23 MV_INT_URL = ('https://chrome-internal.googlesource.com/chromeos/'
24 'manifest-versions')
25 MV_EXT_URL = ('https://chromium.googlesource.com/chromiumos/'
26 'manifest-versions')
27
Lann Martin10f3ee92018-08-22 15:48:10 -060028 def setUp(self):
Don Garrett903fedc2018-11-02 17:04:26 -070029 self.repo_dir = os.path.join(self.tempdir, 'repo')
Evan Hernandezc831b122019-02-07 15:26:43 -070030 self.repo_url = os.path.join(self.tempdir, '.repo/repo')
Don Garrett903fedc2018-11-02 17:04:26 -070031 self.preload_src = os.path.join(self.tempdir, 'source')
32 self.git_cache = os.path.join(self.tempdir, 'git_cache')
Lann Martin10f3ee92018-08-22 15:48:10 -060033 self.manifest = os.path.join(self.tempdir, 'manifest.xml')
Don Garrett903fedc2018-11-02 17:04:26 -070034 self.mv_ext = os.path.join(self.tempdir, 'mv_ext')
35 self.mv_int = os.path.join(self.tempdir, 'mv_int')
Evan Hernandezc760c712019-02-07 15:18:18 -070036 self.manifest_url = 'manifest.com'
Lann Martin10f3ee92018-08-22 15:48:10 -060037
Don Garrett903fedc2018-11-02 17:04:26 -070038 self.repo_mock = self.PatchObject(
39 repository, 'RepoRepository', autospec=True)
Lann Martin10f3ee92018-08-22 15:48:10 -060040
Don Garrett903fedc2018-11-02 17:04:26 -070041 self.refresh_manifest_mock = self.PatchObject(
42 manifest_version, 'RefreshManifestCheckout', autospec=True)
Lann Martin10f3ee92018-08-22 15:48:10 -060043
Don Garrett903fedc2018-11-02 17:04:26 -070044 self.resolve_buildspec_mock = self.PatchObject(
45 manifest_version, 'ResolveBuildspec', autospec=True)
Lann Martin10f3ee92018-08-22 15:48:10 -060046
Don Garrett903fedc2018-11-02 17:04:26 -070047 self.resolve_version_mock = self.PatchObject(
48 manifest_version, 'ResolveBuildspecVersion', autospec=True)
Lann Martin10f3ee92018-08-22 15:48:10 -060049
Don Garrett903fedc2018-11-02 17:04:26 -070050
51 def notestHelp(self):
52 with self.assertRaises(SystemExit):
53 repo_sync_manifest.main([
54 '--help',
55 ])
56
57 def testMinimal(self):
58 repo_sync_manifest.main([
59 '--repo-root', self.repo_dir,
60 ])
61
62 # Ensure manifest_versions is not updated.
63 self.assertEqual(self.refresh_manifest_mock.mock_calls, [])
64
65 # Ensure RepoRepository created and Sync'd as expected.
66 self.assertEqual(self.repo_mock.mock_calls, [
67 mock.call(
68 directory=self.repo_dir,
69 manifest_repo_url=self.INT_MANIFEST_URL,
70 branch='master',
71 git_cache_dir=None,
Evan Hernandezc831b122019-02-07 15:26:43 -070072 repo_url=None,
Raul E Rangel5a7c5002019-11-08 09:18:32 -070073 groups=None,
Don Garrett903fedc2018-11-02 17:04:26 -070074 ),
75 mock.call().Sync(detach=True, local_manifest=None)
76 ])
77
78 def testMinimalExternal(self):
79 repo_sync_manifest.main([
80 '--repo-root', self.repo_dir,
81 '--external',
82 ])
83
84 # Ensure manifest_versions is not updated.
85 self.assertEqual(self.refresh_manifest_mock.mock_calls, [])
86
87 # Ensure RepoRepository created and Sync'd as expected.
88 self.assertEqual(self.repo_mock.mock_calls, [
89 mock.call(
90 directory=self.repo_dir,
91 manifest_repo_url=self.EXT_MANIFEST_URL,
92 branch='master',
93 git_cache_dir=None,
Evan Hernandezc831b122019-02-07 15:26:43 -070094 repo_url=None,
Raul E Rangel5a7c5002019-11-08 09:18:32 -070095 groups=None,
Don Garrett903fedc2018-11-02 17:04:26 -070096 ),
97 mock.call().Sync(detach=True, local_manifest=None)
98 ])
99
Evan Hernandezc760c712019-02-07 15:18:18 -0700100 def testMinimalManifestUrl(self):
101 repo_sync_manifest.main([
102 '--repo-root', self.repo_dir,
103 '--manifest-url', self.manifest_url,
104 ])
105
106 # Ensure manifest_versions is not updated.
107 self.assertEqual(self.refresh_manifest_mock.mock_calls, [])
108
109 # Ensure RepoRepository created and Sync'd as expected.
110 self.assertEqual(self.repo_mock.mock_calls, [
111 mock.call(
112 directory=self.repo_dir,
113 manifest_repo_url=self.manifest_url,
114 branch='master',
115 git_cache_dir=None,
Evan Hernandezc831b122019-02-07 15:26:43 -0700116 repo_url=None,
Raul E Rangel5a7c5002019-11-08 09:18:32 -0700117 groups=None,
Evan Hernandezc760c712019-02-07 15:18:18 -0700118 ),
119 mock.call().Sync(detach=True, local_manifest=None)
120 ])
121
Don Garrett903fedc2018-11-02 17:04:26 -0700122 def testBranch(self):
123 repo_sync_manifest.main([
124 '--repo-root', self.repo_dir,
125 '--branch', 'branch'
126 ])
127
128 # Ensure RepoRepository created and Sync'd as expected.
129 self.assertEqual(self.repo_mock.mock_calls, [
130 mock.call(
131 directory=self.repo_dir,
132 manifest_repo_url=self.INT_MANIFEST_URL,
133 branch='branch',
134 git_cache_dir=None,
Evan Hernandezc831b122019-02-07 15:26:43 -0700135 repo_url=None,
Raul E Rangel5a7c5002019-11-08 09:18:32 -0700136 groups=None,
Don Garrett903fedc2018-11-02 17:04:26 -0700137 ),
138 mock.call().Sync(detach=True, local_manifest=None)
139 ])
140
141 # Ensure manifest_versions is not updated.
142 self.assertEqual(self.refresh_manifest_mock.mock_calls, [])
143
144 def testBuildSpec(self):
145 self.resolve_buildspec_mock.return_value = 'resolved_buildspec'
146
147 repo_sync_manifest.main([
148 '--repo-root', self.repo_dir,
149 '--buildspec', 'test/spec',
150 '--manifest-versions-int', self.mv_int,
151 ])
152
153 # Ensure manifest-versions interactions are correct.
154 self.assertEqual(self.refresh_manifest_mock.mock_calls, [
155 mock.call(self.mv_int, self.MV_INT_URL)])
156 self.assertEqual(self.resolve_buildspec_mock.mock_calls, [
157 mock.call(self.mv_int, 'test/spec')])
158 self.assertEqual(self.resolve_version_mock.mock_calls, [])
159
160 # Ensure RepoRepository created and Sync'd as expected.
161 self.assertEqual(self.repo_mock.mock_calls, [
162 mock.call(
163 directory=self.repo_dir,
164 manifest_repo_url=self.INT_MANIFEST_URL,
165 branch='master',
166 git_cache_dir=None,
Evan Hernandezc831b122019-02-07 15:26:43 -0700167 repo_url=None,
Raul E Rangel5a7c5002019-11-08 09:18:32 -0700168 groups=None,
Don Garrett903fedc2018-11-02 17:04:26 -0700169 ),
170 mock.call().Sync(detach=True, local_manifest='resolved_buildspec')
171 ])
172
173 def testBuildSpecExternal(self):
174 self.resolve_buildspec_mock.return_value = 'resolved_buildspec'
175
176 repo_sync_manifest.main([
177 '--repo-root', self.repo_dir,
178 '--buildspec', 'test/spec',
179 '--manifest-versions-ext', self.mv_ext,
180 '--external',
181 ])
182
183 # Ensure manifest-versions interactions are correct.
184 self.assertEqual(self.refresh_manifest_mock.mock_calls, [
185 mock.call(self.mv_ext, self.MV_EXT_URL)])
186 self.assertEqual(self.resolve_buildspec_mock.mock_calls, [
187 mock.call(self.mv_ext, 'test/spec')])
188 self.assertEqual(self.resolve_version_mock.mock_calls, [])
189
190 # Ensure RepoRepository created and Sync'd as expected.
191 self.assertEqual(self.repo_mock.mock_calls, [
192 mock.call(
193 directory=self.repo_dir,
194 manifest_repo_url=self.EXT_MANIFEST_URL,
195 branch='master',
196 git_cache_dir=None,
Evan Hernandezc831b122019-02-07 15:26:43 -0700197 repo_url=None,
Raul E Rangel5a7c5002019-11-08 09:18:32 -0700198 groups=None,
Don Garrett903fedc2018-11-02 17:04:26 -0700199 ),
200 mock.call().Sync(detach=True, local_manifest='resolved_buildspec')
201 ])
202
203 def testVersion(self):
204 self.resolve_version_mock.return_value = 'resolved_buildspec'
205
206 repo_sync_manifest.main([
207 '--repo-root', self.repo_dir,
208 '--version', '1.2.3',
209 '--manifest-versions-int', self.mv_int,
210 ])
211
212 # Ensure manifest-versions interactions are correct.
213 self.assertEqual(self.refresh_manifest_mock.mock_calls, [
214 mock.call(self.mv_int, self.MV_INT_URL)])
215 self.assertEqual(self.resolve_buildspec_mock.mock_calls, [])
216 self.assertEqual(self.resolve_version_mock.mock_calls, [
217 mock.call(self.mv_int, '1.2.3')])
218
219 # Ensure RepoRepository created and Sync'd as expected.
220 self.assertEqual(self.repo_mock.mock_calls, [
221 mock.call(
222 directory=self.repo_dir,
223 manifest_repo_url=self.INT_MANIFEST_URL,
224 branch='master',
225 git_cache_dir=None,
Evan Hernandezc831b122019-02-07 15:26:43 -0700226 repo_url=None,
Raul E Rangel5a7c5002019-11-08 09:18:32 -0700227 groups=None,
Don Garrett903fedc2018-11-02 17:04:26 -0700228 ),
229 mock.call().Sync(detach=True, local_manifest='resolved_buildspec')
230 ])
231
232 def testVersionExternal(self):
233 self.resolve_version_mock.return_value = 'resolved_buildspec'
234
235 repo_sync_manifest.main([
236 '--repo-root', self.repo_dir,
237 '--version', '1.2.3',
238 '--manifest-versions-ext', self.mv_ext,
239 '--external',
240 ])
241
242 # Ensure manifest-versions interactions are correct.
243 self.assertEqual(self.refresh_manifest_mock.mock_calls, [
244 mock.call(self.mv_ext, self.MV_EXT_URL)])
245 self.assertEqual(self.resolve_buildspec_mock.mock_calls, [])
246 self.assertEqual(self.resolve_version_mock.mock_calls, [
247 mock.call(self.mv_ext, '1.2.3')])
248
249 # Ensure RepoRepository created and Sync'd as expected.
250 self.assertEqual(self.repo_mock.mock_calls, [
251 mock.call(
252 directory=self.repo_dir,
253 manifest_repo_url=self.EXT_MANIFEST_URL,
254 branch='master',
255 git_cache_dir=None,
Evan Hernandezc831b122019-02-07 15:26:43 -0700256 repo_url=None,
Raul E Rangel5a7c5002019-11-08 09:18:32 -0700257 groups=None,
Don Garrett903fedc2018-11-02 17:04:26 -0700258 ),
259 mock.call().Sync(detach=True, local_manifest='resolved_buildspec')
260 ])
261
262 def testBuildSpecNoManifestVersions(self):
263 with self.assertRaises(AssertionError):
264 repo_sync_manifest.main([
265 '--repo-root', self.repo_dir,
266 '--buildspec', 'test/spec',
267 ])
268
269 with self.assertRaises(AssertionError):
270 repo_sync_manifest.main([
271 '--repo-root', self.repo_dir,
272 '--buildspec', 'test/spec',
273 '--external',
274 ])
275
276 def testLocalManifest(self):
277 repo_sync_manifest.main([
278 '--repo-root', self.repo_dir,
279 '--manifest-file', self.manifest,
280 ])
281
282 # Ensure manifest_versions is not updated.
283 self.assertEqual(self.refresh_manifest_mock.mock_calls, [])
284
285 # Ensure RepoRepository created and Sync'd as expected.
286 self.assertEqual(self.repo_mock.mock_calls, [
287 mock.call(
288 directory=self.repo_dir,
289 manifest_repo_url=self.INT_MANIFEST_URL,
290 branch='master',
291 git_cache_dir=None,
Evan Hernandezc831b122019-02-07 15:26:43 -0700292 repo_url=None,
Raul E Rangel5a7c5002019-11-08 09:18:32 -0700293 groups=None,
294 ),
295 mock.call().Sync(detach=True, local_manifest=self.manifest)
296 ])
297
298 def testGroups(self):
299 repo_sync_manifest.main([
300 '--repo-root', self.repo_dir,
301 '--manifest-file', self.manifest,
302 '--groups', 'all'
303 ])
304
305 # Ensure manifest_versions is not updated.
306 self.assertEqual(self.refresh_manifest_mock.mock_calls, [])
307
308 # Ensure RepoRepository created and Sync'd as expected.
309 self.assertEqual(self.repo_mock.mock_calls, [
310 mock.call(
311 directory=self.repo_dir,
312 manifest_repo_url=self.INT_MANIFEST_URL,
313 branch='master',
314 git_cache_dir=None,
315 repo_url=None,
316 groups='all',
Don Garrett903fedc2018-11-02 17:04:26 -0700317 ),
318 mock.call().Sync(detach=True, local_manifest=self.manifest)
319 ])
320
321 def testOptimizations(self):
322 repo_sync_manifest.main([
323 '--repo-root', self.repo_dir,
324 '--copy-repo', self.preload_src,
325 '--git-cache', self.git_cache,
Evan Hernandezc831b122019-02-07 15:26:43 -0700326 '--repo-url', self.repo_url,
Don Garrett903fedc2018-11-02 17:04:26 -0700327 ])
328
329 # Ensure manifest_versions is not updated.
330 self.assertEqual(self.refresh_manifest_mock.mock_calls, [])
331
332 # Ensure RepoRepository created and Sync'd as expected.
333 self.assertEqual(self.repo_mock.mock_calls, [
334 mock.call(
335 directory=self.repo_dir,
336 manifest_repo_url=self.INT_MANIFEST_URL,
337 branch='master',
338 git_cache_dir=self.git_cache,
Evan Hernandezc831b122019-02-07 15:26:43 -0700339 repo_url=self.repo_url,
Raul E Rangel5a7c5002019-11-08 09:18:32 -0700340 groups=None,
Don Garrett903fedc2018-11-02 17:04:26 -0700341 ),
342 mock.call().PreLoad(self.preload_src),
343 mock.call().Sync(detach=True, local_manifest=None)
344 ])