curlhttpclient_ut.cc 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. #include <iostream>
  2. #include <stdio.h>
  3. #include "utils.h"
  4. #include "../include/gtest/gtest.h"
  5. #include "../include/gmock/gmock.h"
  6. #include "../../core/include/alibabacloud/core/Url.h"
  7. #include "../../core/include/alibabacloud/core/HttpRequest.h"
  8. #include "../../core/include/alibabacloud/core/HttpClient.h"
  9. #include "../../core/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. // httpserver_for_ut port "echo text"
  25. // default port 8021
  26. // default text test/httpserver/index.html
  27. TEST(CurlHttpClient, basic) {
  28. CurlHttpClient client;
  29. HttpRequest request;
  30. utUtils utils;
  31. char dir[1024];
  32. utils.get_dir_exec(dir, nullptr);
  33. char httpserver_ut_with_args[10 * 1024];
  34. const string testBody = "CurlHttpClient test boday";
  35. snprintf(httpserver_ut_with_args, 10 * 1024, "%s/httpserver_for_ut 8021 \"%s\"", dir, testBody.c_str());
  36. FILE* http = popen(httpserver_ut_with_args, "r");
  37. EXPECT_TRUE(http != nullptr);
  38. // wait util httpserver started
  39. char buffer[100];
  40. usleep(10 * 1000);
  41. fgets(buffer, 100, http);
  42. Url url;
  43. url.setHost("127.0.0.1");
  44. url.setPort(8021);
  45. request.setMethod(HttpRequest::Method::Get);
  46. request.setUrl(url);
  47. request.setHeader("head1", "value1");
  48. request.setHeader("head2", "value2");
  49. HttpClient::HttpResponseOutcome out = client.makeRequest(request);
  50. EXPECT_TRUE(out.result().body() == testBody);
  51. request.setMethod(HttpRequest::Method::Put);
  52. request.setUrl(url);
  53. HttpClient::HttpResponseOutcome out1 = client.makeRequest(request);
  54. EXPECT_TRUE(out1.result().body() == testBody);
  55. request.setMethod(HttpRequest::Method::Post);
  56. request.setUrl(url);
  57. HttpClient::HttpResponseOutcome out2 = client.makeRequest(request);
  58. EXPECT_TRUE(out2.result().body() == testBody);
  59. pclose(http);
  60. }
  61. TEST(CurlHttpClient, netWorkError) {
  62. CurlHttpClient client;
  63. HttpRequest request;
  64. HttpClient::HttpResponseOutcome out = client.makeRequest(request);
  65. EXPECT_TRUE(out.error().errorCode() == "NetworkError");
  66. EXPECT_TRUE(out.error().errorMessage() == "Failed to connect to host or proxy.");
  67. }
  68. TEST(CurlHttpClient, netWorkErrorWithHttpProxy) {
  69. const std::string hostname = "hostname";
  70. const std::string user = "user";
  71. const std::string password = "password";
  72. uint16_t port = 12345;
  73. const NetworkProxy proxy(NetworkProxy::Http, hostname, port, user, password);
  74. CurlHttpClient client;
  75. client.setProxy(proxy);
  76. HttpRequest request;
  77. HttpClient::HttpResponseOutcome out = client.makeRequest(request);
  78. EXPECT_TRUE(out.error().errorCode() == "NetworkError");
  79. EXPECT_TRUE(out.error().errorMessage() == "Failed to connect to host or proxy.");
  80. }
  81. TEST(CurlHttpClient, netWorkErrorWithSocks5Proxy) {
  82. const std::string hostname = "hostname";
  83. const std::string user = "user";
  84. const std::string password = "password";
  85. uint16_t port = 12345;
  86. const NetworkProxy proxy(NetworkProxy::Socks5, hostname, port, user, password);
  87. CurlHttpClient client;
  88. client.setProxy(proxy);
  89. HttpRequest request;
  90. HttpClient::HttpResponseOutcome out = client.makeRequest(request);
  91. EXPECT_TRUE(out.error().errorCode() == "NetworkError");
  92. EXPECT_TRUE(out.error().errorMessage() == "Failed to connect to host or proxy.");
  93. }
  94. TEST(CurlHttpClient, mock) {
  95. CurlHttpClient client;
  96. HttpRequest request;
  97. string body = "1234567";
  98. HttpResponse response(request);
  99. response.setStatusCode(200);
  100. response.setBody(body.c_str(), body.size());
  101. NiceMock<mockCurlHttpClient> mclient;
  102. HttpClient::HttpResponseOutcome res = HttpClient::HttpResponseOutcome(response);
  103. HttpClient::HttpResponseOutcome out1;
  104. out1.error().setErrorCode("111");
  105. out1.error().setErrorMessage("this is a mock test");
  106. DefaultValue<HttpClient::HttpResponseOutcome>::Set(res);
  107. HttpRequest req;
  108. EXPECT_CALL(mclient, makeRequest(_));
  109. HttpClient::HttpResponseOutcome o = mclient.makeRequest(request);
  110. EXPECT_TRUE(res.result().body() == body);
  111. }