FtpConnectionTest.cc 4.9 KB

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