curlhttpclient_ut.cc 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  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::Return;
  12. using ::testing::DoAll;
  13. using ::testing::SetArgReferee;
  14. using ::testing::ReturnPointee;
  15. using ::testing::_;
  16. using ::testing::NiceMock;
  17. using ::testing::DefaultValue;
  18. using namespace AlibabaCloud;
  19. using namespace std;
  20. class mockCurlHttpClient : public CurlHttpClient {
  21. public:
  22. MOCK_METHOD1(makeRequest, HttpResponseOutcome (const HttpRequest &request));
  23. };
  24. TEST(CurlHttpClient, http_get) {
  25. CurlHttpClient client;
  26. HttpRequest request;
  27. Url url;
  28. url.setHost("127.0.0.1");
  29. url.setPort(8021);
  30. url.setPath("/anypath");
  31. url.setQuery("k1=v1&k2=v2");
  32. request.setMethod(HttpRequest::Method::Get);
  33. request.setUrl(url);
  34. request.setHeader("Content-Type", "text/html");
  35. HttpClient::HttpResponseOutcome out = client.makeRequest(request);
  36. EXPECT_TRUE(std::string(out.result().body()) == "{\"k1\":\"v1\",\"k2\":\"v2\"}");
  37. }
  38. TEST(CurlHttpClient, http_post) {
  39. CurlHttpClient client;
  40. HttpRequest request;
  41. std::string test_body = "any-body";
  42. Url url;
  43. url.setHost("127.0.0.1");
  44. url.setPort(8021);
  45. url.setPath("/anypath");
  46. url.setQuery("k1=v1&k2=v2");
  47. request.setMethod(HttpRequest::Method::Post);
  48. request.setUrl(url);
  49. request.setHeader("Content-Type", "text/html");
  50. request.setBody(test_body.c_str(), test_body.size());
  51. HttpClient::HttpResponseOutcome out = client.makeRequest(request);
  52. EXPECT_TRUE(std::string(out.result().body()) == "POST: " + test_body);
  53. }
  54. TEST(CurlHttpClient, http_put) {
  55. CurlHttpClient client;
  56. HttpRequest request;
  57. std::string test_body = "any-body";
  58. Url url;
  59. url.setHost("127.0.0.1");
  60. url.setPort(8021);
  61. url.setPath("/anypath");
  62. url.setQuery("k1=v1&k2=v2");
  63. request.setMethod(HttpRequest::Method::Put);
  64. request.setUrl(url);
  65. request.setHeader("Content-Type", "text/html");
  66. request.setBody(test_body.c_str(), test_body.size());
  67. HttpClient::HttpResponseOutcome out = client.makeRequest(request);
  68. EXPECT_TRUE(std::string(out.result().body()) == "PUT: " + test_body);
  69. }
  70. TEST(CurlHttpClient, http_delete) {
  71. CurlHttpClient client;
  72. HttpRequest request;
  73. std::string test_body = "any-body";
  74. Url url;
  75. url.setHost("127.0.0.1");
  76. url.setPort(8021);
  77. url.setPath("/anypath");
  78. url.setQuery("k1=v1&k2=v2");
  79. request.setMethod(HttpRequest::Method::Delete);
  80. request.setUrl(url);
  81. request.setHeader("Content-Type", "text/html");
  82. request.setBody(test_body.c_str(), test_body.size());
  83. HttpClient::HttpResponseOutcome out = client.makeRequest(request);
  84. EXPECT_TRUE(std::string(out.result().body()) == "DELETE: " + test_body);
  85. }
  86. TEST(CurlHttpClient, netWorkError) {
  87. CurlHttpClient client;
  88. HttpRequest request;
  89. HttpClient::HttpResponseOutcome out = client.makeRequest(request);
  90. EXPECT_TRUE(out.error().errorCode() == "NetworkError");
  91. EXPECT_TRUE(out.error().errorMessage().find("Failed to connect to host or proxy: GET ") == 0);
  92. }
  93. TEST(CurlHttpClient, netWorkErrorWithHttpProxy) {
  94. const std::string hostname = "hostname";
  95. const std::string user = "user";
  96. const std::string password = "password";
  97. uint16_t port = 12345;
  98. const NetworkProxy proxy(NetworkProxy::Http, hostname, port, user, password);
  99. CurlHttpClient client;
  100. client.setProxy(proxy);
  101. HttpRequest request;
  102. HttpClient::HttpResponseOutcome out = client.makeRequest(request);
  103. EXPECT_TRUE(out.error().errorCode() == "NetworkError");
  104. EXPECT_TRUE(out.error().errorMessage().find("Failed to connect to host or proxy: GET ") == 0);
  105. }
  106. TEST(CurlHttpClient, netWorkErrorWithSocks5Proxy) {
  107. const std::string hostname = "hostname";
  108. const std::string user = "user";
  109. const std::string password = "password";
  110. uint16_t port = 12345;
  111. const NetworkProxy proxy(NetworkProxy::Socks5, hostname, port, user, password);
  112. CurlHttpClient client;
  113. client.setProxy(proxy);
  114. HttpRequest request;
  115. HttpClient::HttpResponseOutcome out = client.makeRequest(request);
  116. EXPECT_TRUE(out.error().errorCode() == "NetworkError");
  117. EXPECT_TRUE(out.error().errorMessage().find("Failed to connect to host or proxy: GET ") == 0);
  118. }
  119. TEST(CurlHttpClient, mock) {
  120. CurlHttpClient client;
  121. HttpRequest request;
  122. string body = "1234567";
  123. HttpResponse response(request);
  124. response.setStatusCode(200);
  125. response.setBody(body.c_str(), body.size());
  126. NiceMock<mockCurlHttpClient> mclient;
  127. HttpClient::HttpResponseOutcome res = HttpClient::HttpResponseOutcome(response);
  128. HttpClient::HttpResponseOutcome out1;
  129. out1.error().setErrorCode("111");
  130. out1.error().setErrorMessage("this is a mock test");
  131. DefaultValue<HttpClient::HttpResponseOutcome>::Set(res);
  132. HttpRequest req;
  133. EXPECT_CALL(mclient, makeRequest(_));
  134. HttpClient::HttpResponseOutcome o = mclient.makeRequest(request);
  135. EXPECT_TRUE(res.result().body() == body);
  136. }