diff --git a/src/core/lib/http/httpcli_security_connector.cc b/src/core/lib/http/httpcli_security_connector.cc index c82a09e375a..5defca225b6 100644 --- a/src/core/lib/http/httpcli_security_connector.cc +++ b/src/core/lib/http/httpcli_security_connector.cc @@ -192,17 +192,20 @@ class HttpRequestSSLCredentials : public grpc_channel_credentials { } private: - int cmp_impl(const grpc_channel_credentials* other) const override { - // TODO(yashykt): Check if we can do something better here - return QsortCompare(static_cast(this), - other); + int cmp_impl(const grpc_channel_credentials* /* other */) const override { + // There's no differentiating factor between two HttpRequestSSLCredentials + // objects. + return 0; } }; } // namespace RefCountedPtr CreateHttpRequestSSLCredentials() { - return MakeRefCounted(); + // Create a singleton object for HttpRequestSSLCredentials so that channels to + // the same target with HttpRequestSSLCredentials can reuse the subchannels. + static auto* creds = new HttpRequestSSLCredentials(); + return creds->Ref(); } } // namespace grpc_core diff --git a/test/core/security/credentials_test.cc b/test/core/security/credentials_test.cc index b243e652268..3a5fb12659a 100644 --- a/test/core/security/credentials_test.cc +++ b/test/core/security/credentials_test.cc @@ -45,6 +45,7 @@ #include "src/core/lib/gpr/tmpfile.h" #include "src/core/lib/gprpp/host_port.h" #include "src/core/lib/http/httpcli.h" +#include "src/core/lib/http/httpcli_ssl_credentials.h" #include "src/core/lib/iomgr/error.h" #include "src/core/lib/security/credentials/composite/composite_credentials.h" #include "src/core/lib/security/credentials/external/aws_external_account_credentials.h" @@ -3615,6 +3616,68 @@ TEST(CredentialsTest, TestFakeCallCredentialsCompareFailure) { grpc_call_credentials_release(md_creds); } +TEST(CredentialsTest, TestHttpRequestSSLCredentialsCompare) { + auto creds_1 = grpc_core::CreateHttpRequestSSLCredentials(); + auto creds_2 = grpc_core::CreateHttpRequestSSLCredentials(); + EXPECT_EQ(creds_1->cmp(creds_2.get()), 0); + EXPECT_EQ(creds_2->cmp(creds_1.get()), 0); +} + +TEST(CredentialsTest, TestHttpRequestSSLCredentialsSingleton) { + auto creds_1 = grpc_core::CreateHttpRequestSSLCredentials(); + auto creds_2 = grpc_core::CreateHttpRequestSSLCredentials(); + EXPECT_EQ(creds_1, creds_2); +} + +TEST(CredentialsTest, TestCompositeChannelCredsCompareSuccess) { + auto* insecure_creds = grpc_insecure_credentials_create(); + auto* fake_channel_creds = grpc_fake_transport_security_credentials_create(); + auto fake_creds = grpc_core::MakeRefCounted(); + auto* composite_creds_1 = grpc_composite_channel_credentials_create( + insecure_creds, fake_creds.get(), nullptr); + auto* composite_creds_2 = grpc_composite_channel_credentials_create( + fake_channel_creds, fake_creds.get(), nullptr); + EXPECT_NE(composite_creds_1->cmp(composite_creds_2), 0); + EXPECT_NE(composite_creds_2->cmp(composite_creds_1), 0); + grpc_channel_credentials_release(insecure_creds); + grpc_channel_credentials_release(composite_creds_1); + grpc_channel_credentials_release(composite_creds_2); +} + +TEST(CredentialsTest, + TestCompositeChannelCredsCompareFailureDifferentChannelCreds) { + auto* insecure_creds = grpc_insecure_credentials_create(); + auto fake_creds = grpc_core::MakeRefCounted(); + auto* md_creds = grpc_md_only_test_credentials_create("key", "value", false); + auto* composite_creds_1 = grpc_composite_channel_credentials_create( + insecure_creds, fake_creds.get(), nullptr); + auto* composite_creds_2 = grpc_composite_channel_credentials_create( + insecure_creds, md_creds, nullptr); + EXPECT_NE(composite_creds_1->cmp(composite_creds_2), 0); + EXPECT_NE(composite_creds_2->cmp(composite_creds_1), 0); + grpc_channel_credentials_release(insecure_creds); + grpc_call_credentials_release(md_creds); + grpc_channel_credentials_release(composite_creds_1); + grpc_channel_credentials_release(composite_creds_2); +} + +TEST(CredentialsTest, + TestCompositeChannelCredsCompareFailureDifferentCallCreds) { + auto* insecure_creds = grpc_insecure_credentials_create(); + auto fake_creds = grpc_core::MakeRefCounted(); + auto* md_creds = grpc_md_only_test_credentials_create("key", "value", false); + auto* composite_creds_1 = grpc_composite_channel_credentials_create( + insecure_creds, fake_creds.get(), nullptr); + auto* composite_creds_2 = grpc_composite_channel_credentials_create( + insecure_creds, md_creds, nullptr); + EXPECT_NE(composite_creds_1->cmp(composite_creds_2), 0); + EXPECT_NE(composite_creds_2->cmp(composite_creds_1), 0); + grpc_channel_credentials_release(insecure_creds); + grpc_call_credentials_release(md_creds); + grpc_channel_credentials_release(composite_creds_1); + grpc_channel_credentials_release(composite_creds_2); +} + TEST(CredentialsTest, TestXdsCredentialsCompareSucces) { auto* insecure_creds = grpc_insecure_credentials_create(); auto* xds_creds_1 = grpc_xds_credentials_create(insecure_creds);