From e0be4c625260b588b2a5254f9185418656415f78 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?C=C3=A9dric=20Le=20Ninivin?= <cedric.leninivin@tiolive.com>
Date: Fri, 21 Sep 2012 12:09:14 +0200
Subject: [PATCH] Factored tests

---
 slapos/tests/slapgrid.py | 282 ++++++++++++++-------------------------
 1 file changed, 97 insertions(+), 185 deletions(-)

diff --git a/slapos/tests/slapgrid.py b/slapos/tests/slapgrid.py
index d64330075..8c6c3e24d 100644
--- a/slapos/tests/slapgrid.py
+++ b/slapos/tests/slapgrid.py
@@ -142,7 +142,7 @@ class MasterMixin(BasicMixin):
     os.mkdir(partition_path, 0750)
     return partition_path
 
-  def _bootstrap(self):
+  def _bootstrap(self, periodicity=None):
     os.mkdir(self.software_root)
     software_hash = slapos.grid.utils.getSoftwareUrlHash('http://sr/')
     srdir = os.path.join(self.software_root, software_hash)
@@ -154,8 +154,56 @@ class MasterMixin(BasicMixin):
     open(os.path.join(srbindir, 'buildout'), 'w').write("""#!/bin/sh
 touch worked""")
     os.chmod(os.path.join(srbindir, 'buildout'), 0755)
+    if periodicity is not None:
+      open(os.path.join(srdir, 'periodicity'), 'w').write(
+        """%s""" % (periodicity))
     return software_hash
 
+  def _server_response (self, _requested_state, timestamp=None):
+    def server_response(self_httplib, path, method, body, header):
+      parsed_url = urlparse.urlparse(path.lstrip('/'))
+      self.sequence.append(parsed_url.path)
+      if method == 'GET':
+        parsed_qs = urlparse.parse_qs(parsed_url.query)
+      else:
+        parsed_qs = urlparse.parse_qs(body)
+      if parsed_url.path == 'getFullComputerInformation' and \
+            'computer_id' in parsed_qs:
+        slap_computer = slapos.slap.Computer(parsed_qs['computer_id'][0])
+        slap_computer._software_release_list = []
+        partition = slapos.slap.ComputerPartition(parsed_qs['computer_id'][0],
+                                                  '0')
+        sr = slapos.slap.SoftwareRelease()
+        sr._software_release = 'http://sr/'
+        partition._software_release_document = sr
+        partition._requested_state = _requested_state
+        if not timestamp == None :
+          partition._parameter_dict = {'timestamp': timestamp}
+        slap_computer._computer_partition_list = [partition]
+        return (200, {}, xml_marshaller.xml_marshaller.dumps(slap_computer))
+      if parsed_url.path == 'availableComputerPartition' and \
+            method == 'POST' and 'computer_partition_id' in parsed_qs:
+        return (200, {}, '')
+      if parsed_url.path == 'startedComputerPartition' and \
+            method == 'POST' and 'computer_partition_id' in parsed_qs:
+        self.assertEqual(parsed_qs['computer_partition_id'][0], '0')
+        self.started = True
+        return (200, {}, '')
+      if parsed_url.path == 'stoppedComputerPartition' and \
+            method == 'POST' and 'computer_partition_id' in parsed_qs:
+        self.assertEqual(parsed_qs['computer_partition_id'][0], '0')
+        self.stopped = True
+        return (200, {}, '')
+      if parsed_url.path == 'softwareInstanceError' and \
+            method == 'POST' and 'computer_partition_id' in parsed_qs:
+        self.error = True
+        self.assertEqual(parsed_qs['computer_partition_id'][0], '0')
+        return (200, {}, '')
+      else:
+        return (404, {}, '')
+
+    return server_response
+
   def setUp(self):
     self._patchHttplib()
     self._mock_sleep()
