======================= Unified Installer Tests ======================= $LastChangedDate: 2011-03-03 17:30:15 -0800 (Thu, 03 Mar 2011) $ $LastChangedRevision: 47921 $ ----------- Setup stuff ----------- >>> import subprocess, os, os.path, sys, shutil, urllib2, stat, pwd, time >>> uid = os.geteuid() >>> root = uid == 0 >>> testTarget = '/Users/steve/nobackup/plonetest' >>> withPython = '/opt/local/bin/python' >>> if os.path.exists(testTarget): shutil.rmtree(testTarget) This test should be run from the directory with install.sh >>> os.chdir(os.path.join(os.getcwd(), '..')) >>> os.path.exists('install.sh') True install.sh should be executable >>> os.access('install.sh', os.X_OK) True Let's set up a convenience function for executing a command line and getting stdout, stderr and return code. >>> def doCommand(command): ... p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) ... out, err = p.communicate() ... return (out, err, p.returncode) ------------- Usage Message ------------- Running install.sh with no options should result in a usage message: >>> stdout, stderr, returncode = doCommand('./install.sh') >>> returncode 1 >>> stderr '' >>> stdout "\nUsage: ..." ----------------- Test a ZEO install ------------------ >>> stdout, stderr, returncode = doCommand('./install.sh zeo --target=%s --password=admin --libjpeg=yes --libz=yes --libreadline=yes' % testTarget) >>> returncode and (stdout + stderr) 0 >>> print stdout ZEO Cluster Install selected... Installing Plone 4.0.4 at ... Plone successfully installed at ... Username: admin Password: admin... target should have basic kit >>> sorted(os.listdir(testTarget)) ['Plone-docs', 'Python-2.6', 'buildout-cache', 'zeocluster'] There should now be a buildout skeleton in zeocluster >>> sorted(os.listdir('%s/zeocluster' % testTarget)) ['.installed.cfg', 'PloneController.app', 'README.html', 'adminPassword.txt', 'base.cfg', 'bin', 'bootstrap.py', 'buildout.cfg', 'develop-eggs', 'develop.cfg', 'parts', 'products', 'src', 'var', 'versions.cfg', 'zope_versions.cfg'] Parts should look good >>> sorted(os.listdir('%s/zeocluster/parts' % testTarget)) ['README.txt', 'client1', 'client2', 'zeoserver'] parts/README.html should be a warning >>> print open('%s/zeocluster/parts/README.txt' % testTarget).read() WARNING:...run bin/buildout... We should have an inituser for admin >>> print open('%s/zeocluster/parts/client1/inituser' % testTarget).read() admin:{SHA}... Check bin contents >>> sorted(os.listdir('%s/zeocluster/bin' % testTarget)) ['backup', 'buildout', 'client1', 'client2', 'clusterstatus.sh', 'paster', 'plonectl', 'repozo', 'restartclients.sh', 'restartcluster.sh', 'restore', 'shutdowncluster.sh', 'snapshotbackup', 'snapshotrestore', 'startcluster.sh', 'zeopack', 'zeoserver', 'zopepy', 'zopeskel'] Installing again to the same target should fail >>> stdout, stderr, returncode = doCommand('./install.sh zeo --target=%s --password=admin' % testTarget) >>> print stdout ZEO Cluster Install selected... .../zeocluster already exists; aborting install... Ownership tests ---------------- >>> if root: ... plone_uid = pwd.getpwnam('plone')[2] ... zeo_uid = pwd.getpwnam('plone')[2] ... else: ... plone_uid = zeo_uid = uid >>> os.stat('%s/zeocluster/var/filestorage' % testTarget)[stat.ST_UID] == zeo_uid True >>> os.stat('%s/zeocluster/var/zeoserver' % testTarget)[stat.ST_UID] == zeo_uid True >>> os.stat('%s/zeocluster/var/client1' % testTarget)[stat.ST_UID] == plone_uid True >>> os.stat('%s/zeocluster/var/client2' % testTarget)[stat.ST_UID] == plone_uid True Run it ------ >>> stdout, stderr, returncode = doCommand('%s/zeocluster/bin/zeoserver start' % testTarget) >>> returncode 0 >>> stderr '' # >>> print stdout # ... # daemon process started, pid=... # >>> stdout, stderr, returncode = doCommand('%s/zeocluster/bin/client1 start' % testTarget) >>> returncode 0 >>> stderr '' # >>> print stdout # ... # daemon process started, pid=... # >>> stdout, stderr, returncode = doCommand('%s/zeocluster/bin/client2 start' % testTarget) >>> returncode 0 >>> stderr '' # >>> print stdout # ... # daemon process started, pid=... # Status check >>> stdout, stderr, returncode = doCommand('%s/zeocluster/bin/plonectl status' % testTarget) >>> returncode 0 >>> stderr '' >>> time.sleep(10) # >>> print stdout # zeoserver: program running; pid=... # client1: program running; pid=... # client2: program running; pid=... # Fetch root page via client1 >>> urllib2.urlopen('http://localhost:8080/').read() '...Plone is up and running... Fetch root page via client2 >>> urllib2.urlopen('http://localhost:8081/').read() '...Plone is up and running... Check Banner >>> print urllib2.urlopen('http://localhost:8080/').headers['server'] Zope/(2.12..., python 2.6.6, darwin) ZServer/1.1 Stop it >>> stdout, stderr, returncode = doCommand('%s/zeocluster/bin/plonectl stop' % testTarget) >>> returncode 0 >>> stderr '' # >>> print stdout # zeoserver:...daemon process stopped # client1:...daemon process stopped # client2:...daemon process stopped... ------------------------- Test a standalone install ------------------------- >>> stdout, stderr, returncode = doCommand('./install.sh standalone --target=%s --password=admin' % testTarget) >>> returncode and (stdout + stderr) 0 stderr is going to have a little warning noise, but should not have errors >>> stderr.find('error') < 0 True >>> print stdout Stand-Alone Zope Instance selected... Plone successfully installed at... Username: admin Password: admin... Installing again to the same target should fail >>> stdout, stderr, returncode = doCommand('./install.sh standalone --target=%s --password=admin' % testTarget) >>> print stdout Stand-Alone Zope Instance selected... .../zinstance already exists; aborting install... target should have basic kit >>> sorted(os.listdir(testTarget)) ['Plone-docs', 'Python-2.6', 'buildout-cache', 'zeocluster', 'zinstance'] There should now be a buildout skeleton in zinstance >>> [item for item in sorted(os.listdir('%s/zinstance' % testTarget)) if item != 'PloneController.app'] ['.installed.cfg', 'README.html', 'adminPassword.txt', 'base.cfg', 'bin', 'bootstrap.py', 'buildout.cfg', 'develop-eggs', 'develop.cfg', 'parts', 'products', 'src', 'var', 'versions.cfg', 'zope_versions.cfg'] Parts should look good >>> sorted(os.listdir('%s/zinstance/parts' % testTarget)) ['README.txt', 'instance'] parts/README.html should be a warning >>> print open('%s/zeocluster/parts/README.txt' % testTarget).read() WARNING:...run bin/buildout... Check bin contents >>> sorted(os.listdir('%s/zinstance/bin' % testTarget)) ['backup', 'buildout', 'instance', 'paster', 'plonectl', 'restore', 'snapshotbackup', 'snapshotrestore', 'zopepy', 'zopeskel'] Run it ------ >>> stdout, stderr, returncode = doCommand('%s/zinstance/bin/instance start' % testTarget) >>> returncode 0 >>> stderr '' # >>> print stdout # ... # daemon process started, pid=... # >>> time.sleep(10) Status check >>> stdout, stderr, returncode = doCommand('%s/zinstance/bin/instance status' % testTarget) >>> returncode 0 >>> stderr '' # >>> print stdout # ... # program running; pid=... Fetch root page >>> urllib2.urlopen('http://localhost:8080/').read() '...Plone is up and running... # Fetch Plone top page # >>> urllib2.urlopen('http://localhost:8080/Plone').read() # '...This site was built using Plone CMS... Check Banner >>> print urllib2.urlopen('http://localhost:8080/').headers['server'] Zope/(2.12..., python 2.6...) ZServer/1.1 Stop it >>> stdout, stderr, returncode = doCommand('%s/zinstance/bin/instance stop' % testTarget) >>> returncode 0 >>> stderr '' # >>> print stdout # ... # daemon process stopped # ------------------------------ Test an --instance=... install ------------------------------ >>> stdout, stderr, returncode = doCommand('./install.sh zeo --target=%s --password=admin --instance=zeocluster2' % testTarget) >>> returncode and (stdout + stderr) 0 >>> print stdout ZEO Cluster Install selected... Installing Plone 4.0.4 at ... Plone successfully installed at ... Username: admin Password: admin... There should now be a buildout skeleton in zeocluster2 >>> sorted(os.listdir('%s/zeocluster2' % testTarget)) ['.installed.cfg', 'PloneController.app', 'README.html', 'adminPassword.txt', 'base.cfg', 'bin', 'bootstrap.py', 'buildout.cfg', 'develop-eggs', 'develop.cfg', 'parts', 'products', 'src', 'var', 'versions.cfg', 'zope_versions.cfg'] --------------------------- Test a --withpython install --------------------------- >>> ntestTarget = "%s/wptest" % testTarget >>> stdout, stderr, returncode = doCommand('./install.sh zeo --target=%s --password=admin --with-python=%s' % (ntestTarget, withPython)) >>> returncode and (stdout + stderr) 0 target should have basic kit >>> sorted(os.listdir(ntestTarget)) ['Plone-docs', 'Python-2.6', 'buildout-cache', 'zeocluster'] and, the python directory should look like we have a successful virtualenv install >>> sd = sorted(os.listdir('%s/Python-2.6/bin' % ntestTarget)) >>> 'python' in sd True