Sfoglia il codice sorgente

add unit test case for ecsmetadata and fix other ut

zhangzifa 7 anni fa
parent
commit
fc29617d7d

+ 2 - 2
core/include/alibabacloud/core/CommonClient.h

@@ -35,7 +35,7 @@ namespace AlibabaCloud
 		typedef std::future<CommonResponseOutcome> CommonResponseOutcomeCallable;
 		typedef std::function<void(const CommonClient*, const CommonRequest&, const CommonResponseOutcome&, const std::shared_ptr<const AsyncCallerContext>&)> CommonResponseAsyncHandler;
 		typedef Outcome<Error, std::string> JsonOutcome;
-		
+
 		CommonClient(const Credentials &credentials, const ClientConfiguration &configuration);
 		CommonClient(const std::shared_ptr<CredentialsProvider> &credentialsProvider, const ClientConfiguration &configuration);
 		CommonClient(const std::string &accessKeyId, const std::string &accessKeySecret, const ClientConfiguration &configuration);
@@ -51,7 +51,7 @@ namespace AlibabaCloud
 		HttpRequest buildRoaHttpRequest(const std::string & endpoint, const CommonRequest &msg, HttpRequest::Method method) const;
 		HttpRequest buildRpcHttpRequest(const std::string & endpoint, const CommonRequest &msg, HttpRequest::Method method) const;
 		JsonOutcome makeRequest(const std::string &endpoint, const CommonRequest &msg, HttpRequest::Method method = HttpRequest::Method::Get)const;
-
+		using CoreClient::asyncExecute;
 	private:
 		std::string canonicalizedQuery(const std::map <std::string, std::string> &params)const;
 		std::string canonicalizedHeaders(const HttpMessage::HeaderCollection &headers)const;

+ 3 - 3
core/include/alibabacloud/core/CoreClient.h

