FtpConnectionTest.cc 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  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(testReceiveResponse);
  13. CPPUNIT_TEST(testSendMdtm);
  14. CPPUNIT_TEST(testReceiveMdtmResponse);
  15. CPPUNIT_TEST_SUITE_END();
  16. private:
  17. SharedHandle<SocketCore> _serverSocket;
  18. uint16_t _listenPort;
  19. SharedHandle<FtpConnection> _ftp;
  20. Option _option;
  21. public:
  22. void setUp()
  23. {
  24. //_ftpServerSocket.reset(new SocketCore());
  25. SharedHandle<SocketCore> listenSocket(new SocketCore());
  26. listenSocket->bind(0);
  27. listenSocket->beginListen();
  28. std::pair<std::string, uint16_t> addrinfo;
  29. listenSocket->getAddrInfo(addrinfo);
  30. _listenPort = addrinfo.second;
  31. SharedHandle<Request> req(new Request());
  32. req->setUrl("ftp://localhost/dir/file.img");
  33. SharedHandle<SocketCore> clientSocket(new SocketCore());
  34. clientSocket->establishConnection("127.0.0.1", _listenPort);
  35. while(!clientSocket->isWritable(0));
  36. clientSocket->setBlockingMode();
  37. _serverSocket.reset(listenSocket->acceptConnection());
  38. _ftp.reset(new FtpConnection(1, clientSocket, req, &_option));
  39. }
  40. void tearDown() {}
  41. void testSendMdtm();
  42. void testReceiveMdtmResponse();
  43. void testReceiveResponse();
  44. };
  45. CPPUNIT_TEST_SUITE_REGISTRATION(FtpConnectionTest);
  46. void FtpConnectionTest::testReceiveResponse()
  47. {
  48. _serverSocket->writeData("100");
  49. CPPUNIT_ASSERT_EQUAL((unsigned int)0, _ftp->receiveResponse());
  50. _serverSocket->writeData(" single line response");
  51. CPPUNIT_ASSERT_EQUAL((unsigned int)0, _ftp->receiveResponse());
  52. _serverSocket->writeData("\r\n");
  53. CPPUNIT_ASSERT_EQUAL((unsigned int)100, _ftp->receiveResponse());
  54. // 2 responses in the buffer
  55. _serverSocket->writeData("101 single1\r\n"
  56. "102 single2\r\n");
  57. CPPUNIT_ASSERT_EQUAL((unsigned int)101, _ftp->receiveResponse());
  58. CPPUNIT_ASSERT_EQUAL((unsigned int)102, _ftp->receiveResponse());
  59. _serverSocket->writeData("103-multi line response\r\n");
  60. CPPUNIT_ASSERT_EQUAL((unsigned int)0, _ftp->receiveResponse());
  61. _serverSocket->writeData("103-line2\r\n");
  62. CPPUNIT_ASSERT_EQUAL((unsigned int)0, _ftp->receiveResponse());
  63. _serverSocket->writeData("103");
  64. CPPUNIT_ASSERT_EQUAL((unsigned int)0, _ftp->receiveResponse());
  65. _serverSocket->writeData(" ");
  66. CPPUNIT_ASSERT_EQUAL((unsigned int)0, _ftp->receiveResponse());
  67. _serverSocket->writeData("last\r\n");
  68. CPPUNIT_ASSERT_EQUAL((unsigned int)103, _ftp->receiveResponse());
  69. _serverSocket->writeData("104-multi\r\n"
  70. "104 \r\n"
  71. "105-multi\r\n"
  72. "105 \r\n");
  73. CPPUNIT_ASSERT_EQUAL((unsigned int)104, _ftp->receiveResponse());
  74. CPPUNIT_ASSERT_EQUAL((unsigned int)105, _ftp->receiveResponse());
  75. }
  76. void FtpConnectionTest::testSendMdtm()
  77. {
  78. _ftp->sendMdtm();
  79. char data[32];
  80. size_t len = sizeof(data);
  81. _serverSocket->readData(data, len);
  82. CPPUNIT_ASSERT_EQUAL((size_t)15, len);
  83. data[len] = '\0';
  84. CPPUNIT_ASSERT_EQUAL(std::string("MDTM file.img\r\n"), std::string(data));
  85. }
  86. void FtpConnectionTest::testReceiveMdtmResponse()
  87. {
  88. {
  89. Time t;
  90. _serverSocket->writeData("213 20080908124312");
  91. CPPUNIT_ASSERT_EQUAL((unsigned int)0, _ftp->receiveMdtmResponse(t));
  92. _serverSocket->writeData("\r\n");
  93. CPPUNIT_ASSERT_EQUAL((unsigned int)213, _ftp->receiveMdtmResponse(t));
  94. CPPUNIT_ASSERT_EQUAL((time_t)1220877792, t.getTime());
  95. }
  96. {
  97. // see milli second part is ignored
  98. Time t;
  99. _serverSocket->writeData("213 20080908124312.014\r\n");
  100. CPPUNIT_ASSERT_EQUAL((unsigned int)213, _ftp->receiveMdtmResponse(t));
  101. CPPUNIT_ASSERT_EQUAL((time_t)1220877792, t.getTime());
  102. }
  103. {
  104. // hhmmss part is missing
  105. Time t;
  106. _serverSocket->writeData("213 20080908\r\n");
  107. CPPUNIT_ASSERT_EQUAL((unsigned int)213, _ftp->receiveMdtmResponse(t));
  108. CPPUNIT_ASSERT_EQUAL((time_t)-1, t.getTime());
  109. }
  110. {
  111. // invalid month: 19
  112. Time t;
  113. _serverSocket->writeData("213 20081908124312\r\n");
  114. CPPUNIT_ASSERT_EQUAL((unsigned int)213, _ftp->receiveMdtmResponse(t));
  115. CPPUNIT_ASSERT_EQUAL((time_t)-1, t.getTime());
  116. }
  117. {
  118. Time t;
  119. _serverSocket->writeData("550 File Not Found\r\n");
  120. CPPUNIT_ASSERT_EQUAL((unsigned int)550, _ftp->receiveMdtmResponse(t));
  121. }
  122. }
  123. } // namespace aria2