-
Notifications
You must be signed in to change notification settings - Fork 247
/
test_mac_pkg.py
74 lines (60 loc) · 4.41 KB
/
test_mac_pkg.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# This script uses hdiutil to attach a dmg (whose name is derived from the
# appname and the version number passed in), asserts that it attached as
# expected, cd's into the mounted filesystem, executes "$appname
# --version-and-path", and checks whether the output of --version-and-path is
# right.
# If all of the paths listed therein are loaded from within the current PWD
# then it exits with code 0.
# If anything goes wrong then it exits with non-zero (failure). This is to
# check that the Mac OS "DMG" (disk image) package that gets built is correctly
# loading all of its packages from inside the image.
# Here is an example output from --version-and-path:
# allmydata-tahoe: 1.4.1-r3916 (/home/zooko/playground/allmydata/tahoe/trunk/trunk/src), foolscap: 0.4.1 (/usr/local/lib/python2.6/dist-packages/foolscap-0.4.1-py2.6.egg), pycryptopp: 0.5.10 (/home/zooko/playground/allmydata/tahoe/trunk/trunk/support/lib/python2.6/site-packages/pycryptopp-0.5.10-py2.6-linux-x86_64.egg), zfec: 1.4.2 (/usr/local/lib/python2.6/dist-packages/zfec-1.4.2-py2.6-linux-x86_64.egg), Twisted: 8.2.0-r26987 (/usr/local/lib/python2.6/dist-packages/Twisted-8.2.0_r26987-py2.6-linux-x86_64.egg), Nevow: 0.9.32 (/home/zooko/playground/allmydata/tahoe/trunk/trunk/support/lib/python2.6/site-packages/Nevow-0.9.32-py2.6.egg), zope.interface: 3.4.0 (/usr/lib/python2.6/dist-packages), python: 2.6.2 (/usr/bin/python), platform: Linux-Ubuntu_9.04-x86_64-64bit_ELF (None), sqlite: 3.6.10 (unknown), simplejson: 2.0.1 (/usr/local/lib/python2.6/dist-packages/simplejson-2.0.1-py2.6-linux-x86_64.egg), argparse: 0.8.0 (/usr/local/lib/python2.6/dist-packages/argparse-0.8.0-py2.6.egg), pyOpenSSL: 0.7 (/home/zooko/playground/allmydata/tahoe/trunk/trunk/support/lib/python2.6/site-packages/pyOpenSSL-0.7-py2.6-linux-x86_64.egg), pyutil: 1.3.30 (/usr/local/lib/python2.6/dist-packages/pyutil-1.3.30-py2.6.egg), zbase32: 1.1.1 (/usr/local/lib/python2.6/dist-packages/zbase32-1.1.1-py2.6.egg), setuptools: 0.6c12dev (/home/zooko/playground/allmydata/tahoe/trunk/trunk/support/lib/python2.6/site-packages/setuptools-0.6c12dev.egg), pysqlite: 2.4.1 (/usr/lib/python2.6/sqlite3)
import os, re, subprocess, time, tempfile, shutil
def test_mac_pkg(appname, version):
""" Return True on success, raise exception on failure. """
assert isinstance(appname, basestring), appname
assert isinstance(version, basestring), version
PKGNAME='mac/'+appname+'-'+version+'.pkg'
d = tempfile.mkdtemp(dir='/tmp')
# xar -C /tmp/tmpdir -xf PKGNAME
cmd = ['xar', '-C', d, '-xf', PKGNAME]
extractit = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
rc = extractit.wait()
if rc != 0:
raise Exception("FAIL: xar returned non-zero exit code: %r from command: %r" % (rc, cmd,))
stderrtxt = extractit.stderr.read()
if stderrtxt:
raise Exception("FAIL: xar said something on stderr: %r" % (stderrtxt,))
# cd /tmp/tmpXXX/tahoe-lafs.pkg
os.chdir(d + '/tahoe-lafs.pkg')
# cat Payload | gunzip -dc | cpio -i
cat_process = subprocess.Popen(['cat', 'Payload'], stdout=subprocess.PIPE)
gunzip_process = subprocess.Popen(['gunzip', '-dc'],
stdin=cat_process.stdout,
stdout=subprocess.PIPE)
cpio_process = subprocess.Popen(['cpio', '-i'],
stdin=gunzip_process.stdout,
stdout=subprocess.PIPE)
cpio_process.communicate()
callitpid = None
try:
basedir = os.getcwd()
cmd = ['bin/' + appname, '--version-and-path']
callit = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
callitpid = callit.pid
assert callitpid
time.sleep(5)
stdouttxt = callit.stdout.read()
PKG_VER_PATH_RE=re.compile("(\S+): (\S+) \((.+?)\)", re.UNICODE)
for mo in PKG_VER_PATH_RE.finditer(stdouttxt):
if not mo.group(3).startswith(basedir):
# the following packages are provided by the OS X default installation itself
if not mo.group(1) in ['zope.interface', 'python', 'platform', 'pyOpenSSL']:
raise Exception("FAIL: found package not loaded from basedir (%s); package was: %s" % (basedir, mo.groups(),))
return True # success!
finally:
shutil.rmtree(d)
if callitpid:
os.kill(callitpid, 9)
os.waitpid(callitpid, 0)