@@ -167,52 +215,6 @@ touch worked""")
     BasicMixin.tearDown(self)
 
 
-def _server_response (self_test, _requested_state, timestamp=None):
-  def server_response(self_httplib, path, method, body, header):
-    parsed_url = urlparse.urlparse(path.lstrip('/'))
-    self_test.sequence.append(parsed_url.path)
-    if method == 'GET':
-      parsed_qs = urlparse.parse_qs(parsed_url.query)
-    else:
-      parsed_qs = urlparse.parse_qs(body)
-    if parsed_url.path == 'getFullComputerInformation' and \
-          'computer_id' in parsed_qs:
-      slap_computer = slapos.slap.Computer(parsed_qs['computer_id'][0])
-      slap_computer._software_release_list = []
-      partition = slapos.slap.ComputerPartition(parsed_qs['computer_id'][0],
-                                                '0')
-      sr = slapos.slap.SoftwareRelease()
-      sr._software_release = 'http://sr/'
-      partition._software_release_document = sr
-      partition._requested_state = _requested_state
-      if not timestamp == None :
-        partition._parameter_dict = {'timestamp': timestamp}
-      slap_computer._computer_partition_list = [partition]
-      return (200, {}, xml_marshaller.xml_marshaller.dumps(slap_computer))
-    if parsed_url.path == 'availableComputerPartition' and \
-          method == 'POST' and 'computer_partition_id' in parsed_qs:
-      return (200, {}, '')
-    if parsed_url.path == 'startedComputerPartition' and \
-          method == 'POST' and 'computer_partition_id' in parsed_qs:
-      self_test.assertEqual(parsed_qs['computer_partition_id'][0], '0')
-      self_test.started = True
-      return (200, {}, '')
-    if parsed_url.path == 'stoppedComputerPartition' and \
-          method == 'POST' and 'computer_partition_id' in parsed_qs:
-      self_test.assertEqual(parsed_qs['computer_partition_id'][0], '0')
-      self_test.stopped = True
-      return (200, {}, '')
-    if parsed_url.path == 'softwareInstanceError' and \
-          method == 'POST' and 'computer_partition_id' in parsed_qs:
-      self_test.error = True
-      self_test.assertEqual(parsed_qs['computer_partition_id'][0], '0')
-      return (200, {}, '')
-    else:
-      return (404, {}, '')
-
-  return server_response
-
-
 class TestSlapgridCPWithMaster(MasterMixin, unittest.TestCase):
 
   def test_nothing_to_do(self):
@@ -238,8 +240,8 @@ class TestSlapgridCPWithMaster(MasterMixin, unittest.TestCase):
 
   def test_one_partition(self):
     self.sequence = []
-    httplib.HTTPConnection._callback = _server_response(self,
-      _requested_state='stopped')
+    httplib.HTTPConnection._callback = \
+        self._server_response(_requested_state='stopped')
 
     os.mkdir(self.software_root)
     os.mkdir(self.instance_root)
@@ -273,8 +275,8 @@ touch worked""")
     "template.cfg" but "instance.cfg".
     """
     self.sequence = []
-    httplib.HTTPConnection._callback = _server_response(self,
-      _requested_state='stopped')
+    httplib.HTTPConnection._callback = \
+        self._server_response(_requested_state='stopped')
 
     os.mkdir(self.software_root)
     os.mkdir(self.instance_root)
@@ -332,7 +334,7 @@ touch worked""")
   def test_one_partition_started(self):
     self.sequence = []
     self.started = False
-    httplib.HTTPConnection._callback = _server_response(self,'started')
+    httplib.HTTPConnection._callback = self._server_response('started')
     os.mkdir(self.software_root)
     os.mkdir(self.instance_root)
     partition_path = os.path.join(self.instance_root, '0')
