blob: 68605d77b1957e01dcafe3d1aa95071c5343ce54 [file] [log] [blame]
Ben Murdoch097c5b22016-05-18 11:27:45 +01001# Copyright (c) 2014 Google Inc. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5"""
6TestMac.py: a collection of helper function shared between test on Mac OS X.
7"""
8
9import re
10import subprocess
11
12__all__ = ['Xcode', 'CheckFileType']
13
14
15def CheckFileType(test, file, archs):
16 """Check that |file| contains exactly |archs| or fails |test|."""
17 proc = subprocess.Popen(['lipo', '-info', file], stdout=subprocess.PIPE)
18 o = proc.communicate()[0].strip()
19 assert not proc.returncode
20 if len(archs) == 1:
21 pattern = re.compile('^Non-fat file: (.*) is architecture: (.*)$')
22 else:
23 pattern = re.compile('^Architectures in the fat file: (.*) are: (.*)$')
24 match = pattern.match(o)
25 if match is None:
26 print 'Ouput does not match expected pattern: %s' % (pattern.pattern)
27 test.fail_test()
28 else:
29 found_file, found_archs = match.groups()
30 if found_file != file or set(found_archs.split()) != set(archs):
31 print 'Expected file %s with arch %s, got %s with arch %s' % (
32 file, ' '.join(archs), found_file, found_archs)
33 test.fail_test()
34
35
36class XcodeInfo(object):
37 """Simplify access to Xcode informations."""
38
39 def __init__(self):
40 self._cache = {}
41
42 def _XcodeVersion(self):
43 lines = subprocess.check_output(['xcodebuild', '-version']).splitlines()
44 version = ''.join(lines[0].split()[-1].split('.'))
45 version = (version + '0' * (3 - len(version))).zfill(4)
46 return version, lines[-1].split()[-1]
47
48 def Version(self):
49 if 'Version' not in self._cache:
50 self._cache['Version'], self._cache['Build'] = self._XcodeVersion()
51 return self._cache['Version']
52
53 def Build(self):
54 if 'Build' not in self._cache:
55 self._cache['Version'], self._cache['Build'] = self._XcodeVersion()
56 return self._cache['Build']
57
58 def SDKBuild(self):
59 if 'SDKBuild' not in self._cache:
60 self._cache['SDKBuild'] = subprocess.check_output(
61 ['xcodebuild', '-version', '-sdk', '', 'ProductBuildVersion'])
62 self._cache['SDKBuild'] = self._cache['SDKBuild'].rstrip('\n')
63 return self._cache['SDKBuild']
64
65 def SDKVersion(self):
66 if 'SDKVersion' not in self._cache:
67 self._cache['SDKVersion'] = subprocess.check_output(
68 ['xcodebuild', '-version', '-sdk', '', 'SDKVersion'])
69 self._cache['SDKVersion'] = self._cache['SDKVersion'].rstrip('\n')
70 return self._cache['SDKVersion']
71
72
73Xcode = XcodeInfo()