6262from google.auth import credentials as ga_credentials
6363from google.auth.exceptions import MutualTLSChannelError
6464from google.cloud.location import locations_pb2
65+ from google.oauth2 import service_account
66+
6567from google.cloud.secretmanager_v1.services.secret_manager_service import (
6668 SecretManagerServiceAsyncClient,
6769 SecretManagerServiceClient,
6870 pagers,
6971 transports,
7072)
7173from google.cloud.secretmanager_v1.types import resources, service
72- from google.oauth2 import service_account
7374
7475CRED_INFO_JSON = {
7576 "credential_source": "/path/to/file",
@@ -773,73 +774,57 @@ def test_secret_manager_service_client_client_options(
773774def test_secret_manager_service_client_otel_channel_injection_enabled():
774775 """Proves that when OpenTelemetry tracing is enabled:
775776
776- 1. SecretManagerServiceClient detects the feature flag via
777- _observability.is_otel_capabilities_enabled.
778- 2. The client binds _observability.create_channel_with_otel using
779- functools.partial with SecretManagerServiceGrpcTransport.create_channel and client_options.
780- 3. The bound channel factory callable is passed into transport kwargs under 'channel',
781- allowing the Transport to initialize the channel lazily with its own parameters.
777+ 1. SecretManagerServiceClient obtains the channel wrapper via
778+ _observability.get_otel_channel_wrapper passing client_options.
779+ 2. The wrapper is passed into transport kwargs under 'wrappers',
780+ allowing the Transport to apply it via apply_channel_wrappers.
782781 """
782+ mock_wrapper = mock.Mock()
783783 with (
784784 mock.patch(
785- "google.cloud.secretmanager_v1.services.secret_manager_service.client._observability.is_otel_capabilities_enabled ",
786- return_value=True ,
787- ) as mock_is_enabled ,
785+ "google.cloud.secretmanager_v1.services.secret_manager_service.client._observability.get_otel_channel_wrapper ",
786+ return_value=mock_wrapper ,
787+ ) as mock_get_wrapper ,
788788 mock.patch.object(
789789 transports.SecretManagerServiceGrpcTransport, "__init__", return_value=None
790790 ) as patched_transport_init,
791791 ):
792792 client = SecretManagerServiceClient(transport="grpc")
793793
794- mock_is_enabled.assert_called_once( )
794+ mock_get_wrapper.assert_called_once_with(client._client_options )
795795 called_kwargs = patched_transport_init.call_args.kwargs
796- assert "channel" in called_kwargs
797- channel_factory = called_kwargs["channel"]
798- assert isinstance(channel_factory, functools.partial)
799- assert (
800- channel_factory.func
801- is google.cloud.secretmanager_v1.services.secret_manager_service.client._observability.create_channel_with_otel
802- )
803- assert channel_factory.args == (
804- transports.SecretManagerServiceGrpcTransport.create_channel,
805- )
806- assert channel_factory.keywords == {"client_options": client._client_options}
796+ assert "wrappers" in called_kwargs
797+ assert called_kwargs["wrappers"] == [mock_wrapper]
807798
808799
809800def test_secret_manager_service_client_otel_channel_injection_disabled():
810801 """Proves that when OpenTelemetry tracing is disabled:
811802
812- 1. SecretManagerServiceClient checks the feature flag and finds it disabled.
813- 2. Eager channel creation via _observability.create_channel_with_otel is skipped.
814- 3. No 'channel' argument is passed to the transport constructor, preserving lazy
815- channel initialization in the transport.
803+ 1. SecretManagerServiceClient checks for an OTel wrapper and receives None.
804+ 2. No 'wrappers' argument is passed to the transport constructor.
816805 """
817806 with (
818807 mock.patch(
819- "google.cloud.secretmanager_v1.services.secret_manager_service.client._observability.is_otel_capabilities_enabled",
820- return_value=False,
821- ) as mock_is_enabled,
822- mock.patch(
823- "google.cloud.secretmanager_v1.services.secret_manager_service.client._observability.create_channel_with_otel",
824- ) as mock_create_channel_with_otel,
808+ "google.cloud.secretmanager_v1.services.secret_manager_service.client._observability.get_otel_channel_wrapper",
809+ return_value=None,
810+ ) as mock_get_wrapper,
825811 mock.patch.object(
826812 transports.SecretManagerServiceGrpcTransport, "__init__", return_value=None
827813 ) as patched_transport_init,
828814 ):
829- SecretManagerServiceClient(transport="grpc")
815+ client = SecretManagerServiceClient(transport="grpc")
830816
831- mock_is_enabled.assert_called_once()
832- mock_create_channel_with_otel.assert_not_called()
817+ mock_get_wrapper.assert_called_once_with(client._client_options)
833818 called_kwargs = patched_transport_init.call_args.kwargs
834- assert "channel " not in called_kwargs
819+ assert "wrappers " not in called_kwargs
835820
836821
837- def test_secret_manager_service_grpc_transport_interceptors ():
838- """Proves that SecretManagerServiceGrpcTransport accepts custom client interceptors
839- and invokes grpc_helpers.apply_interceptors to inject them into the underlying
840- gRPC channel pipeline .
822+ def test_secret_manager_service_grpc_transport_wrappers ():
823+ """Proves that SecretManagerServiceGrpcTransport accepts channel wrappers
824+ and invokes grpc_helpers.apply_channel_wrappers to apply them to the underlying
825+ gRPC channel.
841826 """
842- mock_interceptor = mock.Mock()
827+ mock_wrapper = mock.Mock()
843828 mock_channel = mock.Mock()
844829
845830 with (
@@ -849,18 +834,35 @@ def test_secret_manager_service_grpc_transport_interceptors():
849834 return_value=mock_channel,
850835 ),
851836 mock.patch(
852- "google.api_core.grpc_helpers.apply_interceptors ",
837+ "google.api_core.grpc_helpers.apply_channel_wrappers ",
853838 return_value=mock_channel,
854- ) as mock_apply_interceptors ,
839+ ) as mock_apply_wrappers ,
855840 ):
856- transport = transports.SecretManagerServiceGrpcTransport(
857- interceptors=[mock_interceptor ],
841+ transports.SecretManagerServiceGrpcTransport(
842+ wrappers=[mock_wrapper ],
858843 )
859844
860- mock_apply_interceptors.assert_called_once_with(
861- mock_channel, [mock_interceptor]
845+ mock_apply_wrappers.assert_called_once_with(mock_channel, [mock_wrapper])
846+
847+
848+ def test_secret_manager_service_grpc_transport_custom_channel_wrappers():
849+ """Proves that SecretManagerServiceGrpcTransport wraps explicitly passed custom channels
850+ using grpc_helpers.apply_channel_wrappers.
851+ """
852+ mock_wrapper = mock.Mock()
853+ mock_custom_channel = mock.Mock(spec=grpc.Channel)
854+
855+ with mock.patch(
856+ "google.api_core.grpc_helpers.apply_channel_wrappers",
857+ return_value=mock_custom_channel,
858+ ) as mock_apply_wrappers:
859+ transports.SecretManagerServiceGrpcTransport(
860+ channel=mock_custom_channel,
861+ wrappers=[mock_wrapper],
862862 )
863863
864+ mock_apply_wrappers.assert_called_once_with(mock_custom_channel, [mock_wrapper])
865+
864866
865867@pytest.mark.parametrize(
866868 "client_class,transport_class,transport_name,use_client_cert_env",
0 commit comments