@@ -370,7 +372,7 @@ touch worked""")
   def test_one_partition_started_stopped(self):
     self.started = True
     self.sequence = []
-    httplib.HTTPConnection._callback = _server_response(self,'started')
+    httplib.HTTPConnection._callback = self._server_response('started')
 
     os.mkdir(self.software_root)
     os.mkdir(self.instance_root)
@@ -426,7 +428,7 @@ chmod 755 etc/run/wrapper
     self.stopped = False
     self.sequence = []
     self.setSlapgrid()
-    httplib.HTTPConnection._callback = _server_response(self,'stopped')
+    httplib.HTTPConnection._callback = self._server_response('stopped')
 
     self.assertTrue(self.grid.processComputerPartitionList())
     self.assertSortedListEqual(os.listdir(self.instance_root), ['0', 'etc',
@@ -451,7 +453,7 @@ chmod 755 etc/run/wrapper
   def test_one_partition_stopped_started(self):
     self.stopped = False
     self.sequence = []
-    httplib.HTTPConnection._callback = _server_response(self,'stopped')
+    httplib.HTTPConnection._callback = self._server_response('stopped')
 
     os.mkdir(self.software_root)
     os.mkdir(self.instance_root)
@@ -481,7 +483,7 @@ chmod 755 etc/run/wrapper
 
     self.started = False
     self.sequence = []
-    httplib.HTTPConnection._callback = _server_response(self,'started')
+    httplib.HTTPConnection._callback = self._server_response('started')
 
     self.setSlapgrid()
     self.assertTrue(self.grid.processComputerPartitionList())
@@ -505,6 +507,7 @@ chmod 755 etc/run/wrapper
                       'startedComputerPartition'])
     self.assertTrue(self.started)
 
+
 class TestSlapgridCPPartitionProcessing (MasterMixin, unittest.TestCase):
 
   def test_partition_timestamp(self):
@@ -512,23 +515,12 @@ class TestSlapgridCPPartitionProcessing (MasterMixin, unittest.TestCase):
     self.sequence = []
     self.timestamp = str(int(time.time()))
     self.started = False
-    httplib.HTTPConnection._callback = _server_response(
-        self, 'stopped', self.timestamp)
+    httplib.HTTPConnection._callback = \
+        self._server_response('stopped', self.timestamp)
+
+    partition_path = self._create_instance()
+    software_hash = self._bootstrap()
 
-    os.mkdir(self.software_root)
-    os.mkdir(self.instance_root)
-    partition_path = os.path.join(self.instance_root, '0')
-    os.mkdir(partition_path, 0750)
-    software_hash = slapos.grid.utils.getSoftwareUrlHash('http://sr/')
-    srdir = os.path.join(self.software_root, software_hash)
-    os.mkdir(srdir)
-    open(os.path.join(srdir, 'template.cfg'), 'w').write(
-      """[buildout]""")
-    srbindir = os.path.join(srdir, 'bin')
-    os.mkdir(srbindir)
-    open(os.path.join(srbindir, 'buildout'), 'w').write("""#!/bin/sh
-touch worked""")
-    os.chmod(os.path.join(srbindir, 'buildout'), 0755)
     self.assertTrue(self.grid.processComputerPartitionList())
     self.assertSortedListEqual(os.listdir(self.instance_root), ['0', 'etc',
       'var'])
@@ -554,22 +546,10 @@ touch worked""")
     self.sequence = []
     self.timestamp = str(int(time.time()))
     self.started = False
-    httplib.HTTPConnection._callback = _server_response(
-        self, 'stopped', self.timestamp)
-    os.mkdir(self.software_root)
-    os.mkdir(self.instance_root)
-    partition_path = os.path.join(self.instance_root, '0')
-    os.mkdir(partition_path, 0750)
-    software_hash = slapos.grid.utils.getSoftwareUrlHash('http://sr/')
-    srdir = os.path.join(self.software_root, software_hash)
-    os.mkdir(srdir)
-    open(os.path.join(srdir, 'template.cfg'), 'w').write(
-      """[buildout]""")
-    srbindir = os.path.join(srdir, 'bin')
-    os.mkdir(srbindir)
-    open(os.path.join(srbindir, 'buildout'), 'w').write("""#!/bin/sh
-touch worked""")
-    os.chmod(os.path.join(srbindir, 'buildout'), 0755)
+    httplib.HTTPConnection._callback = \
+        self._server_response('stopped', self.timestamp)
+    partition_path = self._create_instance()
+    software_hash = self._bootstrap()
     self.assertTrue(self.grid.processComputerPartitionList())
     self.assertSortedListEqual(os.listdir(self.instance_root), ['0', 'etc',
       'var'])
@@ -596,23 +576,12 @@ touch worked""")
     self.sequence = []
     self.timestamp = str(int(time.time()))
     self.started = False
-    httplib.HTTPConnection._callback = _server_response(
-        self,'stopped', self.timestamp)
+    httplib.HTTPConnection._callback = \
+        self._server_response('stopped', self.timestamp)
+
+    partition_path = self._create_instance()
+    software_hash = self._bootstrap()
 
-    os.mkdir(self.software_root)
-    os.mkdir(self.instance_root)
-    partition_path = os.path.join(self.instance_root, '0')
-    os.mkdir(partition_path, 0750)
-    software_hash = slapos.grid.utils.getSoftwareUrlHash('http://sr/')
-    srdir = os.path.join(self.software_root, software_hash)
-    os.mkdir(srdir)
-    open(os.path.join(srdir, 'template.cfg'), 'w').write(
-      """[buildout]""")
-    srbindir = os.path.join(srdir, 'bin')
-    os.mkdir(srbindir)
-    open(os.path.join(srbindir, 'buildout'), 'w').write("""#!/bin/sh
-touch worked""")
-    os.chmod(os.path.join(srbindir, 'buildout'), 0755)
     self.assertTrue(self.grid.processComputerPartitionList())
     self.assertSortedListEqual(os.listdir(self.instance_root), ['0', 'etc',
       'var'])
@@ -623,8 +592,8 @@ touch worked""")
       [software_hash])
 
     self.setSlapgrid()
