From dcbd597fa6a11ec24365e961ca51a0cb37b847ee Mon Sep 17 00:00:00 2001
From: Sebastien Robin <seb@nexedi.com>
Date: Tue, 30 Oct 2012 10:05:24 +0100
Subject: [PATCH] erp5testnode: unit test constructProfile

---
 erp5/tests/testERP5TestNode.py | 44 ++++++++++++++++++++++++++++++----
 erp5/util/testnode/testnode.py | 24 +++++++------------
 2 files changed, 48 insertions(+), 20 deletions(-)

diff --git a/erp5/tests/testERP5TestNode.py b/erp5/tests/testERP5TestNode.py
index a0989b0c63..882dc82d92 100644
--- a/erp5/tests/testERP5TestNode.py
+++ b/erp5/tests/testERP5TestNode.py
@@ -30,8 +30,12 @@ class ERP5TestNode(TestCase):
 
   def setUp(self):
     self._tempdir = tempfile.mkdtemp()
-    self.software_root = os.path.join(self._tempdir, 'software')
-    self.instance_root = os.path.join(self._tempdir, 'instance')
+    self.working_directory = os.path.join(self._tempdir, 'testnode')
+    self.slapos_directory = os.path.join(self._tempdir, 'slapos')
+    os.mkdir(self.working_directory)
+    os.mkdir(self.slapos_directory)
+    self.remote_repository1 = os.path.join(self._tempdir, 'rep1')
+    self.remote_repository2 = os.path.join(self._tempdir, 'rep2')
 
   def tearDown(self):
     shutil.rmtree(self._tempdir, True)
@@ -39,6 +43,19 @@ class ERP5TestNode(TestCase):
   def getTestNode(self):
     return TestNode(None, None)
 
+  def updateNodeTestSuiteData(self, node_test_suite):
+    node_test_suite.edit(working_directory=self.working_directory,
+        test_suite="Foo",
+        project_title="Foo",
+        test_suite_title="Foo-Test",
+        vcs_repository_list=[
+            {'url': self.remote_repository1,
+             'profile_path': 'software.cfg',
+             'branch': 'master'},
+            {'url': self.remote_repository2,
+             'buildout_section_id': 'foo',
+             'branch': 'master'}])
+
   def test_01_GetDelNodeTestSuite(self):
     """
     We should be able to get/delete NodeTestSuite objects inside test_node
@@ -58,8 +75,25 @@ class ERP5TestNode(TestCase):
     """
     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)
+    node_test_suite.edit(working_directory=self.working_directory)
+    self.assertEquals("%s/foo" % self.working_directory,
+                      node_test_suite.working_directory)
 
   def test_03_constructProfile(self):
-    pass
+    test_node = self.getTestNode()
+    node_test_suite = test_node.getNodeTestSuite('foo')
+    self.updateNodeTestSuiteData(node_test_suite)
+    test_node.constructProfile(node_test_suite)
+    self.assertEquals("%s/software.cfg" % (node_test_suite.working_directory,),
+                      node_test_suite.custom_profile_path)
+    profile = open(node_test_suite.custom_profile_path, 'r')
+    expected_profile = """
+[buildout]
+extends = %s/testnode/foo/rep1/software.cfg
+
+[foo]
+repository = %s/testnode/foo/foo
+branch = master
+""" % (self._tempdir, self._tempdir)
+    self.assertEquals(expected_profile, profile.read())
+    profile.close()
diff --git a/erp5/util/testnode/testnode.py b/erp5/util/testnode/testnode.py
index f29f8fd9db..dcc15a6487 100644
--- a/erp5/util/testnode/testnode.py
+++ b/erp5/util/testnode/testnode.py
@@ -69,6 +69,9 @@ class NodeTestSuite(SlapOSInstance):
     if kw.has_key("working_directory"):
       kw["working_directory"] = os.path.join(kw["working_directory"],
                                               self.reference)
+      SlapOSControler.createFolder(kw["working_directory"])
+      kw["custom_profile_path"] = os.path.join(kw['working_directory'],
+                                 'software.cfg')
     super(NodeTestSuite, self).edit(**kw)
 
 class TestNode(object):
@@ -81,7 +84,7 @@ class TestNode(object):
     # hack until slapos.cookbook is updated
     if self.config.get('working_directory', '').endswith("slapos/"):
       self.config['working_directory'] = self.config[
-        'working_directory'][:-(len("slapos/"))]
+        'working_directory'][:-(len("slapos/"))] + "/testnode"
 
   def checkOldTestSuite(self,test_suite_data):
     config = self.config
@@ -108,15 +111,6 @@ class TestNode(object):
     if self.node_test_suite_dict.has_key(reference):
       self.node_test_suite_dict.pop(reference)
 
-  def updateConfigForTestSuite(self, test_suite, node_test_suite):
-    config = self.config
-    node_test_suite.edit(**test_suite),
-    config['working_directory'] = os.path.join(config['slapos_directory'],
-                                           node_test_suite.reference)
-    SlapOSControler.createFolder(config['working_directory'])
-    custom_profile_path = os.path.join(config['working_directory'], 'software.cfg')
-    config['custom_profile_path'] = custom_profile_path
-
   def constructProfile(self, node_test_suite):
     config = self.config
     profile_content = ''
@@ -161,7 +155,7 @@ branch = %(branch)s
    'branch' : vcs_repository.get('branch','master')}
     if not profile_path_count:
       raise ValueError(PROFILE_PATH_KEY + ' not defined')
-    custom_profile = open(config['custom_profile_path'], 'w')
+    custom_profile = open(node_test_suite.custom_profile_path, 'w')
     custom_profile.write(profile_content)
     custom_profile.close()
     config['repository_path'] = repository_path
@@ -234,6 +228,8 @@ branch = %(branch)s
       working_directory, self.config, log=self.log, slapproxy_log=slapproxy_log,
       process_manager=self.process_manager, reset_software=reset_software,
       software_path_list=software_path_list)
+    self.process_manager.supervisord_pid_file = os.path.join(\
+         slapos_controler.instance_root, 'var', 'run', 'supervisord.pid')
     method_list= ["runSoftwareRelease"]
     if create_partition:
       method_list.append("runComputerPartition")
@@ -262,7 +258,7 @@ branch = %(branch)s
   def prepareSlapOSForTestSuite(self, node_test_suite):
     return self._prepareSlapOS(node_test_suite.working_directory,
               node_test_suite,
-              software_path_list=[self.config.get("custom_profile_path")])
+              software_path_list=[node_test_suite.custom_profile_path])
 
   def _dealShebang(self,run_test_suite_path):
     line = open(run_test_suite_path, 'r').readline()
@@ -346,10 +342,8 @@ branch = %(branch)s
                test_suite["test_suite_reference"])
             node_test_suite.edit(
                working_directory=self.config['working_directory'])
-            self.updateConfigForTestSuite(test_suite, node_test_suite)
+            node_test_suite.edit(**test_suite)
             run_software = True
-            self.process_manager.supervisord_pid_file = os.path.join(\
-                slapos_controler.instance_root, 'var', 'run', 'supervisord.pid')
             # Write our own software.cfg to use the local repository
             self.constructProfile(node_test_suite)
             # kill processes from previous loop if any
-- 
2.30.9