| OLD | NEW |
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2012 The Chromium 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 copy |
| 7 import datetime | 7 import datetime |
| 8 import hashlib | 8 import hashlib |
| 9 import os | 9 import os |
| 10 import posixpath | 10 import posixpath |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 129 | 129 |
| 130 def Add(self, host_oses, channel, version): | 130 def Add(self, host_oses, channel, version): |
| 131 for host_os in host_oses: | 131 for host_os in host_oses: |
| 132 timestamp = self.datetime.strftime('%Y-%m-%d %H:%M:%S.%f') | 132 timestamp = self.datetime.strftime('%Y-%m-%d %H:%M:%S.%f') |
| 133 self.history.append((host_os, channel, version, timestamp)) | 133 self.history.append((host_os, channel, version, timestamp)) |
| 134 self.datetime += datetime.timedelta(0, -3600) # one hour earlier | 134 self.datetime += datetime.timedelta(0, -3600) # one hour earlier |
| 135 self.datetime += datetime.timedelta(-1) # one day earlier | 135 self.datetime += datetime.timedelta(-1) # one day earlier |
| 136 | 136 |
| 137 | 137 |
| 138 class MakeFiles(dict): | 138 class MakeFiles(dict): |
| 139 def AddOnlineManifest(self, manifest_string): |
| 140 self['naclsdk_manifest2.json'] = manifest_string |
| 141 |
| 139 def Add(self, bundle, add_archive_for_os=OS_MLW, add_json_for_os=OS_MLW): | 142 def Add(self, bundle, add_archive_for_os=OS_MLW, add_json_for_os=OS_MLW): |
| 140 for archive in bundle.GetArchives(): | 143 for archive in bundle.GetArchives(): |
| 141 if not archive.host_os in add_archive_for_os: | 144 if not archive.host_os in add_archive_for_os: |
| 142 continue | 145 continue |
| 143 | 146 |
| 144 # add a dummy file for each archive | 147 # add a dummy file for each archive |
| 145 path = GetPathFromHttpsUrl(archive.url) | 148 path = GetPathFromHttpsUrl(archive.url) |
| 146 self[path] = 'My Dummy Archive' | 149 self[path] = 'My Dummy Archive' |
| 147 | 150 |
| 148 if archive.host_os in add_json_for_os: | 151 if archive.host_os in add_json_for_os: |
| 149 # add .json manifest snippet, it should look like a normal Bundle, but | 152 # add .json manifest snippet, it should look like a normal Bundle, but |
| 150 # only has one archive. | 153 # only has one archive. |
| 151 new_bundle = manifest_util.Bundle('') | 154 new_bundle = manifest_util.Bundle('') |
| 152 new_bundle.CopyFrom(bundle) | 155 new_bundle.CopyFrom(bundle) |
| 153 del new_bundle.archives[:] | 156 del new_bundle.archives[:] |
| 154 new_bundle.AddArchive(archive) | 157 new_bundle.AddArchive(archive) |
| 155 self[path + '.json'] = new_bundle.GetDataAsString() | 158 self[path + '.json'] = new_bundle.GetDataAsString() |
| 156 | 159 |
| 157 | 160 |
| 158 class TestDelegate(update_nacl_manifest.Delegate): | 161 class TestDelegate(update_nacl_manifest.Delegate): |
| 159 def __init__(self, manifest, history, files, version_mapping): | 162 def __init__(self, manifest, history, files, version_mapping): |
| 160 self.manifest = manifest | 163 self.manifest = manifest |
| 161 self.history = history | 164 self.history = history |
| 162 self.files = files | 165 self.files = files |
| 163 self.version_mapping = version_mapping | 166 self.version_mapping = version_mapping |
| 164 self.dryrun = 0 | 167 self.dryrun = 0 |
| 168 self.called_gsutil_cp = False |
| 165 | 169 |
| 166 def GetRepoManifest(self): | 170 def GetRepoManifest(self): |
| 167 return self.manifest | 171 return self.manifest |
| 168 | 172 |
| 169 def GetHistory(self): | 173 def GetHistory(self): |
| 170 return self.history | 174 return self.history |
| 171 | 175 |
| 172 def GetTrunkRevision(self, version): | 176 def GetTrunkRevision(self, version): |
| 173 return self.version_mapping[version] | 177 return self.version_mapping[version] |
| 174 | 178 |
| 175 def GsUtil_ls(self, url): | 179 def GsUtil_ls(self, url): |
| 176 path = GetPathFromGsUrl(url) | 180 path = GetPathFromGsUrl(url) |
| 177 result = [] | 181 result = [] |
| 178 for filename, _ in self.files.iteritems(): | 182 for filename, _ in self.files.iteritems(): |
| 179 if filename.startswith(path): | 183 if filename.startswith(path): |
| 180 result.append(MakeGsUrl(filename)) | 184 result.append(MakeGsUrl(filename)) |
| 181 return result | 185 return result |
| 182 | 186 |
| 183 def GsUtil_cat(self, url): | 187 def GsUtil_cat(self, url): |
| 184 path = GetPathFromGsUrl(url) | 188 path = GetPathFromGsUrl(url) |
| 185 if path not in self.files: | 189 if path not in self.files: |
| 186 raise subprocess.CalledProcessError(1, 'gsutil cat %s' % (url,)) | 190 raise subprocess.CalledProcessError(1, 'gsutil cat %s' % (url,)) |
| 187 return self.files[path] | 191 return self.files[path] |
| 188 | 192 |
| 189 def GsUtil_cp(self, src, dest, stdin=None): | 193 def GsUtil_cp(self, src, dest, stdin=None): |
| 194 self.called_gsutil_cp = True |
| 190 dest_path = GetPathFromGsUrl(dest) | 195 dest_path = GetPathFromGsUrl(dest) |
| 191 if src == '-': | 196 if src == '-': |
| 192 self.files[dest_path] = stdin | 197 self.files[dest_path] = stdin |
| 193 else: | 198 else: |
| 194 src_path = GetPathFromGsUrl(src) | 199 src_path = GetPathFromGsUrl(src) |
| 195 if src_path not in self.files: | 200 if src_path not in self.files: |
| 196 raise subprocess.CalledProcessError(1, 'gsutil cp %s %s' % (src, dest)) | 201 raise subprocess.CalledProcessError(1, 'gsutil cp %s %s' % (src, dest)) |
| 197 self.files[dest_path] = self.files[src_path] | 202 self.files[dest_path] = self.files[src_path] |
| 198 | 203 |
| 199 def Print(self, *args): | 204 def Print(self, *args): |
| (...skipping 30 matching lines...) Expand all Loading... |
| 230 self.files = MakeFiles() | 235 self.files = MakeFiles() |
| 231 self.version_mapping = {} | 236 self.version_mapping = {} |
| 232 self.delegate = None | 237 self.delegate = None |
| 233 self.uploaded_manifest = None | 238 self.uploaded_manifest = None |
| 234 self.manifest = None | 239 self.manifest = None |
| 235 | 240 |
| 236 def _MakeDelegate(self): | 241 def _MakeDelegate(self): |
| 237 self.delegate = TestDelegate(self.manifest, self.history.history, | 242 self.delegate = TestDelegate(self.manifest, self.history.history, |
| 238 self.files, self.version_mapping) | 243 self.files, self.version_mapping) |
| 239 | 244 |
| 240 def _Run(self, host_oses): | 245 def _Run(self, host_oses, fixed_bundle_versions=None): |
| 241 update_nacl_manifest.Run(self.delegate, host_oses) | 246 update_nacl_manifest.Run(self.delegate, host_oses, fixed_bundle_versions) |
| 242 | 247 |
| 243 def _HasUploadedManifest(self): | 248 def _HasUploadedManifest(self): |
| 244 return 'naclsdk_manifest2.json' in self.files | 249 return 'naclsdk_manifest2.json' in self.files |
| 245 | 250 |
| 246 def _ReadUploadedManifest(self): | 251 def _ReadUploadedManifest(self): |
| 247 self.uploaded_manifest = manifest_util.SDKManifest() | 252 self.uploaded_manifest = manifest_util.SDKManifest() |
| 248 self.uploaded_manifest.LoadDataFromString( | 253 self.uploaded_manifest.LoadDataFromString( |
| 249 self.files['naclsdk_manifest2.json']) | 254 self.files['naclsdk_manifest2.json']) |
| 250 | 255 |
| 251 def _AssertUploadedManifestHasBundle(self, bundle, stability): | 256 def _AssertUploadedManifestHasBundle(self, bundle, stability): |
| (...skipping 16 matching lines...) Expand all Loading... |
| 268 import csv | 273 import csv |
| 269 import cStringIO | 274 import cStringIO |
| 270 history_stream = cStringIO.StringIO(history) | 275 history_stream = cStringIO.StringIO(history) |
| 271 self.history.history = [(platform, channel, version, date) | 276 self.history.history = [(platform, channel, version, date) |
| 272 for platform, channel, version, date in csv.reader(history_stream)] | 277 for platform, channel, version, date in csv.reader(history_stream)] |
| 273 | 278 |
| 274 def testNoUpdateNeeded(self): | 279 def testNoUpdateNeeded(self): |
| 275 self.manifest = MakeManifest(B18_0_1025_163_R1_MLW) | 280 self.manifest = MakeManifest(B18_0_1025_163_R1_MLW) |
| 276 self._MakeDelegate() | 281 self._MakeDelegate() |
| 277 self._Run(OS_MLW) | 282 self._Run(OS_MLW) |
| 278 self.assertEqual(self._HasUploadedManifest(), False) | 283 self.assertFalse(self._HasUploadedManifest()) |
| 279 | 284 |
| 280 # Add another bundle, make sure it still doesn't update | 285 # Add another bundle, make sure it still doesn't update |
| 281 self.manifest.AddBundle(B19_0_1084_41_R1_MLW) | 286 self.manifest.AddBundle(B19_0_1084_41_R1_MLW) |
| 282 self._Run(OS_MLW) | 287 self._Run(OS_MLW) |
| 283 self.assertEqual(self._HasUploadedManifest(), False) | 288 self.assertFalse(self._HasUploadedManifest()) |
| 284 | 289 |
| 285 def testSimpleUpdate(self): | 290 def testSimpleUpdate(self): |
| 286 self.manifest = MakeManifest(B18_R1_NONE) | 291 self.manifest = MakeManifest(B18_R1_NONE) |
| 287 self.history.Add(OS_MLW, BETA, V18_0_1025_163) | 292 self.history.Add(OS_MLW, BETA, V18_0_1025_163) |
| 288 self.files.Add(B18_0_1025_163_R1_MLW) | 293 self.files.Add(B18_0_1025_163_R1_MLW) |
| 289 self._MakeDelegate() | 294 self._MakeDelegate() |
| 290 self._Run(OS_MLW) | 295 self._Run(OS_MLW) |
| 291 self._ReadUploadedManifest() | 296 self._ReadUploadedManifest() |
| 292 self._AssertUploadedManifestHasBundle(B18_0_1025_163_R1_MLW, BETA) | 297 self._AssertUploadedManifestHasBundle(B18_0_1025_163_R1_MLW, BETA) |
| 293 self.assertEqual(len(self.uploaded_manifest.GetBundles()), 1) | 298 self.assertEqual(len(self.uploaded_manifest.GetBundles()), 1) |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 378 if channel == STABLE: | 383 if channel == STABLE: |
| 379 self.assertEqual(uploaded_bundle.recommended, 'yes') | 384 self.assertEqual(uploaded_bundle.recommended, 'yes') |
| 380 else: | 385 else: |
| 381 self.assertEqual(uploaded_bundle.recommended, 'no') | 386 self.assertEqual(uploaded_bundle.recommended, 'no') |
| 382 | 387 |
| 383 def testNoUpdateWithNonPepperBundle(self): | 388 def testNoUpdateWithNonPepperBundle(self): |
| 384 self.manifest = MakeManifest(NON_PEPPER_BUNDLE_NOARCHIVES, | 389 self.manifest = MakeManifest(NON_PEPPER_BUNDLE_NOARCHIVES, |
| 385 B18_0_1025_163_R1_MLW) | 390 B18_0_1025_163_R1_MLW) |
| 386 self._MakeDelegate() | 391 self._MakeDelegate() |
| 387 self._Run(OS_MLW) | 392 self._Run(OS_MLW) |
| 388 self.assertEqual(self._HasUploadedManifest(), False) | 393 self.assertFalse(self._HasUploadedManifest()) |
| 389 | 394 |
| 390 def testUpdateWithHistoryWithExtraneousPlatforms(self): | 395 def testUpdateWithHistoryWithExtraneousPlatforms(self): |
| 391 self.manifest = MakeManifest(B18_R1_NONE) | 396 self.manifest = MakeManifest(B18_R1_NONE) |
| 392 self.history.Add(OS_ML, BETA, V18_0_1025_184) | 397 self.history.Add(OS_ML, BETA, V18_0_1025_184) |
| 393 self.history.Add(OS_CR, BETA, V18_0_1025_184) | 398 self.history.Add(OS_CR, BETA, V18_0_1025_184) |
| 394 self.history.Add(OS_CR, BETA, V18_0_1025_175) | 399 self.history.Add(OS_CR, BETA, V18_0_1025_175) |
| 395 self.history.Add(OS_MLW, BETA, V18_0_1025_163) | 400 self.history.Add(OS_MLW, BETA, V18_0_1025_163) |
| 396 self.files.Add(B18_0_1025_163_R1_MLW) | 401 self.files.Add(B18_0_1025_163_R1_MLW) |
| 397 self._MakeDelegate() | 402 self._MakeDelegate() |
| 398 self._Run(OS_MLW) | 403 self._Run(OS_MLW) |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 523 self.files.Add(B18_0_1025_163_R1_MLW) | 528 self.files.Add(B18_0_1025_163_R1_MLW) |
| 524 self.files.Add(B19_0_1084_41_R1_MLW) | 529 self.files.Add(B19_0_1084_41_R1_MLW) |
| 525 self._MakeDelegate() | 530 self._MakeDelegate() |
| 526 self._Run(OS_MLW) | 531 self._Run(OS_MLW) |
| 527 self._ReadUploadedManifest() | 532 self._ReadUploadedManifest() |
| 528 p18_bundle = self.uploaded_manifest.GetBundle(B18_R1_NONE.name) | 533 p18_bundle = self.uploaded_manifest.GetBundle(B18_R1_NONE.name) |
| 529 self.assertEqual(p18_bundle.stability, POST_STABLE) | 534 self.assertEqual(p18_bundle.stability, POST_STABLE) |
| 530 p19_bundle = self.uploaded_manifest.GetBundle(B19_R1_NONE.name) | 535 p19_bundle = self.uploaded_manifest.GetBundle(B19_R1_NONE.name) |
| 531 self.assertEqual(p19_bundle.stability, STABLE) | 536 self.assertEqual(p19_bundle.stability, STABLE) |
| 532 | 537 |
| 538 def testDontPushIfNoChange(self): |
| 539 # Make an online manifest that already has this bundle. |
| 540 online_manifest = MakeManifest(B18_0_1025_163_R1_MLW) |
| 541 self.files.AddOnlineManifest(online_manifest.GetDataAsString()) |
| 542 |
| 543 self.manifest = MakeManifest(B18_R1_NONE) |
| 544 self.history.Add(OS_MLW, DEV, V18_0_1025_163) |
| 545 self.files.Add(B18_0_1025_163_R1_MLW) |
| 546 |
| 547 self._MakeDelegate() |
| 548 self._Run(OS_MLW) |
| 549 self.assertFalse(self.delegate.called_gsutil_cp) |
| 550 |
| 551 def testDontPushIfRollback(self): |
| 552 # Make an online manifest that has a newer bundle |
| 553 online_manifest = MakeManifest(B18_0_1025_184_R1_MLW) |
| 554 self.files.AddOnlineManifest(online_manifest.GetDataAsString()) |
| 555 |
| 556 self.manifest = MakeManifest(B18_R1_NONE) |
| 557 self.history.Add(OS_MLW, DEV, V18_0_1025_163) |
| 558 self.files.Add(B18_0_1025_163_R1_MLW) |
| 559 |
| 560 self._MakeDelegate() |
| 561 self._Run(OS_MLW) |
| 562 self.assertFalse(self.delegate.called_gsutil_cp) |
| 563 |
| 564 def testRunWithFixedBundleVersions(self): |
| 565 self.manifest = MakeManifest(B18_R1_NONE) |
| 566 self.history.Add(OS_MLW, BETA, V18_0_1025_163) |
| 567 self.files.Add(B18_0_1025_163_R1_MLW) |
| 568 self.files.Add(B18_0_1025_184_R1_MLW) |
| 569 |
| 570 self._MakeDelegate() |
| 571 self._Run(OS_MLW, [('pepper_18', '18.0.1025.184')]) |
| 572 self._ReadUploadedManifest() |
| 573 self._AssertUploadedManifestHasBundle(B18_0_1025_184_R1_MLW, BETA) |
| 574 self.assertEqual(len(self.uploaded_manifest.GetBundles()), 1) |
| 575 |
| 576 def testRunWithMissingFixedBundleVersions(self): |
| 577 self.manifest = MakeManifest(B18_R1_NONE) |
| 578 self.history.Add(OS_MLW, BETA, V18_0_1025_163) |
| 579 self.files.Add(B18_0_1025_163_R1_MLW) |
| 580 |
| 581 self._MakeDelegate() |
| 582 self._Run(OS_MLW, [('pepper_18', '18.0.1025.184')]) |
| 583 # Nothing should be uploaded if the user gives a missing fixed version. |
| 584 self.assertFalse(self.delegate.called_gsutil_cp) |
| 585 |
| 533 | 586 |
| 534 class TestUpdateVitals(unittest.TestCase): | 587 class TestUpdateVitals(unittest.TestCase): |
| 535 def setUp(self): | 588 def setUp(self): |
| 536 f = tempfile.NamedTemporaryFile('w', prefix="test_update_nacl_manifest") | 589 f = tempfile.NamedTemporaryFile('w', prefix="test_update_nacl_manifest") |
| 537 self.test_file = f.name | 590 self.test_file = f.name |
| 538 f.close() | 591 f.close() |
| 539 test_data = "Some test data" | 592 test_data = "Some test data" |
| 540 self.sha1 = hashlib.sha1(test_data).hexdigest() | 593 self.sha1 = hashlib.sha1(test_data).hexdigest() |
| 541 self.data_len = len(test_data) | 594 self.data_len = len(test_data) |
| 542 with open(self.test_file, 'w') as f: | 595 with open(self.test_file, 'w') as f: |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 579 '23.0.1271.89': '167132', | 632 '23.0.1271.89': '167132', |
| 580 '24.0.1305.4': '164971', | 633 '24.0.1305.4': '164971', |
| 581 } | 634 } |
| 582 for version, revision in revision_dict.iteritems(): | 635 for version, revision in revision_dict.iteritems(): |
| 583 self.assertEqual('trunk.%s' % revision, | 636 self.assertEqual('trunk.%s' % revision, |
| 584 self.delegate.GetTrunkRevision(version)) | 637 self.delegate.GetTrunkRevision(version)) |
| 585 | 638 |
| 586 | 639 |
| 587 if __name__ == '__main__': | 640 if __name__ == '__main__': |
| 588 sys.exit(unittest.main()) | 641 sys.exit(unittest.main()) |
| OLD | NEW |