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, |
(...skipping 12 matching lines...) Expand all Loading... |
195 | 197 |
196 class TestPackagesFileFiltering(unittest.TestCase): | 198 class TestPackagesFileFiltering(unittest.TestCase): |
197 | 199 |
198 def setUp(self): | 200 def setUp(self): |
199 self.mox = mox.Mox() | 201 self.mox = mox.Mox() |
200 | 202 |
201 def tearDown(self): | 203 def tearDown(self): |
202 self.mox.UnsetStubs() | 204 self.mox.UnsetStubs() |
203 self.mox.VerifyAll() | 205 self.mox.VerifyAll() |
204 | 206 |
205 def testFilterAllPackages(self): | 207 def testFilterPkgIndex(self): |
206 self.mox.StubOutWithMock(prebuilt, 'ShouldFilterPackage') | 208 self.mox.StubOutWithMock(prebuilt, 'ShouldFilterPackage') |
207 prebuilt.ShouldFilterPackage("public1").AndReturn(False) | 209 prebuilt.ShouldFilterPackage('public1').AndReturn(False) |
208 prebuilt.ShouldFilterPackage("private").AndReturn(True) | 210 prebuilt.ShouldFilterPackage('public2').AndReturn(False) |
209 prebuilt.ShouldFilterPackage("public2").AndReturn(False) | 211 prebuilt.ShouldFilterPackage('private').AndReturn(True) |
210 full_packages_file = [ | 212 pkgindex = SimplePackageIndex() |
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() | 213 self.mox.ReplayAll() |
222 temp_packages_file = tempfile.NamedTemporaryFile() | 214 prebuilt.FilterPackagesIndex(pkgindex) |
223 temp_packages_file.write("".join(full_packages_file)) | 215 self.assertEqual(pkgindex.packages, PUBLIC_PACKAGES) |
224 temp_packages_file.flush() | 216 self.assertEqual(pkgindex.modified, True) |
225 new_packages_file = prebuilt.FilterPackagesFile(temp_packages_file.name) | 217 |
226 new_contents = open(new_packages_file.name).read() | 218 |
227 self.assertEqual("".join(private_packages_file), new_contents) | 219 class TestGrabPackageURLs(unittest.TestCase): |
228 self.assertEqual("".join(private_packages_file), new_packages_file.read()) | 220 |
229 new_packages_file.close() | 221 def testEmptyIndex(self): |
| 222 pkgindex = SimplePackageIndex(packages=False) |
| 223 db = prebuilt.GrabPackageURLs(pkgindex) |
| 224 self.assertEqual(db, {}) |
| 225 |
| 226 def testNormalIndex(self): |
| 227 pkgindex = SimplePackageIndex() |
| 228 db = prebuilt.GrabPackageURLs(pkgindex) |
| 229 self.assertEqual(len(db), 3) |
| 230 self.assertEqual(db['1'], 'http://www.example.com/public1.tbz2') |
| 231 self.assertEqual(db['2'], 'http://www.example.com/foo.tgz') |
| 232 self.assertEqual(db['3'], 'http://www.example.com/private.tbz2') |
| 233 |
| 234 def testFailedGrabPackageURLs(self): |
| 235 pkgindex = SimplePackageIndex(header=False) |
| 236 self.assertRaises(KeyError, prebuilt.GrabPackageURLs, pkgindex) |
| 237 pkgindex = SimplePackageIndex() |
| 238 del pkgindex.packages[0]['CPV'] |
| 239 self.assertRaises(KeyError, prebuilt.GrabPackageURLs, pkgindex) |
| 240 pkgindex = SimplePackageIndex() |
| 241 del pkgindex.packages[0]['SHA1'] |
| 242 self.assertRaises(KeyError, prebuilt.GrabPackageURLs, pkgindex) |
| 243 |
| 244 |
| 245 class TestFindDuplicates(unittest.TestCase): |
| 246 |
| 247 def testEmptyIndex(self): |
| 248 pkgindex = SimplePackageIndex(packages=False) |
| 249 dupdb = {} |
| 250 orig, dups = prebuilt.FindDuplicates(pkgindex, dupdb) |
| 251 self.assertEqual(orig, []) |
| 252 self.assertEqual(dups, []) |
| 253 |
| 254 def testNormalIndex(self): |
| 255 pkgindex = SimplePackageIndex() |
| 256 dupdb = {} |
| 257 orig, dups = prebuilt.FindDuplicates(pkgindex, dupdb) |
| 258 self.assertEqual(orig, pkgindex.packages) |
| 259 self.assertEqual(dups, []) |
| 260 |
| 261 def testDuplicateIndex(self): |
| 262 pkgindex = SimplePackageIndex() |
| 263 dupdb = prebuilt.GrabPackageURLs(pkgindex) |
| 264 orig, dups = prebuilt.FindDuplicates(pkgindex, dupdb) |
| 265 self.assertEqual(orig, []) |
| 266 expected = [(pkg, dupdb[pkg['SHA1']]) for pkg in pkgindex.packages] |
| 267 self.assertEqual(dups, expected) |
| 268 |
| 269 def testPartialIndex(self): |
| 270 pkgindex = SimplePackageIndex() |
| 271 dupdb = prebuilt.GrabPackageURLs(pkgindex) |
| 272 del dupdb['3'] |
| 273 orig, dups = prebuilt.FindDuplicates(pkgindex, dupdb) |
| 274 self.assertEqual(orig, [pkgindex.packages[2]]) |
| 275 expected = [(pkg, dupdb[pkg['SHA1']]) for pkg in pkgindex.packages[:-1]] |
| 276 self.assertEqual(dups, expected) |
| 277 |
| 278 |
| 279 class TestResolveDuplicates(unittest.TestCase): |
| 280 |
| 281 def testNoDuplicates(self): |
| 282 pkgindex = SimplePackageIndex() |
| 283 prebuilt.ResolveDuplicates(pkgindex, []) |
| 284 self.assertEqual(pkgindex.modified, False) |
| 285 self.assertEqual(pkgindex.packages, SimplePackageIndex().packages) |
| 286 |
| 287 def testDuplicates(self): |
| 288 pkgindex = SimplePackageIndex() |
| 289 dupdb = prebuilt.GrabPackageURLs(pkgindex) |
| 290 _, dups = prebuilt.FindDuplicates(pkgindex, dupdb) |
| 291 expected = copy.deepcopy(pkgindex.packages) |
| 292 for pkg in expected: |
| 293 pkg['PATH'] = os.path.basename(dupdb[pkg['SHA1']]) |
| 294 prebuilt.ResolveDuplicates(pkgindex, dups) |
| 295 self.assertEqual(pkgindex.packages, expected) |
| 296 |
| 297 |
| 298 class TestWritePackageIndex(unittest.TestCase): |
| 299 |
| 300 def setUp(self): |
| 301 self.mox = mox.Mox() |
| 302 |
| 303 def tearDown(self): |
| 304 self.mox.UnsetStubs() |
| 305 self.mox.VerifyAll() |
| 306 |
| 307 def testSimple(self): |
| 308 pkgindex = SimplePackageIndex() |
| 309 self.mox.StubOutWithMock(pkgindex, 'Write') |
| 310 pkgindex.Write(mox.IgnoreArg()) |
| 311 self.mox.ReplayAll() |
| 312 f = prebuilt.WritePackageIndex(pkgindex) |
| 313 self.assertEqual(f.read(), '') |
230 | 314 |
231 | 315 |
232 if __name__ == '__main__': | 316 if __name__ == '__main__': |
233 unittest.main() | 317 unittest.main() |
OLD | NEW |