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 271 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.assertEqual(False, self.delegate.called_gsutil_cp) | |
Sam Clegg
2012/11/29 19:39:10
assertFalse() here and below?
binji
2012/11/30 18:55:00
Done.
| |
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.assertEqual(False, 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.assertEqual(False, 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 |