Есть несколько юнит-тестов для поведения в этой области.
twisted.test.test_ftp.FTPClientTestCase.test_failedRETR
является наиболее релевантным. Он охватывает случай, когда соединения управления и передачи данных теряются во время передачи файла.
Мне кажется, что тестовое покрытие в этой области могло бы быть значительно улучшено. Нет тестов, охватывающих случай, когда, например, происходит потеря соединения с данными во время передачи. Однако одна сложность заключается в том, что FTP не очень надежный протокол. Окончание передачи файла сигнализируется закрытием соединения для передачи данных. Чтобы быть в безопасности, вы должны проверить, получили ли вы столько байтов, сколько ожидали получить. Единственный способ выполнить эту проверку - заранее узнать размер файла или запросить его у сервера, используя LIST
(FTPClient.list
).
Учитывая все это, я бы посоветовал, что когда передача файла завершится, вы всегда спрашиваете сервер, сколько байтов вы должны были получить, и убедитесь, что оно соответствует количеству байтов, доставленных в ваш протокол. Иногда вы можете получить ошибку на Deferred
, возвращаемом с retrieveFile
, но это обеспечит вам безопасность даже в тех случаях, когда вы этого не сделаете.