[Erp5-report] r43245 rafael - /erp5/trunk/buildout/tests/assertInstance.py
nobody at svn.erp5.org
nobody at svn.erp5.org
Thu Feb 10 01:37:05 CET 2011
Author: rafael
Date: Thu Feb 10 01:37:04 2011
New Revision: 43245
URL: http://svn.erp5.org?rev=43245&view=rev
Log:
Include test/assertion for Instance creation. It contains part of erp5.appliance.test source code, so we can if any software built is able to create the instances.
Added:
erp5/trunk/buildout/tests/assertInstance.py
Added: erp5/trunk/buildout/tests/assertInstance.py
URL: http://svn.erp5.org/erp5/trunk/buildout/tests/assertInstance.py?rev=43245&view=auto
==============================================================================
--- erp5/trunk/buildout/tests/assertInstance.py (added)
+++ erp5/trunk/buildout/tests/assertInstance.py [utf8] Thu Feb 10 01:37:04 2011
@@ -0,0 +1,231 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# Copyright (c) 2010 Nexedi SA and Contributors. All Rights Reserved.
+# Lukasz Nowak <luke at nexedi.com>
+# Romain Courteaud <romain at nexedi.com>
+# Rafael Monnerat <rafael at nexedi.com>
+#
+# WARNING: This program as such is intended to be used by professional
+# programmers who take the whole responsibility of assessing all potential
+# consequences resulting from its eventual inadequacies and bugs
+# End users who are looking for a ready-to-use solution with commercial
+# guarantees and support are strongly advised to contract a Free Software
+# Service Company
+#
+# This program is Free Software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+##############################################################################
+""" Run this test at software built folder.
+
+ cd software
+ python path/to/assertInstance.py
+"""
+import signal
+import pexpect, time
+import os
+import unittest
+import subprocess
+import shutil
+
+class TimeoutException(Exception):
+ pass
+
+class SubFailed(Exception):
+ pass
+
+def callWithTimeout(command_list, timeout=60, cwd=None,
+ input_list=None):
+
+ output = []
+ def timeout_handler(signum, frame):
+ raise TimeoutException()
+
+ old_handler = signal.signal(signal.SIGALRM, timeout_handler)
+ signal.signal(signal.SIGALRM, timeout_handler)
+ signal.alarm(timeout)
+ command = None
+ try:
+ try:
+ returncode = None
+ command = pexpect.spawn(" ".join(command_list), timeout=timeout, cwd=cwd)
+ isalive = True
+ while isalive:
+ if input_list is not None:
+ for input in input_list:
+ command.expect(input[0])
+ command.sendline(input[1])
+ time.sleep(1)
+ line = command.readline()
+ if line:
+ line = line[:-1]
+ l = line.rstrip('\n').rstrip('\r')
+ print l
+ output.append(l)
+ isalive = command.isalive()
+ for line in command.readlines():
+ print line
+ output.append(l)
+ command.close()
+ returncode = command.exitstatus
+ except TimeoutException:
+ returncode = 1
+ command.close()
+ finally:
+ if command is not None:
+ command.kill(signal.SIGKILL)
+ signal.signal(signal.SIGALRM, old_handler)
+ signal.alarm(0)
+ if returncode != 0:
+ raise SubFailed, "%s %s" % (returncode, command_list)
+ return returncode, "\n".join(output)
+
+class AssertDefaultERP5Instance26(unittest.TestCase):
+ instance_path = os.path.join(os.getcwd(),".instance_test")
+ software_path = os.getcwd()
+ extends_cache = os.path.join(os.getcwd(),"extends-cache")
+ instance_buildout = """[buildout]
+extends-cache = %(extends_cache)s
+offline = true
+extends =
+ %(instance_profile_url)s
+ %(instance_template_file)s
+
+parts =
+ mysql-instance
+ cloudooo-instance
+ supervisor-instance
+ runUnitTest
+ development-site
+
+[configuration]
+supervisor_port = 19999
+mysql_port = 19998
+oood_port = 19997
+
+[development-site]
+http-address = 19996
+"""
+ instance_profile_url = 'https://svn.erp5.org/repos/public/erp5/trunk/buildout/profiles/development-2.12.cfg'
+ binary_bootstrap_file_name = 'bootstrap2.6'
+
+ def assertRelativePathExists(self,relative_list):
+ path_list = [self.instance_path]
+ path_list.extend(relative_list)
+ self.assertTrue(os.path.exists(os.path.join(*path_list)))
+
+ def test(self):
+ if not os.path.exists(self.instance_path):
+ mkdir = ['mkdir', self.instance_path]
+ callWithTimeout(mkdir)
+
+ self.assertTrue(os.path.exists(self.instance_path))
+
+ # Create buildout profile
+ instance_kw = dict(
+ instance_profile_url = self.instance_profile_url,
+ extends_cache = self.extends_cache,
+ instance_template_file = os.path.join(self.software_path, 'instance.inc')
+ )
+
+ file(os.path.join(self.instance_path, 'buildout.cfg'), 'w').write(
+ self.instance_buildout % instance_kw)
+
+ # Bootstrap instance
+ instance_bootstrap = [os.path.join(self.software_path, 'bin' , self.binary_bootstrap_file_name)]
+ callWithTimeout(instance_bootstrap, cwd=self.instance_path)
+
+ self.assertRelativePathExists(['bin', 'buildout'])
+
+ # Run instance buildout
+ callWithTimeout([os.path.join(self.instance_path, 'bin', 'buildout')], cwd=self.instance_path)
+
+ self.assertRelativePathExists(['var'])
+ self.assertRelativePathExists(['var', 'development-site'])
+ self.assertRelativePathExists(['var', 'bin', 'supervisord'])
+ self.assertRelativePathExists(['var', 'bin', 'mysql'])
+ self.assertRelativePathExists(['var', 'bin', 'cloudoooctl'])
+ # Start supervisor in foreground mode and have control over its process
+ # as in the end it have to be cleanly shutdown
+ supervisord_command = [os.path.join(self.instance_path, 'bin', 'supervisord'),
+ '-n']
+ supervisord_popen = subprocess.Popen(supervisord_command, cwd=self.instance_path)
+ supervisord_popen.poll()
+ # Wait 10 seconds, to give supervisord chance to start required services
+ time.sleep(10)
+ try:
+ mysql_command = [os.path.join(self.instance_path, 'var', 'bin', 'mysql'),
+ '-h', '127.0.0.1', '-u', 'root']
+
+ callWithTimeout(mysql_command,
+ cwd=self.instance_path, input_list=[
+ ("mysql> ", "create database development_site;"),
+ ("mysql> ", "grant all privileges on development_site.* to "
+ "'development_user'@'localhost' identified by "
+ "'development_password';"),
+ ("mysql> ", "grant all privileges on development_site.* to "
+ "'development_user'@'127.0.0.1' identified by "
+ "'development_password';"),
+ ("mysql> ", "create database test212;"),
+ ("mysql> ", "grant all privileges on test212.* to "
+ "'test'@'localhost';"),
+ ("mysql> ", "grant all privileges on test212.* to "
+ "'test'@'127.0.0.1';"),
+ ("mysql> ", "exit")])
+
+ # Run a test from readme
+ test_run_command = [os.path.join(self.instance_path, 'bin', 'runUnitTest'),
+ 'testClassTool']
+ returncode, output = callWithTimeout(test_run_command,
+ timeout=1200,
+ cwd=self.instance_path)
+ self.assertEquals(output.split("\n")[-1], 'OK')
+
+ bt5_directory = os.path.join(self.instance_path, 'bt5')
+ try:
+ svn = os.path.join(self.software_path, 'parts', 'subversion', 'bin', 'svn')
+ if not os.path.exists(bt5_directory):
+ os.mkdir(bt5_directory)
+ # Get needed business template
+ for bt5 in ['erp5_base', 'erp5_ingestion', 'erp5_ingestion_mysql_'
+ 'innodb_catalog', 'erp5_web', 'erp5_dms', 'erp5_full_text_myisam_catalog']:
+ callWithTimeout([svn, 'export', '--non-interactive',
+ '--trust-server-cert',
+ 'https://svn.erp5.org/repos/public/erp5/trunk/bt5/' + bt5,
+ os.path.join(bt5_directory, bt5)], timeout=600)
+ # Check that catalog is working
+ for test in ['testERP5Catalog.TestERP5Catalog.'
+ 'test_04_SearchFolderWithDeletedObjects',
+ 'testDms.TestDocument.'
+ 'testOOoDocument_get_size']:
+ test_run_command = [os.path.join(self.instance_path, 'bin', 'runUnitTest'),
+ '--bt5_path=%s/bt5' % self.instance_path, test]
+ returncode, output = \
+ callWithTimeout(test_run_command, timeout=1200,cwd=self.instance_path)
+ self.assertEquals(output.split("\n")[-1], 'OK')
+ finally:
+ if os.path.exists(bt5_directory):
+ shutil.rmtree(bt5_directory)
+ finally:
+ # Stop supervisor
+ while supervisord_popen.poll() is None:
+ # send SIGKILL
+ supervisord_popen.terminate()
+ # give some time to terminate services
+ time.sleep(5)
+ callWithTimeout(["rm -rf", self.instance_path])
+
+if __name__ == '__main__':
+ unittest.main()
More information about the Erp5-report
mailing list