Test if _ApplyContainerMods works properly in attach/detach scenarios.

Signed-off-by: Alex Pyrgiotis <[email protected]>

diff --git a/test/py/cmdlib/instance_unittest.py 
b/test/py/cmdlib/instance_unittest.py
index dea01a1..f19fa4c 100644
--- a/test/py/cmdlib/instance_unittest.py
+++ b/test/py/cmdlib/instance_unittest.py
@@ -1023,6 +1023,98 @@ class TestIndexOperations(unittest.TestCase):
 
 
 class TestApplyContainerMods(unittest.TestCase):
+
+  def applyAndAssert(self, container, inp, expected_container,
+                     expected_chgdesc=[]):
+    """Apply a list of changes to a container and check the container state
+
+    Parameters:
+    @type container: List
+    @param container: The container on which we will apply the changes
+    @type inp: List<(action, index, object)>
+    @param inp: The list of changes, a tupple with three elements:
+                i. action, e.g. constants.DDM_ADD
+                ii. index, e.g. -1, 0, 10
+                iii. object (any type)
+    @type expected: List
+    @param expected: The expected state of the container
+    @type chgdesc: List
+    @param chgdesc: List of applied changes
+
+
+    """
+    chgdesc = []
+    mods = instance_utils.PrepareContainerMods(inp, None)
+    instance_utils.ApplyContainerMods("test", container, chgdesc, mods,
+                                      None, None, None, None, None)
+    self.assertEqual(container, expected_container)
+    self.assertEqual(chgdesc, expected_chgdesc)
+
+  def _insertContainerSuccessFn(self, op):
+    container = []
+    inp = [(op, -1, "Hello"),
+           (op, -1, "World"),
+           (op, 0, "Start"),
+           (op, -1, "End"),
+           ]
+    expected = ["Start", "Hello", "World", "End"]
+    self.applyAndAssert(container, inp, expected)
+
+    inp = [(op, 0, "zero"),
+           (op, 3, "Added"),
+           (op, 5, "four"),
+           (op, 7, "xyz"),
+           ]
+    expected = ["zero", "Start", "Hello", "Added", "World", "four", "End",
+                "xyz"]
+    self.applyAndAssert(container, inp, expected)
+
+  def _insertContainerErrorFn(self, op):
+    container = []
+    expected = None
+
+    inp = [(op, 1, "error"), ]
+    self.assertRaises(IndexError, self.applyAndAssert, container, inp,
+                      expected)
+
+    inp = [(op, -2, "error"), ]
+    self.assertRaises(IndexError, self.applyAndAssert, container, inp,
+                      expected)
+
+  def _extractContainerSuccessFn(self, op):
+    container = ["item1", "item2", "item3", "item4", "item5"]
+    inp = [(op, -1, None),
+           (op, -0, None),
+           (op, 1, None),
+           ]
+    expected = ["item2", "item4"]
+    chgdesc = [('test/4', op),
+               ('test/0', op),
+               ('test/1', op)
+               ]
+    self.applyAndAssert(container, inp, expected, chgdesc)
+
+  def _extractContainerErrorFn(self, op):
+    container = []
+    expected = None
+
+    inp = [(op, 0, None), ]
+    self.assertRaises(IndexError, self.applyAndAssert, container, inp,
+                      expected)
+
+    inp = [(op, -1, None), ]
+    self.assertRaises(IndexError, self.applyAndAssert, container, inp,
+                      expected)
+
+    inp = [(op, 2, None), ]
+    self.assertRaises(IndexError, self.applyAndAssert, container, inp,
+                      expected)
+    container = [""]
+    inp = [(op, 0, None), ]
+    expected = None
+    self.assertRaises(AssertionError, self.applyAndAssert, container, inp,
+                      expected)
+
   def testEmptyContainer(self):
     container = []
     chgdesc = []
@@ -1031,77 +1123,29 @@ class TestApplyContainerMods(unittest.TestCase):
     self.assertEqual(container, [])
     self.assertEqual(chgdesc, [])
 
-  def testAdd(self):
-    container = []
-    chgdesc = []
-    mods = instance_utils.PrepareContainerMods([
-      (constants.DDM_ADD, -1, "Hello"),
-      (constants.DDM_ADD, -1, "World"),
-      (constants.DDM_ADD, 0, "Start"),
-      (constants.DDM_ADD, -1, "End"),
-      ], None)
-instance_utils.ApplyContainerMods("test", container, chgdesc, mods,
-                                  None, None, None, None, None)
-    self.assertEqual(container, ["Start", "Hello", "World", "End"])
-    self.assertEqual(chgdesc, [])
+  def testAddSuccess(self):
+    self._insertContainerSuccessFn(constants.DDM_ADD)
 
-    mods = instance_utils.PrepareContainerMods([
-      (constants.DDM_ADD, 0, "zero"),
-      (constants.DDM_ADD, 3, "Added"),
-      (constants.DDM_ADD, 5, "four"),
-      (constants.DDM_ADD, 7, "xyz"),
-      ], None)
-instance_utils.ApplyContainerMods("test", container, chgdesc, mods,
-                                  None, None, None, None, None)
-    self.assertEqual(container,
-                     ["zero", "Start", "Hello", "Added", "World", "four",
-                      "End", "xyz"])
-    self.assertEqual(chgdesc, [])
+  def testAddError(self):
+    self._insertContainerErrorFn(constants.DDM_ADD)
 
-    for idx in [-2, len(container) + 1]:
-      mods = instance_utils.PrepareContainerMods([
-        (constants.DDM_ADD, idx, "error"),
-        ], None)
-      self.assertRaises(IndexError, instance_utils.ApplyContainerMods,
-                        "test", container, None, mods, None, None, None, None,
-                        None)
+  def testAttachSuccess(self):
+    self._insertContainerSuccessFn(constants.DDM_ATTACH)
 
