blob: ad7630c4006c7efe78263872d11efb40049a65c4 [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')
33 self.preload_src = os.path.join(self.tempdir, 'source')
34 self.git_cache = os.path.join(self.tempdir, 'git_cache')
Lann Martin10f3ee92018-08-22 15:48:10 -060035 self.manifest = os.path.join(self.tempdir, 'manifest.xml')
Don Garrett903fedc2018-11-02 17:04:26 -070036 self.mv_ext = os.path.join(self.tempdir, 'mv_ext')
37 self.mv_int = os.path.join(self.tempdir, 'mv_int')
Lann Martin10f3ee92018-08-22 15:48:10 -060038
Don Garrett903fedc2018-11-02 17:04:26 -070039 self.repo_mock = self.PatchObject(
40 repository, 'RepoRepository', autospec=True)
Lann Martin10f3ee92018-08-22 15:48:10 -060041
Don Garrett903fedc2018-11-02 17:04:26 -070042 self.refresh_manifest_mock = self.PatchObject(
43 manifest_version, 'RefreshManifestCheckout', autospec=True)
Lann Martin10f3ee92018-08-22 15:48:10 -060044
Don Garrett903fedc2018-11-02 17:04:26 -070045 self.resolve_buildspec_mock = self.PatchObject(
46 manifest_version, 'ResolveBuildspec', autospec=True)
Lann Martin10f3ee92018-08-22 15:48:10 -060047
Don Garrett903fedc2018-11-02 17:04:26 -070048 self.resolve_version_mock = self.PatchObject(
49 manifest_version, 'ResolveBuildspecVersion', autospec=True)
Lann Martin10f3ee92018-08-22 15:48:10 -060050
Don Garrett903fedc2018-11-02 17:04:26 -070051
52 def notestHelp(self):
53 with self.assertRaises(SystemExit):
54 repo_sync_manifest.main([
55 '--help',
56 ])
57
58 def testMinimal(self):
59 repo_sync_manifest.main([
60 '--repo-root', self.repo_dir,
61 ])
62
63 # Ensure manifest_versions is not updated.
64 self.assertEqual(self.refresh_manifest_mock.mock_calls, [])
65
66 # Ensure RepoRepository created and Sync'd as expected.
67 self.assertEqual(self.repo_mock.mock_calls, [
68 mock.call(
69 directory=self.repo_dir,
70 manifest_repo_url=self.INT_MANIFEST_URL,
71 branch='master',
72 git_cache_dir=None,
73 ),
74 mock.call().Sync(detach=True, local_manifest=None)
75 ])
76
77 def testMinimalExternal(self):
78 repo_sync_manifest.main([
79 '--repo-root', self.repo_dir,
80 '--external',
81 ])
82
83 # Ensure manifest_versions is not updated.
84 self.assertEqual(self.refresh_manifest_mock.mock_calls, [])
85
86 # Ensure RepoRepository created and Sync'd as expected.
87 self.assertEqual(self.repo_mock.mock_calls, [
88 mock.call(
89 directory=self.repo_dir,
90 manifest_repo_url=self.EXT_MANIFEST_URL,
91 branch='master',
92 git_cache_dir=None,
93 ),
94 mock.call().Sync(detach=True, local_manifest=None)
95 ])
96
97 def testBranch(self):
98 repo_sync_manifest.main([
99 '--repo-root', self.repo_dir,
100 '--branch', 'branch'
101 ])
102
103 # Ensure RepoRepository created and Sync'd as expected.
104 self.assertEqual(self.repo_mock.mock_calls, [
105 mock.call(
106 directory=self.repo_dir,
107 manifest_repo_url=self.INT_MANIFEST_URL,
108 branch='branch',
109 git_cache_dir=None,
110 ),
111 mock.call().Sync(detach=True, local_manifest=None)
112 ])
113
114 # Ensure manifest_versions is not updated.
115 self.assertEqual(self.refresh_manifest_mock.mock_calls, [])
116
117 def testBuildSpec(self):
118 self.resolve_buildspec_mock.return_value = 'resolved_buildspec'
119
120 repo_sync_manifest.main([
121 '--repo-root', self.repo_dir,
122 '--buildspec', 'test/spec',
123 '--manifest-versions-int', self.mv_int,
124 ])
125
126 # Ensure manifest-versions interactions are correct.
127 self.assertEqual(self.refresh_manifest_mock.mock_calls, [
128 mock.call(self.mv_int, self.MV_INT_URL)])
129 self.assertEqual(self.resolve_buildspec_mock.mock_calls, [
130 mock.call(self.mv_int, 'test/spec')])
131 self.assertEqual(self.resolve_version_mock.mock_calls, [])
132
133 # Ensure RepoRepository created and Sync'd as expected.
134 self.assertEqual(self.repo_mock.mock_calls, [
135 mock.call(
136 directory=self.repo_dir,
137 manifest_repo_url=self.INT_MANIFEST_URL,
138 branch='master',
139 git_cache_dir=None,
140 ),
141 mock.call().Sync(detach=True, local_manifest='resolved_buildspec')
142 ])
143
144 def testBuildSpecExternal(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-ext', self.mv_ext,
151 '--external',
152 ])
153
154 # Ensure manifest-versions interactions are correct.
155 self.assertEqual(self.refresh_manifest_mock.mock_calls, [
156 mock.call(self.mv_ext, self.MV_EXT_URL)])
157 self.assertEqual(self.resolve_buildspec_mock.mock_calls, [
158 mock.call(self.mv_ext, 'test/spec')])
159 self.assertEqual(self.resolve_version_mock.mock_calls, [])
160
161 # Ensure RepoRepository created and Sync'd as expected.
162 self.assertEqual(self.repo_mock.mock_calls, [
163 mock.call(
164 directory=self.repo_dir,
165 manifest_repo_url=self.EXT_MANIFEST_URL,
166 branch='master',
167 git_cache_dir=None,
168 ),
169 mock.call().Sync(detach=True, local_manifest='resolved_buildspec')
170 ])
171
172 def testVersion(self):
173 self.resolve_version_mock.return_value = 'resolved_buildspec'
174
175 repo_sync_manifest.main([
176 '--repo-root', self.repo_dir,
177 '--version', '1.2.3',
178 '--manifest-versions-int', self.mv_int,
179 ])
180
181 # Ensure manifest-versions interactions are correct.
182 self.assertEqual(self.refresh_manifest_mock.mock_calls, [
183 mock.call(self.mv_int, self.MV_INT_URL)])
184 self.assertEqual(self.resolve_buildspec_mock.mock_calls, [])
185 self.assertEqual(self.resolve_version_mock.mock_calls, [
186 mock.call(self.mv_int, '1.2.3')])
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.INT_MANIFEST_URL,
193 branch='master',
194 git_cache_dir=None,
195 ),
196 mock.call().Sync(detach=True, local_manifest='resolved_buildspec')
197 ])
198
199 def testVersionExternal(self):
200 self.resolve_version_mock.return_value = 'resolved_buildspec'
201
202 repo_sync_manifest.main([
203 '--repo-root', self.repo_dir,
204 '--version', '1.2.3',
205 '--manifest-versions-ext', self.mv_ext,
206 '--external',
207 ])
208
209 # Ensure manifest-versions interactions are correct.
210 self.assertEqual(self.refresh_manifest_mock.mock_calls, [
211 mock.call(self.mv_ext, self.MV_EXT_URL)])
212 self.assertEqual(self.resolve_buildspec_mock.mock_calls, [])
213 self.assertEqual(self.resolve_version_mock.mock_calls, [
214 mock.call(self.mv_ext, '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.EXT_MANIFEST_URL,
221 branch='master',
222 git_cache_dir=None,
223 ),
224 mock.call().Sync(detach=True, local_manifest='resolved_buildspec')
225 ])
226
227 def testBuildSpecNoManifestVersions(self):
228 with self.assertRaises(AssertionError):
229 repo_sync_manifest.main([
230 '--repo-root', self.repo_dir,
231 '--buildspec', 'test/spec',
232 ])
233
234 with self.assertRaises(AssertionError):
235 repo_sync_manifest.main([
236 '--repo-root', self.repo_dir,
237 '--buildspec', 'test/spec',
238 '--external',
239 ])
240
241 def testLocalManifest(self):
242 repo_sync_manifest.main([
243 '--repo-root', self.repo_dir,
244 '--manifest-file', self.manifest,
245 ])
246
247 # Ensure manifest_versions is not updated.
248 self.assertEqual(self.refresh_manifest_mock.mock_calls, [])
249
250 # Ensure RepoRepository created and Sync'd as expected.
251 self.assertEqual(self.repo_mock.mock_calls, [
252 mock.call(
253 directory=self.repo_dir,
254 manifest_repo_url=self.INT_MANIFEST_URL,
255 branch='master',
256 git_cache_dir=None,
257 ),
258 mock.call().Sync(detach=True, local_manifest=self.manifest)
259 ])
260
261 def testOptimizations(self):
262 repo_sync_manifest.main([
263 '--repo-root', self.repo_dir,
264 '--copy-repo', self.preload_src,
265 '--git-cache', self.git_cache,
266 ])
267
268 # Ensure manifest_versions is not updated.
269 self.assertEqual(self.refresh_manifest_mock.mock_calls, [])
270
271 # Ensure RepoRepository created and Sync'd as expected.
272 self.assertEqual(self.repo_mock.mock_calls, [
273 mock.call(
274 directory=self.repo_dir,
275 manifest_repo_url=self.INT_MANIFEST_URL,
276 branch='master',
277 git_cache_dir=self.git_cache,
278 ),
279 mock.call().PreLoad(self.preload_src),
280 mock.call().Sync(detach=True, local_manifest=None)
281 ])