@@ -1,12 +1,12 @@
 /*
  * Copyright 2009-2017 Alibaba Cloud All rights reserved.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ 3 - 3
core/include/alibabacloud/core/HttpMessage.h

@@ -1,12 +1,12 @@
 /*
  * Copyright 2009-2017 Alibaba Cloud All rights reserved.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ 3 - 10
core/src/EcsMetadataFetcher.cc

@@ -22,13 +22,6 @@
 
 using namespace AlibabaCloud;
 
-namespace
-{
-	const int DEFAULT_TIMEOUT_IN_MILLISECONDS = 5000;
-	const char* const METADATA_SERVICE_HOST = "100.100.100.200";
-	const char* const URL_IN_ECS_METADATA = "/latest/meta-data/ram/security-credentials/";
-}
-
 EcsMetadataFetcher::EcsMetadataFetcher()
 {
 }
@@ -47,13 +40,13 @@ void EcsMetadataFetcher::setRoleName(const std::string & roleName)
 	roleName_ = roleName;
 }
 
-std::string EcsMetadataFetcher::getMetadata()
+std::string EcsMetadataFetcher::getMetadata(const std::string host, const std::string in_path)
 {
 	std::stringstream path;
-	path << URL_IN_ECS_METADATA << roleName_;
+	path << in_path << roleName_;
 
 	Url credentialUrl;
-	credentialUrl.setHost(METADATA_SERVICE_HOST);
+	credentialUrl.setHost(host);
 	credentialUrl.setPath(path.str());
 
 	auto client = std::make_shared<CurlHttpClient>();

+ 7 - 2
core/src/EcsMetadataFetcher.h

@@ -19,6 +19,12 @@
 
 #include <string>
 
+namespace {
+	const int DEFAULT_TIMEOUT_IN_MILLISECONDS = 5000;
+	const char* const METADATA_SERVICE_HOST = "100.100.100.200";
+	const char* const URL_IN_ECS_METADATA = "/latest/meta-data/ram/security-credentials/";
+}
+
 namespace AlibabaCloud
 {
 	class EcsMetadataFetcher
@@ -29,8 +35,7 @@ namespace AlibabaCloud
 
 		std::string roleName()const;
 		void setRoleName(const std::string & roleName);
-		
-		std::string getMetadata();
+		std::string getMetadata(const std::string host = METADATA_SERVICE_HOST, const std::string path = URL_IN_ECS_METADATA);
 	private:
 		std::string roleName_;
 	};

+ 1 - 0
test/core/CMakeLists.txt

@@ -44,6 +44,7 @@ add_executable(core_ut
   commonresponse_ut.cc
   credentials_ut.cc
   curlhttpclient_ut.cc
+  ecsmetadatafetcher_ut.cc
   endpointprovider_ut.cc
   error_ut.cc
   executor_ut.cc

+ 39 - 20
test/core/commonclient_ut.cc

@@ -4,11 +4,13 @@
 #include "gtest/gtest.h"
 #include "../../core/src/Utils.h"
 #include "alibabacloud/core/Config.h"
+#include "alibabacloud/core/AlibabaCloud.h"
 #include "alibabacloud/core/CommonClient.h"
 #include "alibabacloud/core/CommonResponse.h"
 #include "alibabacloud/core/CommonRequest.h"
 #include "alibabacloud/core/SimpleCredentialsProvider.h"
 
+
 using namespace std;
 using namespace AlibabaCloud;
 
@@ -18,23 +20,23 @@ namespace AlibabaCloud {
       TestCommonClient(const Credentials &credentials, const ClientConfiguration &configuration):
         CommonClient(credentials, configuration)
       {}
-      HttpRequest buildHttp(const std::string & endpoint, const CommonRequest &msg, HttpRequest::Method method) {
-        return CommonClient::buildHttpRequest(endpoint, msg, method);
-      }
-      HttpRequest buildRoa(const std::string & endpoint, const CommonRequest &msg, HttpRequest::Method method) {
-        return CommonClient::buildRoaHttpRequest(endpoint, msg, method);
-      }
-      HttpRequest buildRpc(const std::string & endpoint, const CommonRequest &msg, HttpRequest::Method method) {
-        return CommonClient::buildRpcHttpRequest(endpoint, msg, method);
-      }
-
-      JsonOutcome buildReq(const std::string & endpoint, const CommonRequest &msg, HttpRequest::Method method) {
-        return CommonClient::makeRequest(endpoint, msg, method);
-      }
+      using CommonClient::buildHttpRequest;
+      using CommonClient::buildRoaHttpRequest;
+      using CommonClient::buildRpcHttpRequest;
+      using CommonClient::makeRequest;
+      using CommonClient::asyncExecute;
   };
 }
 
+static int nbr = 0;
+static void task() {
+   nbr |= 0x01;
+}
+
+
 TEST(CommonClient, basic) {
+
+  InitializeSdk();
   const ClientConfiguration cfg;
 
   std::string key    = "accessKeyId";
@@ -50,7 +52,18 @@ TEST(CommonClient, basic) {
   CommonRequest cr;
   cr.setContent("test-content", 12);
 
-  CommonClient::CommonResponseOutcome out = cc1.commonResponse(cr);
+  CommonClient::CommonResponseOutcome out1 = cc1.commonResponse(cr);
+  EXPECT_TRUE(out1.error().errorCode() == "NetworkError");
+  EXPECT_TRUE(out1.result().payload() == "");
+
+  CommonClient::CommonResponseOutcome out2 = cc2.commonResponse(cr);
+  EXPECT_TRUE(out2.error().errorCode() == "NetworkError");
+  EXPECT_TRUE(out2.result().payload() == "");
+
+  CommonClient::CommonResponseOutcome out3 = cc3.commonResponse(cr);
+  EXPECT_TRUE(out3.error().errorCode() == "NetworkError");
+  EXPECT_TRUE(out3.result().payload() == "");
+
 /*
 https://cn-hangzhou/?
    AccessKeyId=accessKeyId
@@ -66,7 +79,7 @@ https://cn-hangzhou/?
 */
 
   TestCommonClient* client = new TestCommonClient(credentials, cfg);
