FtpConnectionTest.cc 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. #include "FtpConnection.h"
  2. #include "Exception.h"
  3. #include "Util.h"
  4. #include "SocketCore.h"
  5. #include "Request.h"
  6. #include "Option.h"
  7. #include <iostream>
  8. #include <cppunit/extensions/HelperMacros.h>
  9. namespace aria2 {
  10. class FtpConnectionTest:public CppUnit::TestFixture {
  11. CPPUNIT_TEST_SUITE(FtpConnectionTest);
  12. CPPUNIT_TEST(testSendMdtm);
  13. CPPUNIT_TEST(testReceiveMdtmResponse);
  14. CPPUNIT_TEST_SUITE_END();
  15. private:
  16. SharedHandle<SocketCore> _serverSocket;
  17. uint16_t _listenPort;
  18. SharedHandle<FtpConnection> _ftp;
  19. Option _option;
  20. public:
  21. void setUp()
  22. {
  23. //_ftpServerSocket.reset(new SocketCore());
  24. SharedHandle<SocketCore> listenSocket(new SocketCore());
  25. listenSocket->bind(0);
  26. listenSocket->beginListen();
  27. std::pair<std::string, uint16_t> addrinfo;
  28. listenSocket->getAddrInfo(addrinfo);
  29. _listenPort = addrinfo.second;
  30. SharedHandle<Request> req(new Request());
  31. req->setUrl("ftp://localhost/dir/file.img");
  32. SharedHandle<SocketCore> clientSocket(new SocketCore());
  33. clientSocket->establishConnection("127.0.0.1", _listenPort);
  34. while(!clientSocket->isWritable(0));
  35. clientSocket->setBlockingMode();
  36. _serverSocket.reset(listenSocket->acceptConnection());
  37. _ftp.reset(new FtpConnection(1, clientSocket, req, &_option));
  38. }
  39. void tearDown() {}
  40. void testSendMdtm();
  41. void testReceiveMdtmResponse();
  42. };
  43. CPPUNIT_TEST_SUITE_REGISTRATION(FtpConnectionTest);
  44. void FtpConnectionTest::testSendMdtm()
  45. {
  46. _ftp->sendMdtm();
  47. char data[32];
  48. size_t len = sizeof(data);
  49. _serverSocket->readData(data, len);
  50. CPPUNIT_ASSERT_EQUAL((size_t)15, len);
  51. data[len] = '\0';
  52. CPPUNIT_ASSERT_EQUAL(std::string("MDTM file.img\r\n"), std::string(data));
  53. }
  54. void FtpConnectionTest::testReceiveMdtmResponse()
  55. {
  56. {
  57. Time t;
  58. _serverSocket->writeData("213 20080908124312");
  59. CPPUNIT_ASSERT_EQUAL((unsigned int)0, _ftp->receiveMdtmResponse(t));
  60. _serverSocket->writeData("\r\n");
  61. CPPUNIT_ASSERT_EQUAL((unsigned int)213, _ftp->receiveMdtmResponse(t));
  62. CPPUNIT_ASSERT_EQUAL((time_t)1220877792, t.getTime());
  63. }
  64. {
  65. // see milli second part is ignored
  66. Time t;
  67. _serverSocket->writeData("213 20080908124312.014\r\n");
  68. CPPUNIT_ASSERT_EQUAL((unsigned int)213, _ftp->receiveMdtmResponse(t));
  69. CPPUNIT_ASSERT_EQUAL((time_t)1220877792, t.getTime());
  70. }
  71. {
  72. // hhmmss part is missing
  73. Time t;
  74. _serverSocket->writeData("213 20080908\r\n");
  75. CPPUNIT_ASSERT_EQUAL((unsigned int)213, _ftp->receiveMdtmResponse(t));
  76. CPPUNIT_ASSERT_EQUAL((time_t)-1, t.getTime());
  77. }
  78. {
  79. // invalid month: 19
  80. Time t;
  81. _serverSocket->writeData("213 20081908124312\r\n");
  82. CPPUNIT_ASSERT_EQUAL((unsigned int)213, _ftp->receiveMdtmResponse(t));
  83. CPPUNIT_ASSERT_EQUAL((time_t)-1, t.getTime());
  84. }
  85. {
  86. Time t;
  87. _serverSocket->writeData("550 File Not Found\r\n");
  88. CPPUNIT_ASSERT_EQUAL((unsigned int)550, _ftp->receiveMdtmResponse(t));
  89. }
  90. }
  91. } // namespace aria2