diff options
Diffstat (limited to 'deps/gyp/test/ios/gyptest-per-config-settings.py')
-rw-r--r-- | deps/gyp/test/ios/gyptest-per-config-settings.py | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/deps/gyp/test/ios/gyptest-per-config-settings.py b/deps/gyp/test/ios/gyptest-per-config-settings.py new file mode 100644 index 0000000000..63e9044f99 --- /dev/null +++ b/deps/gyp/test/ios/gyptest-per-config-settings.py @@ -0,0 +1,151 @@ +#!/usr/bin/env python + +# Copyright (c) 2012 Google Inc. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +""" +Verifies that device and simulator bundles are built correctly. +""" + +import plistlib +import TestGyp +import os +import struct +import subprocess +import sys +import tempfile + +if sys.platform == 'darwin': + print "This test is currently disabled: https://crbug.com/483696." + sys.exit(0) + + +def CheckFileType(file, expected): + proc = subprocess.Popen(['lipo', '-info', file], stdout=subprocess.PIPE) + o = proc.communicate()[0].strip() + assert not proc.returncode + if not expected in o: + print 'File: Expected %s, got %s' % (expected, o) + test.fail_test() + +def HasCerts(): + # Because the bots do not have certs, don't check them if there are no + # certs available. + proc = subprocess.Popen(['security','find-identity','-p', 'codesigning', + '-v'], stdout=subprocess.PIPE) + return "0 valid identities found" not in proc.communicate()[0].strip() + +def CheckSignature(file): + proc = subprocess.Popen(['codesign', '-v', file], stdout=subprocess.PIPE) + o = proc.communicate()[0].strip() + assert not proc.returncode + if "code object is not signed at all" in o: + print 'File %s not properly signed.' % (file) + test.fail_test() + +def CheckEntitlements(file, expected_entitlements): + with tempfile.NamedTemporaryFile() as temp: + proc = subprocess.Popen(['codesign', '--display', '--entitlements', + temp.name, file], stdout=subprocess.PIPE) + o = proc.communicate()[0].strip() + assert not proc.returncode + data = temp.read() + entitlements = ParseEntitlements(data) + if not entitlements: + print 'No valid entitlements found in %s.' % (file) + test.fail_test() + if entitlements != expected_entitlements: + print 'Unexpected entitlements found in %s.' % (file) + test.fail_test() + +def ParseEntitlements(data): + if len(data) < 8: + return None + magic, length = struct.unpack('>II', data[:8]) + if magic != 0xfade7171 or length != len(data): + return None + return data[8:] + +def GetProductVersion(): + args = ['xcodebuild','-version','-sdk','iphoneos','ProductVersion'] + job = subprocess.Popen(args, stdout=subprocess.PIPE) + return job.communicate()[0].strip() + +def CheckPlistvalue(plist, key, expected): + if key not in plist: + print '%s not set in plist' % key + test.fail_test() + return + actual = plist[key] + if actual != expected: + print 'File: Expected %s, got %s for %s' % (expected, actual, key) + test.fail_test() + +def CheckPlistNotSet(plist, key): + if key in plist: + print '%s should not be set in plist' % key + test.fail_test() + return + +def ConvertBinaryPlistToXML(path): + proc = subprocess.call(['plutil', '-convert', 'xml1', path], + stdout=subprocess.PIPE) + +if sys.platform == 'darwin': + test = TestGyp.TestGyp(formats=['ninja', 'xcode']) + + test.run_gyp('test-device.gyp', chdir='app-bundle') + + test_configs = ['Default-iphoneos', 'Default'] + # TODO(justincohen): Disabling 'Default-iphoneos' for xcode until bots are + # configured with signing certs. + if test.format == 'xcode': + test_configs.remove('Default-iphoneos') + + for configuration in test_configs: + test.set_configuration(configuration) + test.build('test-device.gyp', 'test_app', chdir='app-bundle') + result_file = test.built_file_path('Test App Gyp.bundle/Test App Gyp', + chdir='app-bundle') + test.must_exist(result_file) + + info_plist = test.built_file_path('Test App Gyp.bundle/Info.plist', + chdir='app-bundle') + + # plistlib doesn't support binary plists, but that's what Xcode creates. + if test.format == 'xcode': + ConvertBinaryPlistToXML(info_plist) + plist = plistlib.readPlist(info_plist) + + CheckPlistvalue(plist, 'UIDeviceFamily', [1, 2]) + + if configuration == 'Default-iphoneos': + CheckFileType(result_file, 'armv7') + CheckPlistvalue(plist, 'DTPlatformVersion', GetProductVersion()) + CheckPlistvalue(plist, 'CFBundleSupportedPlatforms', ['iPhoneOS']) + CheckPlistvalue(plist, 'DTPlatformName', 'iphoneos') + else: + CheckFileType(result_file, 'i386') + CheckPlistNotSet(plist, 'DTPlatformVersion') + CheckPlistvalue(plist, 'CFBundleSupportedPlatforms', ['iPhoneSimulator']) + CheckPlistvalue(plist, 'DTPlatformName', 'iphonesimulator') + + if HasCerts() and configuration == 'Default-iphoneos': + test.build('test-device.gyp', 'sig_test', chdir='app-bundle') + result_file = test.built_file_path('sig_test.bundle/sig_test', + chdir='app-bundle') + CheckSignature(result_file) + info_plist = test.built_file_path('sig_test.bundle/Info.plist', + chdir='app-bundle') + + plist = plistlib.readPlist(info_plist) + CheckPlistvalue(plist, 'UIDeviceFamily', [1]) + + entitlements_file = test.built_file_path('sig_test.xcent', + chdir='app-bundle') + if os.path.isfile(entitlements_file): + expected_entitlements = open(entitlements_file).read() + CheckEntitlements(result_file, expected_entitlements) + + test.pass_test() |