-  HttpRequest r = client->buildHttp("cn-hangzhou", cr, HttpRequest::Method::Post);
+  HttpRequest r = client->buildHttpRequest("cn-hangzhou", cr, HttpRequest::Method::Post);
   EXPECT_TRUE(r.method() == HttpRequest::Method::Post);
   EXPECT_TRUE(r.url().scheme() == "https");
   EXPECT_TRUE(r.url().userName() == "");
@@ -86,11 +99,10 @@ https://cn-hangzhou/?
   EXPECT_TRUE(r.url().query().find("Timestamp=") != string::npos);
   EXPECT_TRUE(r.url().query().find("Version=") != string::npos);
 
-
   cr.setQueryParameter("query_k1", "query_v1");
   cr.setHeaderParameter("header_k1", "header_v1");
 
-  HttpRequest rr = client->buildRoa("cn-shanghai", cr, HttpRequest::Method::Get);
+  HttpRequest rr = client->buildRoaHttpRequest("cn-shanghai", cr, HttpRequest::Method::Get);
   EXPECT_TRUE(rr.method() == HttpRequest::Method::Get);
   EXPECT_TRUE(rr.header("Accept") == "application/json");
   EXPECT_TRUE(rr.url().toString() == "https://cn-shanghai/?header_k1=header_v1");
@@ -109,7 +121,14 @@ https://cn-hangzhou/?
   // acs accessKeyId:JZD81jGWLp1F3ZIkaLp1yuEZmKc=
   EXPECT_TRUE(rr.header("Authorization").find("acs accessKeyId:") != string::npos);
   EXPECT_TRUE(rr.header("unknown-header") == "");
-  HttpRequest rrr = client->buildRpc("cn-hangzhou", cr, HttpRequest::Method::Post);
-  cout << "" <<endl;
-
+  HttpRequest rrr = client->buildRpcHttpRequest("cn-hangzhou", cr, HttpRequest::Method::Post);
+  EXPECT_TRUE(client->serviceName() == "Common");
+
+  std::function<void()> func(task);
+  Runnable* rf = new Runnable(func);
+  EXPECT_TRUE(nbr == 0);
+  client->asyncExecute(rf);
+  usleep(10000);
+  EXPECT_TRUE(nbr == 1);
+  ShutdownSdk();
 }

+ 6 - 6
test/core/curlhttpclient_ut.cc

@@ -2,12 +2,12 @@
 #include <stdio.h>
 
 #include "utils.h"
-#include "../include/gtest/gtest.h"
-#include "../include/gmock/gmock.h"
-#include "../../core/include/alibabacloud/core/Url.h"
-#include "../../core/include/alibabacloud/core/HttpRequest.h"
-#include "../../core/include/alibabacloud/core/HttpClient.h"
-#include "../../core/src/CurlHttpClient.h"
+#include "gtest/gtest.h"
+#include "gmock/gmock.h"
+#include "alibabacloud/core/Url.h"
+#include "alibabacloud/core/HttpRequest.h"
+#include "alibabacloud/core/HttpClient.h"
+#include "../src/CurlHttpClient.h"
 
 using namespace std;
 using ::testing::Return;

+ 34 - 0
test/core/ecsmetadatafetcher_ut.cc

@@ -0,0 +1,34 @@
+#include <iostream>
+#include <stdio.h>
+#include "gtest/gtest.h"
+#include "gmock/gmock.h"
+#include "alibabacloud/core/Url.h"
+#include "alibabacloud/core/HttpRequest.h"
+#include "alibabacloud/core/HttpClient.h"
+#include "../src/EcsMetadataFetcher.h"
+
+using namespace std;
+using namespace AlibabaCloud;
+
+namespace {
+
+  TEST(EcsMetadataFetcher, basic) {
+    EcsMetadataFetcher fetcher;
+    fetcher.setRoleName("test-role-name");
+    EXPECT_TRUE(fetcher.roleName() == "test-role-name");
+  }
+
+  TEST(EcsMetadataFetcher, mock) {
+    HttpRequest request;
+
+    string body = "1234567";
+    HttpResponse response(request);
+    response.setStatusCode(200);
+    response.setBody(body.c_str(), body.size());
+
+    EcsMetadataFetcher fetcher;
+    string out = fetcher.getMetadata("a", "b");
+    EXPECT_TRUE(out == "NetworkError");
+    out = fetcher.getMetadata("127.0.0.1");
+  }
+}

