blob: 3e4714405d544e5b7f1293c36ebbaef261c3766a [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
Don Garrett903fedc2018-11-02 17:04:26 -070010import mock
Lann Martin10f3ee92018-08-22 15:48:10 -060011import os
12
Don Garrett903fedc2018-11-02 17:04:26 -070013from chromite.cbuildbot import manifest_version
14from chromite.cbuildbot import repository
Lann Martin10f3ee92018-08-22 15:48:10 -060015from chromite.lib import cros_test_lib
Lann Martin10f3ee92018-08-22 15:48:10 -060016from chromite.scripts import repo_sync_manifest
17
18
Don Garrett903fedc2018-11-02 17:04:26 -070019class RepoSyncManifestTest(cros_test_lib.RunCommandTempDirTestCase):
Lann Martin10f3ee92018-08-22 15:48:10 -060020 """Unit tests for repo_sync_manifest."""
21
Don Garrett903fedc2018-11-02 17:04:26 -070022 INT_MANIFEST_URL = ('https://chrome-internal-review.googlesource.com/'
23 'chromeos/manifest-internal')
24 EXT_MANIFEST_URL = ('https://chromium.googlesource.com/chromiumos/manifest')
25
26 MV_INT_URL = ('https://chrome-internal.googlesource.com/chromeos/'
27 'manifest-versions')
28 MV_EXT_URL = ('https://chromium.googlesource.com/chromiumos/'
29 'manifest-versions')
30
Lann Martin10f3ee92018-08-22 15:48:10 -060031 def setUp(self):
Don Garrett903fedc2018-11-02 17:04:26 -070032 self.repo_dir = os.path.join(self.tempdir, 'repo')
Evan Hernandezc831b122019-02-07 15:26:43 -070033 self.repo_url = os.path.join(self.tempdir, '.repo/repo')
Don Garrett903fedc2018-11-02 17:04:26 -070034 self.preload_src = os.path.join(self.tempdir, 'source')
35 self.git_cache = os.path.join(self.tempdir, 'git_cache')
Lann Martin10f3ee92018-08-22 15:48:10 -060036 self.manifest = os.path.join(self.tempdir, 'manifest.xml')
Don Garrett903fedc2018-11-02 17:04:26 -070037 self.mv_ext = os.path.join(self.tempdir, 'mv_ext')
38 self.mv_int = os.path.join(self.tempdir, 'mv_int')
Evan Hernandezc760c712019-02-07 15:18:18 -070039 self.manifest_url = 'manifest.com'
Lann Martin10f3ee92018-08-22 15:48:10 -060040
Don Garrett903fedc2018-11-02 17:04:26 -070041 self.repo_mock = self.PatchObject(
42 repository, 'RepoRepository', autospec=True)
Lann Martin10f3ee92018-08-22 15:48:10 -060043
Don Garrett903fedc2018-11-02 17:04:26 -070044 self.refresh_manifest_mock = self.PatchObject(
45 manifest_version, 'RefreshManifestCheckout', autospec=True)
Lann Martin10f3ee92018-08-22 15:48:10 -060046
Don Garrett903fedc2018-11-02 17:04:26 -070047 self.resolve_buildspec_mock = self.PatchObject(
48 manifest_version, 'ResolveBuildspec', autospec=True)
Lann Martin10f3ee92018-08-22 15:48:10 -060049
Don Garrett903fedc2018-11-02 17:04:26 -070050 self.resolve_version_mock = self.PatchObject(
51 manifest_version, 'ResolveBuildspecVersion', autospec=True)
Lann Martin10f3ee92018-08-22 15:48:10 -060052
Don Garrett903fedc2018-11-02 17:04:26 -070053
54 def notestHelp(self):
55 with self.assertRaises(SystemExit):
56 repo_sync_manifest.main([
57 '--help',
58 ])
59
60 def testMinimal(self):
61 repo_sync_manifest.main([
62 '--repo-root', self.repo_dir,
63 ])
64
65 # Ensure manifest_versions is not updated.
66 self.assertEqual(self.refresh_manifest_mock.mock_calls, [])
67
68 # Ensure RepoRepository created and Sync'd as expected.
69 self.assertEqual(self.repo_mock.mock_calls, [
70 mock.call(
71 directory=self.repo_dir,
72 manifest_repo_url=self.INT_MANIFEST_URL,
73 branch='master',
74 git_cache_dir=None,
Evan Hernandezc831b122019-02-07 15:26:43 -070075 repo_url=None,
Don Garrett903fedc2018-11-02 17:04:26 -070076 ),
77 mock.call().Sync(detach=True, local_manifest=None)
78 ])
79
80 def testMinimalExternal(self):
81 repo_sync_manifest.main([
82 '--repo-root', self.repo_dir,
83 '--external',
84 ])
85
86 # Ensure manifest_versions is not updated.
87 self.assertEqual(self.refresh_manifest_mock.mock_calls, [])
88
89 # Ensure RepoRepository created and Sync'd as expected.
90 self.assertEqual(self.repo_mock.mock_calls, [
91 mock.call(
92 directory=self.repo_dir,
93 manifest_repo_url=self.EXT_MANIFEST_URL,
94 branch='master',
95 git_cache_dir=None,
Evan Hernandezc831b122019-02-07 15:26:43 -070096 repo_url=None,
Don Garrett903fedc2018-11-02 17:04:26 -070097 ),
98 mock.call().Sync(detach=True, local_manifest=None)
99 ])
100
Evan Hernandezc760c712019-02-07 15:18:18 -0700101 def testMinimalManifestUrl(self):
102 repo_sync_manifest.main([
103 '--repo-root', self.repo_dir,
104 '--manifest-url', self.manifest_url,
105 ])
106
107 # Ensure manifest_versions is not updated.
108 self.assertEqual(self.refresh_manifest_mock.mock_calls, [])
109
110 # Ensure RepoRepository created and Sync'd as expected.
111 self.assertEqual(self.repo_mock.mock_calls, [
112 mock.call(
113 directory=self.repo_dir,
114 manifest_repo_url=self.manifest_url,
115 branch='master',
116 git_cache_dir=None,
Evan Hernandezc831b122019-02-07 15:26:43 -0700117 repo_url=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,
Don Garrett903fedc2018-11-02 17:04:26 -0700136 ),
137 mock.call().Sync(detach=True, local_manifest=None)
138 ])
139
140 # Ensure manifest_versions is not updated.
141 self.assertEqual(self.refresh_manifest_mock.mock_calls, [])
142
143 def testBuildSpec(self):
144 self.resolve_buildspec_mock.return_value = 'resolved_buildspec'
145
146 repo_sync_manifest.main([
147 '--repo-root', self.repo_dir,
148 '--buildspec', 'test/spec',
149 '--manifest-versions-int', self.mv_int,
150 ])
151
152 # Ensure manifest-versions interactions are correct.
153 self.assertEqual(self.refresh_manifest_mock.mock_calls, [
154 mock.call(self.mv_int, self.MV_INT_URL)])
155 self.assertEqual(self.resolve_buildspec_mock.mock_calls, [
156 mock.call(self.mv_int, 'test/spec')])
157 self.assertEqual(self.resolve_version_mock.mock_calls, [])
158
159 # Ensure RepoRepository created and Sync'd as expected.
160 self.assertEqual(self.repo_mock.mock_calls, [
161 mock.call(
162 directory=self.repo_dir,
163 manifest_repo_url=self.INT_MANIFEST_URL,
164 branch='master',
165 git_cache_dir=None,
Evan Hernandezc831b122019-02-07 15:26:43 -0700166 repo_url=None,
Don Garrett903fedc2018-11-02 17:04:26 -0700167 ),
168 mock.call().Sync(detach=True, local_manifest='resolved_buildspec')
169 ])
170
171 def testBuildSpecExternal(self):
172 self.resolve_buildspec_mock.return_value = 'resolved_buildspec'
173
174 repo_sync_manifest.main([
175 '--repo-root', self.repo_dir,
176 '--buildspec', 'test/spec',
177 '--manifest-versions-ext', self.mv_ext,
178 '--external',
179 ])
180
181 # Ensure manifest-versions interactions are correct.
182 self.assertEqual(self.refresh_manifest_mock.mock_calls, [
183 mock.call(self.mv_ext, self.MV_EXT_URL)])
184 self.assertEqual(self.resolve_buildspec_mock.mock_calls, [
185 mock.call(self.mv_ext, 'test/spec')])
186 self.assertEqual(self.resolve_version_mock.mock_calls, [])
187
188 # Ensure RepoRepository created and Sync'd as expected.
189 self.assertEqual(self.repo_mock.mock_calls, [
190 mock.call(
191 directory=self.repo_dir,
192 manifest_repo_url=self.EXT_MANIFEST_URL,
193 branch='master',
194 git_cache_dir=None,
Evan Hernandezc831b122019-02-07 15:26:43 -0700195 repo_url=None,
Don Garrett903fedc2018-11-02 17:04:26 -0700196 ),
197 mock.call().Sync(detach=True, local_manifest='resolved_buildspec')
198 ])
199
200 def testVersion(self):
201 self.resolve_version_mock.return_value = 'resolved_buildspec'
202
203 repo_sync_manifest.main([
204 '--repo-root', self.repo_dir,
205 '--version', '1.2.3',
206 '--manifest-versions-int', self.mv_int,
207 ])
208
209 # Ensure manifest-versions interactions are correct.
210 self.assertEqual(self.refresh_manifest_mock.mock_calls, [
211 mock.call(self.mv_int, self.MV_INT_URL)])
212 self.assertEqual(self.resolve_buildspec_mock.mock_calls, [])
213 self.assertEqual(self.resolve_version_mock.mock_calls, [
214 mock.call(self.mv_int, '1.2.3')])
215
216 # Ensure RepoRepository created and Sync'd as expected.
217 self.assertEqual(self.repo_mock.mock_calls, [
218 mock.call(
219 directory=self.repo_dir,
220 manifest_repo_url=self.INT_MANIFEST_URL,
221 branch='master',
222 git_cache_dir=None,
Evan Hernandezc831b122019-02-07 15:26:43 -0700223 repo_url=None,
Don Garrett903fedc2018-11-02 17:04:26 -0700224 ),
225 mock.call().Sync(detach=True, local_manifest='resolved_buildspec')
226 ])
227
228 def testVersionExternal(self):
229 self.resolve_version_mock.return_value = 'resolved_buildspec'
230
231 repo_sync_manifest.main([
232 '--repo-root', self.repo_dir,
233 '--version', '1.2.3',
234 '--manifest-versions-ext', self.mv_ext,
235 '--external',
236 ])
237
238 # Ensure manifest-versions interactions are correct.
239 self.assertEqual(self.refresh_manifest_mock.mock_calls, [
240 mock.call(self.mv_ext, self.MV_EXT_URL)])
241 self.assertEqual(self.resolve_buildspec_mock.mock_calls, [])
242 self.assertEqual(self.resolve_version_mock.mock_calls, [
243 mock.call(self.mv_ext, '1.2.3')])
244
245 # Ensure RepoRepository created and Sync'd as expected.
246 self.assertEqual(self.repo_mock.mock_calls, [
247 mock.call(
248 directory=self.repo_dir,
249 manifest_repo_url=self.EXT_MANIFEST_URL,
250 branch='master',
251 git_cache_dir=None,
Evan Hernandezc831b122019-02-07 15:26:43 -0700252 repo_url=None,
Don Garrett903fedc2018-11-02 17:04:26 -0700253 ),
254 mock.call().Sync(detach=True, local_manifest='resolved_buildspec')
255 ])
256
257 def testBuildSpecNoManifestVersions(self):
258 with self.assertRaises(AssertionError):
259 repo_sync_manifest.main([
260 '--repo-root', self.repo_dir,
261 '--buildspec', 'test/spec',
262 ])
263
264 with self.assertRaises(AssertionError):
265 repo_sync_manifest.main([
266 '--repo-root', self.repo_dir,
267 '--buildspec', 'test/spec',
268 '--external',
269 ])
270
271 def testLocalManifest(self):
272 repo_sync_manifest.main([
273 '--repo-root', self.repo_dir,
274 '--manifest-file', self.manifest,
275 ])
276
277 # Ensure manifest_versions is not updated.
278 self.assertEqual(self.refresh_manifest_mock.mock_calls, [])
279
280 # Ensure RepoRepository created and Sync'd as expected.
281 self.assertEqual(self.repo_mock.mock_calls, [
282 mock.call(
283 directory=self.repo_dir,
284 manifest_repo_url=self.INT_MANIFEST_URL,
285 branch='master',
286 git_cache_dir=None,
Evan Hernandezc831b122019-02-07 15:26:43 -0700287 repo_url=None,
Don Garrett903fedc2018-11-02 17:04:26 -0700288 ),
289 mock.call().Sync(detach=True, local_manifest=self.manifest)
290 ])
291
292 def testOptimizations(self):
293 repo_sync_manifest.main([
294 '--repo-root', self.repo_dir,
295 '--copy-repo', self.preload_src,
296 '--git-cache', self.git_cache,
Evan Hernandezc831b122019-02-07 15:26:43 -0700297 '--repo-url', self.repo_url,
Don Garrett903fedc2018-11-02 17:04:26 -0700298 ])
299
300 # Ensure manifest_versions is not updated.
301 self.assertEqual(self.refresh_manifest_mock.mock_calls, [])
302
303 # Ensure RepoRepository created and Sync'd as expected.
304 self.assertEqual(self.repo_mock.mock_calls, [
305 mock.call(
306 directory=self.repo_dir,
307 manifest_repo_url=self.INT_MANIFEST_URL,
308 branch='master',
309 git_cache_dir=self.git_cache,
Evan Hernandezc831b122019-02-07 15:26:43 -0700310 repo_url=self.repo_url,
Don Garrett903fedc2018-11-02 17:04:26 -0700311 ),
312 mock.call().PreLoad(self.preload_src),
313 mock.call().Sync(detach=True, local_manifest=None)
314 ])