blob: 9053193dd7ac32798807132f86f175ac03e97425 [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,
Don Garrett903fedc2018-11-02 17:04:26 -070077 ),
78 mock.call().Sync(detach=True, local_manifest=None)
79 ])
80
81 def testMinimalExternal(self):
82 repo_sync_manifest.main([
83 '--repo-root', self.repo_dir,
84 '--external',
85 ])
86
87 # Ensure manifest_versions is not updated.
88 self.assertEqual(self.refresh_manifest_mock.mock_calls, [])
89
90 # Ensure RepoRepository created and Sync'd as expected.
91 self.assertEqual(self.repo_mock.mock_calls, [
92 mock.call(
93 directory=self.repo_dir,
94 manifest_repo_url=self.EXT_MANIFEST_URL,
95 branch='master',
96 git_cache_dir=None,
Evan Hernandezc831b122019-02-07 15:26:43 -070097 repo_url=None,
Don Garrett903fedc2018-11-02 17:04:26 -070098 ),
99 mock.call().Sync(detach=True, local_manifest=None)
100 ])
101
Evan Hernandezc760c712019-02-07 15:18:18 -0700102 def testMinimalManifestUrl(self):
103 repo_sync_manifest.main([
104 '--repo-root', self.repo_dir,
105 '--manifest-url', self.manifest_url,
106 ])
107
108 # Ensure manifest_versions is not updated.
109 self.assertEqual(self.refresh_manifest_mock.mock_calls, [])
110
111 # Ensure RepoRepository created and Sync'd as expected.
112 self.assertEqual(self.repo_mock.mock_calls, [
113 mock.call(
114 directory=self.repo_dir,
115 manifest_repo_url=self.manifest_url,
116 branch='master',
117 git_cache_dir=None,
Evan Hernandezc831b122019-02-07 15:26:43 -0700118 repo_url=None,
Evan Hernandezc760c712019-02-07 15:18:18 -0700119 ),
120 mock.call().Sync(detach=True, local_manifest=None)
121 ])
122
Don Garrett903fedc2018-11-02 17:04:26 -0700123 def testBranch(self):
124 repo_sync_manifest.main([
125 '--repo-root', self.repo_dir,
126 '--branch', 'branch'
127 ])
128
129 # Ensure RepoRepository created and Sync'd as expected.
130 self.assertEqual(self.repo_mock.mock_calls, [
131 mock.call(
132 directory=self.repo_dir,
133 manifest_repo_url=self.INT_MANIFEST_URL,
134 branch='branch',
135 git_cache_dir=None,
Evan Hernandezc831b122019-02-07 15:26:43 -0700136 repo_url=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,
Don Garrett903fedc2018-11-02 17:04:26 -0700168 ),
169 mock.call().Sync(detach=True, local_manifest='resolved_buildspec')
170 ])
171
172 def testBuildSpecExternal(self):
173 self.resolve_buildspec_mock.return_value = 'resolved_buildspec'
174
175 repo_sync_manifest.main([
176 '--repo-root', self.repo_dir,
177 '--buildspec', 'test/spec',
178 '--manifest-versions-ext', self.mv_ext,
179 '--external',
180 ])
181
182 # Ensure manifest-versions interactions are correct.
183 self.assertEqual(self.refresh_manifest_mock.mock_calls, [
184 mock.call(self.mv_ext, self.MV_EXT_URL)])
185 self.assertEqual(self.resolve_buildspec_mock.mock_calls, [
186 mock.call(self.mv_ext, 'test/spec')])
187 self.assertEqual(self.resolve_version_mock.mock_calls, [])
188
189 # Ensure RepoRepository created and Sync'd as expected.
190 self.assertEqual(self.repo_mock.mock_calls, [
191 mock.call(
192 directory=self.repo_dir,
193 manifest_repo_url=self.EXT_MANIFEST_URL,
194 branch='master',
195 git_cache_dir=None,
Evan Hernandezc831b122019-02-07 15:26:43 -0700196 repo_url=None,
Don Garrett903fedc2018-11-02 17:04:26 -0700197 ),
198 mock.call().Sync(detach=True, local_manifest='resolved_buildspec')
199 ])
200
201 def testVersion(self):
202 self.resolve_version_mock.return_value = 'resolved_buildspec'
203
204 repo_sync_manifest.main([
205 '--repo-root', self.repo_dir,
206 '--version', '1.2.3',
207 '--manifest-versions-int', self.mv_int,
208 ])
209
210 # Ensure manifest-versions interactions are correct.
211 self.assertEqual(self.refresh_manifest_mock.mock_calls, [
212 mock.call(self.mv_int, self.MV_INT_URL)])
213 self.assertEqual(self.resolve_buildspec_mock.mock_calls, [])
214 self.assertEqual(self.resolve_version_mock.mock_calls, [
215 mock.call(self.mv_int, '1.2.3')])
216
217 # Ensure RepoRepository created and Sync'd as expected.
218 self.assertEqual(self.repo_mock.mock_calls, [
219 mock.call(
220 directory=self.repo_dir,
221 manifest_repo_url=self.INT_MANIFEST_URL,
222 branch='master',
223 git_cache_dir=None,
Evan Hernandezc831b122019-02-07 15:26:43 -0700224 repo_url=None,
Don Garrett903fedc2018-11-02 17:04:26 -0700225 ),
226 mock.call().Sync(detach=True, local_manifest='resolved_buildspec')
227 ])
228
229 def testVersionExternal(self):
230 self.resolve_version_mock.return_value = 'resolved_buildspec'
231
232 repo_sync_manifest.main([
233 '--repo-root', self.repo_dir,
234 '--version', '1.2.3',
235 '--manifest-versions-ext', self.mv_ext,
236 '--external',
237 ])
238
239 # Ensure manifest-versions interactions are correct.
240 self.assertEqual(self.refresh_manifest_mock.mock_calls, [
241 mock.call(self.mv_ext, self.MV_EXT_URL)])
242 self.assertEqual(self.resolve_buildspec_mock.mock_calls, [])
243 self.assertEqual(self.resolve_version_mock.mock_calls, [
244 mock.call(self.mv_ext, '1.2.3')])
245
246 # Ensure RepoRepository created and Sync'd as expected.
247 self.assertEqual(self.repo_mock.mock_calls, [
248 mock.call(
249 directory=self.repo_dir,
250 manifest_repo_url=self.EXT_MANIFEST_URL,
251 branch='master',
252 git_cache_dir=None,
Evan Hernandezc831b122019-02-07 15:26:43 -0700253 repo_url=None,
Don Garrett903fedc2018-11-02 17:04:26 -0700254 ),
255 mock.call().Sync(detach=True, local_manifest='resolved_buildspec')
256 ])
257
258 def testBuildSpecNoManifestVersions(self):
259 with self.assertRaises(AssertionError):
260 repo_sync_manifest.main([
261 '--repo-root', self.repo_dir,
262 '--buildspec', 'test/spec',
263 ])
264
265 with self.assertRaises(AssertionError):
266 repo_sync_manifest.main([
267 '--repo-root', self.repo_dir,
268 '--buildspec', 'test/spec',
269 '--external',
270 ])
271
272 def testLocalManifest(self):
273 repo_sync_manifest.main([
274 '--repo-root', self.repo_dir,
275 '--manifest-file', self.manifest,
276 ])
277
278 # Ensure manifest_versions is not updated.
279 self.assertEqual(self.refresh_manifest_mock.mock_calls, [])
280
281 # Ensure RepoRepository created and Sync'd as expected.
282 self.assertEqual(self.repo_mock.mock_calls, [
283 mock.call(
284 directory=self.repo_dir,
285 manifest_repo_url=self.INT_MANIFEST_URL,
286 branch='master',
287 git_cache_dir=None,
Evan Hernandezc831b122019-02-07 15:26:43 -0700288 repo_url=None,
Don Garrett903fedc2018-11-02 17:04:26 -0700289 ),
290 mock.call().Sync(detach=True, local_manifest=self.manifest)
291 ])
292
293 def testOptimizations(self):
294 repo_sync_manifest.main([
295 '--repo-root', self.repo_dir,
296 '--copy-repo', self.preload_src,
297 '--git-cache', self.git_cache,
Evan Hernandezc831b122019-02-07 15:26:43 -0700298 '--repo-url', self.repo_url,
Don Garrett903fedc2018-11-02 17:04:26 -0700299 ])
300
301 # Ensure manifest_versions is not updated.
302 self.assertEqual(self.refresh_manifest_mock.mock_calls, [])
303
304 # Ensure RepoRepository created and Sync'd as expected.
305 self.assertEqual(self.repo_mock.mock_calls, [
306 mock.call(
307 directory=self.repo_dir,
308 manifest_repo_url=self.INT_MANIFEST_URL,
309 branch='master',
310 git_cache_dir=self.git_cache,
Evan Hernandezc831b122019-02-07 15:26:43 -0700311 repo_url=self.repo_url,
Don Garrett903fedc2018-11-02 17:04:26 -0700312 ),
313 mock.call().PreLoad(self.preload_src),
314 mock.call().Sync(detach=True, local_manifest=None)
315 ])