+ 0 - 13
test/core/httpmessage_ut.cc

@@ -40,17 +40,4 @@ TEST(HttpMessage, perRequest) {
   EXPECT_TRUE(req.bodySize() == body.size());
   EXPECT_TRUE(req.hasBody());
   EXPECT_TRUE(req.body() != nullptr);
-
-
 }
-
-class TestHttpMessage: public HttpMessage {
- public:
-  TestHttpMessage(): HttpMessage(){}
-};
-
-TEST(HttpMessage, A) {
-  TestHttpMessage tm;
-  TestHttpMessage ttm(tm);
-
-}

+ 34 - 92
test/core/roaserviceclient_ut.cc

@@ -4,6 +4,7 @@
 #include "alibabacloud/core/SimpleCredentialsProvider.h"
 #include "alibabacloud/core/RoaServiceClient.h"
 #include "alibabacloud/core/HttpMessage.h"
+#include "alibabacloud/core/HttpRequest.h"
 
 using namespace std;
 using namespace AlibabaCloud;
@@ -25,58 +26,26 @@ namespace AlibabaCloud {
     HttpRequest buildHttpRequest(const std::string & endpoint, const ServiceRequest &msg, HttpRequest::Method method)const {
       return RoaServiceClient::buildHttpRequest(endpoint, msg, method);
     }
-
   };
 
-
   class TestRoaServiceRequest: public ServiceRequest {
    public:
     TestRoaServiceRequest(const std::string &product, const std::string &version):
     ServiceRequest(product, version){}
 
-
-    void addParameter(const ParameterNameType &name, const ParameterValueType &value) {
-      addParameter(name, value);
-    }
-    ParameterValueType parameter(const ParameterNameType &name)const {
-      return parameter(name);
-    }
-    void removeParameter(const ParameterNameType &name) {
-      removeParameter(name);
-    }
-    void setContent(const char *data, size_t size) {
-      setContent(data, size);
-    }
-    void setParameter(const ParameterNameType &name, const ParameterValueType &value) {
-      setParameter(name, value);
-    }
-    void setParameters(const ParameterCollection &params) {
-      setParameters(params);
-    }
-    void setResourcePath(const std::string &path) {
-      setResourcePath(path);
-    }
-    void setProduct(const std::string &product) {
-      setProduct(product);
-    }
-    void setVersion(const std::string &version) {
-      setVersion(version);
-    }
-};
-
+    using ServiceRequest::addParameter;
+    using ServiceRequest::parameter;
+    using ServiceRequest::removeParameter;
+    using ServiceRequest::setContent;
+    using ServiceRequest::setParameter;
+    using ServiceRequest::setParameters;
+    using ServiceRequest::setResourcePath;
+    using ServiceRequest::setProduct;
+    using ServiceRequest::setVersion;
+  };
 }
 