-    httplib.HTTPConnection._callback = _server_response(
-        self, 'stopped', str(int(self.timestamp)-1))
+    httplib.HTTPConnection._callback = \
+        self._server_response('stopped', str(int(self.timestamp)-1))
     self.assertTrue(self.grid.processComputerPartitionList())
     self.assertEqual(self.sequence,
                      ['getFullComputerInformation', 'availableComputerPartition',
@@ -637,23 +606,11 @@ touch worked""")
     self.sequence = []
     self.timestamp = str(int(time.time()))
     self.started = False
-    httplib.HTTPConnection._callback = _server_response(self,
+    httplib.HTTPConnection._callback = self._server_response(
                                                         'stopped',
                                                         self.timestamp)
-    os.mkdir(self.software_root)
-    os.mkdir(self.instance_root)
-    partition_path = os.path.join(self.instance_root, '0')
-    os.mkdir(partition_path, 0750)
-    software_hash = slapos.grid.utils.getSoftwareUrlHash('http://sr/')
-    srdir = os.path.join(self.software_root, software_hash)
-    os.mkdir(srdir)
-    open(os.path.join(srdir, 'template.cfg'), 'w').write(
-      """[buildout]""")
-    srbindir = os.path.join(srdir, 'bin')
-    os.mkdir(srbindir)
-    open(os.path.join(srbindir, 'buildout'), 'w').write("""#!/bin/sh
-touch worked""")
-    os.chmod(os.path.join(srbindir, 'buildout'), 0755)
+    partition_path = self._create_instance()
+    software_hash = self._bootstrap()
     self.assertTrue(self.grid.processComputerPartitionList())
     self.assertSortedListEqual(os.listdir(self.instance_root), ['0', 'etc',
       'var'])
@@ -662,9 +619,8 @@ touch worked""")
                                ['.timestamp','worked', 'buildout.cfg'])
     self.assertSortedListEqual(os.listdir(self.software_root),
       [software_hash])
-    httplib.HTTPConnection._callback = _server_response(self,
-                                                        'stopped',
-                                                        str(int(self.timestamp)+1))
+    httplib.HTTPConnection._callback = \
+        self._server_response('stopped',str(int(self.timestamp)+1))
     self.setSlapgrid()
     self.assertTrue(self.grid.processComputerPartitionList())
     self.setSlapgrid()
@@ -680,23 +636,11 @@ touch worked""")
     self.sequence = []
     self.timestamp = str(int(time.time()))
     self.started = False
-    httplib.HTTPConnection._callback = _server_response(self,
-                                                        'stopped',
-                                                        self.timestamp)
-    os.mkdir(self.software_root)
-    os.mkdir(self.instance_root)
-    partition_path = os.path.join(self.instance_root, '0')
-    os.mkdir(partition_path, 0750)
-    software_hash = slapos.grid.utils.getSoftwareUrlHash('http://sr/')
-    srdir = os.path.join(self.software_root, software_hash)
-    os.mkdir(srdir)
-    open(os.path.join(srdir, 'template.cfg'), 'w').write(
-      """[buildout]""")
-    srbindir = os.path.join(srdir, 'bin')
-    os.mkdir(srbindir)
-    open(os.path.join(srbindir, 'buildout'), 'w').write("""#!/bin/sh
-touch worked""")
-    os.chmod(os.path.join(srbindir, 'buildout'), 0755)
+    httplib.HTTPConnection._callback = \
+        self._server_response('stopped',self.timestamp)
+    partition_path = self._create_instance()
+    software_hash = self._bootstrap()
+
     self.assertTrue(self.grid.processComputerPartitionList())
     self.assertSortedListEqual(os.listdir(self.instance_root), ['0', 'etc',
       'var'])
@@ -705,8 +649,7 @@ touch worked""")
                                ['.timestamp','worked', 'buildout.cfg'])
     self.assertSortedListEqual(os.listdir(self.software_root),
       [software_hash])
