1 | # This script treats the OS X pkg as an xar archive and uncompresses it to |
---|
2 | # the filesystem. The xar file contains a file called Payload, which is a |
---|
3 | # gziped cpio archive of the filesystem. It then cd's into the file system |
---|
4 | # and executes '$appname --version-and-path' and checks whether the output |
---|
5 | # of that command is right. |
---|
6 | |
---|
7 | # If all of the paths listed therein are loaded from within the current PWD |
---|
8 | # then it exits with code 0. |
---|
9 | |
---|
10 | # If anything goes wrong then it exits with non-zero (failure). This is to |
---|
11 | # check that the Mac OS '.pkg' package that gets built is correctly loading |
---|
12 | # all of its packages from inside the image. |
---|
13 | |
---|
14 | # Here is an example output from --version-and-path: |
---|
15 | |
---|
16 | # allmydata-tahoe: 1.10.0.post185.dev0 [2249-deps-and-osx-packaging-1: 76ac53846042d9a4095995be92af66cdc09d5ad0-dirty] (/Applications/tahoe.app/src) |
---|
17 | # foolscap: 0.7.0 (/Applications/tahoe.app/support/lib/python2.7/site-packages/foolscap-0.7.0-py2.7.egg) |
---|
18 | # zfec: 1.4.24 (/Applications/tahoe.app/support/lib/python2.7/site-packages/zfec-1.4.24-py2.7-macosx-10.9-intel.egg) |
---|
19 | # Twisted: 13.0.0 (/Applications/tahoe.app/support/lib/python2.7/site-packages/Twisted-13.0.0-py2.7-macosx-10.9-intel.egg) |
---|
20 | # Nevow: 0.11.1 (/Applications/tahoe.app/support/lib/python2.7/site-packages/Nevow-0.11.1-py2.7.egg) |
---|
21 | # zope.interface: unknown (/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/zope) |
---|
22 | # python: 2.7.5 (/usr/bin/python) |
---|
23 | # platform: Darwin-13.4.0-x86_64-i386-64bit (None) |
---|
24 | # pyOpenSSL: 0.13 (/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python) |
---|
25 | # pyasn1: 0.1.7 (/Applications/tahoe.app/support/lib/python2.7/site-packages/pyasn1-0.1.7-py2.7.egg) |
---|
26 | # mock: 1.0.1 (/Applications/tahoe.app/support/lib/python2.7/site-packages) |
---|
27 | # setuptools: 0.6c16dev6 (/Applications/tahoe.app/support/lib/python2.7/site-packages/setuptools-0.6c16dev6.egg) |
---|
28 | # service-identity: 14.0.0 (/Applications/tahoe.app/support/lib/python2.7/site-packages/service_identity-14.0.0-py2.7.egg) |
---|
29 | # characteristic: 14.1.0 (/Applications/tahoe.app/support/lib/python2.7/site-packages) |
---|
30 | # pyasn1-modules: 0.0.5 (/Applications/tahoe.app/support/lib/python2.7/site-packages/pyasn1_modules-0.0.5-py2.7.egg) |
---|
31 | |
---|
32 | |
---|
33 | import os, re, shutil, subprocess, sys, tempfile |
---|
34 | |
---|
35 | def test_osx_pkg(pkgfile): |
---|
36 | """ Return on success, raise exception on failure. """ |
---|
37 | |
---|
38 | tmpdir = tempfile.mkdtemp(dir='/tmp') |
---|
39 | # xar -C /tmp/tmpdir -xf PKGNAME |
---|
40 | cmd = ['xar', '-C', tmpdir, '-xf', pkgfile] |
---|
41 | extractit = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) |
---|
42 | rc = extractit.wait() |
---|
43 | if rc != 0: |
---|
44 | raise Exception("FAIL: xar returned non-zero exit code: %r from command: %r" % (rc, cmd,)) |
---|
45 | |
---|
46 | stderrtxt = extractit.stderr.read() |
---|
47 | if stderrtxt: |
---|
48 | raise Exception("FAIL: xar said something on stderr: %r" % (stderrtxt,)) |
---|
49 | |
---|
50 | # cd /tmp/tmpXXX/tahoe-lafs.pkg |
---|
51 | os.chdir(tmpdir + '/tahoe-lafs.pkg') |
---|
52 | |
---|
53 | # cat Payload | gunzip -dc | cpio -i |
---|
54 | cat_process = subprocess.Popen(['cat', 'Payload'], stdout=subprocess.PIPE) |
---|
55 | gunzip_process = subprocess.Popen(['gunzip', '-dc'], |
---|
56 | stdin=cat_process.stdout, |
---|
57 | stdout=subprocess.PIPE) |
---|
58 | cpio_process = subprocess.Popen(['cpio', '-i', '--verbose'], |
---|
59 | stdin=gunzip_process.stdout, |
---|
60 | stdout=subprocess.PIPE) |
---|
61 | cpio_process.communicate() |
---|
62 | |
---|
63 | try: |
---|
64 | basedir = os.getcwd() |
---|
65 | cmd = ['bin/tahoe', '--version-and-path'] |
---|
66 | callit = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) |
---|
67 | |
---|
68 | rc = callit.wait() |
---|
69 | if rc != 0: |
---|
70 | print( |
---|
71 | "{} failed.\n" |
---|
72 | "stdout: {}\n" |
---|
73 | "stderr: {}\n".format( |
---|
74 | cmd, callit.stdout.read(), callit.stderr.read(), |
---|
75 | ), |
---|
76 | ) |
---|
77 | raise Exception("FAIL: '%s' returned non-zero exit code: %r" % (" ".join(cmd), rc)) |
---|
78 | stdouttxt = callit.stdout.read() |
---|
79 | |
---|
80 | PKG_VER_PATH_RE=re.compile("^(\S+): ([^\(]+)\((.+?)\)$", re.UNICODE) |
---|
81 | |
---|
82 | for mo in PKG_VER_PATH_RE.finditer(stdouttxt): |
---|
83 | if not mo.group(3).startswith(basedir): |
---|
84 | # the following packages are provided by the OS X default installation itself |
---|
85 | if not mo.group(1) in ['zope.interface', 'python', 'platform', 'pyOpenSSL']: |
---|
86 | raise Exception("FAIL: found package not loaded from basedir (%s); package was: %s" % (basedir, mo.groups(),)) |
---|
87 | # success! |
---|
88 | finally: |
---|
89 | shutil.rmtree(tmpdir) |
---|
90 | |
---|
91 | |
---|
92 | if __name__ == '__main__': |
---|
93 | pkgs = [fn for fn in os.listdir(".") if fn.endswith("-osx.pkg")] |
---|
94 | if len(pkgs) != 1: |
---|
95 | print("ERR: unable to find a single .pkg file:", pkgs) |
---|
96 | sys.exit(1) |
---|
97 | print("Testing %s ..." % pkgs[0]) |
---|
98 | test_osx_pkg(pkgs[0]) |
---|
99 | print("Looks OK!") |
---|