-  def testRemoveError(self):
-    for idx in [0, 1, 2, 100, -1, -4]:
-      mods = instance_utils.PrepareContainerMods([
-        (constants.DDM_REMOVE, idx, None),
-        ], None)
-      self.assertRaises(IndexError, instance_utils.ApplyContainerMods,
-                        "test", [], None, mods, None, None, None, None, None)
+  def testAttachError(self):
+    self._insertContainerErrorFn(constants.DDM_ATTACH)
 
-    mods = instance_utils.PrepareContainerMods([
-      (constants.DDM_REMOVE, 0, object()),
-      ], None)
-    self.assertRaises(AssertionError, instance_utils.ApplyContainerMods,
-                      "test", [""], None, mods, None, None, None, None, None)
+  def testRemoveSuccess(self):
+    self._extractContainerSuccessFn(constants.DDM_REMOVE)
 
-  def testAddError(self):
-    for idx in range(-100, -1) + [100]:
-      mods = instance_utils.PrepareContainerMods([
-        (constants.DDM_ADD, idx, None),
-        ], None)
-      self.assertRaises(IndexError, instance_utils.ApplyContainerMods,
-                        "test", [], None, mods, None, None, None, None, None)
+  def testRemoveError(self):
+    self._extractContainerErrorFn(constants.DDM_REMOVE)
 
-  def testRemove(self):
-    container = ["item 1", "item 2"]
-    mods = instance_utils.PrepareContainerMods([
-      (constants.DDM_ADD, -1, "aaa"),
-      (constants.DDM_REMOVE, -1, None),
-      (constants.DDM_ADD, -1, "bbb"),
-      ], None)
-    chgdesc = []
-instance_utils.ApplyContainerMods("test", container, chgdesc, mods,
-                                  None, None, None, None, None)
-    self.assertEqual(container, ["item 1", "item 2", "bbb"])
-    self.assertEqual(chgdesc, [
-      ("test/2", "remove"),
-      ])
+  def testDetachSuccess(self):
+    self._extractContainerSuccessFn(constants.DDM_DETACH)
+
+  def testDetachError(self):
+    self._extractContainerErrorFn(constants.DDM_DETACH)
 
   def testModify(self):
     container = ["item 1", "item 2"]
@@ -1111,8 +1155,8 @@ instance_utils.ApplyContainerMods("test", container, 
chgdesc, mods,
       (constants.DDM_MODIFY, 1, "c"),
       ], None)
     chgdesc = []
-instance_utils.ApplyContainerMods("test", container, chgdesc, mods,
-                                  None, None, None, None, None)
+    instance_utils.ApplyContainerMods("test", container, chgdesc, mods,
+                                      None, None, None, None, None)
     self.assertEqual(container, ["item 1", "item 2"])
     self.assertEqual(chgdesc, [])
 
@@ -1132,6 +1176,13 @@ instance_utils.ApplyContainerMods("test", container, 
chgdesc, mods,
       ])
 
   @staticmethod
+  def _AttachTestFn(idx, params, private):
+    private.data = ("attach", idx, params)
+    return ((100 * idx, params), [
+      ("test/%s" % idx, hex(idx)),
+      ])
+
+  @staticmethod
   def _ModifyTestFn(idx, item, params, private):
     private.data = ("modify", idx, params)
     return [
@@ -1142,6 +1193,10 @@ instance_utils.ApplyContainerMods("test", container, 
chgdesc, mods,
   def _RemoveTestFn(idx, item, private):
     private.data = ("remove", idx, item)
 
+  @staticmethod
+  def _DetachTestFn(idx, item, private):
+    private.data = ("detach", idx, item)
+
   def testAddWithCreateFunction(self):
     container = []
     chgdesc = []
@@ -1154,14 +1209,17 @@ instance_utils.ApplyContainerMods("test", container, 
chgdesc, mods,
       (constants.DDM_MODIFY, -1, "foobar"),
       (constants.DDM_REMOVE, 2, None),
       (constants.DDM_ADD, 1, "More"),
+      (constants.DDM_DETACH, -1, None),
+      (constants.DDM_ATTACH, 0, "Hello"),
       ], mock.Mock)
     instance_utils.ApplyContainerMods("test", container, chgdesc, mods,
-                                      self._CreateTestFn, None, 
self._ModifyTestFn,
-                                      self._RemoveTestFn, None)
+                                      self._CreateTestFn, self._AttachTestFn,
+                                      self._ModifyTestFn, self._RemoveTestFn,
+                                      self._DetachTestFn)
     self.assertEqual(container, [
+      (000, "Hello"),
       (000, "Start"),
       (100, "More"),
-      (000, "Hello"),
       ])
     self.assertEqual(chgdesc, [
       ("test/0", "0x0"),
@@ -1171,7 +1229,9 @@ instance_utils.ApplyContainerMods("test", container, 
chgdesc, mods,
       ("test/2", "remove"),
       ("test/2", "modify foobar"),
       ("test/2", "remove"),
-      ("test/1", "0x1")
+      ("test/1", "0x1"),
+      ("test/2", "detach"),
+      ("test/0", "0x0"),
       ])
     self.assertTrue(compat.all(op == private.data[0]
                                for (op, _, _, private) in mods))
@@ -1184,6 +1244,8 @@ instance_utils.ApplyContainerMods("test", container, 
chgdesc, mods,
       ("modify", 2, "foobar"),
       ("remove", 2, (300, "End")),
       ("add", 1, "More"),
+      ("detach", 2, (000, "Hello")),
+      ("attach", 0, "Hello"),
       ])
 
 
-- 
1.7.10.4

Reply via email to