| OLD | NEW |
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 | 2 |
| 3 # Copyright (c) 2012 Google Inc. All rights reserved. | 3 # Copyright (c) 2012 Google Inc. All rights reserved. |
| 4 # Use of this source code is governed by a BSD-style license that can be | 4 # Use of this source code is governed by a BSD-style license that can be |
| 5 # found in the LICENSE file. | 5 # found in the LICENSE file. |
| 6 | 6 |
| 7 """ | 7 """ |
| 8 Verifies that device and simulator bundles are built correctly. | 8 Verifies that device and simulator bundles are built correctly. |
| 9 """ | 9 """ |
| 10 | 10 |
| 11 from __future__ import print_function |
| 12 |
| 11 import plistlib | 13 import plistlib |
| 12 import TestGyp | 14 import TestGyp |
| 13 import os | 15 import os |
| 14 import struct | 16 import struct |
| 15 import subprocess | 17 import subprocess |
| 16 import sys | 18 import sys |
| 17 import tempfile | 19 import tempfile |
| 18 import TestMac | 20 import TestMac |
| 19 | 21 |
| 20 def CheckFileType(file, expected): | 22 def CheckFileType(file, expected): |
| 21 proc = subprocess.Popen(['lipo', '-info', file], stdout=subprocess.PIPE) | 23 proc = subprocess.Popen(['lipo', '-info', file], stdout=subprocess.PIPE) |
| 22 o = proc.communicate()[0].strip() | 24 o = proc.communicate()[0].strip() |
| 23 assert not proc.returncode | 25 assert not proc.returncode |
| 24 if not expected in o: | 26 if not expected in o: |
| 25 print 'File: Expected %s, got %s' % (expected, o) | 27 print('File: Expected %s, got %s' % (expected, o)) |
| 26 test.fail_test() | 28 test.fail_test() |
| 27 | 29 |
| 28 def HasCerts(): | 30 def HasCerts(): |
| 29 # Because the bots do not have certs, don't check them if there are no | 31 # Because the bots do not have certs, don't check them if there are no |
| 30 # certs available. | 32 # certs available. |
| 31 proc = subprocess.Popen(['security','find-identity','-p', 'codesigning', | 33 proc = subprocess.Popen(['security','find-identity','-p', 'codesigning', |
| 32 '-v'], stdout=subprocess.PIPE) | 34 '-v'], stdout=subprocess.PIPE) |
| 33 return "0 valid identities found" not in proc.communicate()[0].strip() | 35 return "0 valid identities found" not in proc.communicate()[0].strip() |
| 34 | 36 |
| 35 def CheckSignature(file): | 37 def CheckSignature(file): |
| 36 proc = subprocess.Popen(['codesign', '-v', file], stdout=subprocess.PIPE) | 38 proc = subprocess.Popen(['codesign', '-v', file], stdout=subprocess.PIPE) |
| 37 o = proc.communicate()[0].strip() | 39 o = proc.communicate()[0].strip() |
| 38 assert not proc.returncode | 40 assert not proc.returncode |
| 39 if "code object is not signed at all" in o: | 41 if "code object is not signed at all" in o: |
| 40 print 'File %s not properly signed.' % (file) | 42 print('File %s not properly signed.' % (file)) |
| 41 test.fail_test() | 43 test.fail_test() |
| 42 | 44 |
| 43 def CheckEntitlements(file, expected_entitlements): | 45 def CheckEntitlements(file, expected_entitlements): |
| 44 with tempfile.NamedTemporaryFile() as temp: | 46 with tempfile.NamedTemporaryFile() as temp: |
| 45 proc = subprocess.Popen(['codesign', '--display', '--entitlements', | 47 proc = subprocess.Popen(['codesign', '--display', '--entitlements', |
| 46 temp.name, file], stdout=subprocess.PIPE) | 48 temp.name, file], stdout=subprocess.PIPE) |
| 47 o = proc.communicate()[0].strip() | 49 o = proc.communicate()[0].strip() |
| 48 assert not proc.returncode | 50 assert not proc.returncode |
| 49 data = temp.read() | 51 data = temp.read() |
| 50 entitlements = ParseEntitlements(data) | 52 entitlements = ParseEntitlements(data) |
| 51 if not entitlements: | 53 if not entitlements: |
| 52 print 'No valid entitlements found in %s.' % (file) | 54 print('No valid entitlements found in %s.' % (file)) |
| 53 test.fail_test() | 55 test.fail_test() |
| 54 if entitlements != expected_entitlements: | 56 if entitlements != expected_entitlements: |
| 55 print 'Unexpected entitlements found in %s.' % (file) | 57 print('Unexpected entitlements found in %s.' % (file)) |
| 56 test.fail_test() | 58 test.fail_test() |
| 57 | 59 |
| 58 def ParseEntitlements(data): | 60 def ParseEntitlements(data): |
| 59 if len(data) < 8: | 61 if len(data) < 8: |
| 60 return None | 62 return None |
| 61 magic, length = struct.unpack('>II', data[:8]) | 63 magic, length = struct.unpack('>II', data[:8]) |
| 62 if magic != 0xfade7171 or length != len(data): | 64 if magic != 0xfade7171 or length != len(data): |
| 63 return None | 65 return None |
| 64 return data[8:] | 66 return data[8:] |
| 65 | 67 |
| 66 def GetXcodeVersionValue(type): | 68 def GetXcodeVersionValue(type): |
| 67 args = ['xcodebuild', '-version', '-sdk', 'iphoneos', type] | 69 args = ['xcodebuild', '-version', '-sdk', 'iphoneos', type] |
| 68 job = subprocess.Popen(args, stdout=subprocess.PIPE) | 70 job = subprocess.Popen(args, stdout=subprocess.PIPE) |
| 69 return job.communicate()[0].strip() | 71 return job.communicate()[0].strip() |
| 70 | 72 |
| 71 def GetMachineBuild(): | 73 def GetMachineBuild(): |
| 72 args = ['sw_vers', '-buildVersion'] | 74 args = ['sw_vers', '-buildVersion'] |
| 73 job = subprocess.Popen(args, stdout=subprocess.PIPE) | 75 job = subprocess.Popen(args, stdout=subprocess.PIPE) |
| 74 return job.communicate()[0].strip() | 76 return job.communicate()[0].strip() |
| 75 | 77 |
| 76 def CheckPlistvalue(plist, key, expected): | 78 def CheckPlistvalue(plist, key, expected): |
| 77 if key not in plist: | 79 if key not in plist: |
| 78 print '%s not set in plist' % key | 80 print('%s not set in plist' % key) |
| 79 test.fail_test() | 81 test.fail_test() |
| 80 return | 82 return |
| 81 actual = plist[key] | 83 actual = plist[key] |
| 82 if actual != expected: | 84 if actual != expected: |
| 83 print 'File: Expected %s, got %s for %s' % (expected, actual, key) | 85 print('File: Expected %s, got %s for %s' % (expected, actual, key)) |
| 84 test.fail_test() | 86 test.fail_test() |
| 85 | 87 |
| 86 def CheckPlistNotSet(plist, key): | 88 def CheckPlistNotSet(plist, key): |
| 87 if key in plist: | 89 if key in plist: |
| 88 print '%s should not be set in plist' % key | 90 print('%s should not be set in plist' % key) |
| 89 test.fail_test() | 91 test.fail_test() |
| 90 return | 92 return |
| 91 | 93 |
| 92 def ConvertBinaryPlistToXML(path): | 94 def ConvertBinaryPlistToXML(path): |
| 93 proc = subprocess.call(['plutil', '-convert', 'xml1', path], | 95 proc = subprocess.call(['plutil', '-convert', 'xml1', path], |
| 94 stdout=subprocess.PIPE) | 96 stdout=subprocess.PIPE) |
| 95 | 97 |
| 96 if sys.platform == 'darwin': | 98 if sys.platform == 'darwin': |
| 97 test = TestGyp.TestGyp(formats=['ninja', 'xcode']) | 99 test = TestGyp.TestGyp(formats=['ninja', 'xcode']) |
| 98 | 100 |
| 99 test.run_gyp('test-device.gyp', chdir='app-bundle') | 101 test.run_gyp('test-device.gyp', chdir='app-bundle') |
| 100 | 102 |
| 101 test_configs = ['Default-iphoneos', 'Default'] | 103 test_configs = ['Default-iphoneos', 'Default'] |
| 102 for configuration in test_configs: | 104 for configuration in test_configs: |
| 103 test.set_configuration(configuration) | 105 test.set_configuration(configuration) |
| 104 test.build('test-device.gyp', 'test_app', chdir='app-bundle') | 106 test.build('test-device.gyp', 'test_app', chdir='app-bundle') |
| 105 result_file = test.built_file_path('Test App Gyp.app/Test App Gyp', | 107 result_file = test.built_file_path('Test App Gyp.app/Test App Gyp', |
| 106 chdir='app-bundle') | 108 chdir='app-bundle') |
| 107 test.must_exist(result_file) | 109 test.must_exist(result_file) |
| 108 info_plist = test.built_file_path('Test App Gyp.app/Info.plist', | 110 info_plist = test.built_file_path('Test App Gyp.app/Info.plist', |
| 109 chdir='app-bundle') | 111 chdir='app-bundle') |
| 110 plist = plistlib.readPlist(info_plist) | 112 plist = plistlib.readPlist(info_plist) |
| 111 xcode_version = TestMac.Xcode.Version() | 113 xcode_version = TestMac.Xcode.Version() |
| 112 if xcode_version >= '0720': | 114 if xcode_version >= '0720': |
| 113 if len(plist) != 23: | 115 if len(plist) != 23: |
| 114 print 'plist should have 23 entries, but it has %s' % len(plist) | 116 print('plist should have 23 entries, but it has %s' % len(plist)) |
| 115 test.fail_test() | 117 test.fail_test() |
| 116 | 118 |
| 117 # Values that will hopefully never change. | 119 # Values that will hopefully never change. |
| 118 CheckPlistvalue(plist, 'CFBundleDevelopmentRegion', 'English') | 120 CheckPlistvalue(plist, 'CFBundleDevelopmentRegion', 'English') |
| 119 CheckPlistvalue(plist, 'CFBundleExecutable', 'Test App Gyp') | 121 CheckPlistvalue(plist, 'CFBundleExecutable', 'Test App Gyp') |
| 120 CheckPlistvalue(plist, 'CFBundleIdentifier', 'com.google.Test App Gyp') | 122 CheckPlistvalue(plist, 'CFBundleIdentifier', 'com.google.Test App Gyp') |
| 121 CheckPlistvalue(plist, 'CFBundleInfoDictionaryVersion', '6.0') | 123 CheckPlistvalue(plist, 'CFBundleInfoDictionaryVersion', '6.0') |
| 122 CheckPlistvalue(plist, 'CFBundleName', 'Test App Gyp') | 124 CheckPlistvalue(plist, 'CFBundleName', 'Test App Gyp') |
| 123 CheckPlistvalue(plist, 'CFBundlePackageType', 'APPL') | 125 CheckPlistvalue(plist, 'CFBundlePackageType', 'APPL') |
| 124 CheckPlistvalue(plist, 'CFBundleShortVersionString', '1.0') | 126 CheckPlistvalue(plist, 'CFBundleShortVersionString', '1.0') |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 176 plist = plistlib.readPlist(info_plist) | 178 plist = plistlib.readPlist(info_plist) |
| 177 CheckPlistvalue(plist, 'UIDeviceFamily', [1]) | 179 CheckPlistvalue(plist, 'UIDeviceFamily', [1]) |
| 178 | 180 |
| 179 entitlements_file = test.built_file_path('sig_test.xcent', | 181 entitlements_file = test.built_file_path('sig_test.xcent', |
| 180 chdir='app-bundle') | 182 chdir='app-bundle') |
| 181 if os.path.isfile(entitlements_file): | 183 if os.path.isfile(entitlements_file): |
| 182 expected_entitlements = open(entitlements_file).read() | 184 expected_entitlements = open(entitlements_file).read() |
| 183 CheckEntitlements(result_file, expected_entitlements) | 185 CheckEntitlements(result_file, expected_entitlements) |
| 184 | 186 |
| 185 test.pass_test() | 187 test.pass_test() |
| OLD | NEW |