Browse Source

[2856] Add state transition test helpers, and extend complete_update() tests

Mukund Sivaraman 12 years ago
parent
commit
c6e820b307

+ 16 - 12
src/lib/python/isc/memmgr/datasrc_info.py

@@ -67,25 +67,29 @@ class SegmentInfo:
     def get_events(self):
         return self.__events
 
+    def __sync_reader_helper(self, new_state):
+        if len(self.__old_readers) == 0:
+            self.__state = new_state
+            if len(self.__events) > 0:
+                e = self.__events[0]
+                del self.__events[0]
+                return e
+
+        return None
+
     def complete_update(self):
         if self.__state == self.UPDATING:
             self.__state = self.SYNCHRONIZING
+            self.__old_readers.update(self.__readers)
+            self.__readers.clear()
+            return self.__sync_reader_helper(self.SYNCHRONIZING)
         elif self.__state == self.COPYING:
             self.__state = self.READY
+            return None
         else:
             raise SegmentInfoError('complete_update() called in ' +
                                    'incorrect state: ' + str(self.__state))
 
-    def __sync_reader_helper(self):
-        if len(self.__old_readers) == 0:
-            self.__state = self.COPYING
-            if len(self.__events) > 0:
-                e = self.__events[0]
-                del self.__events[0]
-                return e
-
-        return None
-
     def sync_reader(self, reader_session_id):
         if self.__state != self.SYNCHRONIZING:
             raise SegmentInfoError('sync_reader() called in ' +
@@ -100,7 +104,7 @@ class SegmentInfo:
         self.__old_readers.remove(reader_session_id)
         self.__readers.add(reader_session_id)
 
-        return self.__sync_reader_helper()
+        return self.__sync_reader_helper(self.COPYING)
 
     def remove_reader(self, reader_session_id):
         if self.__state != self.SYNCHRONIZING:
@@ -108,7 +112,7 @@ class SegmentInfo:
                                    'incorrect state: ' + str(self.__state))
         if reader_session_id in self.__old_readers:
             self.__old_readers.remove(reader_session_id)
-            return self.__sync_reader_helper()
+            return self.__sync_reader_helper(self.COPYING)
         elif reader_session_id in self.__readers:
             self.__readers.remove(reader_session_id)
             return None

+ 46 - 1
src/lib/python/isc/memmgr/tests/datasrc_info_tests.py

@@ -65,9 +65,54 @@ class TestSegmentInfo(unittest.TestCase):
         self.assertEqual(len(self.__sgmt_info.get_old_readers()), 0)
         self.assertEqual(len(self.__sgmt_info.get_events()), 0)
 
-    def test_complete_update_when_ready(self):
+    def __si_to_ready_state(self):
+        # Go to a default starting state
+        self.__sgmt_info = SegmentInfo.create('mapped', 0, RRClass.IN,
+                                              'sqlite3',
+                                              {'mapped_file_dir':
+                                                   self.__mapped_file_dir})
+        self.assertEqual(self.__sgmt_info.get_state(), SegmentInfo.READY)
+
+    def __si_to_updating_state(self):
+        self.__si_to_ready_state()
+        self.__sgmt_info.add_reader(3)
+        self.__sgmt_info.add_event((42,))
+        e = self.__sgmt_info.start_update()
+        self.assertTupleEqual(e, (42,))
+        self.assertSetEqual(self.__sgmt_info.get_readers(), {3})
+        self.assertEqual(self.__sgmt_info.get_state(), SegmentInfo.UPDATING)
+
+    def __si_to_synchronizing_state(self):
+        self.__si_to_updating_state()
+        self.__sgmt_info.complete_update()
+        self.assertEqual(self.__sgmt_info.get_state(), SegmentInfo.SYNCHRONIZING)
+
+    def __si_to_copying_state(self):
+        self.__si_to_synchronizing_state()
+        self.__sgmt_info.sync_reader(3)
+        self.assertEqual(self.__sgmt_info.get_state(), SegmentInfo.COPYING)
+
+    def test_complete_update(self):
+        # in READY state
+        self.__si_to_ready_state()
         self.assertRaises(SegmentInfoError, self.__sgmt_info.complete_update)
 
+        # in UPDATING state this is the same as calling
+        # self.__si_to_synchronizing_state(), but let's try to be
+        # descriptive
+        self.__si_to_updating_state()
+        self.__sgmt_info.complete_update()
+        self.assertEqual(self.__sgmt_info.get_state(), SegmentInfo.SYNCHRONIZING)
+
+        # in SYNCHRONIZING state
+        self.__si_to_synchronizing_state()
+        self.assertRaises(SegmentInfoError, self.__sgmt_info.complete_update)
+
+        # in COPYING state
+        self.__si_to_copying_state()
+        self.__sgmt_info.complete_update()
+        self.assertEqual(self.__sgmt_info.get_state(), SegmentInfo.READY)
+
     def test_sync_reader_when_ready(self):
         self.assertRaises(SegmentInfoError, self.__sgmt_info.sync_reader, (None))