-    httplib.HTTPConnection._callback = _server_response(self,
-                                                        'stopped')
+    httplib.HTTPConnection._callback = self._server_response('stopped')
     self.setSlapgrid()
     self.assertTrue(self.grid.processComputerPartitionList())
     self.assertEqual(self.sequence,
@@ -732,26 +675,10 @@ touch worked""")
     unwanted_periodicity = 2
     self.grid.force_periodicity = True
 
-    httplib.HTTPConnection._callback = _server_response(self,
-                                                        'stopped',
-                                                        self.timestamp)
-    os.mkdir(self.software_root)
-    os.mkdir(self.instance_root)
-    partition_path = os.path.join(self.instance_root, '0')
-    os.mkdir(partition_path, 0750)
-    software_hash = slapos.grid.utils.getSoftwareUrlHash('http://sr/')
-    srdir = os.path.join(self.software_root, software_hash)
-    os.mkdir(srdir)
-    open(os.path.join(srdir, 'template.cfg'), 'w').write(
-      """[buildout]""")
-    srbindir = os.path.join(srdir, 'bin')
-    os.mkdir(srbindir)
-    open(os.path.join(srbindir, 'buildout'), 'w').write("""#!/bin/sh
-touch worked""")
-    os.chmod(os.path.join(srbindir, 'buildout'), 0755)
-
-    open(os.path.join(srdir, 'periodicity'), 'w').write(
-      """%s""" % (unwanted_periodicity))
+    httplib.HTTPConnection._callback = \
+        self._server_response('stopped',self.timestamp)
+    partition_path = self._create_instance()
+    software_hash = self._bootstrap(periodicity = unwanted_periodicity)
 
     self.assertTrue(self.grid.processComputerPartitionList())
     time.sleep(unwanted_periodicity + 1)
@@ -782,25 +709,10 @@ touch worked""")
     self.timestamp = str(int(time.time()-5))
     self.started = False
     wanted_periodicity = 3
-    httplib.HTTPConnection._callback = _server_response(self,
-                                                        'stopped',
-                                                        self.timestamp)
-    os.mkdir(self.software_root)
-    os.mkdir(self.instance_root)
-    partition_path = os.path.join(self.instance_root, '0')
-    os.mkdir(partition_path, 0750)
-    software_hash = slapos.grid.utils.getSoftwareUrlHash('http://sr/')
-    srdir = os.path.join(self.software_root, software_hash)
-    os.mkdir(srdir)
-    open(os.path.join(srdir, 'template.cfg'), 'w').write(
-      """[buildout]""")
-    open(os.path.join(srdir, 'periodicity'), 'w').write(
-      """%s""" % wanted_periodicity)
-    srbindir = os.path.join(srdir, 'bin')
-    os.mkdir(srbindir)
-    open(os.path.join(srbindir, 'buildout'), 'w').write("""#!/bin/sh
-touch worked""")
-    os.chmod(os.path.join(srbindir, 'buildout'), 0755)
+    httplib.HTTPConnection._callback = \
+        self._server_response('stopped', self.timestamp)
+    partition_path = self._create_instance()
+    software_hash = self._bootstrap(periodicity=wanted_periodicity)
     self.assertTrue(self.grid.processComputerPartitionList())
     self.assertNotEqual(wanted_periodicity,self.grid.maximum_periodicity)
     self.setSlapgrid()
@@ -842,7 +754,7 @@ class TestSlapgridUsageReport(MasterMixin, unittest.TestCase):
     # Start the instance
     self.sequence = []
     self.started = False
-    httplib.HTTPConnection._callback = _server_response(self, 'started')
+    httplib.HTTPConnection._callback = self._server_response('started')
     open(os.path.join(srbindir, 'buildout'), 'w').write(WRAPPER_CONTENT)
     os.chmod(os.path.join(srbindir, 'buildout'), 0755)
     self.assertTrue(self.grid.processComputerPartitionList())
@@ -868,7 +780,7 @@ class TestSlapgridUsageReport(MasterMixin, unittest.TestCase):
 
     # Then destroy the instance
     self.sequence = []
-    httplib.HTTPConnection._callback = _server_response(self, 'destroyed')
+    httplib.HTTPConnection._callback = self._server_response('destroyed')
     self.assertTrue(self.grid.agregateAndSendUsage())
     # Assert partition directory is empty
     self.assertSortedListEqual(os.listdir(self.instance_root),
@@ -913,7 +825,7 @@ class TestSlapgridUsageReport(MasterMixin, unittest.TestCase):
     # Start the instance
     self.sequence = []
     self.started = False
-    httplib.HTTPConnection._callback = _server_response(self, 'started')
+    httplib.HTTPConnection._callback = self._server_response('started')
     open(os.path.join(srbindir, 'buildout'), 'w').write(WRAPPER_CONTENT)
     os.chmod(os.path.join(srbindir, 'buildout'), 0755)
     self.assertTrue(self.grid.processComputerPartitionList())
-- 
2.30.9