On 01:27 pm, [email protected] wrote:
I am investigating timeout properties of the FTP server module.  I
have written the following trial test, that when functioning properly
will throw a PortConnectionError with a "DTPFactory timeout"

I would like to use something like

  self.failUnlessRaises()

Unrelated to the real intent of your question: adjust this desire, you should want to use self.assertRaises() instead.
but the test is also constructed using defer.deferredGenerator, and it
doesn't seem possible to apply the test for an exception to a
Generator-based test.

This is somewhat true-ish. There is another trial method that helps out with this case: assertFailure. The new trial documentation written by Thomas Herv� addresses this use case a bit:

http://buildbot.twistedmatrix.com/builds/sphinx- html/499-16046/projects/core/howto/trial.html#testing-scheduling

However, it's not clear to me that you actually have a Deferred that is going to fire with a Failure. It sounds like maybe you have an error that will get logged and no other indication that what you were waiting for has happened? If so, you might want to aim for a Deferred that fires when the important thing has happened.

Jean-Paul
This is a useful type of test to be able to
write: to assert that an exceptional condition *will* occur within a
timeout period.  Failure is if the exceptional condition is *never*
raised. Suggestions for attacking these types of properties is welcome.

FYI: Here is my test, along with the trial directive that if it runs
for 60 seconds it is a failure.  But first, here is the ERROR
traceback that a "successful" run of this test produces.

===============================================================================
[ERROR]
Traceback (most recent call last):
Failure: twisted.protocols.ftp.PortConnectionError: DTPFactory timeout

test_ftp_timeouts.TimeoutsFTPServerTestCase.test_FtpControlChannelTimesOut
-------------------------------------------------------------------------------


   def test_FtpControlChannelTimesOut(self):
       """Test that after the FTP timeout, the control channel closes
itself."""

# Set the timeout to something small, but greater than DTPTimeout
       self.serverProtocol.timeOut = 15

       # Login
       wfd = defer.waitForDeferred(self._anonymousLogin())
       yield wfd
       wfd.getResult()
       log.msg("Login Anonymous")

       # Wait for N seconds, protocol timeOut not fired yet
       wait1 = defer.waitForDeferred(self.mywait(2))
       yield wait1

       # Should get here and not fail
       log.msg("FTP is ok here")

# Issue a PASV command, and extract the host and port from the response pasvCmd = defer.waitForDeferred(self.client.queueStringCommand('PASV'))
       yield pasvCmd
       responseLines = pasvCmd.getResult()
       log.msg("PASV responseLines", responseLines)
       host, port = ftp.decodeHostPort(responseLines[-1][4:])

       # Wait for N seconds, protocol timeOut will fire
       wait2 = defer.waitForDeferred(self.mywait(20))
       yield wait2
       log.msg("FTP should have timed out and left reactor clean")


   test_FtpControlChannelTimesOut =
defer.deferredGenerator(test_FtpControlChannelTimesOut)
   # test_FtpControlChannelTimesOut.skip = "skipping"
   test_FtpControlChannelTimesOut.timeout = 60 # is a real error if
it takes this long

_______________________________________________
Twisted-Python mailing list
[email protected]
http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python

_______________________________________________
Twisted-Python mailing list
[email protected]
http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python

Reply via email to