@@ -66,6 +66,57 @@ def test_wrap_unary_errors():
6666 assert exc_info .value .response == grpc_error
6767
6868
69+ def test_wrap_stream_okay ():
70+ expected_responses = [1 , 2 , 3 ]
71+ callable_ = mock .Mock (spec = [
72+ '__call__' ], return_value = iter (expected_responses ))
73+
74+ wrapped_callable = grpc_helpers ._wrap_stream_errors (callable_ )
75+
76+ got_iterator = wrapped_callable (1 , 2 , three = 'four' )
77+
78+ responses = list (got_iterator )
79+
80+ callable_ .assert_called_once_with (1 , 2 , three = 'four' )
81+ assert responses == expected_responses
82+
83+
84+ def test_wrap_stream_iterable_iterface ():
85+ response_iter = mock .create_autospec (grpc .Call , instance = True )
86+ callable_ = mock .Mock (spec = ['__call__' ], return_value = response_iter )
87+
88+ wrapped_callable = grpc_helpers ._wrap_stream_errors (callable_ )
89+
90+ got_iterator = wrapped_callable ()
91+
92+ callable_ .assert_called_once_with ()
93+
94+ # Check each aliased method in the grpc.Call interface
95+ got_iterator .add_callback (mock .sentinel .callback )
96+ response_iter .add_callback .assert_called_once_with (mock .sentinel .callback )
97+
98+ got_iterator .cancel ()
99+ response_iter .cancel .assert_called_once_with ()
100+
101+ got_iterator .code ()
102+ response_iter .code .assert_called_once_with ()
103+
104+ got_iterator .details ()
105+ response_iter .details .assert_called_once_with ()
106+
107+ got_iterator .initial_metadata ()
108+ response_iter .initial_metadata .assert_called_once_with ()
109+
110+ got_iterator .is_active ()
111+ response_iter .is_active .assert_called_once_with ()
112+
113+ got_iterator .time_remaining ()
114+ response_iter .time_remaining .assert_called_once_with ()
115+
116+ got_iterator .trailing_metadata ()
117+ response_iter .trailing_metadata .assert_called_once_with ()
118+
119+
69120def test_wrap_stream_errors_invocation ():
70121 grpc_error = RpcErrorImpl (grpc .StatusCode .INVALID_ARGUMENT )
71122 callable_ = mock .Mock (spec = ['__call__' ], side_effect = grpc_error )
@@ -83,16 +134,10 @@ class RpcResponseIteratorImpl(object):
83134 def __init__ (self , exception ):
84135 self ._exception = exception
85136
86- # Note: This matches grpc._channel._Rendezvous._next which is what is
87- # patched by _wrap_stream_errors.
88- def _next (self ):
137+ def next (self ):
89138 raise self ._exception
90139
91- def __next__ (self ): # pragma: NO COVER
92- return self ._next ()
93-
94- def next (self ): # pragma: NO COVER
95- return self ._next ()
140+ __next__ = next
96141
97142
98143def test_wrap_stream_errors_iterator ():
@@ -107,7 +152,6 @@ def test_wrap_stream_errors_iterator():
107152 with pytest .raises (exceptions .ServiceUnavailable ) as exc_info :
108153 next (got_iterator )
109154
110- assert got_iterator == response_iter
111155 callable_ .assert_called_once_with (1 , 2 , three = 'four' )
112156 assert exc_info .value .response == grpc_error
113157
0 commit comments