From 683cf60c537a1c58d232690fb18ab93849e4eba6 Mon Sep 17 00:00:00 2001 From: Gabriel Monnerat <gabriel@tiolive.com> Date: Fri, 1 Oct 2010 12:17:40 +0000 Subject: [PATCH] add profiles to install cloudooo and one template to run your unit tests git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@38831 20353a03-c40f-0410-a6d1-a30d3c3de9de --- buildout/instance-profiles/cloudooo.cfg | 49 +++++++++ buildout/profiles/test-cloudooo.cfg | 20 ++++ buildout/software-profiles/cloudooo.cfg | 32 ++++-- buildout/templates/runCloudOOoUnitTest.py.in | 107 +++++++++++++++++++ 4 files changed, 199 insertions(+), 9 deletions(-) create mode 100644 buildout/instance-profiles/cloudooo.cfg create mode 100644 buildout/profiles/test-cloudooo.cfg create mode 100644 buildout/templates/runCloudOOoUnitTest.py.in diff --git a/buildout/instance-profiles/cloudooo.cfg b/buildout/instance-profiles/cloudooo.cfg new file mode 100644 index 0000000000..d1a5bc9baa --- /dev/null +++ b/buildout/instance-profiles/cloudooo.cfg @@ -0,0 +1,49 @@ +[buildout] +extends = ../profiles/software-definition.cfg +parts = + cloudooo-instance-template + paster + create-log-directory + +[paster] +recipe = zc.recipe.egg +eggs = + PasteScript + +[create-log-directory] +recipe = z3c.recipe.mkdir +paths = + ${buildout:log-directory} + ${buildout:run-directory} + +[cloudooo-instance-template] +recipe = erp5.recipe.cloudoooinstance +daemon = true # only true or false +conf-output = ${buildout:etc-directory}/cloudooo.conf +ctl-output = ${buildout:data-bin-directory}/cloudoooctl +log-directory = ${buildout:log-directory} +run-directory = ${buildout:run-directory} +bin-directory = ${buildout:bin-directory} +start-timeout = 20 +hostname = localhost +debug-mode = True +working_path = ${buildout:run-directory} +# +## Monitor Settings +# +request-limit = 100 +monitor-interval = 10 +timeout-response = 180 +enable-memory-monitor = True +memory-limit = 3000 +# +## OpenOffice Settings +# +uno-path = ${software_definition:openoffice_software}/basis-link/program/ +office-binary-path = ${software_definition:openoffice_software}/program/ +openoffice-port = 4062 +virtual-display-port = 6077 +virtual-display-id = 77 +virtual-screen = 0 +server-hostname = 0.0.0.0 +server-port = 8011 diff --git a/buildout/profiles/test-cloudooo.cfg b/buildout/profiles/test-cloudooo.cfg new file mode 100644 index 0000000000..a85ef258aa --- /dev/null +++ b/buildout/profiles/test-cloudooo.cfg @@ -0,0 +1,20 @@ +[buildout] +extends = ../instance-profiles/cloudooo.cfg +parts += + runUnitTest + chmod + +[runUnitTest] +recipe = z3c.recipe.template +input = ${buildout:directory}/templates/runCloudOOoUnitTest.py.in +output = ${buildout:bin-directory}/runCloudOOoUnitTest.py.in +tests-directory = ${software_definition:software_home}/src/cloudooo/cloudooo/tests +cloudoooctl-path = ${cloudooo-instance-template:ctl-output} +conf-path = ${cloudooo-instance-template:conf-output} +timeout-limit = 60 + +[chmod] +recipe = plone.recipe.command +command = + chmod a+x ${buildout:bin-directory}/runCloudOOoUnitTest.py.in +update = {:command} diff --git a/buildout/software-profiles/cloudooo.cfg b/buildout/software-profiles/cloudooo.cfg index e2d38b42d3..d85a331bf0 100644 --- a/buildout/software-profiles/cloudooo.cfg +++ b/buildout/software-profiles/cloudooo.cfg @@ -1,14 +1,28 @@ [buildout] -parts = - openoffice-bin - cloudooo - extends = ../software-profiles/python-2.6.cfg ../software-profiles/openoffice-bin.cfg -[cloudooo] -recipe = zc.recipe.egg -eggs = - PasteScript - cloudooo +parts = + openoffice-bin + python2.6 + pythonbin2.6 + +extensions = mr.developer +sources = sources +auto-checkout = cloudooo + +[sources] +cloudooo = svn https://svn.erp5.org/repos/public/erp5/trunk/utils/cloudooo + +[pythonbin2.6] +recipe = zc.recipe.egg:scripts +python = python2.6 +eggs = ${eggs:eggs} + invokepython>=0.4 +scripts = + invokepython=python${python2.6:python_version_major} + ipython=ipython${python2.6:python_version_major} + +[eggs] +eggs = cloudooo diff --git a/buildout/templates/runCloudOOoUnitTest.py.in b/buildout/templates/runCloudOOoUnitTest.py.in new file mode 100644 index 0000000000..fdc6748664 --- /dev/null +++ b/buildout/templates/runCloudOOoUnitTest.py.in @@ -0,0 +1,107 @@ +#!${buildout:executable} + +import sys +import unittest +import psutil +from psutil.error import AccessDenied +from getopt import getopt, GetoptError +from time import sleep +from cloudooo.utils import socketStatus, waitStopDaemon +from ConfigParser import ConfigParser +from os import chdir +from os.path import join, exists +from os import remove +from getpass import getuser +from subprocess import Popen + +log_path = '${buildout:directory}/log/cloudooo.log' +environment_path = '${tests-directory}' +cloudooo_runner = '${cloudoooctl-path}' +server_cloudooo_conf = '${conf-path}' +timeout_limit = ${timeout-limit} +sys.path.append(environment_path) +chdir(environment_path) +from cloudoooTestCase import loadConfig, startFakeEnvironment, stopFakeEnvironment + +def wait_liberate_port(hostname, port): + for n in range(timeout_limit): + if not socketStatus(hostname, port): + break + sleep(1) + +def wait_use_port(hostname, port): + for n in range(timeout_limit): + if socketStatus(hostname, port): + return + sleep(1) + +def get_partial_log(): + if exists(log_path): + return '\n'.join(open(log_path).read().split('\n')[-30:]) + return '' + +def exit(msg): + sys.stderr.write(msg) + sys.exit(0) + +def run_test(test_name): + module = __import__(test_name) + if not hasattr(module, "test_suite"): + exit("No test suite to run, exiting immediately") + TestRunner = unittest.TextTestRunner + suite = unittest.TestSuite() + suite.addTest(module.test_suite()) + TestRunner(verbosity=2).run(suite) + +DAEMON = OPENOFFICE = XVFB = False + +config = ConfigParser() +config.read(server_cloudooo_conf) +openoffice_port = int(config.get("app:main", "openoffice_port")) +xvfb_port = int(config.get("app:main", "virtual_display_port")) +xvfb_display_id = int(config.get("app:main", "virtual_display_id")) +hostname = config.get("app:main", "application_hostname") +server_port = int(config.get("server:main", "port")) +run_dir = config.get('app:main', 'working_path') + +try: + opt_list, arg_list = getopt(sys.argv[1:-1], "", ["with-daemon", + "with-openoffice", + "with-xvfb"]) +except GetoptError, msg: + exit(msg.msg) + +for opt, arg in opt_list: + if opt == "--with-daemon": + DAEMON = True + elif opt == "--with-openoffice": + OPENOFFICE = True + elif opt == "--with-xvfb": + XVFB = True + +test_name = sys.argv[-1] +if not exists(join(environment_path, '%s.py' % test_name)): + exit("%s not exists\n" % test_name) + +if DAEMON: + loadConfig(server_cloudooo_conf) + Popen([cloudooo_runner, 'start']).communicate() + wait_use_port(hostname, server_port) + print get_partial_log() + try: + run_test(test_name) + finally: + Popen([cloudooo_runner, 'stop']).communicate() + wait_liberate_port(hostname, server_port) +elif OPENOFFICE: + openoffice, xvfb = startFakeEnvironment(conf_path=server_cloudooo_conf) + run_test(test_name) + stopFakeEnvironment() +elif XVFB: + xvfb = startFakeEnvironment(start_openoffice=False, + conf_path=server_cloudooo_conf) + run_test(test_name) + stopFakeEnvironment(stop_openoffice=False) +else: + loadConfig(server_cloudooo_conf) + run_test(test_name) -- 2.30.9