-
-
-
-
-
-
-
-
-
-
-TEST(RoaServiceClient, b0) {
+TEST(RoaServiceClient, basic) {
   const ClientConfiguration config;
 
   std::string key    = "accessKeyId";
@@ -85,65 +54,38 @@ TEST(RoaServiceClient, b0) {
 
   const Credentials credentials(key, secret, token);
 
-  // const CommonClient cc1(credentials, cfg);
-  // CommonClient cc2(std::make_shared<SimpleCredentialsProvider>(credentials), cfg);
-
-
   TestRoaClient client("ecs", std::make_shared<SimpleCredentialsProvider>(credentials), config);
 
   const string product = "ECS";
   const string version = "1.0";
 
   RoaServiceRequest roa_req(product, version);
-  // roa_req.setParameter("key1", "value1");
-  // roa_req.setQueryParameter("query_k1", "query_v1");
-  // string content = "test-content";
-  // roa_req.setContent(content.c_str(), content.length());
 
-  client.makeRequest("cn-shanghai", roa_req, HttpRequest::Method::Get);
+  RoaServiceClient::JsonOutcome out = client.makeRequest("cn-shanghai", roa_req, HttpRequest::Method::Get);
+
+  EXPECT_TRUE(out.error().errorCode() == "NetworkError");
 
   RoaServiceRequest req(product, version);
 
   req.setParameter("a", "b");
   req.setContent("123456789", 9);
-  client.buildHttpRequest("cn-shanghai", req, HttpRequest::Method::Get);
-
-}
-
-
-TEST(RoaServiceClient, basic) {
-  const string service = "ECS";
-  const std::string regionId = "cn-shanghai";
-
-  const std::string hostname = "hostname";
-  const std::string user = "user";
-  const std::string password = "password";
-  uint16_t port = 12345;
-  const NetworkProxy proxy(NetworkProxy::Http, hostname, port, user, password);
-
-  HmacSha1Signer sig;
-
-  const std::string access_key = "accessKeyId";
-  const std::string access_secret = "accessKeySecret";
-  const std::string session_token = "sessionToken";
-  Credentials credentials(access_key, access_secret, session_token);
-
-  ClientConfiguration config(regionId, proxy);
-
-  RoaServiceClient roa(service,
-    std::make_shared<SimpleCredentialsProvider>(credentials),
-    config);
-  TestRoaClient client(service, std::make_shared<SimpleCredentialsProvider>(credentials), config);
-
-
-  HttpMessage::HeaderCollection headers;
-  // client.canonicalizedHeaders(headers);
-  // REQUIRE(roa.actionName() == action);
+  HttpRequest http_req = client.buildHttpRequest("cn-shanghai", req, HttpRequest::Method::Get);
+
+  EXPECT_TRUE(http_req.url().toString() == "https://cn-shanghai/?a=b");
+  EXPECT_TRUE(http_req.header("Accept") == "application/json");
+  EXPECT_TRUE(http_req.header("Content-Length") == "9");
+  EXPECT_TRUE(http_req.header("Content-Type") == "application/octet-stream");
+  EXPECT_TRUE(http_req.header("Content-MD5") == "JfnnlDI7RTiF9RgfG2JNCw==");
+  const string date = "Fri, 11 Jan 2019 14:08:39 GMT";
+  EXPECT_TRUE(http_req.header("Date").length() == date.length());
+  EXPECT_TRUE(http_req.header("Host") == "cn-shanghai");
+  EXPECT_TRUE(http_req.header("x-sdk-cient") == "");
+  EXPECT_TRUE(http_req.header("x-acs-region-id") == "cn-hangzhou");
+  EXPECT_TRUE(http_req.header("x-acs-security-token") == token);
+  EXPECT_TRUE(http_req.header("x-acs-signature-method") == "HMAC-SHA1");
+  EXPECT_TRUE(http_req.header("x-acs-signature-version") == "1.0");
+  EXPECT_TRUE(http_req.header("x-acs-version") == "1.0");
+  const string nounce = "8a013b14-7bac-4652-8b5f-c02c8924e4ae";
+  EXPECT_TRUE(http_req.header("x-acs-signature-nonce").length() == nounce.length());
+  EXPECT_TRUE(http_req.header("Authorization").find("acs accessKeyId:") != string::npos);
 }
-
-// EcsClient::EcsClient(const Credentials &credentials, const ClientConfiguration &configuration) :
-//   RpcServiceClient(SERVICE_NAME, std::make_shared<SimpleCredentialsProvider>(credentials), configuration)
-// {
-//   auto locationClient = std::make_shared<LocationClient>(credentials, configuration);
-//   endpointProvider_ = std::make_shared<EndpointProvider>(locationClient, configuration.regionId(), SERVICE_NAME, "ecs");
-// }