def connectedServerAndClient(ServerClass=lambda: SimpleSymmetricProtocol(True), ClientClass=lambda: SimpleSymmetricProtocol(False), *a, **kw): """Returns a 3-tuple: (client, server, pump) """ return iosim.connectedServerAndClient( ServerClass, ClientClass, *a, **kw)
def connectedServerAndClient( ServerClass=lambda: SimpleSymmetricProtocol(True), ClientClass=lambda: SimpleSymmetricProtocol(False), *a, **kw): """Returns a 3-tuple: (client, server, pump) """ return iosim.connectedServerAndClient(ServerClass, ClientClass, *a, **kw)
def testFailedLogin(self): self.server.portal = NoPortal() c, s, pump = iosim.connectedServerAndClient( lambda : self.server, lambda : self.client) pump.flush() status = [evt[1] for evt in self.client.events if evt[0] == 'status'][-1] lastEvent = [evt[0] for evt in self.client.events if evt[0] != 'status'][-1] self.assertEquals(status, u'Login failed: Authentication failed') self.assertEquals(lastEvent, u'stopped')
def _disconnectTest(self, mbox, blocked): self.server.portal = Portal(mbox, lambda: None) c, s, pump = iosim.connectedServerAndClient( lambda: self.server, lambda: self.client) pump.flush() self.assertEquals( len(blocked), 1, "Expected a pending Deferred for listMessages, found %r" % ( blocked,)) s.transport.loseConnection() pump.flush() self.assertEquals(self.client.events[-1][0], 'stopped')
def testBasicGrabbing(self): self.server.portal = Portal( ListMailbox(self.testMessageStrings), lambda: None) c, s, pump = iosim.connectedServerAndClient( lambda: self.server, lambda: self.client) pump.flush() self.assertEquals( len([evt for evt in self.client.events if evt[0] == 'success']), 3) self.assertEquals( [evt[0] for evt in self.client.events if evt[0] != 'status'][-1], 'stopped')
def test_lostConnectionDuringLogin(self): """ Make sure that if a connection drops while logging in, it is properly noticed and the status is updated correctly. """ self.server.portal = DelayedPortal() c, s, pump = iosim.connectedServerAndClient( lambda: self.server, lambda: self.client) pump.flush() # Should have been one login attempt ([loginDeferred, credentials, mind, interface],) = self.server.portal.loginAttempts s.transport.loseConnection() pump.flush() self.assertEquals(self.client.events[-1][0], 'stopped')
def testConnectionTimeout(self): """ Make sure that if we receive no bytes for a really long time after issuing a retrieve command, we give up and disassociate ourself from our grabber object. """ sched = [] self.client.callLater = lambda n, f: sched.append((n, f)) mbox = DelayedListMailbox(self.testMessageStrings) self.server.portal = Portal(mbox, lambda: None) c, s, pump = iosim.connectedServerAndClient( lambda: self.server, lambda: self.client) self.assertEquals(len(sched), 1) sched.pop()[1]() self.assertEquals(self.client.events[-2][0], 'transient') self.client.events[-2][1].trap(error.TimeoutError) self.assertEquals(self.client.events[-1][0], 'stopped')
def testLineTooLong(self): """ Make sure a message illegally served with a line longer than we will accept is handled and marked as a failure, but doesn't completely derail the grabber. """ self.server.portal = Portal( ListMailbox(['X' * (2 ** 16)]), lambda: None) c, s, pump = iosim.connectedServerAndClient( lambda: self.server, lambda: self.client) pump.flush() for evt in self.client.events: if evt[0] == 'transient': evt[1].trap(pop3.LineTooLong) break else: self.fail("No transient failure recorded.")
def testInsecureLogin(self): """ Test that if login isn't even attempted because there is no way to do it without revealing a password that the grabber status is set properly. """ self.server = POP3WithoutAPOP() self.server.schedule = list self.server.timeOut = None c, s, pump = iosim.connectedServerAndClient( lambda : self.server, lambda : self.client) pump.flush() status = [evt[1] for evt in self.client.events if evt[0] == 'status'][-1] lastEvent = [evt[0] for evt in self.client.events if evt[0] != 'status'][-1] self.assertEquals(status, u'Login aborted: server not secure.') self.assertEquals(lastEvent, u'stopped')