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")
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()