예제 #1
0
 def _got_ref(self, rref, arg, kw):
     self.failUnlessEqual(self.attached, False)
     self.attached = True
     self.failUnlessEqual(arg, "arg")
     self.failUnlessEqual(kw, "kwarg")
     ri = self.rc.getReconnectionInfo()
     self.assertEqual(ri.state, "connected")
     time2 = time.time()
     last = ri.lastAttempt
     self.assert_(self._time1 <= last <= time2, (self._time1, last, time2))
     ci = ri.connectionInfo
     self.assertEqual(ci.connected, True)
     hints = referenceable.SturdyRef(self.url).getTubRef().getLocations()
     expected_hint = hints[0]
     self.assertEqual(ci.winningHint, expected_hint)
     self.assertEqual(ci.listenerStatus, (None, None))
     self.assertEqual(ci.connectorStatuses, {expected_hint: "successful"})
     self.assertEqual(ci.connectionHandlers, {expected_hint: "tcp"})
     self.count += 1
     rref.notifyOnDisconnect(self._disconnected, self.count)
     if self.count < 2:
         # forcibly disconnect it
         eventually(rref.tracker.broker.transport.loseConnection)
     else:
         self.done.callback("done")
예제 #2
0
    def test_negotiate_fails_and_retry(self):
        connects = []
        target = HelperTarget("bob")
        url = self.tubB.registerReference(target, "target")
        hint = referenceable.SturdyRef(url).getTubRef().getLocations()[0]
        l = self.tubB.getListeners()[0]
        l._negotiationClass = AlwaysFailNegotiation
        portb = self.tub_ports[1]

        d1 = defer.Deferred()
        notifiers = [d1]
        rc = self.tubA.connectTo(url, self._connected, notifiers, connects)
        yield self.poll(lambda: rc.getReconnectionInfo().state == "waiting")

        # the reconnector should have failed once or twice, since the
        # negotiation would always fail.
        self.failUnlessEqual(len(connects), 0)
        ci = rc.getReconnectionInfo().connectionInfo
        cs = ci.connectorStatuses
        self.assertEqual(cs, {hint: "negotiation failed: I always fail"})

        # Now we fix tubB. We only touched the Listener, so re-doing the
        # listenOn should clear it.
        yield self.tubB.stopListeningOn(l)

        self.tubB.listenOn("tcp:%d:interface=127.0.0.1" % portb)

        # the next time the reconnector tries, it should succeed
        yield d1

        self.failUnlessEqual(len(connects), 1)
        rc.stopConnecting()