Ticket #3462: t3462-2.diff
| File t3462-2.diff, 5.2 KB (added by warner, 3 years ago) |
|---|
-
twisted/test/test_ftp.py
9 9 10 10 import os 11 11 import errno 12 from StringIO import StringIO 12 13 13 14 from zope.interface import implements 14 15 … … 2616 2617 2617 2618 def test_write(self): 2618 2619 """ 2619 Test L{ftp.IWriteFile}: the implementation should have a receive method 2620 returning a C{Deferred} with fires with a consumer ready to receive 2621 data to be written. 2620 Test L{ftp.IWriteFile}: the implementation should have a receive 2621 method returning a C{Deferred} with fires with a consumer ready to 2622 receive data to be written. It should also have a close() method that 2623 returns a Deferred. 2622 2624 """ 2623 2625 content = 'elbbow\n' 2624 2626 def cbGet(writer): 2625 return writer.receive().addCallback(cbReceive )2626 def cbReceive(consumer ):2627 return writer.receive().addCallback(cbReceive, writer) 2628 def cbReceive(consumer, writer): 2627 2629 producer = TestProducer(content, consumer) 2628 2630 consumer.registerProducer(None, True) 2629 2631 producer.start() 2630 2632 consumer.unregisterProducer() 2633 return writer.close().addCallback(cbClose) 2634 def cbClose(ignored): 2631 2635 self.assertEquals(self.getFileContent(), content) 2632 2636 return self.getFileWriter().addCallback(cbGet) 2633 2637 … … 2669 2673 Return the content of the temporary file. 2670 2674 """ 2671 2675 return self.root.child(self.filename).getContent() 2676 2677 2678 class CloseTestWriter: 2679 implements(ftp.IWriteFile) 2680 closeStarted = False 2681 def receive(self): 2682 self.s = StringIO() 2683 fc = ftp.FileConsumer(self.s) 2684 return defer.succeed(fc) 2685 def close(self): 2686 self.closeStarted = True 2687 return self.d 2688 2689 class CloseTestShell: 2690 def openForWriting(self, segs): 2691 return defer.succeed(self.writer) 2692 2693 class FTPCloseTest(unittest.TestCase): 2694 def test_write(self): 2695 # Confirm that FTP uploads (i.e. ftp_STOR) call and wait upon the 2696 # IWriteFile object's close() method. 2697 f = ftp.FTP() 2698 f.workingDirectory = ["root"] 2699 f.shell = CloseTestShell() 2700 f.shell.writer = CloseTestWriter() 2701 f.shell.writer.d = defer.Deferred() 2702 f.factory = ftp.FTPFactory() 2703 f.factory.timeOut = None 2704 f.makeConnection(StringIO()) 2705 2706 di = ftp.DTP() 2707 di.factory = ftp.DTPFactory(f) 2708 f.dtpInstance = di 2709 di.makeConnection(None)# 2710 2711 stor_done = [] 2712 d = f.ftp_STOR("path") 2713 d.addCallback(stor_done.append) 2714 # the writer is still receiving data 2715 self.assertFalse(f.shell.writer.closeStarted, "close() called early") 2716 di.dataReceived("some data here") 2717 self.assertFalse(f.shell.writer.closeStarted, "close() called early") 2718 di.connectionLost("reason is ignored") 2719 # now we should be waiting in close() 2720 self.assertTrue(f.shell.writer.closeStarted, "close() not called") 2721 self.assertFalse(stor_done) 2722 f.shell.writer.d.callback("allow close() to finish") 2723 self.assertTrue(stor_done) 2724 2725 return d # just in case an errback occurred -
twisted/protocols/ftp.py
1122 1122 cons = ASCIIConsumerWrapper(cons) 1123 1123 1124 1124 d = self.dtpInstance.registerConsumer(cons) 1125 d.addCallbacks(cbSent, ebSent)1126 1125 1127 1126 # Tell them what to doooo 1128 1127 if self.dtpInstance.isConnected: … … 1135 1134 def cbOpened(file): 1136 1135 d = file.receive() 1137 1136 d.addCallback(cbConsumer) 1137 d.addCallback(lambda ignored: file.close()) 1138 d.addCallbacks(cbSent, ebSent) 1138 1139 return d 1139 1140 1140 1141 def ebOpened(err): … … 1507 1508 @rtype: C{Deferred} of C{IConsumer} 1508 1509 """ 1509 1510 1511 def close(): 1512 """ 1513 Perform any post-write work that needs to be done. This method may 1514 only be invoked once on each provider, and will always be invoked 1515 after receive(). 1510 1516 1517 @rtype: C{Deferred} of anything: the value is ignored. The FTP client 1518 will not see their upload request complete until this Deferred has 1519 been fired. 1520 """ 1511 1521 1512 1522 def _getgroups(uid): 1513 1523 """Return the primary and supplementary groups for the given UID. … … 1868 1878 # FileConsumer will close the file object 1869 1879 return defer.succeed(FileConsumer(self.fObj)) 1870 1880 1881 def close(self): 1882 return defer.succeed(None) 1871 1883 1872 1884 1873 1885 class FTPRealm: -
twisted/vfs/adapters/ftp.py
295 295 """ 296 296 return defer.succeed(IConsumer(self.node)) 297 297 298 def close(self): 299 """ 300 Perform post-write actions. 301 """ 302 return defer.succeed(None) 298 303 299 304 300 305 class _FileToConsumerAdapter(object):
