]> git.rkrishnan.org Git - tahoe-lafs/tahoe-lafs.git/commitdiff
introducer.py: add test coverage of _disconnected()
authorBrian Warner <warner@allmydata.com>
Wed, 19 Sep 2007 18:50:13 +0000 (11:50 -0700)
committerBrian Warner <warner@allmydata.com>
Wed, 19 Sep 2007 18:50:13 +0000 (11:50 -0700)
src/allmydata/introducer.py
src/allmydata/test/test_introducer.py

index caf72969151db2f5283f6249ecadf3010c240428..2afe893aaa921c14e01fd003a5324254c3fe40b4 100644 (file)
@@ -117,6 +117,7 @@ class IntroducerClient(service.Service, Referenceable):
         introducer.notifyOnDisconnect(self._disconnected)
 
     def _disconnected(self):
+        self.log("bummer, we've lost our connection to the introducer")
         self._connected = False
 
     def notify_on_new_connection(self, cb):
index b63b79ca49e4707fd9ca5dbef57b4d097b995869..11a9a038f1d672df246622c618515f3c18794092 100644 (file)
@@ -15,7 +15,7 @@ class MyNode(Referenceable):
 
 class LoggingMultiService(service.MultiService):
     def log(self, msg):
-        pass
+        log.msg(msg)
 
 class TestIntroducer(unittest.TestCase, testutil.PollMixin):
     def setUp(self):
@@ -83,10 +83,13 @@ class TestIntroducer(unittest.TestCase, testutil.PollMixin):
 
         # d will fire once everybody is connected
 
-        def _check(res):
-            log.msg("doing _check")
+        def _check1(res):
+            log.msg("doing _check1")
             for c in clients:
                 self.failUnlessEqual(len(c.connections), NUMCLIENTS)
+                self.failUnless(c._connected) # to the introducer
+        d.addCallback(_check1)
+        def _disconnect_somebody_else(res):
             # now disconnect somebody's connection to someone else
             self.waiting_for_connections = 2
             d2 = self._done_counting = defer.Deferred()
@@ -100,11 +103,13 @@ class TestIntroducer(unittest.TestCase, testutil.PollMixin):
             victim.tracker.broker.transport.loseConnection()
             log.msg(" did disconnect")
             return d2
-        d.addCallback(_check)
-        def _check_again(res):
-            log.msg("doing _check_again")
+        d.addCallback(_disconnect_somebody_else)
+        def _check2(res):
+            log.msg("doing _check2")
             for c in clients:
                 self.failUnlessEqual(len(c.connections), NUMCLIENTS)
+        d.addCallback(_check2)
+        def _disconnect_yourself(res):
             # now disconnect somebody's connection to themselves. This will
             # only result in one new connection, since it is a loopback.
             self.waiting_for_connections = 1
@@ -119,13 +124,27 @@ class TestIntroducer(unittest.TestCase, testutil.PollMixin):
             victim.tracker.broker.transport.loseConnection()
             log.msg(" did disconnect")
             return d2
-        d.addCallback(_check_again)
-        def _check_again2(res):
-            log.msg("doing _check_again2")
+        d.addCallback(_disconnect_yourself)
+        def _check3(res):
+            log.msg("doing _check3")
+            for c in clients:
+                self.failUnlessEqual(len(c.connections), NUMCLIENTS)
+        d.addCallback(_check3)
+        def _shutdown_introducer(res):
+            # now shut down the introducer. We do this by shutting down the
+            # tub it's using. Nobody's connections (to each other) should go
+            # down. All clients should notice the loss, and no other errors
+            # should occur.
+            log.msg("shutting down the introducer")
+            return self.central_tub.disownServiceParent()
+        d.addCallback(_shutdown_introducer)
+        d.addCallback(self.stall, 2)
+        def _check4(res):
+            log.msg("doing _check4")
             for c in clients:
                 self.failUnlessEqual(len(c.connections), NUMCLIENTS)
-            # now disconnect somebody's connection to themselves
-        d.addCallback(_check_again2)
+                self.failIf(c._connected)
+        d.addCallback(_check4)
         return d
     test_system.timeout = 2400