• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/env python
2
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
5# found in the LICENSE file.
6
7"""
8Verifies that app bundles are built correctly.
9"""
10
11import TestGyp
12import TestMac
13
14import os
15import plistlib
16import subprocess
17import sys
18
19if sys.platform == 'darwin':
20  print "This test is currently disabled: https://crbug.com/483696."
21  sys.exit(0)
22
23def ExpectEq(expected, actual):
24  if expected != actual:
25    print >>sys.stderr, 'Expected "%s", got "%s"' % (expected, actual)
26    test.fail_test()
27
28def ls(path):
29  '''Returns a list of all files in a directory, relative to the directory.'''
30  result = []
31  for dirpath, _, files in os.walk(path):
32    for f in files:
33      result.append(os.path.join(dirpath, f)[len(path) + 1:])
34  return result
35
36# Xcode supports for assets catalog was introduced in Xcode 6.0
37if sys.platform == 'darwin' and TestMac.Xcode.Version() >= '0600':
38  test_gyp_path = 'test-assets-catalog.gyp'
39  test_app_path = 'Test App Assets Catalog Gyp.app'
40
41  test = TestGyp.TestGyp(formats=['ninja', 'make', 'xcode'])
42  test.run_gyp(test_gyp_path, chdir='app-bundle')
43  test.build(test_gyp_path, test.ALL, chdir='app-bundle')
44
45  # Binary
46  test.built_file_must_exist(
47      os.path.join(test_app_path, 'Contents/MacOS/Test App Assets Catalog Gyp'),
48      chdir='app-bundle')
49
50  # Info.plist
51  info_plist = test.built_file_path(
52      os.path.join(test_app_path, 'Contents/Info.plist'),
53      chdir='app-bundle')
54  test.must_exist(info_plist)
55  test.must_contain(
56      info_plist,
57      'com.google.Test-App-Assets-Catalog-Gyp')  # Variable expansion
58  test.must_not_contain(info_plist, '${MACOSX_DEPLOYMENT_TARGET}');
59
60  if test.format != 'make':
61    # TODO: Synthesized plist entries aren't hooked up in the make generator.
62    machine = subprocess.check_output(['sw_vers', '-buildVersion']).rstrip('\n')
63    plist = plistlib.readPlist(info_plist)
64    ExpectEq(machine, plist['BuildMachineOSBuild'])
65
66    expected = ''
67    version = TestMac.Xcode.SDKVersion()
68    expected = 'macosx' + version
69    ExpectEq(expected, plist['DTSDKName'])
70    sdkbuild = TestMac.Xcode.SDKBuild()
71    if not sdkbuild:
72      # Above command doesn't work in Xcode 4.2.
73      sdkbuild = plist['BuildMachineOSBuild']
74    ExpectEq(sdkbuild, plist['DTSDKBuild'])
75    ExpectEq(TestMac.Xcode.Version(), plist['DTXcode'])
76    ExpectEq(TestMac.Xcode.Build(), plist['DTXcodeBuild'])
77
78  # Resources
79  strings_files = ['InfoPlist.strings', 'utf-16be.strings', 'utf-16le.strings']
80  for f in strings_files:
81    strings = test.built_file_path(
82        os.path.join(test_app_path, 'Contents/Resources/English.lproj', f),
83        chdir='app-bundle')
84    test.must_exist(strings)
85    # Xcodes writes UTF-16LE with BOM.
86    contents = open(strings, 'rb').read()
87    if not contents.startswith('\xff\xfe' + '/* Localized'.encode('utf-16le')):
88      test.fail_test()
89
90  test.built_file_must_exist(
91      os.path.join(
92          test_app_path, 'Contents/Resources/English.lproj/MainMenu.nib'),
93      chdir='app-bundle')
94
95  # make does not supports .xcassets files
96  extra_content_files = []
97  if test.format != 'make':
98    extra_content_files = ['Contents/Resources/Assets.car']
99    for f in extra_content_files:
100      test.built_file_must_exist(
101          os.path.join(test_app_path, f),
102          chdir='app-bundle')
103
104  # Packaging
105  test.built_file_must_exist(
106      os.path.join(test_app_path, 'Contents/PkgInfo'),
107      chdir='app-bundle')
108  test.built_file_must_match(
109      os.path.join(test_app_path, 'Contents/PkgInfo'), 'APPLause',
110      chdir='app-bundle')
111
112  # Check that no other files get added to the bundle.
113  if set(ls(test.built_file_path(test_app_path, chdir='app-bundle'))) != \
114     set(['Contents/MacOS/Test App Assets Catalog Gyp',
115          'Contents/Info.plist',
116          'Contents/Resources/English.lproj/MainMenu.nib',
117          'Contents/PkgInfo',
118          ] + extra_content_files +
119         [os.path.join('Contents/Resources/English.lproj', f)
120             for f in strings_files]):
121    test.fail_test()
122
123  test.pass_test()
124