From 74db37c06aaaabdc2611d8e9736c997b2666a8e5 Mon Sep 17 00:00:00 2001
From: Thomas Thrainer <thomasth@google.com>
Date: Mon, 29 Apr 2013 14:02:39 +0200
Subject: [PATCH] Add test for version dispatching code

Based on the version of DRBD (as reported through /proc/drbd), the DRBD8
class chooses helper objects which adapt for the differences between
DRBD <= 8.3 and DRBD 8.4. This new test verifies that the proper objects
are created.

Signed-off-by: Thomas Thrainer <thomasth@google.com>
Signed-off-by: Michele Tartara <mtartara@google.com>
Reviewed-by: Michele Tartara <mtartara@google.com>
---
 test/py/ganeti.block.drbd_unittest.py | 42 +++++++++++++++++++++++++++
 test/py/testutils.py                  | 15 ++++++++++
 2 files changed, 57 insertions(+)

diff --git a/test/py/ganeti.block.drbd_unittest.py b/test/py/ganeti.block.drbd_unittest.py
index cc30a09c6..87b3d0310 100755
--- a/test/py/ganeti.block.drbd_unittest.py
+++ b/test/py/ganeti.block.drbd_unittest.py
@@ -375,5 +375,47 @@ class TestDRBD8Status(testutils.GanetiTestCase):
                       filename=self.proc80ev_data)
 
 
+class TestDRBD8Construction(testutils.GanetiTestCase):
+  def setUp(self):
+    """Read in txt data"""
+    testutils.GanetiTestCase.setUp(self)
+    self.proc80_info = \
+      drbd_info.DRBD8Info.CreateFromFile(
+        filename=testutils.TestDataFilename("proc_drbd8.txt"))
+    self.proc83_info = \
+      drbd_info.DRBD8Info.CreateFromFile(
+        filename=testutils.TestDataFilename("proc_drbd83.txt"))
+    self.proc84_info = \
+      drbd_info.DRBD8Info.CreateFromFile(
+        filename=testutils.TestDataFilename("proc_drbd84.txt"))
+
+    self.test_unique_id = ("hosta.com", 123, "host2.com", 123, 0, "secret")
+
+  @testutils.patch_object(drbd_info.DRBD8Info, "CreateFromFile")
+  def testConstructionWith80Data(self, mock_create_from_file):
+    mock_create_from_file.return_value = self.proc80_info
+
+    inst = drbd.DRBD8(self.test_unique_id, [], 123, {})
+    self.assertEqual(inst._show_info_cls, drbd_info.DRBD83ShowInfo)
+    self.assertTrue(isinstance(inst._cmd_gen, drbd_cmdgen.DRBD83CmdGenerator))
+
+  @testutils.patch_object(drbd_info.DRBD8Info, "CreateFromFile")
+  def testConstructionWith83Data(self, mock_create_from_file):
+    mock_create_from_file.return_value = self.proc83_info
+
+    inst = drbd.DRBD8(self.test_unique_id, [], 123, {})
+    self.assertEqual(inst._show_info_cls, drbd_info.DRBD83ShowInfo)
+    self.assertTrue(isinstance(inst._cmd_gen, drbd_cmdgen.DRBD83CmdGenerator))
+
+  @testutils.patch_object(drbd_info.DRBD8Info, "CreateFromFile")
+  def testConstructionWith84Data(self, mock_create_from_file):
+    mock_create_from_file.return_value = self.proc84_info
+
+    inst = drbd.DRBD8(self.test_unique_id, [], 123, {})
+    self.assertEqual(inst._show_info_cls, drbd_info.DRBD84ShowInfo)
+    # FIXME: add assertion for right class here!
+    self.assertEqual(inst._cmd_gen, None)
+
+
 if __name__ == "__main__":
   testutils.GanetiTestProgram()
diff --git a/test/py/testutils.py b/test/py/testutils.py
index 545939346..8249847f3 100644
--- a/test/py/testutils.py
+++ b/test/py/testutils.py
@@ -209,6 +209,21 @@ class GanetiTestCase(unittest.TestCase):
     return fname
 
 
+def patch_object(*args, **kwargs):
+  """Unified patch_object for various versions of Python Mock.
+
+  Different Python Mock versions provide incompatible versions of patching an
+  object. More recent versions use _patch_object, older ones used patch_object.
+  This function unifies the different variations.
+
+  """
+  import mock
+  try:
+    return mock._patch_object(*args, **kwargs)
+  except AttributeError:
+    return mock.patch_object(*args, **kwargs)
+
+
 def UnifyValueType(data):
   """Converts all tuples into lists.
 
-- 
GitLab