curlhttpclient_ut.cc 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. #include <iostream>
  2. #include <stdio.h>
  3. #include "utils.h"
  4. #include "gtest/gtest.h"
  5. #include "gmock/gmock.h"
  6. #include "alibabacloud/core/Url.h"
  7. #include "alibabacloud/core/HttpRequest.h"
  8. #include "alibabacloud/core/HttpClient.h"
  9. #include "../src/CurlHttpClient.h"
  10. using namespace std;
  11. using ::testing::_;
  12. using ::testing::NiceMock;
  13. using ::testing::DefaultValue;
  14. using namespace AlibabaCloud;
  15. using namespace std;
  16. class mockCurlHttpClient : public CurlHttpClient {
  17. public:
  18. MOCK_METHOD1(makeRequest, HttpResponseOutcome (const HttpRequest &request));
  19. };
  20. TEST(CurlHttpClient, connectTimeout) {
  21. CurlHttpClient client;
  22. HttpRequest request;
  23. Url url;
  24. url.setScheme("http");
  25. url.setHost("192.168.100.100");
  26. request.setMethod(HttpRequest::Method::Get);
  27. request.setUrl(url);
  28. request.setConnectTimeout(100);
  29. request.setReadTimeout(1000);
  30. request.setHeader("Content-Type", "text/html");
  31. HttpClient::HttpResponseOutcome out = client.makeRequest(request);
  32. string errmsg = "Timeout (connectTimeout: 100ms, readTimeout: 1000ms) when connect or read data: GET http://192.168.100.100/";
  33. EXPECT_TRUE(out.error().errorCode() == "OperationTimeoutError");
  34. EXPECT_TRUE(out.error().errorMessage() == errmsg);
  35. }
  36. TEST(CurlHttpClient, defaultTimeout) {
  37. CurlHttpClient client;
  38. HttpRequest request;
  39. Url url;
  40. url.setScheme("http");
  41. url.setHost("192.168.100.100");
  42. request.setMethod(HttpRequest::Method::Get);
  43. request.setUrl(url);
  44. request.setHeader("Content-Type", "text/html");
  45. HttpClient::HttpResponseOutcome out = client.makeRequest(request);
  46. string errmsg = "Timeout (connectTimeout: 5000ms, readTimeout: 10000ms) when connect or read data: GET http://192.168.100.100/";
  47. EXPECT_TRUE(out.error().errorCode() == "OperationTimeoutError");
  48. EXPECT_TRUE(out.error().errorMessage() == errmsg);
  49. }
  50. TEST(CurlHttpClient, readTimeout) {
  51. CurlHttpClient client;
  52. HttpRequest request;
  53. Url url;
  54. url.setScheme("http");
  55. url.setHost("127.0.0.1");
  56. url.setPort(8021);
  57. url.setPath("/readTimeoutTest");
  58. url.setQuery("timeout=500");
  59. request.setMethod(HttpRequest::Method::Get);
  60. request.setUrl(url);
  61. request.setConnectTimeout(233);
  62. request.setReadTimeout(500);
  63. request.setHeader("Content-Type", "text/html");
  64. HttpClient::HttpResponseOutcome out = client.makeRequest(request);
  65. string errmsg = "Timeout (connectTimeout: 233ms, readTimeout: 500ms) when connect or read data: GET http://127.0.0.1:8021/readTimeoutTest?timeout=500";
  66. EXPECT_TRUE(out.error().errorCode() == "OperationTimeoutError");
  67. EXPECT_TRUE(out.error().errorMessage() == errmsg);
  68. }
  69. TEST(CurlHttpClient, http_get) {
  70. CurlHttpClient client;
  71. HttpRequest request;
  72. Url url;
  73. url.setHost("127.0.0.1");
  74. url.setPort(8021);
  75. url.setPath("/anypath");
  76. url.setQuery("k1=v1&k2=v2");
  77. request.setMethod(HttpRequest::Method::Get);
  78. request.setUrl(url);
  79. request.setHeader("Content-Type", "text/html");
  80. HttpClient::HttpResponseOutcome out = client.makeRequest(request);
  81. EXPECT_TRUE(std::string(out.result().body()) == "{\"k1\":\"v1\",\"k2\":\"v2\"}");
  82. }
  83. TEST(CurlHttpClient, http_post) {
  84. CurlHttpClient client;
  85. HttpRequest request;
  86. std::string test_body = "any-body";
  87. Url url;
  88. url.setHost("127.0.0.1");
  89. url.setPort(8021);
  90. url.setPath("/anypath");
  91. url.setQuery("k1=v1&k2=v2");
  92. request.setMethod(HttpRequest::Method::Post);
  93. request.setUrl(url);
  94. request.setHeader("Content-Type", "text/html");
  95. request.setBody(test_body.c_str(), test_body.size());
  96. HttpClient::HttpResponseOutcome out = client.makeRequest(request);
  97. EXPECT_TRUE(std::string(out.result().body()) == "POST: " + test_body);
  98. }
  99. TEST(CurlHttpClient, http_put) {
  100. CurlHttpClient client;
  101. HttpRequest request;
  102. std::string test_body = "any-body";
  103. Url url;
  104. url.setHost("127.0.0.1");
  105. url.setPort(8021);
  106. url.setPath("/anypath");
  107. url.setQuery("k1=v1&k2=v2");
  108. request.setMethod(HttpRequest::Method::Put);
  109. request.setUrl(url);
  110. request.setHeader("Content-Type", "text/html");
  111. request.setBody(test_body.c_str(), test_body.size());
  112. HttpClient::HttpResponseOutcome out = client.makeRequest(request);
  113. EXPECT_TRUE(std::string(out.result().body()) == "PUT: " + test_body);
  114. }
  115. TEST(CurlHttpClient, http_delete) {
  116. CurlHttpClient client;
  117. HttpRequest request;
  118. std::string test_body = "any-body";
  119. Url url;
  120. url.setHost("127.0.0.1");
  121. url.setPort(8021);
  122. url.setPath("/anypath");
  123. url.setQuery("k1=v1&k2=v2");
  124. request.setMethod(HttpRequest::Method::Delete);
  125. request.setUrl(url);
  126. request.setHeader("Content-Type", "text/html");
  127. request.setBody(test_body.c_str(), test_body.size());
  128. HttpClient::HttpResponseOutcome out = client.makeRequest(request);
  129. EXPECT_TRUE(std::string(out.result().body()) == "DELETE: " + test_body);
  130. }
  131. TEST(CurlHttpClient, netWorkError) {
  132. CurlHttpClient client;
  133. HttpRequest request;
  134. HttpClient::HttpResponseOutcome out = client.makeRequest(request);
  135. EXPECT_TRUE(out.error().errorCode() == "NetworkError");
  136. EXPECT_TRUE(out.error().errorMessage().find("Failed to connect to host or proxy: GET ") == 0);
  137. }
  138. TEST(CurlHttpClient, netWorkErrorWithHttpProxy) {
  139. const std::string hostname = "hostname";
  140. const std::string user = "user";
  141. const std::string password = "password";
  142. uint16_t port = 12345;
  143. const NetworkProxy proxy(NetworkProxy::Http, hostname, port, user, password);
  144. CurlHttpClient client;
  145. client.setProxy(proxy);
  146. HttpRequest request;
  147. HttpClient::HttpResponseOutcome out = client.makeRequest(request);
  148. EXPECT_TRUE(out.error().errorCode() == "NetworkError");
  149. EXPECT_TRUE(out.error().errorMessage().find("Failed to connect to host or proxy: GET ") == 0);
  150. }
  151. TEST(CurlHttpClient, netWorkErrorWithSocks5Proxy) {
  152. const std::string hostname = "hostname";
  153. const std::string user = "user";
  154. const std::string password = "password";
  155. uint16_t port = 12345;
  156. const NetworkProxy proxy(NetworkProxy::Socks5, hostname, port, user, password);
  157. CurlHttpClient client;
  158. client.setProxy(proxy);
  159. HttpRequest request;
  160. HttpClient::HttpResponseOutcome out = client.makeRequest(request);
  161. EXPECT_TRUE(out.error().errorCode() == "NetworkError");
  162. EXPECT_TRUE(out.error().errorMessage().find("Failed to connect to host or proxy: GET ") == 0);
  163. }
  164. TEST(CurlHttpClient, mock) {
  165. CurlHttpClient client;
  166. HttpRequest request;
  167. string body = "1234567";
  168. HttpResponse response(request);
  169. response.setStatusCode(200);
  170. response.setBody(body.c_str(), body.size());
  171. NiceMock<mockCurlHttpClient> mclient;
  172. HttpClient::HttpResponseOutcome res = HttpClient::HttpResponseOutcome(response);
  173. HttpClient::HttpResponseOutcome out1;
  174. out1.error().setErrorCode("111");
  175. out1.error().setErrorMessage("this is a mock test");
  176. DefaultValue<HttpClient::HttpResponseOutcome>::Set(res);
  177. HttpRequest req;
  178. EXPECT_CALL(mclient, makeRequest(_));
  179. HttpClient::HttpResponseOutcome o = mclient.makeRequest(request);
  180. EXPECT_TRUE(res.result().body() == body);
  181. }