blob: e3ce49378067d25fc04884fd3162e3b86cde91ff [file] [log] [blame]
Lann Martin10f3ee92018-08-22 15:48:10 -06001# -*- coding: utf-8 -*-
2# Copyright 2018 The Chromium OS Authors. All rights reserved.
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5
6"""Tests for scripts/repo_sync_manifest."""
7
8from __future__ import print_function
9
10import os
11
Mike Frysinger6db648e2018-07-24 19:57:58 -040012import mock
13
Don Garrett903fedc2018-11-02 17:04:26 -070014from chromite.cbuildbot import manifest_version
15from chromite.cbuildbot import repository
Lann Martin10f3ee92018-08-22 15:48:10 -060016from chromite.lib import cros_test_lib
Lann Martin10f3ee92018-08-22 15:48:10 -060017from chromite.scripts import repo_sync_manifest
18
19
Don Garrett903fedc2018-11-02 17:04:26 -070020class RepoSyncManifestTest(cros_test_lib.RunCommandTempDirTestCase):
Lann Martin10f3ee92018-08-22 15:48:10 -060021 """Unit tests for repo_sync_manifest."""
22
Don Garrett903fedc2018-11-02 17:04:26 -070023 INT_MANIFEST_URL = ('https://chrome-internal-review.googlesource.com/'
24 'chromeos/manifest-internal')
25 EXT_MANIFEST_URL = ('https://chromium.googlesource.com/chromiumos/manifest')
26
27 MV_INT_URL = ('https://chrome-internal.googlesource.com/chromeos/'
28 'manifest-versions')
29 MV_EXT_URL = ('https://chromium.googlesource.com/chromiumos/'
30 'manifest-versions')
31
Lann Martin10f3ee92018-08-22 15:48:10 -060032 def setUp(self):
Don Garrett903fedc2018-11-02 17:04:26 -070033 self.repo_dir = os.path.join(self.tempdir, 'repo')
Evan Hernandezc831b122019-02-07 15:26:43 -070034 self.repo_url = os.path.join(self.tempdir, '.repo/repo')
Don Garrett903fedc2018-11-02 17:04:26 -070035 self.preload_src = os.path.join(self.tempdir, 'source')
36 self.git_cache = os.path.join(self.tempdir, 'git_cache')
Lann Martin10f3ee92018-08-22 15:48:10 -060037 self.manifest = os.path.join(self.tempdir, 'manifest.xml')
Don Garrett903fedc2018-11-02 17:04:26 -070038 self.mv_ext = os.path.join(self.tempdir, 'mv_ext')
39 self.mv_int = os.path.join(self.tempdir, 'mv_int')
Evan Hernandezc760c712019-02-07 15:18:18 -070040 self.manifest_url = 'manifest.com'
Lann Martin10f3ee92018-08-22 15:48:10 -060041
Don Garrett903fedc2018-11-02 17:04:26 -070042 self.repo_mock = self.PatchObject(
43 repository, 'RepoRepository', autospec=True)
Lann Martin10f3ee92018-08-22 15:48:10 -060044
Don Garrett903fedc2018-11-02 17:04:26 -070045 self.refresh_manifest_mock = self.PatchObject(
46 manifest_version, 'RefreshManifestCheckout', autospec=True)
Lann Martin10f3ee92018-08-22 15:48:10 -060047
Don Garrett903fedc2018-11-02 17:04:26 -070048 self.resolve_buildspec_mock = self.PatchObject(
49 manifest_version, 'ResolveBuildspec', autospec=True)
Lann Martin10f3ee92018-08-22 15:48:10 -060050
Don Garrett903fedc2018-11-02 17:04:26 -070051 self.resolve_version_mock = self.PatchObject(
52 manifest_version, 'ResolveBuildspecVersion', autospec=True)
Lann Martin10f3ee92018-08-22 15:48:10 -060053
Don Garrett903fedc2018-11-02 17:04:26 -070054
55 def notestHelp(self):
56 with self.assertRaises(SystemExit):
57 repo_sync_manifest.main([
58 '--help',
59 ])
60
61 def testMinimal(self):
62 repo_sync_manifest.main([
63 '--repo-root', self.repo_dir,
64 ])
65
66 # Ensure manifest_versions is not updated.
67 self.assertEqual(self.refresh_manifest_mock.mock_calls, [])
68
69 # Ensure RepoRepository created and Sync'd as expected.
70 self.assertEqual(self.repo_mock.mock_calls, [
71 mock.call(
72 directory=self.repo_dir,
73 manifest_repo_url=self.INT_MANIFEST_URL,
74 branch='master',
75 git_cache_dir=None,
Evan Hernandezc831b122019-02-07 15:26:43 -070076 repo_url=None,
Raul E Rangel5a7c5002019-11-08 09:18:32 -070077 groups=None,
Don Garrett903fedc2018-11-02 17:04:26 -070078 ),
79 mock.call().Sync(detach=True, local_manifest=None)
80 ])
81
82 def testMinimalExternal(self):
83 repo_sync_manifest.main([
84 '--repo-root', self.repo_dir,
85 '--external',
86 ])
87
88 # Ensure manifest_versions is not updated.
89 self.assertEqual(self.refresh_manifest_mock.mock_calls, [])
90
91 # Ensure RepoRepository created and Sync'd as expected.
92 self.assertEqual(self.repo_mock.mock_calls, [
93 mock.call(
94 directory=self.repo_dir,
95 manifest_repo_url=self.EXT_MANIFEST_URL,
96 branch='master',
97 git_cache_dir=None,
Evan Hernandezc831b122019-02-07 15:26:43 -070098 repo_url=None,
Raul E Rangel5a7c5002019-11-08 09:18:32 -070099 groups=None,
Don Garrett903fedc2018-11-02 17:04:26 -0700100 ),
101 mock.call().Sync(detach=True, local_manifest=None)
102 ])
103
Evan Hernandezc760c712019-02-07 15:18:18 -0700104 def testMinimalManifestUrl(self):
105 repo_sync_manifest.main([
106 '--repo-root', self.repo_dir,
107 '--manifest-url', self.manifest_url,
108 ])
109
110 # Ensure manifest_versions is not updated.
111 self.assertEqual(self.refresh_manifest_mock.mock_calls, [])
112
113 # Ensure RepoRepository created and Sync'd as expected.
114 self.assertEqual(self.repo_mock.mock_calls, [
115 mock.call(
116 directory=self.repo_dir,
117 manifest_repo_url=self.manifest_url,
118 branch='master',
119 git_cache_dir=None,
Evan Hernandezc831b122019-02-07 15:26:43 -0700120 repo_url=None,
Raul E Rangel5a7c5002019-11-08 09:18:32 -0700121 groups=None,
Evan Hernandezc760c712019-02-07 15:18:18 -0700122 ),
123 mock.call().Sync(detach=True, local_manifest=None)
124 ])
125
Don Garrett903fedc2018-11-02 17:04:26 -0700126 def testBranch(self):
127 repo_sync_manifest.main([
128 '--repo-root', self.repo_dir,
129 '--branch', 'branch'
130 ])
131
132 # Ensure RepoRepository created and Sync'd as expected.
133 self.assertEqual(self.repo_mock.mock_calls, [
134 mock.call(
135 directory=self.repo_dir,
136 manifest_repo_url=self.INT_MANIFEST_URL,
137 branch='branch',
138 git_cache_dir=None,
Evan Hernandezc831b122019-02-07 15:26:43 -0700139 repo_url=None,
Raul E Rangel5a7c5002019-11-08 09:18:32 -0700140 groups=None,
Don Garrett903fedc2018-11-02 17:04:26 -0700141 ),
142 mock.call().Sync(detach=True, local_manifest=None)
143 ])
144
145 # Ensure manifest_versions is not updated.
146 self.assertEqual(self.refresh_manifest_mock.mock_calls, [])
147
148 def testBuildSpec(self):
149 self.resolve_buildspec_mock.return_value = 'resolved_buildspec'
150
151 repo_sync_manifest.main([
152 '--repo-root', self.repo_dir,
153 '--buildspec', 'test/spec',
154 '--manifest-versions-int', self.mv_int,
155 ])
156
157 # Ensure manifest-versions interactions are correct.
158 self.assertEqual(self.refresh_manifest_mock.mock_calls, [
159 mock.call(self.mv_int, self.MV_INT_URL)])
160 self.assertEqual(self.resolve_buildspec_mock.mock_calls, [
161 mock.call(self.mv_int, 'test/spec')])
162 self.assertEqual(self.resolve_version_mock.mock_calls, [])
163
164 # Ensure RepoRepository created and Sync'd as expected.
165 self.assertEqual(self.repo_mock.mock_calls, [
166 mock.call(
167 directory=self.repo_dir,
168 manifest_repo_url=self.INT_MANIFEST_URL,
169 branch='master',
170 git_cache_dir=None,
Evan Hernandezc831b122019-02-07 15:26:43 -0700171 repo_url=None,
Raul E Rangel5a7c5002019-11-08 09:18:32 -0700172 groups=None,
Don Garrett903fedc2018-11-02 17:04:26 -0700173 ),
174 mock.call().Sync(detach=True, local_manifest='resolved_buildspec')
175 ])
176
177 def testBuildSpecExternal(self):
178 self.resolve_buildspec_mock.return_value = 'resolved_buildspec'
179
180 repo_sync_manifest.main([
181 '--repo-root', self.repo_dir,
182 '--buildspec', 'test/spec',
183 '--manifest-versions-ext', self.mv_ext,
184 '--external',
185 ])
186
187 # Ensure manifest-versions interactions are correct.
188 self.assertEqual(self.refresh_manifest_mock.mock_calls, [
189 mock.call(self.mv_ext, self.MV_EXT_URL)])
190 self.assertEqual(self.resolve_buildspec_mock.mock_calls, [
191 mock.call(self.mv_ext, 'test/spec')])
192 self.assertEqual(self.resolve_version_mock.mock_calls, [])
193
194 # Ensure RepoRepository created and Sync'd as expected.
195 self.assertEqual(self.repo_mock.mock_calls, [
196 mock.call(
197 directory=self.repo_dir,
198 manifest_repo_url=self.EXT_MANIFEST_URL,
199 branch='master',
200 git_cache_dir=None,
Evan Hernandezc831b122019-02-07 15:26:43 -0700201 repo_url=None,
Raul E Rangel5a7c5002019-11-08 09:18:32 -0700202 groups=None,
Don Garrett903fedc2018-11-02 17:04:26 -0700203 ),
204 mock.call().Sync(detach=True, local_manifest='resolved_buildspec')
205 ])
206
207 def testVersion(self):
208 self.resolve_version_mock.return_value = 'resolved_buildspec'
209
210 repo_sync_manifest.main([
211 '--repo-root', self.repo_dir,
212 '--version', '1.2.3',
213 '--manifest-versions-int', self.mv_int,
214 ])
215
216 # Ensure manifest-versions interactions are correct.
217 self.assertEqual(self.refresh_manifest_mock.mock_calls, [
218 mock.call(self.mv_int, self.MV_INT_URL)])
219 self.assertEqual(self.resolve_buildspec_mock.mock_calls, [])
220 self.assertEqual(self.resolve_version_mock.mock_calls, [
221 mock.call(self.mv_int, '1.2.3')])
222
223 # Ensure RepoRepository created and Sync'd as expected.
224 self.assertEqual(self.repo_mock.mock_calls, [
225 mock.call(
226 directory=self.repo_dir,
227 manifest_repo_url=self.INT_MANIFEST_URL,
228 branch='master',
229 git_cache_dir=None,
Evan Hernandezc831b122019-02-07 15:26:43 -0700230 repo_url=None,
Raul E Rangel5a7c5002019-11-08 09:18:32 -0700231 groups=None,
Don Garrett903fedc2018-11-02 17:04:26 -0700232 ),
233 mock.call().Sync(detach=True, local_manifest='resolved_buildspec')
234 ])
235
236 def testVersionExternal(self):
237 self.resolve_version_mock.return_value = 'resolved_buildspec'
238
239 repo_sync_manifest.main([
240 '--repo-root', self.repo_dir,
241 '--version', '1.2.3',
242 '--manifest-versions-ext', self.mv_ext,
243 '--external',
244 ])
245
246 # Ensure manifest-versions interactions are correct.
247 self.assertEqual(self.refresh_manifest_mock.mock_calls, [
248 mock.call(self.mv_ext, self.MV_EXT_URL)])
249 self.assertEqual(self.resolve_buildspec_mock.mock_calls, [])
250 self.assertEqual(self.resolve_version_mock.mock_calls, [
251 mock.call(self.mv_ext, '1.2.3')])
252
253 # Ensure RepoRepository created and Sync'd as expected.
254 self.assertEqual(self.repo_mock.mock_calls, [
255 mock.call(
256 directory=self.repo_dir,
257 manifest_repo_url=self.EXT_MANIFEST_URL,
258 branch='master',
259 git_cache_dir=None,
Evan Hernandezc831b122019-02-07 15:26:43 -0700260 repo_url=None,
Raul E Rangel5a7c5002019-11-08 09:18:32 -0700261 groups=None,
Don Garrett903fedc2018-11-02 17:04:26 -0700262 ),
263 mock.call().Sync(detach=True, local_manifest='resolved_buildspec')
264 ])
265
266 def testBuildSpecNoManifestVersions(self):
267 with self.assertRaises(AssertionError):
268 repo_sync_manifest.main([
269 '--repo-root', self.repo_dir,
270 '--buildspec', 'test/spec',
271 ])
272
273 with self.assertRaises(AssertionError):
274 repo_sync_manifest.main([
275 '--repo-root', self.repo_dir,
276 '--buildspec', 'test/spec',
277 '--external',
278 ])
279
280 def testLocalManifest(self):
281 repo_sync_manifest.main([
282 '--repo-root', self.repo_dir,
283 '--manifest-file', self.manifest,
284 ])
285
286 # Ensure manifest_versions is not updated.
287 self.assertEqual(self.refresh_manifest_mock.mock_calls, [])
288
289 # Ensure RepoRepository created and Sync'd as expected.
290 self.assertEqual(self.repo_mock.mock_calls, [
291 mock.call(
292 directory=self.repo_dir,
293 manifest_repo_url=self.INT_MANIFEST_URL,
294 branch='master',
295 git_cache_dir=None,
Evan Hernandezc831b122019-02-07 15:26:43 -0700296 repo_url=None,
Raul E Rangel5a7c5002019-11-08 09:18:32 -0700297 groups=None,
298 ),
299 mock.call().Sync(detach=True, local_manifest=self.manifest)
300 ])
301
302 def testGroups(self):
303 repo_sync_manifest.main([
304 '--repo-root', self.repo_dir,
305 '--manifest-file', self.manifest,
306 '--groups', 'all'
307 ])
308
309 # Ensure manifest_versions is not updated.
310 self.assertEqual(self.refresh_manifest_mock.mock_calls, [])
311
312 # Ensure RepoRepository created and Sync'd as expected.
313 self.assertEqual(self.repo_mock.mock_calls, [
314 mock.call(
315 directory=self.repo_dir,
316 manifest_repo_url=self.INT_MANIFEST_URL,
317 branch='master',
318 git_cache_dir=None,
319 repo_url=None,
320 groups='all',
Don Garrett903fedc2018-11-02 17:04:26 -0700321 ),
322 mock.call().Sync(detach=True, local_manifest=self.manifest)
323 ])
324
325 def testOptimizations(self):
326 repo_sync_manifest.main([
327 '--repo-root', self.repo_dir,
328 '--copy-repo', self.preload_src,
329 '--git-cache', self.git_cache,
Evan Hernandezc831b122019-02-07 15:26:43 -0700330 '--repo-url', self.repo_url,
Don Garrett903fedc2018-11-02 17:04:26 -0700331 ])
332
333 # Ensure manifest_versions is not updated.
334 self.assertEqual(self.refresh_manifest_mock.mock_calls, [])
335
336 # Ensure RepoRepository created and Sync'd as expected.
337 self.assertEqual(self.repo_mock.mock_calls, [
338 mock.call(
339 directory=self.repo_dir,
340 manifest_repo_url=self.INT_MANIFEST_URL,
341 branch='master',
342 git_cache_dir=self.git_cache,
Evan Hernandezc831b122019-02-07 15:26:43 -0700343 repo_url=self.repo_url,
Raul E Rangel5a7c5002019-11-08 09:18:32 -0700344 groups=None,
Don Garrett903fedc2018-11-02 17:04:26 -0700345 ),
346 mock.call().PreLoad(self.preload_src),
347 mock.call().Sync(detach=True, local_manifest=None)
348 ])