Commit cde3df5c authored by Sebastien Robin's avatar Sebastien Robin

erp5testnode: add more tests, fixed NodeTestSuite creation

parent 2f4d5721
...@@ -36,8 +36,14 @@ class ERP5TestNode(TestCase): ...@@ -36,8 +36,14 @@ class ERP5TestNode(TestCase):
def tearDown(self): def tearDown(self):
shutil.rmtree(self._tempdir, True) shutil.rmtree(self._tempdir, True)
def getTestNode(self):
return TestNode(None, None)
def test_01_GetDelNodeTestSuite(self): def test_01_GetDelNodeTestSuite(self):
test_node = TestNode(None, None) """
We should be able to get/delete NodeTestSuite objects inside test_node
"""
test_node = self.getTestNode()
node_test_suite = test_node.getNodeTestSuite('foo') node_test_suite = test_node.getNodeTestSuite('foo')
self.assertEquals(0, node_test_suite.retry_software_count) self.assertEquals(0, node_test_suite.retry_software_count)
node_test_suite.retry_software_count = 2 node_test_suite.retry_software_count = 2
...@@ -46,5 +52,14 @@ class ERP5TestNode(TestCase): ...@@ -46,5 +52,14 @@ class ERP5TestNode(TestCase):
node_test_suite = test_node.getNodeTestSuite('foo') node_test_suite = test_node.getNodeTestSuite('foo')
self.assertEquals(0, node_test_suite.retry_software_count) self.assertEquals(0, node_test_suite.retry_software_count)
def test_01_GetNodeTestSuite(self): def test_02_NodeTestSuiteWorkingDirectory(self):
"""
Make sure we extend the working path with the node_test_suite reference
"""
test_node = self.getTestNode()
node_test_suite = test_node.getNodeTestSuite('foo')
node_test_suite.edit(working_directory="some_path")
self.assertEquals("some_path/foo", node_test_suite.working_directory)
def test_03_constructProfile(self):
pass pass
...@@ -52,31 +52,35 @@ class DummyLogger(object): ...@@ -52,31 +52,35 @@ class DummyLogger(object):
class SlapOSInstance(object): class SlapOSInstance(object):
def __init__(self, working_directory): def __init__(self):
self.retry_software_count = 0 self.retry_software_count = 0
self.retry = False self.retry = False
self.working_directory = working_directory
def edit(self, **kw):
self.__dict__.update(**kw)
class NodeTestSuite(SlapOSInstance): class NodeTestSuite(SlapOSInstance):
def __init__(self, reference, working_directory): def __init__(self, reference):
super(NodeTestSuite, self).__init__(working_directory) super(NodeTestSuite, self).__init__()
self.reference = reference self.reference = reference
self.working_directory = os.path.join(working_directory, reference)
def edit(self, **kw): def edit(self, **kw):
self.__dict__.update(**kw) if kw.has_key("working_directory"):
kw["working_directory"] = os.path.join(kw["working_directory"],
self.reference)
super(NodeTestSuite, self).edit(**kw)
class TestNode(object): class TestNode(object):
def __init__(self, log, config): def __init__(self, log, config):
self.log = log self.log = log
self.config = config self.config = config or {}
self.process_manager = ProcessManager(log) self.process_manager = ProcessManager(log)
self.node_test_suite_dict = {} self.node_test_suite_dict = {}
# hack until slapos.cookbook is updated # hack until slapos.cookbook is updated
if config['working_directory'].endswith("slapos/"): if self.config.get('working_directory', '').endswith("slapos/"):
config['working_directory'] = config[ self.config['working_directory'] = self.config[
'working_directory'][:-(len("slapos/"))] 'working_directory'][:-(len("slapos/"))]
def checkOldTestSuite(self,test_suite_data): def checkOldTestSuite(self,test_suite_data):
...@@ -96,8 +100,8 @@ class TestNode(object): ...@@ -96,8 +100,8 @@ class TestNode(object):
def getNodeTestSuite(self, reference): def getNodeTestSuite(self, reference):
node_test_suite = self.node_test_suite_dict.get(reference) node_test_suite = self.node_test_suite_dict.get(reference)
if node_test_suite is None: if node_test_suite is None:
node_test_suite = self.node_test_suite_dict[reference] = NodeTestSuite( node_test_suite = NodeTestSuite(reference)
reference, working_directory) self.node_test_suite_dict[reference] = node_test_suite
return node_test_suite return node_test_suite
def delNodeTestSuite(self, reference): def delNodeTestSuite(self, reference):
...@@ -106,21 +110,17 @@ class TestNode(object): ...@@ -106,21 +110,17 @@ class TestNode(object):
def updateConfigForTestSuite(self, test_suite, node_test_suite): def updateConfigForTestSuite(self, test_suite, node_test_suite):
config = self.config config = self.config
node_test_suite.edit(project_title=test_suite["project_title"], node_test_suite.edit(**test_suite),
test_suite=test_suite["test_suite"],
test_suite_title=test_suite["test_suite_title"])
config["vcs_repository_list"] = test_suite["vcs_repository_list"]
config['working_directory'] = os.path.join(config['slapos_directory'], config['working_directory'] = os.path.join(config['slapos_directory'],
node_test_suite.reference) node_test_suite.reference)
SlapOSControler.createFolder(config['working_directory']) SlapOSControler.createFolder(config['working_directory'])
custom_profile_path = os.path.join(config['working_directory'], 'software.cfg') custom_profile_path = os.path.join(config['working_directory'], 'software.cfg')
config['custom_profile_path'] = custom_profile_path config['custom_profile_path'] = custom_profile_path
def constructProfile(self): def constructProfile(self, node_test_suite):
vcs_repository_list = self.config['vcs_repository_list']
config = self.config config = self.config
profile_content = '' profile_content = ''
assert len(vcs_repository_list), "we must have at least one repository" assert len(node_test_suite.vcs_repository_list), "we must have at least one repository"
try: try:
# BBB: Accept global profile_path, which is the same as setting it for the # BBB: Accept global profile_path, which is the same as setting it for the
# first configured repository. # first configured repository.
...@@ -128,14 +128,14 @@ class TestNode(object): ...@@ -128,14 +128,14 @@ class TestNode(object):
except KeyError: except KeyError:
pass pass
else: else:
vcs_repository_list[0][PROFILE_PATH_KEY] = profile_path node_test_suite.vcs_repository_list[0][PROFILE_PATH_KEY] = profile_path
profile_path_count = 0 profile_path_count = 0
for vcs_repository in vcs_repository_list: for vcs_repository in node_test_suite.vcs_repository_list:
url = vcs_repository['url'] url = vcs_repository['url']
buildout_section_id = vcs_repository.get('buildout_section_id', None) buildout_section_id = vcs_repository.get('buildout_section_id', None)
repository_id = buildout_section_id or \ repository_id = buildout_section_id or \
url.split('/')[-1].split('.')[0] url.split('/')[-1].split('.')[0]
repository_path = os.path.join(config['working_directory'],repository_id) repository_path = os.path.join(node_test_suite.working_directory,repository_id)
vcs_repository['repository_id'] = repository_id vcs_repository['repository_id'] = repository_id
vcs_repository['repository_path'] = repository_path vcs_repository['repository_path'] = repository_path
try: try:
...@@ -166,14 +166,12 @@ branch = %(branch)s ...@@ -166,14 +166,12 @@ branch = %(branch)s
custom_profile.close() custom_profile.close()
config['repository_path'] = repository_path config['repository_path'] = repository_path
sys.path.append(repository_path) sys.path.append(repository_path)
return vcs_repository_list
def getAndUpdateFullRevisionList(self, node_test_suite): def getAndUpdateFullRevisionList(self, node_test_suite):
full_revision_list = [] full_revision_list = []
config = self.config config = self.config
log = self.log log = self.log
vcs_repository_list = self.config['vcs_repository_list'] for vcs_repository in node_test_suite.vcs_repository_list:
for vcs_repository in vcs_repository_list:
repository_path = vcs_repository['repository_path'] repository_path = vcs_repository['repository_path']
repository_id = vcs_repository['repository_id'] repository_id = vcs_repository['repository_id']
if not os.path.exists(repository_path): if not os.path.exists(repository_path):
...@@ -202,14 +200,14 @@ branch = %(branch)s ...@@ -202,14 +200,14 @@ branch = %(branch)s
test_result.addWatch(log_file_name,log_file,max_history_bytes=10000) test_result.addWatch(log_file_name,log_file,max_history_bytes=10000)
return log_file_name return log_file_name
def checkRevision(self, test_result, node_test_suite, vcs_repository_list): def checkRevision(self, test_result, node_test_suite):
config = self.config config = self.config
log = self.log log = self.log
if node_test_suite.revision != test_result.revision: if node_test_suite.revision != test_result.revision:
log('Disagreement on tested revision, checking out: %r' % ( log('Disagreement on tested revision, checking out: %r' % (
(node_test_suite.revision,test_result.revision),)) (node_test_suite.revision,test_result.revision),))
for i, repository_revision in enumerate(test_result.revision.split(',')): for i, repository_revision in enumerate(test_result.revision.split(',')):
vcs_repository = vcs_repository_list[i] vcs_repository = node_test_suite.vcs_repository_list[i]
repository_path = vcs_repository['repository_path'] repository_path = vcs_repository['repository_path']
revision = repository_revision.rsplit('-', 1)[1] revision = repository_revision.rsplit('-', 1)[1]
# other testnodes on other boxes are already ready to test another # other testnodes on other boxes are already ready to test another
...@@ -325,7 +323,8 @@ branch = %(branch)s ...@@ -325,7 +323,8 @@ branch = %(branch)s
previous_revision_dict = {} previous_revision_dict = {}
revision_dict = {} revision_dict = {}
test_result = None test_result = None
test_node_slapos = SlapOSInstance(self.config['slapos_directory']) test_node_slapos = SlapOSInstance()
test_node_slapos.edit(working_directory=self.config['slapos_directory'])
try: try:
while True: while True:
try: try:
...@@ -344,14 +343,15 @@ branch = %(branch)s ...@@ -344,14 +343,15 @@ branch = %(branch)s
for test_suite in test_suite_data: for test_suite in test_suite_data:
remote_test_result_needs_cleanup = False remote_test_result_needs_cleanup = False
node_test_suite = self.getNodeTestSuite( node_test_suite = self.getNodeTestSuite(
test_suite["test_suite_reference"], test_suite["test_suite_reference"])
self.config['working_directory']) node_test_suite.edit(
working_directory=self.config['working_directory'])
self.updateConfigForTestSuite(test_suite, node_test_suite) self.updateConfigForTestSuite(test_suite, node_test_suite)
run_software = True run_software = True
self.process_manager.supervisord_pid_file = os.path.join(\ self.process_manager.supervisord_pid_file = os.path.join(\
slapos_controler.instance_root, 'var', 'run', 'supervisord.pid') slapos_controler.instance_root, 'var', 'run', 'supervisord.pid')
# Write our own software.cfg to use the local repository # Write our own software.cfg to use the local repository
vcs_repository_list = self.constructProfile() self.constructProfile(node_test_suite)
# kill processes from previous loop if any # kill processes from previous loop if any
self.process_manager.killPreviousRun() self.process_manager.killPreviousRun()
self.getAndUpdateFullRevisionList(node_test_suite) self.getAndUpdateFullRevisionList(node_test_suite)
...@@ -364,7 +364,7 @@ branch = %(branch)s ...@@ -364,7 +364,7 @@ branch = %(branch)s
log("testnode, test_result : %r" % (test_result, )) log("testnode, test_result : %r" % (test_result, ))
if test_result is not None: if test_result is not None:
log_file_name = self.addWatcher(test_result) log_file_name = self.addWatcher(test_result)
self.checkRevision(test_result,node_test_suite,vcs_repository_list) self.checkRevision(test_result,node_test_suite)
# Now prepare the installation of SlapOS and create instance # Now prepare the installation of SlapOS and create instance
status_dict = self.prepareSlapOSForTestSuite(node_test_suite) status_dict = self.prepareSlapOSForTestSuite(node_test_suite)
# Give some time so computer partitions may start # Give some time so computer partitions may start
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment