HttpResponseTest.cc 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  1. #include "HttpResponse.h"
  2. #include "prefs.h"
  3. #include "PiecedSegment.h"
  4. #include "Piece.h"
  5. #include <cppunit/extensions/HelperMacros.h>
  6. using namespace std;
  7. class HttpResponseTest : public CppUnit::TestFixture {
  8. CPPUNIT_TEST_SUITE(HttpResponseTest);
  9. CPPUNIT_TEST(testGetContentLength_null);
  10. CPPUNIT_TEST(testGetContentLength_contentLength);
  11. //CPPUNIT_TEST(testGetContentLength_range);
  12. CPPUNIT_TEST(testGetEntityLength);
  13. CPPUNIT_TEST(testGetContentType);
  14. CPPUNIT_TEST(testDeterminFilename_without_ContentDisposition);
  15. CPPUNIT_TEST(testDeterminFilename_with_ContentDisposition_zero_length);
  16. CPPUNIT_TEST(testDeterminFilename_with_ContentDisposition);
  17. CPPUNIT_TEST(testGetRedirectURI_without_Location);
  18. CPPUNIT_TEST(testGetRedirectURI_with_Location);
  19. CPPUNIT_TEST(testIsRedirect);
  20. CPPUNIT_TEST(testIsTransferEncodingSpecified);
  21. CPPUNIT_TEST(testGetTransferEncoding);
  22. CPPUNIT_TEST(testGetTransferDecoder);
  23. CPPUNIT_TEST(testValidateResponse);
  24. CPPUNIT_TEST(testValidateResponse_good_range);
  25. CPPUNIT_TEST(testValidateResponse_bad_range);
  26. CPPUNIT_TEST(testValidateResponse_chunked);
  27. CPPUNIT_TEST_SUITE_END();
  28. private:
  29. public:
  30. void setUp() {
  31. }
  32. void testGetContentLength_null();
  33. void testGetContentLength_contentLength();
  34. void testGetEntityLength();
  35. void testGetContentType();
  36. void testDeterminFilename_without_ContentDisposition();
  37. void testDeterminFilename_with_ContentDisposition_zero_length();
  38. void testDeterminFilename_with_ContentDisposition();
  39. void testGetRedirectURI_without_Location();
  40. void testGetRedirectURI_with_Location();
  41. void testIsRedirect();
  42. void testIsTransferEncodingSpecified();
  43. void testGetTransferEncoding();
  44. void testGetTransferDecoder();
  45. void testValidateResponse();
  46. void testValidateResponse_good_range();
  47. void testValidateResponse_bad_range();
  48. void testValidateResponse_chunked();
  49. };
  50. CPPUNIT_TEST_SUITE_REGISTRATION( HttpResponseTest );
  51. void HttpResponseTest::testGetContentLength_null()
  52. {
  53. HttpResponse httpResponse;
  54. CPPUNIT_ASSERT_EQUAL((int64_t)0, httpResponse.getContentLength());
  55. }
  56. void HttpResponseTest::testGetContentLength_contentLength()
  57. {
  58. HttpResponse httpResponse;
  59. HttpHeaderHandle httpHeader = new HttpHeader();
  60. httpHeader->put("Content-Length", "4294967296");
  61. httpResponse.setHttpHeader(httpHeader);
  62. CPPUNIT_ASSERT_EQUAL((int64_t)4294967296LL, httpResponse.getContentLength());
  63. }
  64. void HttpResponseTest::testGetEntityLength()
  65. {
  66. HttpResponse httpResponse;
  67. HttpHeaderHandle httpHeader = new HttpHeader();
  68. httpHeader->put("Content-Length", "4294967296");
  69. httpResponse.setHttpHeader(httpHeader);
  70. CPPUNIT_ASSERT_EQUAL((int64_t)4294967296LL, httpResponse.getEntityLength());
  71. httpHeader->put("Content-Range", "bytes 1-4294967296/4294967297");
  72. CPPUNIT_ASSERT_EQUAL((int64_t)4294967297LL, httpResponse.getEntityLength());
  73. }
  74. void HttpResponseTest::testGetContentType()
  75. {
  76. HttpResponse httpResponse;
  77. HttpHeaderHandle httpHeader = new HttpHeader();
  78. httpHeader->put("content-type", "application/octet-stream");
  79. httpResponse.setHttpHeader(httpHeader);
  80. CPPUNIT_ASSERT_EQUAL(string("application/octet-stream"),
  81. httpResponse.getContentType());
  82. }
  83. void HttpResponseTest::testDeterminFilename_without_ContentDisposition()
  84. {
  85. HttpResponse httpResponse;
  86. HttpHeaderHandle httpHeader = new HttpHeader();
  87. HttpRequestHandle httpRequest = new HttpRequest();
  88. RequestHandle request = new Request();
  89. request->setUrl("http://localhost/archives/aria2-1.0.0.tar.bz2");
  90. httpRequest->setRequest(request);
  91. httpResponse.setHttpHeader(httpHeader);
  92. httpResponse.setHttpRequest(httpRequest);
  93. CPPUNIT_ASSERT_EQUAL(string("aria2-1.0.0.tar.bz2"),
  94. httpResponse.determinFilename());
  95. }
  96. void HttpResponseTest::testDeterminFilename_with_ContentDisposition_zero_length()
  97. {
  98. HttpResponse httpResponse;
  99. HttpHeaderHandle httpHeader = new HttpHeader();
  100. httpHeader->put("Content-Disposition", "attachment; filename=\"\"");
  101. HttpRequestHandle httpRequest = new HttpRequest();
  102. RequestHandle request = new Request();
  103. request->setUrl("http://localhost/archives/aria2-1.0.0.tar.bz2");
  104. httpRequest->setRequest(request);
  105. httpResponse.setHttpHeader(httpHeader);
  106. httpResponse.setHttpRequest(httpRequest);
  107. CPPUNIT_ASSERT_EQUAL(string("aria2-1.0.0.tar.bz2"),
  108. httpResponse.determinFilename());
  109. }
  110. void HttpResponseTest::testDeterminFilename_with_ContentDisposition()
  111. {
  112. HttpResponse httpResponse;
  113. HttpHeaderHandle httpHeader = new HttpHeader();
  114. httpHeader->put("Content-Disposition", "attachment; filename=\"aria2-current.tar.bz2\"");
  115. HttpRequestHandle httpRequest = new HttpRequest();
  116. RequestHandle request = new Request();
  117. request->setUrl("http://localhost/archives/aria2-1.0.0.tar.bz2");
  118. httpRequest->setRequest(request);
  119. httpResponse.setHttpHeader(httpHeader);
  120. httpResponse.setHttpRequest(httpRequest);
  121. CPPUNIT_ASSERT_EQUAL(string("aria2-current.tar.bz2"),
  122. httpResponse.determinFilename());
  123. }
  124. void HttpResponseTest::testGetRedirectURI_without_Location()
  125. {
  126. HttpResponse httpResponse;
  127. HttpHeaderHandle httpHeader = new HttpHeader();
  128. httpResponse.setHttpHeader(httpHeader);
  129. CPPUNIT_ASSERT_EQUAL(string(""),
  130. httpResponse.getRedirectURI());
  131. }
  132. void HttpResponseTest::testGetRedirectURI_with_Location()
  133. {
  134. HttpResponse httpResponse;
  135. HttpHeaderHandle httpHeader = new HttpHeader();
  136. httpHeader->put("Location", "http://localhost/download/aria2-1.0.0.tar.bz2");
  137. httpResponse.setHttpHeader(httpHeader);
  138. CPPUNIT_ASSERT_EQUAL(string("http://localhost/download/aria2-1.0.0.tar.bz2"),
  139. httpResponse.getRedirectURI());
  140. }
  141. void HttpResponseTest::testIsRedirect()
  142. {
  143. HttpResponse httpResponse;
  144. HttpHeaderHandle httpHeader = new HttpHeader();
  145. httpHeader->put("Location", "http://localhost/download/aria2-1.0.0.tar.bz2");
  146. httpResponse.setHttpHeader(httpHeader);
  147. httpResponse.setStatus(200);
  148. CPPUNIT_ASSERT(!httpResponse.isRedirect());
  149. httpResponse.setStatus(304);
  150. CPPUNIT_ASSERT(httpResponse.isRedirect());
  151. }
  152. void HttpResponseTest::testIsTransferEncodingSpecified()
  153. {
  154. HttpResponse httpResponse;
  155. HttpHeaderHandle httpHeader = new HttpHeader();
  156. httpResponse.setHttpHeader(httpHeader);
  157. CPPUNIT_ASSERT(!httpResponse.isTransferEncodingSpecified());
  158. httpHeader->put("Transfer-Encoding", "chunked");
  159. CPPUNIT_ASSERT(httpResponse.isTransferEncodingSpecified());
  160. }
  161. void HttpResponseTest::testGetTransferEncoding()
  162. {
  163. HttpResponse httpResponse;
  164. HttpHeaderHandle httpHeader = new HttpHeader();
  165. httpResponse.setHttpHeader(httpHeader);
  166. CPPUNIT_ASSERT_EQUAL(string(""), httpResponse.getTransferEncoding());
  167. httpHeader->put("Transfer-Encoding", "chunked");
  168. CPPUNIT_ASSERT_EQUAL(string("chunked"), httpResponse.getTransferEncoding());
  169. }
  170. void HttpResponseTest::testGetTransferDecoder()
  171. {
  172. HttpResponse httpResponse;
  173. HttpHeaderHandle httpHeader = new HttpHeader();
  174. httpResponse.setHttpHeader(httpHeader);
  175. CPPUNIT_ASSERT(httpResponse.getTransferDecoder().isNull());
  176. httpHeader->put("Transfer-Encoding", "chunked");
  177. CPPUNIT_ASSERT(!httpResponse.getTransferDecoder().isNull());
  178. }
  179. void HttpResponseTest::testValidateResponse()
  180. {
  181. HttpResponse httpResponse;
  182. httpResponse.setStatus(401);
  183. try {
  184. httpResponse.validateResponse();
  185. CPPUNIT_FAIL("exception must be thrown.");
  186. } catch(Exception* e) {
  187. delete e;
  188. }
  189. httpResponse.setStatus(505);
  190. try {
  191. httpResponse.validateResponse();
  192. CPPUNIT_FAIL("exception must be thrown.");
  193. } catch(Exception* e) {
  194. delete e;
  195. }
  196. httpResponse.setStatus(304);
  197. HttpHeaderHandle httpHeader = new HttpHeader();
  198. httpResponse.setHttpHeader(httpHeader);
  199. try {
  200. httpResponse.validateResponse();
  201. CPPUNIT_FAIL("exception must be thrown.");
  202. } catch(Exception* e) {
  203. delete e;
  204. }
  205. httpHeader->put("Location", "http://localhost/archives/aria2-1.0.0.tar.bz2");
  206. try {
  207. httpResponse.validateResponse();
  208. } catch(Exception* e) {
  209. delete e;
  210. CPPUNIT_FAIL("exception must not be thrown.");
  211. }
  212. }
  213. void HttpResponseTest::testValidateResponse_good_range()
  214. {
  215. HttpResponse httpResponse;
  216. HttpHeaderHandle httpHeader = new HttpHeader();
  217. httpResponse.setHttpHeader(httpHeader);
  218. HttpRequestHandle httpRequest = new HttpRequest();
  219. SegmentHandle segment = new PiecedSegment(1024*1024, new Piece(1, 1024*1024));
  220. httpRequest->setSegment(segment);
  221. RequestHandle request = new Request();
  222. request->setUrl("http://localhost/archives/aria2-1.0.0.tar.bz2");
  223. request->setKeepAlive(false);
  224. httpRequest->setRequest(request);
  225. httpResponse.setHttpRequest(httpRequest);
  226. httpResponse.setStatus(206);
  227. httpHeader->put("Content-Range", "bytes 1048576-10485760/10485761");
  228. try {
  229. httpResponse.validateResponse();
  230. } catch(Exception* e) {
  231. cerr << e->getMsg() << endl;
  232. delete e;
  233. CPPUNIT_FAIL("exception must not be thrown.");
  234. }
  235. }
  236. void HttpResponseTest::testValidateResponse_bad_range()
  237. {
  238. HttpResponse httpResponse;
  239. HttpHeaderHandle httpHeader = new HttpHeader();
  240. httpResponse.setHttpHeader(httpHeader);
  241. HttpRequestHandle httpRequest = new HttpRequest();
  242. SegmentHandle segment = new PiecedSegment(1024*1024, new Piece(1, 1024*1024));
  243. httpRequest->setSegment(segment);
  244. RequestHandle request = new Request();
  245. request->setUrl("http://localhost/archives/aria2-1.0.0.tar.bz2");
  246. request->setKeepAlive(false);
  247. httpRequest->setRequest(request);
  248. httpResponse.setHttpRequest(httpRequest);
  249. httpResponse.setStatus(206);
  250. httpHeader->put("Content-Range", "bytes 0-10485760/10485761");
  251. try {
  252. httpResponse.validateResponse();
  253. CPPUNIT_FAIL("exception must be thrown.");
  254. } catch(Exception* e) {
  255. delete e;
  256. }
  257. }
  258. void HttpResponseTest::testValidateResponse_chunked()
  259. {
  260. HttpResponse httpResponse;
  261. HttpHeaderHandle httpHeader = new HttpHeader();
  262. httpResponse.setHttpHeader(httpHeader);
  263. HttpRequestHandle httpRequest = new HttpRequest();
  264. SegmentHandle segment = new PiecedSegment(1024*1024, new Piece(1, 1024*1024));
  265. httpRequest->setSegment(segment);
  266. RequestHandle request = new Request();
  267. request->setUrl("http://localhost/archives/aria2-1.0.0.tar.bz2");
  268. request->setKeepAlive(false);
  269. httpRequest->setRequest(request);
  270. httpResponse.setHttpRequest(httpRequest);
  271. httpResponse.setStatus(206);
  272. httpHeader->put("Content-Range", "bytes 0-10485760/10485761");
  273. httpHeader->put("Transfer-Encoding", "chunked");
  274. // if transfer-encoding is specified, then range validation is skipped.
  275. try {
  276. httpResponse.validateResponse();
  277. } catch(Exception* e) {
  278. delete e;
  279. CPPUNIT_FAIL("exception must not be thrown.");
  280. }
  281. }