21 #include <gtest/gtest.h>
23 #include "absl/memory/memory.h"
43 #include "src/proto/grpc/channelz/channelz.grpc.pb.h"
44 #include "src/proto/grpc/testing/echo.grpc.pb.h"
51 using grpc::channelz::v1::GetChannelRequest;
52 using grpc::channelz::v1::GetChannelResponse;
53 using grpc::channelz::v1::GetServerRequest;
54 using grpc::channelz::v1::GetServerResponse;
55 using grpc::channelz::v1::GetServerSocketsRequest;
56 using grpc::channelz::v1::GetServerSocketsResponse;
57 using grpc::channelz::v1::GetServersRequest;
58 using grpc::channelz::v1::GetServersResponse;
59 using grpc::channelz::v1::GetSocketRequest;
60 using grpc::channelz::v1::GetSocketResponse;
61 using grpc::channelz::v1::GetSubchannelRequest;
62 using grpc::channelz::v1::GetSubchannelResponse;
63 using grpc::channelz::v1::GetTopChannelsRequest;
64 using grpc::channelz::v1::GetTopChannelsResponse;
70 bool ValidateAddress(
const Address& address) {
71 if (address.address_case() != Address::kTcpipAddress) {
74 return address.tcpip_address().ip_address().size() == 4 ||
75 address.tcpip_address().ip_address().size() == 16;
80 class Proxy :
public grpc::testing::EchoTestService::Service {
84 void AddChannelToBackend(
const std::shared_ptr<Channel>&
channel) {
85 stubs_.push_back(grpc::testing::EchoTestService::NewStub(
channel));
88 Status Echo(ServerContext* server_context,
const EchoRequest*
request,
90 std::unique_ptr<ClientContext> client_context =
92 size_t idx =
request->param().backend_channel_idx();
97 Status BidiStream(ServerContext* server_context,
98 ServerReaderWriter<EchoResponse, EchoRequest>*
99 stream_from_client)
override {
102 std::unique_ptr<ClientContext> client_context =
106 auto stream_to_backend =
stubs_[0]->BidiStream(client_context.get());
107 while (stream_from_client->Read(&
request)) {
108 stream_to_backend->Write(
request);
110 stream_from_client->Write(
response);
113 stream_to_backend->WritesDone();
114 return stream_to_backend->Finish();
118 std::vector<std::unique_ptr<grpc::testing::EchoTestService::Stub>>
stubs_;
121 enum class CredentialsType {
127 constexpr
char kCaCertPath[] =
"src/core/tsi/test_creds/ca.pem";
128 constexpr
char kServerCertPath[] =
"src/core/tsi/test_creds/server1.pem";
129 constexpr
char kServerKeyPath[] =
"src/core/tsi/test_creds/server1.key";
130 constexpr
char kClientCertPath[] =
"src/core/tsi/test_creds/client.pem";
131 constexpr
char kClientKeyPath[] =
"src/core/tsi/test_creds/client.key";
139 return file_contents;
142 std::shared_ptr<grpc::ChannelCredentials> GetChannelCredentials(
143 CredentialsType
type, ChannelArguments*
args) {
144 if (
type == CredentialsType::kInsecure) {
147 args->SetSslTargetNameOverride(
"foo.test.google.fr");
151 options.set_certificate_provider(
152 std::make_shared<grpc::experimental::StaticDataCertificateProvider>(
154 if (
type == CredentialsType::kMtls) {
155 options.watch_identity_key_cert_pairs();
161 std::shared_ptr<grpc::ServerCredentials> GetServerCredentials(
162 CredentialsType
type) {
163 if (
type == CredentialsType::kInsecure) {
168 auto certificate_provider =
169 std::make_shared<grpc::experimental::StaticDataCertificateProvider>(
173 options.watch_identity_key_cert_pairs();
185 ChannelzServerTest() {}
186 static void SetUpTestCase() {
192 void SetUp()
override {
198 ServerBuilder proxy_builder;
200 proxy_builder.AddListeningPort(proxy_server_address,
201 GetServerCredentials(GetParam()));
204 proxy_builder.AddChannelArgument(
210 void TearDown()
override {
218 void ConfigureProxy(
size_t num_backends) {
220 for (
size_t i = 0;
i < num_backends; ++
i) {
223 ServerBuilder backend_builder;
226 backend_builder.AddListeningPort(backend_server_address,
227 GetServerCredentials(GetParam()));
228 backends_[
i].service = absl::make_unique<TestServiceImpl>();
232 backends_[
i].server = backend_builder.BuildAndStart();
236 ChannelArguments
args;
240 backend_server_address, GetChannelCredentials(GetParam(), &
args),
248 ChannelArguments
args;
257 std::unique_ptr<grpc::testing::EchoTestService::Stub> NewEchoStub() {
259 ChannelArguments
args;
266 return grpc::testing::EchoTestService::NewStub(
channel);
269 void SendSuccessfulEcho(
int channel_idx) {
272 request.set_message(
"Hello channelz");
273 request.mutable_param()->set_backend_channel_idx(channel_idx);
277 EXPECT_TRUE(
s.ok()) <<
"s.error_message() = " <<
s.error_message();
280 void SendSuccessfulStream(
int num_messages) {
283 request.set_message(
"Hello channelz");
286 for (
int i = 0;
i < num_messages; ++
i) {
290 stream_to_proxy->WritesDone();
291 Status s = stream_to_proxy->Finish();
292 EXPECT_TRUE(
s.ok()) <<
"s.error_message() = " <<
s.error_message();
295 void SendFailedEcho(
int channel_idx) {
298 request.set_message(
"Hello channelz");
299 request.mutable_param()->set_backend_channel_idx(channel_idx);
300 auto*
error =
request.mutable_param()->mutable_expected_error();
302 error->set_error_message(
"error");
310 intptr_t GetChannelId(
int channel_idx) {
313 request.set_start_channel_id(0);
316 EXPECT_TRUE(
s.ok()) <<
"s.error_message() = " <<
s.error_message();
318 return response.channel(channel_idx).ref().channel_id();
322 std::stringstream strs;
336 std::unique_ptr<grpc::testing::EchoTestService::Stub>
echo_stub_;
347 TEST_P(ChannelzServerTest, BasicTest) {
352 request.set_start_channel_id(0);
355 EXPECT_TRUE(
s.ok()) <<
"s.error_message() = " <<
s.error_message();
359 TEST_P(ChannelzServerTest, HighStartId) {
364 request.set_start_channel_id(10000);
367 EXPECT_TRUE(
s.ok()) <<
"s.error_message() = " <<
s.error_message();
371 TEST_P(ChannelzServerTest, SuccessfulRequestTest) {
374 SendSuccessfulEcho(0);
377 request.set_channel_id(GetChannelId(0));
380 EXPECT_TRUE(
s.ok()) <<
"s.error_message() = " <<
s.error_message();
386 TEST_P(ChannelzServerTest, FailedRequestTest) {
392 request.set_channel_id(GetChannelId(0));
395 EXPECT_TRUE(
s.ok()) <<
"s.error_message() = " <<
s.error_message();
401 TEST_P(ChannelzServerTest, ManyRequestsTest) {
405 const int kNumSuccess = 10;
406 const int kNumFailed = 11;
407 for (
int i = 0;
i < kNumSuccess; ++
i) {
408 SendSuccessfulEcho(0);
410 for (
int i = 0;
i < kNumFailed; ++
i) {
415 request.set_channel_id(GetChannelId(0));
418 EXPECT_TRUE(
s.ok()) <<
"s.error_message() = " <<
s.error_message();
420 kNumSuccess + kNumFailed);
425 TEST_P(ChannelzServerTest, ManyChannels) {
427 const int kNumChannels = 4;
428 ConfigureProxy(kNumChannels);
431 request.set_start_channel_id(0);
434 EXPECT_TRUE(
s.ok()) <<
"s.error_message() = " <<
s.error_message();
438 TEST_P(ChannelzServerTest, ManyRequestsManyChannels) {
440 const int kNumChannels = 4;
441 ConfigureProxy(kNumChannels);
442 const int kNumSuccess = 10;
443 const int kNumFailed = 11;
444 for (
int i = 0;
i < kNumSuccess; ++
i) {
445 SendSuccessfulEcho(0);
446 SendSuccessfulEcho(2);
448 for (
int i = 0;
i < kNumFailed; ++
i) {
457 request.set_channel_id(GetChannelId(0));
460 EXPECT_TRUE(
s.ok()) <<
"s.error_message() = " <<
s.error_message();
470 request.set_channel_id(GetChannelId(1));
473 EXPECT_TRUE(
s.ok()) <<
"s.error_message() = " <<
s.error_message();
483 request.set_channel_id(GetChannelId(2));
486 EXPECT_TRUE(
s.ok()) <<
"s.error_message() = " <<
s.error_message();
488 kNumSuccess + kNumFailed);
497 request.set_channel_id(GetChannelId(3));
500 EXPECT_TRUE(
s.ok()) <<
"s.error_message() = " <<
s.error_message();
507 TEST_P(ChannelzServerTest, ManySubchannels) {
509 const int kNumChannels = 4;
510 ConfigureProxy(kNumChannels);
511 const int kNumSuccess = 10;
512 const int kNumFailed = 11;
513 for (
int i = 0;
i < kNumSuccess; ++
i) {
514 SendSuccessfulEcho(0);
515 SendSuccessfulEcho(2);
517 for (
int i = 0;
i < kNumFailed; ++
i) {
521 GetTopChannelsRequest gtc_request;
522 GetTopChannelsResponse gtc_response;
523 gtc_request.set_start_channel_id(0);
528 EXPECT_EQ(gtc_response.channel_size(), kNumChannels);
529 for (
int i = 0;
i < gtc_response.channel_size(); ++
i) {
532 if (gtc_response.channel(i).data().calls_started() == 0) {
533 EXPECT_EQ(gtc_response.channel(i).subchannel_ref_size(), 0);
537 ASSERT_GT(gtc_response.channel(i).subchannel_ref_size(), 0);
538 GetSubchannelRequest gsc_request;
539 GetSubchannelResponse gsc_response;
540 gsc_request.set_subchannel_id(
541 gtc_response.channel(i).subchannel_ref(0).subchannel_id());
546 EXPECT_EQ(gtc_response.channel(i).data().calls_started(),
547 gsc_response.subchannel().data().calls_started());
548 EXPECT_EQ(gtc_response.channel(i).data().calls_succeeded(),
549 gsc_response.subchannel().data().calls_succeeded());
550 EXPECT_EQ(gtc_response.channel(i).data().calls_failed(),
551 gsc_response.subchannel().data().calls_failed());
555 TEST_P(ChannelzServerTest, BasicServerTest) {
560 request.set_start_server_id(0);
563 EXPECT_TRUE(
s.ok()) <<
"s.error_message() = " <<
s.error_message();
567 TEST_P(ChannelzServerTest, BasicGetServerTest) {
570 GetServersRequest get_servers_request;
571 GetServersResponse get_servers_response;
572 get_servers_request.set_start_server_id(0);
573 ClientContext get_servers_context;
575 &get_servers_context, get_servers_request, &get_servers_response);
576 EXPECT_TRUE(
s.ok()) <<
"s.error_message() = " <<
s.error_message();
577 EXPECT_EQ(get_servers_response.server_size(), 1);
578 GetServerRequest get_server_request;
579 GetServerResponse get_server_response;
580 get_server_request.set_server_id(
581 get_servers_response.server(0).ref().server_id());
582 ClientContext get_server_context;
584 &get_server_response);
585 EXPECT_TRUE(
s.ok()) <<
"s.error_message() = " <<
s.error_message();
586 EXPECT_EQ(get_servers_response.server(0).ref().server_id(),
587 get_server_response.server().ref().server_id());
590 TEST_P(ChannelzServerTest, ServerCallTest) {
593 const int kNumSuccess = 10;
594 const int kNumFailed = 11;
595 for (
int i = 0;
i < kNumSuccess; ++
i) {
596 SendSuccessfulEcho(0);
598 for (
int i = 0;
i < kNumFailed; ++
i) {
603 request.set_start_server_id(0);
606 EXPECT_TRUE(
s.ok()) <<
"s.error_message() = " <<
s.error_message();
614 kNumSuccess + kNumFailed + 1);
617 TEST_P(ChannelzServerTest, ManySubchannelsAndSockets) {
619 const int kNumChannels = 4;
620 ConfigureProxy(kNumChannels);
621 const int kNumSuccess = 10;
622 const int kNumFailed = 11;
623 for (
int i = 0;
i < kNumSuccess; ++
i) {
624 SendSuccessfulEcho(0);
625 SendSuccessfulEcho(2);
627 for (
int i = 0;
i < kNumFailed; ++
i) {
631 GetTopChannelsRequest gtc_request;
632 GetTopChannelsResponse gtc_response;
633 gtc_request.set_start_channel_id(0);
638 EXPECT_EQ(gtc_response.channel_size(), kNumChannels);
639 for (
int i = 0;
i < gtc_response.channel_size(); ++
i) {
642 if (gtc_response.channel(i).data().calls_started() == 0) {
643 EXPECT_EQ(gtc_response.channel(i).subchannel_ref_size(), 0);
647 ASSERT_GT(gtc_response.channel(i).subchannel_ref_size(), 0);
649 GetSubchannelRequest get_subchannel_req;
650 GetSubchannelResponse get_subchannel_resp;
651 get_subchannel_req.set_subchannel_id(
652 gtc_response.channel(i).subchannel_ref(0).subchannel_id());
653 ClientContext get_subchannel_ctx;
655 &get_subchannel_ctx, get_subchannel_req, &get_subchannel_resp);
657 EXPECT_EQ(get_subchannel_resp.subchannel().socket_ref_size(), 1);
659 GetSocketRequest get_socket_req;
660 GetSocketResponse get_socket_resp;
661 ClientContext get_socket_ctx;
662 get_socket_req.set_socket_id(
663 get_subchannel_resp.subchannel().socket_ref(0).socket_id());
667 get_subchannel_resp.subchannel().socket_ref(0).name().find(
"http"));
672 EXPECT_EQ(get_subchannel_resp.subchannel().data().calls_started(),
673 get_socket_resp.socket().data().streams_started());
674 EXPECT_EQ(get_subchannel_resp.subchannel().data().calls_started(),
675 get_socket_resp.socket().data().streams_succeeded());
677 EXPECT_EQ(get_subchannel_resp.subchannel().data().calls_started(),
678 get_socket_resp.socket().data().messages_sent());
681 EXPECT_EQ(get_subchannel_resp.subchannel().data().calls_succeeded(),
682 get_socket_resp.socket().data().messages_received());
683 switch (GetParam()) {
684 case CredentialsType::kInsecure:
687 case CredentialsType::kTls:
688 case CredentialsType::kMtls:
689 EXPECT_TRUE(get_socket_resp.socket().has_security());
690 EXPECT_TRUE(get_socket_resp.socket().security().has_tls());
693 get_socket_resp.socket().security().tls().remote_certificate()),
694 RemoveWhitespaces(
ReadFile(kServerCertPath)));
700 TEST_P(ChannelzServerTest, StreamingRPC) {
703 const int kNumMessages = 5;
704 SendSuccessfulStream(kNumMessages);
706 GetChannelRequest get_channel_request;
707 GetChannelResponse get_channel_response;
708 get_channel_request.set_channel_id(GetChannelId(0));
709 ClientContext get_channel_context;
711 &get_channel_context, get_channel_request, &get_channel_response);
712 EXPECT_TRUE(
s.ok()) <<
"s.error_message() = " <<
s.error_message();
713 EXPECT_EQ(get_channel_response.channel().data().calls_started(), 1);
714 EXPECT_EQ(get_channel_response.channel().data().calls_succeeded(), 1);
715 EXPECT_EQ(get_channel_response.channel().data().calls_failed(), 0);
717 ASSERT_GT(get_channel_response.channel().subchannel_ref_size(), 0);
718 GetSubchannelRequest get_subchannel_request;
719 GetSubchannelResponse get_subchannel_response;
720 ClientContext get_subchannel_context;
721 get_subchannel_request.set_subchannel_id(
722 get_channel_response.channel().subchannel_ref(0).subchannel_id());
724 get_subchannel_request,
725 &get_subchannel_response);
726 EXPECT_TRUE(
s.ok()) <<
"s.error_message() = " <<
s.error_message();
727 EXPECT_EQ(get_subchannel_response.subchannel().data().calls_started(), 1);
728 EXPECT_EQ(get_subchannel_response.subchannel().data().calls_succeeded(), 1);
729 EXPECT_EQ(get_subchannel_response.subchannel().data().calls_failed(), 0);
731 ASSERT_GT(get_subchannel_response.subchannel().socket_ref_size(), 0);
732 GetSocketRequest get_socket_request;
733 GetSocketResponse get_socket_response;
734 ClientContext get_socket_context;
735 get_socket_request.set_socket_id(
736 get_subchannel_response.subchannel().socket_ref(0).socket_id());
738 get_subchannel_response.subchannel().socket_ref(0).name().find(
"http"));
740 &get_socket_response);
741 EXPECT_TRUE(
s.ok()) <<
"s.error_message() = " <<
s.error_message();
742 EXPECT_EQ(get_socket_response.socket().data().streams_started(), 1);
743 EXPECT_EQ(get_socket_response.socket().data().streams_succeeded(), 1);
744 EXPECT_EQ(get_socket_response.socket().data().streams_failed(), 0);
745 EXPECT_EQ(get_socket_response.socket().data().messages_sent(), kNumMessages);
746 EXPECT_EQ(get_socket_response.socket().data().messages_received(),
748 switch (GetParam()) {
749 case CredentialsType::kInsecure:
750 EXPECT_FALSE(get_socket_response.socket().has_security());
752 case CredentialsType::kTls:
753 case CredentialsType::kMtls:
754 EXPECT_TRUE(get_socket_response.socket().has_security());
755 EXPECT_TRUE(get_socket_response.socket().security().has_tls());
756 EXPECT_EQ(RemoveWhitespaces(get_socket_response.socket()
759 .remote_certificate()),
760 RemoveWhitespaces(
ReadFile(kServerCertPath)));
765 TEST_P(ChannelzServerTest, GetServerSocketsTest) {
768 GetServersRequest get_server_request;
769 GetServersResponse get_server_response;
770 get_server_request.set_start_server_id(0);
771 ClientContext get_server_context;
773 &get_server_response);
774 EXPECT_TRUE(
s.ok()) <<
"s.error_message() = " <<
s.error_message();
775 EXPECT_EQ(get_server_response.server_size(), 1);
776 GetServerSocketsRequest get_server_sockets_request;
777 GetServerSocketsResponse get_server_sockets_response;
778 get_server_sockets_request.set_server_id(
779 get_server_response.server(0).ref().server_id());
780 get_server_sockets_request.set_start_socket_id(0);
781 ClientContext get_server_sockets_context;
783 get_server_sockets_request,
784 &get_server_sockets_response);
785 EXPECT_TRUE(
s.ok()) <<
"s.error_message() = " <<
s.error_message();
786 EXPECT_EQ(get_server_sockets_response.socket_ref_size(), 1);
787 EXPECT_TRUE(get_server_sockets_response.socket_ref(0).name().find(
"http"));
789 GetSocketRequest get_socket_request;
790 GetSocketResponse get_socket_response;
791 ClientContext get_socket_context;
792 get_socket_request.set_socket_id(
793 get_server_sockets_response.socket_ref(0).socket_id());
795 &get_socket_response);
796 EXPECT_TRUE(
s.ok()) <<
"s.error_message() = " <<
s.error_message();
797 EXPECT_TRUE(ValidateAddress(get_socket_response.socket().remote()));
798 EXPECT_TRUE(ValidateAddress(get_socket_response.socket().local()));
799 switch (GetParam()) {
800 case CredentialsType::kInsecure:
801 EXPECT_FALSE(get_socket_response.socket().has_security());
803 case CredentialsType::kTls:
804 case CredentialsType::kMtls:
805 EXPECT_TRUE(get_socket_response.socket().has_security());
806 EXPECT_TRUE(get_socket_response.socket().security().has_tls());
807 if (GetParam() == CredentialsType::kMtls) {
808 EXPECT_EQ(RemoveWhitespaces(get_socket_response.socket()
811 .remote_certificate()),
812 RemoveWhitespaces(
ReadFile(kClientCertPath)));
817 .remote_certificate()
824 TEST_P(ChannelzServerTest, GetServerSocketsPaginationTest) {
827 std::vector<std::unique_ptr<grpc::testing::EchoTestService::Stub>> stubs;
828 const int kNumServerSocketsCreated = 20;
829 for (
int i = 0;
i < kNumServerSocketsCreated; ++
i) {
830 stubs.push_back(NewEchoStub());
833 request.set_message(
"Hello channelz");
834 request.mutable_param()->set_backend_channel_idx(0);
838 EXPECT_TRUE(
s.ok()) <<
"s.error_message() = " <<
s.error_message();
840 GetServersRequest get_server_request;
841 GetServersResponse get_server_response;
842 get_server_request.set_start_server_id(0);
843 ClientContext get_server_context;
845 &get_server_response);
846 EXPECT_TRUE(
s.ok()) <<
"s.error_message() = " <<
s.error_message();
847 EXPECT_EQ(get_server_response.server_size(), 1);
850 GetServerSocketsRequest get_server_sockets_request;
851 GetServerSocketsResponse get_server_sockets_response;
852 get_server_sockets_request.set_server_id(
853 get_server_response.server(0).ref().server_id());
854 get_server_sockets_request.set_start_socket_id(0);
855 ClientContext get_server_sockets_context;
857 get_server_sockets_request,
858 &get_server_sockets_response);
859 EXPECT_TRUE(
s.ok()) <<
"s.error_message() = " <<
s.error_message();
862 EXPECT_EQ(get_server_sockets_response.socket_ref_size(),
863 kNumServerSocketsCreated + 1);
868 GetServerSocketsRequest get_server_sockets_request;
869 GetServerSocketsResponse get_server_sockets_response;
870 get_server_sockets_request.set_server_id(
871 get_server_response.server(0).ref().server_id());
872 get_server_sockets_request.set_start_socket_id(0);
873 const int kMaxResults = 10;
874 get_server_sockets_request.set_max_results(kMaxResults);
875 ClientContext get_server_sockets_context;
877 get_server_sockets_request,
878 &get_server_sockets_response);
879 EXPECT_TRUE(
s.ok()) <<
"s.error_message() = " <<
s.error_message();
880 EXPECT_EQ(get_server_sockets_response.socket_ref_size(), kMaxResults);
885 TEST_P(ChannelzServerTest, GetServerListenSocketsTest) {
888 GetServersRequest get_server_request;
889 GetServersResponse get_server_response;
890 get_server_request.set_start_server_id(0);
891 ClientContext get_server_context;
893 &get_server_response);
894 EXPECT_TRUE(
s.ok()) <<
"s.error_message() = " <<
s.error_message();
895 EXPECT_EQ(get_server_response.server_size(), 1);
898 int listen_socket_size = get_server_response.server(0).listen_socket_size();
899 EXPECT_TRUE(listen_socket_size == 1 || listen_socket_size == 2);
900 GetSocketRequest get_socket_request;
901 GetSocketResponse get_socket_response;
902 get_socket_request.set_socket_id(
903 get_server_response.server(0).listen_socket(0).socket_id());
905 get_server_response.server(0).listen_socket(0).name().find(
"http"));
906 ClientContext get_socket_context_1;
907 s =
channelz_stub_->GetSocket(&get_socket_context_1, get_socket_request,
908 &get_socket_response);
909 EXPECT_TRUE(
s.ok()) <<
"s.error_message() = " <<
s.error_message();
911 EXPECT_TRUE(ValidateAddress(get_socket_response.socket().remote()));
912 EXPECT_TRUE(ValidateAddress(get_socket_response.socket().local()));
913 if (listen_socket_size == 2) {
914 get_socket_request.set_socket_id(
915 get_server_response.server(0).listen_socket(1).socket_id());
916 ClientContext get_socket_context_2;
918 get_server_response.server(0).listen_socket(1).name().find(
"http"));
919 s =
channelz_stub_->GetSocket(&get_socket_context_2, get_socket_request,
920 &get_socket_response);
921 EXPECT_TRUE(
s.ok()) <<
"s.error_message() = " <<
s.error_message();
927 {CredentialsType::kInsecure, CredentialsType::kTls,
928 CredentialsType::kMtls})));
934 int main(
int argc,
char** argv) {