diff options
Diffstat (limited to 'test/cpp')
-rw-r--r-- | test/cpp/client/credentials_test.cc | 3 | ||||
-rw-r--r-- | test/cpp/end2end/end2end_test.cc | 112 | ||||
-rw-r--r-- | test/cpp/interop/client_helper.cc | 6 | ||||
-rw-r--r-- | test/cpp/util/create_test_channel.cc | 6 | ||||
-rw-r--r-- | test/cpp/util/create_test_channel.h | 2 | ||||
-rw-r--r-- | test/cpp/util/fake_credentials.cc | 58 | ||||
-rw-r--r-- | test/cpp/util/fake_credentials.h | 51 | ||||
-rw-r--r-- | test/cpp/util/grpc_cli.cc | 2 | ||||
-rw-r--r-- | test/cpp/util/messages.proto | 1 |
9 files changed, 223 insertions, 18 deletions
diff --git a/test/cpp/client/credentials_test.cc b/test/cpp/client/credentials_test.cc index 6840418989..ee94f455a4 100644 --- a/test/cpp/client/credentials_test.cc +++ b/test/cpp/client/credentials_test.cc @@ -46,8 +46,7 @@ class CredentialsTest : public ::testing::Test { }; TEST_F(CredentialsTest, InvalidServiceAccountCreds) { - std::unique_ptr<Credentials> bad1 = - ServiceAccountCredentials("", "", 1); + std::shared_ptr<Credentials> bad1 = ServiceAccountCredentials("", "", 1); EXPECT_EQ(nullptr, bad1.get()); } diff --git a/test/cpp/end2end/end2end_test.cc b/test/cpp/end2end/end2end_test.cc index f35b16fe55..76271c3e1d 100644 --- a/test/cpp/end2end/end2end_test.cc +++ b/test/cpp/end2end/end2end_test.cc @@ -33,11 +33,13 @@ #include <thread> +#include "src/core/security/credentials.h" +#include "src/cpp/server/thread_pool.h" #include "test/core/util/port.h" #include "test/core/util/test_config.h" #include "test/cpp/util/echo_duplicate.grpc.pb.h" #include "test/cpp/util/echo.grpc.pb.h" -#include "src/cpp/server/thread_pool.h" +#include "test/cpp/util/fake_credentials.h" #include <grpc++/channel_arguments.h> #include <grpc++/channel_interface.h> #include <grpc++/client_context.h> @@ -106,6 +108,16 @@ class TestServiceImpl : public ::grpc::cpp::test::util::TestService::Service { } else { EXPECT_FALSE(context->IsCancelled()); } + + if (request->has_param() && request->param().echo_metadata()) { + const std::multimap<grpc::string, grpc::string>& client_metadata = + context->client_metadata(); + for (std::multimap<grpc::string, grpc::string>::const_iterator iter = + client_metadata.begin(); + iter != client_metadata.end(); ++iter) { + context->AddTrailingMetadata((*iter).first, (*iter).second); + } + } return Status::OK; } @@ -180,7 +192,7 @@ class End2endTest : public ::testing::Test { // Setup server ServerBuilder builder; builder.AddListeningPort(server_address_.str(), - InsecureServerCredentials()); + FakeTransportSecurityServerCredentials()); builder.RegisterService(&service_); builder.SetMaxMessageSize( kMaxMessageSize_); // For testing max message size. @@ -192,8 +204,9 @@ class End2endTest : public ::testing::Test { void TearDown() GRPC_OVERRIDE { server_->Shutdown(); } void ResetStub() { - std::shared_ptr<ChannelInterface> channel = CreateChannel( - server_address_.str(), InsecureCredentials(), ChannelArguments()); + std::shared_ptr<ChannelInterface> channel = + CreateChannel(server_address_.str(), FakeTransportSecurityCredentials(), + ChannelArguments()); stub_ = std::move(grpc::cpp::test::util::TestService::NewStub(channel)); } @@ -404,8 +417,9 @@ TEST_F(End2endTest, BidiStream) { // Talk to the two services with the same name but different package names. // The two stubs are created on the same channel. TEST_F(End2endTest, DiffPackageServices) { - std::shared_ptr<ChannelInterface> channel = CreateChannel( - server_address_.str(), InsecureCredentials(), ChannelArguments()); + std::shared_ptr<ChannelInterface> channel = + CreateChannel(server_address_.str(), FakeTransportSecurityCredentials(), + ChannelArguments()); EchoRequest request; EchoResponse response; @@ -429,7 +443,7 @@ TEST_F(End2endTest, DiffPackageServices) { // rpc and stream should fail on bad credentials. TEST_F(End2endTest, BadCredentials) { - std::unique_ptr<Credentials> bad_creds = ServiceAccountCredentials("", "", 1); + std::shared_ptr<Credentials> bad_creds = ServiceAccountCredentials("", "", 1); EXPECT_EQ(nullptr, bad_creds.get()); std::shared_ptr<ChannelInterface> channel = CreateChannel(server_address_.str(), bad_creds, ChannelArguments()); @@ -438,7 +452,7 @@ TEST_F(End2endTest, BadCredentials) { EchoRequest request; EchoResponse response; ClientContext context; - grpc::string msg("hello"); + request.set_message("Hello"); Status s = stub->Echo(&context, request, &response); EXPECT_EQ("", response.message()); @@ -588,6 +602,88 @@ TEST_F(End2endTest, RpcMaxMessageSize) { EXPECT_FALSE(s.IsOk()); } +bool MetadataContains(const std::multimap<grpc::string, grpc::string>& metadata, + const grpc::string& key, const grpc::string& value) { + int count = 0; + + for (std::multimap<grpc::string, grpc::string>::const_iterator iter = + metadata.begin(); + iter != metadata.end(); ++iter) { + if ((*iter).first == key && (*iter).second == value) { + count++; + } + } + return count == 1; +} + +TEST_F(End2endTest, SetPerCallCredentials) { + ResetStub(); + EchoRequest request; + EchoResponse response; + ClientContext context; + std::shared_ptr<Credentials> creds = + IAMCredentials("fake_token", "fake_selector"); + context.set_credentials(creds); + request.set_message("Hello"); + request.mutable_param()->set_echo_metadata(true); + + Status s = stub_->Echo(&context, request, &response); + EXPECT_EQ(request.message(), response.message()); + EXPECT_TRUE(s.IsOk()); + EXPECT_TRUE(MetadataContains(context.GetServerTrailingMetadata(), + GRPC_IAM_AUTHORIZATION_TOKEN_METADATA_KEY, + "fake_token")); + EXPECT_TRUE(MetadataContains(context.GetServerTrailingMetadata(), + GRPC_IAM_AUTHORITY_SELECTOR_METADATA_KEY, + "fake_selector")); +} + +TEST_F(End2endTest, InsecurePerCallCredentials) { + ResetStub(); + EchoRequest request; + EchoResponse response; + ClientContext context; + std::shared_ptr<Credentials> creds = InsecureCredentials(); + context.set_credentials(creds); + request.set_message("Hello"); + request.mutable_param()->set_echo_metadata(true); + + Status s = stub_->Echo(&context, request, &response); + EXPECT_EQ(StatusCode::CANCELLED, s.code()); + EXPECT_EQ("Failed to set credentials to rpc.", s.details()); +} + +TEST_F(End2endTest, OverridePerCallCredentials) { + ResetStub(); + EchoRequest request; + EchoResponse response; + ClientContext context; + std::shared_ptr<Credentials> creds1 = + IAMCredentials("fake_token1", "fake_selector1"); + context.set_credentials(creds1); + std::shared_ptr<Credentials> creds2 = + IAMCredentials("fake_token2", "fake_selector2"); + context.set_credentials(creds2); + request.set_message("Hello"); + request.mutable_param()->set_echo_metadata(true); + + Status s = stub_->Echo(&context, request, &response); + EXPECT_TRUE(MetadataContains(context.GetServerTrailingMetadata(), + GRPC_IAM_AUTHORIZATION_TOKEN_METADATA_KEY, + "fake_token2")); + EXPECT_TRUE(MetadataContains(context.GetServerTrailingMetadata(), + GRPC_IAM_AUTHORITY_SELECTOR_METADATA_KEY, + "fake_selector2")); + EXPECT_FALSE(MetadataContains(context.GetServerTrailingMetadata(), + GRPC_IAM_AUTHORIZATION_TOKEN_METADATA_KEY, + "fake_token1")); + EXPECT_FALSE(MetadataContains(context.GetServerTrailingMetadata(), + GRPC_IAM_AUTHORITY_SELECTOR_METADATA_KEY, + "fake_selector1")); + EXPECT_EQ(request.message(), response.message()); + EXPECT_TRUE(s.IsOk()); +} + } // namespace testing } // namespace grpc diff --git a/test/cpp/interop/client_helper.cc b/test/cpp/interop/client_helper.cc index a1dea383e6..09fd1c8913 100644 --- a/test/cpp/interop/client_helper.cc +++ b/test/cpp/interop/client_helper.cc @@ -82,7 +82,7 @@ std::shared_ptr<ChannelInterface> CreateChannelForTestCase( FLAGS_server_port); if (test_case == "service_account_creds") { - std::unique_ptr<Credentials> creds; + std::shared_ptr<Credentials> creds; GPR_ASSERT(FLAGS_enable_ssl); grpc::string json_key = GetServiceAccountJsonKey(); std::chrono::seconds token_lifetime = std::chrono::hours(1); @@ -91,13 +91,13 @@ std::shared_ptr<ChannelInterface> CreateChannelForTestCase( return CreateTestChannel(host_port, FLAGS_server_host_override, FLAGS_enable_ssl, FLAGS_use_prod_roots, creds); } else if (test_case == "compute_engine_creds") { - std::unique_ptr<Credentials> creds; + std::shared_ptr<Credentials> creds; GPR_ASSERT(FLAGS_enable_ssl); creds = ComputeEngineCredentials(); return CreateTestChannel(host_port, FLAGS_server_host_override, FLAGS_enable_ssl, FLAGS_use_prod_roots, creds); } else if (test_case == "jwt_token_creds") { - std::unique_ptr<Credentials> creds; + std::shared_ptr<Credentials> creds; GPR_ASSERT(FLAGS_enable_ssl); grpc::string json_key = GetServiceAccountJsonKey(); std::chrono::seconds token_lifetime = std::chrono::hours(1); diff --git a/test/cpp/util/create_test_channel.cc b/test/cpp/util/create_test_channel.cc index f040acc4b1..dc48fa2d87 100644 --- a/test/cpp/util/create_test_channel.cc +++ b/test/cpp/util/create_test_channel.cc @@ -58,13 +58,13 @@ namespace grpc { std::shared_ptr<ChannelInterface> CreateTestChannel( const grpc::string& server, const grpc::string& override_hostname, bool enable_ssl, bool use_prod_roots, - const std::unique_ptr<Credentials>& creds) { + const std::shared_ptr<Credentials>& creds) { ChannelArguments channel_args; if (enable_ssl) { const char* roots_certs = use_prod_roots ? "" : test_root_cert; SslCredentialsOptions ssl_opts = {roots_certs, "", ""}; - std::unique_ptr<Credentials> channel_creds = SslCredentials(ssl_opts); + std::shared_ptr<Credentials> channel_creds = SslCredentials(ssl_opts); if (!server.empty() && !override_hostname.empty()) { channel_args.SetSslTargetNameOverride(override_hostname); @@ -84,7 +84,7 @@ std::shared_ptr<ChannelInterface> CreateTestChannel( const grpc::string& server, const grpc::string& override_hostname, bool enable_ssl, bool use_prod_roots) { return CreateTestChannel(server, override_hostname, enable_ssl, - use_prod_roots, std::unique_ptr<Credentials>()); + use_prod_roots, std::shared_ptr<Credentials>()); } // Shortcut for end2end and interop tests. diff --git a/test/cpp/util/create_test_channel.h b/test/cpp/util/create_test_channel.h index 5c298ce850..5f2609ddd8 100644 --- a/test/cpp/util/create_test_channel.h +++ b/test/cpp/util/create_test_channel.h @@ -52,7 +52,7 @@ std::shared_ptr<ChannelInterface> CreateTestChannel( std::shared_ptr<ChannelInterface> CreateTestChannel( const grpc::string& server, const grpc::string& override_hostname, bool enable_ssl, bool use_prod_roots, - const std::unique_ptr<Credentials>& creds); + const std::shared_ptr<Credentials>& creds); } // namespace grpc diff --git a/test/cpp/util/fake_credentials.cc b/test/cpp/util/fake_credentials.cc new file mode 100644 index 0000000000..f5b83b8159 --- /dev/null +++ b/test/cpp/util/fake_credentials.cc @@ -0,0 +1,58 @@ +/* + * + * Copyright 2015, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include <grpc/grpc_security.h> +#include <grpc++/channel_arguments.h> +#include <grpc++/credentials.h> +#include <grpc++/server_credentials.h> +#include "src/cpp/client/channel.h" +#include "src/cpp/client/secure_credentials.h" +#include "src/cpp/server/secure_server_credentials.h" + +namespace grpc { +namespace testing { + +std::shared_ptr<Credentials> FakeTransportSecurityCredentials() { + grpc_credentials* c_creds = grpc_fake_transport_security_credentials_create(); + return std::shared_ptr<Credentials>(new SecureCredentials(c_creds)); +} + +std::shared_ptr<ServerCredentials> FakeTransportSecurityServerCredentials() { + grpc_server_credentials* c_creds = + grpc_fake_transport_security_server_credentials_create(); + return std::shared_ptr<ServerCredentials>( + new SecureServerCredentials(c_creds)); +} + +} // namespace testing +} // namespace grpc diff --git a/test/cpp/util/fake_credentials.h b/test/cpp/util/fake_credentials.h new file mode 100644 index 0000000000..e1ba7bb9e4 --- /dev/null +++ b/test/cpp/util/fake_credentials.h @@ -0,0 +1,51 @@ +/* + * + * Copyright 2015, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef GRPC_TEST_CPP_UTIL_FAKE_CREDENTIALS_H +#define GRPC_TEST_CPP_UTIL_FAKE_CREDENTIALS_H + +#include <memory> + +namespace grpc { +class Credentials; +class ServerCredentials; + +namespace testing { + +std::shared_ptr<Credentials> FakeTransportSecurityCredentials(); +std::shared_ptr<ServerCredentials> FakeTransportSecurityServerCredentials(); + +} // namespace testing +} // namespace grpc + +#endif // GRPC_TEST_CPP_UTIL_FAKE_CREDENTIALS_H diff --git a/test/cpp/util/grpc_cli.cc b/test/cpp/util/grpc_cli.cc index d71a7a0b77..ad3c0af877 100644 --- a/test/cpp/util/grpc_cli.cc +++ b/test/cpp/util/grpc_cli.cc @@ -104,7 +104,7 @@ int main(int argc, char** argv) { std::stringstream input_stream; input_stream << input_file.rdbuf(); - std::unique_ptr<grpc::Credentials> creds; + std::shared_ptr<grpc::Credentials> creds; if (!FLAGS_enable_ssl) { creds = grpc::InsecureCredentials(); } else { diff --git a/test/cpp/util/messages.proto b/test/cpp/util/messages.proto index a79bce1f30..062f66c091 100644 --- a/test/cpp/util/messages.proto +++ b/test/cpp/util/messages.proto @@ -36,6 +36,7 @@ message RequestParams { optional bool echo_deadline = 1; optional int32 client_cancel_after_us = 2; optional int32 server_cancel_after_us = 3; + optional bool echo_metadata = 4; } message EchoRequest { |