OLD | NEW |
1 #!/usr/bin/python | 1 #!/usr/bin/python |
2 # Copyright (c) 2010 The Chromium OS Authors. All rights reserved. | 2 # Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
| 6 import copy |
6 import mox | 7 import mox |
7 import os | 8 import os |
8 import prebuilt | 9 import prebuilt |
9 import shutil | 10 import shutil |
10 import tempfile | 11 import tempfile |
11 import unittest | 12 import unittest |
12 from chromite.lib import cros_build_lib | 13 from chromite.lib import cros_build_lib |
| 14 from chromite.lib.binpkg import PackageIndex |
| 15 |
| 16 PUBLIC_PACKAGES = [{'CPV': 'public1', 'SHA1': '1'}, |
| 17 {'CPV': 'public2', 'SHA1': '2', 'PATH': 'foo.tgz'}] |
| 18 PRIVATE_PACKAGES = [{'CPV': 'private', 'SHA1': '3'}] |
| 19 |
| 20 |
| 21 def SimplePackageIndex(header=True, packages=True): |
| 22 pkgindex = PackageIndex() |
| 23 if header: |
| 24 pkgindex.header['URI'] = 'http://www.example.com' |
| 25 if packages: |
| 26 pkgindex.packages = copy.deepcopy(PUBLIC_PACKAGES + PRIVATE_PACKAGES) |
| 27 return pkgindex |
| 28 |
13 | 29 |
14 class TestUpdateFile(unittest.TestCase): | 30 class TestUpdateFile(unittest.TestCase): |
15 | 31 |
16 def setUp(self): | 32 def setUp(self): |
17 self.contents_str = ['# comment that should be skipped', | 33 self.contents_str = ['# comment that should be skipped', |
18 'PKGDIR="/var/lib/portage/pkgs"', | 34 'PKGDIR="/var/lib/portage/pkgs"', |
19 'PORTAGE_BINHOST="http://no.thanks.com"', | 35 'PORTAGE_BINHOST="http://no.thanks.com"', |
20 'portage portage-20100310.tar.bz2', | 36 'portage portage-20100310.tar.bz2', |
21 'COMPILE_FLAGS="some_value=some_other"', | 37 'COMPILE_FLAGS="some_value=some_other"', |
22 ] | 38 ] |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
130 self.assertEqual(self.expected_filters, prebuilt._FILTER_PACKAGES) | 146 self.assertEqual(self.expected_filters, prebuilt._FILTER_PACKAGES) |
131 | 147 |
132 def testEmptyFiltersErrors(self): | 148 def testEmptyFiltersErrors(self): |
133 """Ensure LoadPrivateFilters errors if an empty list is generated.""" | 149 """Ensure LoadPrivateFilters errors if an empty list is generated.""" |
134 os.makedirs(os.path.join(self.tmp_dir, prebuilt._PRIVATE_OVERLAY_DIR)) | 150 os.makedirs(os.path.join(self.tmp_dir, prebuilt._PRIVATE_OVERLAY_DIR)) |
135 self.assertRaises(prebuilt.FiltersEmpty, prebuilt.LoadPrivateFilters, | 151 self.assertRaises(prebuilt.FiltersEmpty, prebuilt.LoadPrivateFilters, |
136 self.tmp_dir) | 152 self.tmp_dir) |
137 | 153 |
138 | 154 |
139 class TestPrebuilt(unittest.TestCase): | 155 class TestPrebuilt(unittest.TestCase): |
140 fake_path = '/b/cbuild/build/chroot/build/x86-dogfood/' | |
141 bin_package_mock = ['packages/x11-misc/shared-mime-info-0.70.tbz2', | |
142 'packages/x11-misc/util-macros-1.5.0.tbz2', | |
143 'packages/x11-misc/xbitmaps-1.1.0.tbz2', | |
144 'packages/x11-misc/read-edid-1.4.2.tbz2', | |
145 'packages/x11-misc/xdg-utils-1.0.2-r3.tbz2'] | |
146 | |
147 files_to_sync = [os.path.join(fake_path, file) for file in bin_package_mock] | |
148 | 156 |
149 def setUp(self): | 157 def setUp(self): |
150 self.mox = mox.Mox() | 158 self.mox = mox.Mox() |
151 | 159 |
152 def tearDown(self): | 160 def tearDown(self): |
153 self.mox.UnsetStubs() | 161 self.mox.UnsetStubs() |
154 self.mox.VerifyAll() | 162 self.mox.VerifyAll() |
155 | 163 |
156 def _generate_dict_results(self, gs_bucket_path): | |
157 """ | |
158 Generate a dictionary result similar to GenerateUploadDict | |
159 """ | |
160 results = {} | |
161 for entry in self.files_to_sync: | |
162 results[entry] = os.path.join( | |
163 gs_bucket_path, entry.replace(self.fake_path, '').lstrip('/')) | |
164 return results | |
165 | |
166 def testGenerateUploadDict(self): | 164 def testGenerateUploadDict(self): |
| 165 base_local_path = '/b/cbuild/build/chroot/build/x86-dogfood/' |
167 gs_bucket_path = 'gs://chromeos-prebuilt/host/version' | 166 gs_bucket_path = 'gs://chromeos-prebuilt/host/version' |
168 self.mox.StubOutWithMock(cros_build_lib, 'ListFiles') | 167 local_path = os.path.join(base_local_path, 'public1.tbz2') |
169 cros_build_lib.ListFiles(self.fake_path).AndReturn(self.files_to_sync) | 168 self.mox.StubOutWithMock(prebuilt.os.path, 'exists') |
| 169 prebuilt.os.path.exists(local_path).AndReturn(True) |
170 self.mox.ReplayAll() | 170 self.mox.ReplayAll() |
171 result = prebuilt.GenerateUploadDict(self.fake_path, gs_bucket_path) | 171 pkgs = [{ 'CPV': 'public1' }] |
172 self.assertEqual(result, self._generate_dict_results(gs_bucket_path)) | 172 result = prebuilt.GenerateUploadDict(base_local_path, gs_bucket_path, pkgs) |
| 173 expected = { local_path: gs_bucket_path + '/public1.tbz2' } |
| 174 self.assertEqual(result, expected) |
173 | 175 |
174 def testFailonUploadFail(self): | 176 def testFailonUploadFail(self): |
175 """Make sure we fail if one of the upload processes fail.""" | 177 """Make sure we fail if one of the upload processes fail.""" |
176 files = {'test': '/uasd'} | 178 files = {'test': '/uasd'} |
177 self.assertEqual(prebuilt.RemoteUpload(files), set([('test', '/uasd')])) | 179 self.assertEqual(prebuilt.RemoteUpload(files), set([('test', '/uasd')])) |
178 | 180 |
179 def testDetermineMakeConf(self): | 181 def testDetermineMakeConf(self): |
180 """Test the different known variants of boards for proper path discovery.""" | 182 """Test the different known variants of boards for proper path discovery.""" |
181 targets = {'amd64': os.path.join(prebuilt._PREBUILT_MAKE_CONF['amd64']), | 183 targets = {'amd64': os.path.join(prebuilt._PREBUILT_MAKE_CONF['amd64']), |
182 'x86-generic': os.path.join(prebuilt._BINHOST_BASE_DIR, | 184 'x86-generic': os.path.join(prebuilt._BINHOST_BASE_DIR, |
183 'overlay-x86-generic', 'make.conf'), | 185 'overlay-x86-generic', 'make.conf'), |
184 'arm-tegra2_vogue': os.path.join( | 186 'arm-tegra2_vogue': os.path.join( |
185 prebuilt._BINHOST_BASE_DIR, | 187 prebuilt._BINHOST_BASE_DIR, |
186 'overlay-variant-arm-tegra2-vogue', 'make.conf'),} | 188 'overlay-variant-arm-tegra2-vogue', 'make.conf'),} |
187 for target in targets: | 189 for target in targets: |
188 self.assertEqual(prebuilt.DetermineMakeConfFile(target), targets[target]) | 190 self.assertEqual(prebuilt.DetermineMakeConfFile(target), targets[target]) |
189 | 191 |
190 def testDetermineMakeConfGarbage(self): | 192 def testDetermineMakeConfGarbage(self): |
191 """Ensure an exception is raised on bad input.""" | 193 """Ensure an exception is raised on bad input.""" |
192 self.assertRaises(prebuilt.UnknownBoardFormat, prebuilt.DetermineMakeConfFil
e, | 194 self.assertRaises(prebuilt.UnknownBoardFormat, prebuilt.DetermineMakeConfFil
e, |
193 'asdfasdf') | 195 'asdfasdf') |
194 | 196 |
195 | 197 |
196 class TestPackagesFileFiltering(unittest.TestCase): | 198 class TestPackagesFileFiltering(unittest.TestCase): |
197 | 199 |
| 200 def testFilterPkgIndex(self): |
| 201 pkgindex = SimplePackageIndex() |
| 202 pkgindex.RemoveFilteredPackages(lambda pkg: pkg in PRIVATE_PACKAGES) |
| 203 self.assertEqual(pkgindex.packages, PUBLIC_PACKAGES) |
| 204 self.assertEqual(pkgindex.modified, True) |
| 205 |
| 206 |
| 207 class TestPopulateDuplicateDB(unittest.TestCase): |
| 208 |
| 209 def testEmptyIndex(self): |
| 210 pkgindex = SimplePackageIndex(packages=False) |
| 211 db = {} |
| 212 pkgindex._PopulateDuplicateDB(db) |
| 213 self.assertEqual(db, {}) |
| 214 |
| 215 def testNormalIndex(self): |
| 216 pkgindex = SimplePackageIndex() |
| 217 db = {} |
| 218 pkgindex._PopulateDuplicateDB(db) |
| 219 self.assertEqual(len(db), 3) |
| 220 self.assertEqual(db['1'], 'http://www.example.com/public1.tbz2') |
| 221 self.assertEqual(db['2'], 'http://www.example.com/foo.tgz') |
| 222 self.assertEqual(db['3'], 'http://www.example.com/private.tbz2') |
| 223 |
| 224 def testFailedPopulate(self): |
| 225 db = {} |
| 226 pkgindex = SimplePackageIndex(header=False) |
| 227 self.assertRaises(KeyError, pkgindex._PopulateDuplicateDB, db) |
| 228 pkgindex = SimplePackageIndex() |
| 229 del pkgindex.packages[0]['CPV'] |
| 230 self.assertRaises(KeyError, pkgindex._PopulateDuplicateDB, db) |
| 231 pkgindex = SimplePackageIndex() |
| 232 del pkgindex.packages[0]['SHA1'] |
| 233 self.assertRaises(KeyError, pkgindex._PopulateDuplicateDB, db) |
| 234 |
| 235 |
| 236 class TestResolveDuplicateUploads(unittest.TestCase): |
| 237 |
| 238 def testEmptyList(self): |
| 239 pkgindex = SimplePackageIndex() |
| 240 pristine = SimplePackageIndex() |
| 241 uploads = pkgindex.ResolveDuplicateUploads([]) |
| 242 self.assertEqual(uploads, pristine.packages) |
| 243 self.assertEqual(pkgindex.packages, pristine.packages) |
| 244 self.assertEqual(pkgindex.modified, False) |
| 245 |
| 246 def testEmptyIndex(self): |
| 247 pkgindex = SimplePackageIndex() |
| 248 pristine = SimplePackageIndex() |
| 249 empty = SimplePackageIndex(packages=False) |
| 250 uploads = pkgindex.ResolveDuplicateUploads([empty]) |
| 251 self.assertEqual(uploads, pristine.packages) |
| 252 self.assertEqual(pkgindex.packages, pristine.packages) |
| 253 self.assertEqual(pkgindex.modified, False) |
| 254 |
| 255 def testDuplicates(self): |
| 256 pkgindex = SimplePackageIndex() |
| 257 dup_pkgindex = SimplePackageIndex() |
| 258 expected_pkgindex = SimplePackageIndex() |
| 259 for pkg in expected_pkgindex.packages: |
| 260 pkg.setdefault('PATH', pkg['CPV'] + '.tbz2') |
| 261 uploads = pkgindex.ResolveDuplicateUploads([dup_pkgindex]) |
| 262 self.assertEqual(pkgindex.packages, expected_pkgindex.packages) |
| 263 |
| 264 |
| 265 class TestWritePackageIndex(unittest.TestCase): |
| 266 |
198 def setUp(self): | 267 def setUp(self): |
199 self.mox = mox.Mox() | 268 self.mox = mox.Mox() |
200 | 269 |
201 def tearDown(self): | 270 def tearDown(self): |
202 self.mox.UnsetStubs() | 271 self.mox.UnsetStubs() |
203 self.mox.VerifyAll() | 272 self.mox.VerifyAll() |
204 | 273 |
205 def testFilterAllPackages(self): | 274 def testSimple(self): |
206 self.mox.StubOutWithMock(prebuilt, 'ShouldFilterPackage') | 275 pkgindex = SimplePackageIndex() |
207 prebuilt.ShouldFilterPackage("public1").AndReturn(False) | 276 self.mox.StubOutWithMock(pkgindex, 'Write') |
208 prebuilt.ShouldFilterPackage("private").AndReturn(True) | 277 pkgindex.Write(mox.IgnoreArg()) |
209 prebuilt.ShouldFilterPackage("public2").AndReturn(False) | |
210 full_packages_file = [ | |
211 "foo: bar\n", "\n", | |
212 "CPV: public1\n", "foo: bar1\n", "\n", | |
213 "CPV: private\n", "foo: bar2\n", "\n", | |
214 "CPV: public2\n", "foo: bar3\n", "\n", | |
215 ] | |
216 private_packages_file = [ | |
217 "foo: bar\n", "\n", | |
218 "CPV: public1\n", "foo: bar1\n", "\n", | |
219 "CPV: public2\n", "foo: bar3\n", "\n", | |
220 ] | |
221 self.mox.ReplayAll() | 278 self.mox.ReplayAll() |
222 temp_packages_file = tempfile.NamedTemporaryFile() | 279 f = pkgindex.WriteToNamedTemporaryFile() |
223 temp_packages_file.write("".join(full_packages_file)) | 280 self.assertEqual(f.read(), '') |
224 temp_packages_file.flush() | |
225 new_packages_file = prebuilt.FilterPackagesFile(temp_packages_file.name) | |
226 new_contents = open(new_packages_file.name).read() | |
227 self.assertEqual("".join(private_packages_file), new_contents) | |
228 self.assertEqual("".join(private_packages_file), new_packages_file.read()) | |
229 new_packages_file.close() | |
230 | 281 |
231 | 282 |
232 if __name__ == '__main__': | 283 if __name__ == '__main__': |
233 unittest.main() | 284 unittest.main() |
OLD | NEW |