@@ -61,9 +61,11 @@ def test_request_generator_thread():
6161
6262def test_blocking_consume ():
6363 policy = mock .Mock (spec = ('call_rpc' , 'on_response' ))
64- policy .call_rpc .return_value = ( mock .sentinel .A , mock .sentinel .B )
64+ policy .call_rpc .return_value = iter (( mock .sentinel .A , mock .sentinel .B ) )
6565
6666 consumer = _consumer .Consumer ()
67+ consumer .resume ()
68+
6769 assert consumer ._blocking_consume (policy ) is None
6870 policy .call_rpc .assert_called_once ()
6971 policy .on_response .assert_has_calls (
@@ -96,11 +98,12 @@ def __call__(self, exception):
9698
9799def test_blocking_consume_on_exception ():
98100 policy = mock .Mock (spec = ('call_rpc' , 'on_response' , 'on_exception' ))
99- policy .call_rpc .return_value = ( mock .sentinel .A , mock .sentinel .B )
101+ policy .call_rpc .return_value = iter (( mock .sentinel .A , mock .sentinel .B ) )
100102 exc = TypeError ('Bad things!' )
101103 policy .on_response .side_effect = exc
102104
103105 consumer = _consumer .Consumer ()
106+ consumer .resume ()
104107 consumer ._consumer_thread = mock .Mock (spec = threading .Thread )
105108 policy .on_exception .side_effect = OnException ()
106109
@@ -114,37 +117,77 @@ def test_blocking_consume_on_exception():
114117 policy .on_exception .assert_called_once_with (exc )
115118
116119
120+ class RaisingResponseGenerator (object ):
121+ # NOTE: This is needed because defining `.next` on an **instance**
122+ # rather than the **class** will not be iterable in Python 2.
123+ # This is problematic since a `Mock` just sets members.
124+
125+ def __init__ (self , exception ):
126+ self .exception = exception
127+ self .done_calls = 0
128+ self .next_calls = 0
129+
130+ def done (self ):
131+ self .done_calls += 1
132+ return True
133+
134+ def __next__ (self ):
135+ self .next_calls += 1
136+ raise self .exception
137+
138+ def next (self ):
139+ return self .__next__ () # Python 2
140+
141+
117142def test_blocking_consume_two_exceptions ():
118143 policy = mock .Mock (spec = ('call_rpc' , 'on_exception' ))
119144
120145 exc1 = NameError ('Oh noes.' )
121146 exc2 = ValueError ('Something grumble.' )
122147 policy .on_exception .side_effect = OnException (acceptable = exc1 )
123148
124- response_generator1 = mock .MagicMock (spec = ('__iter__' , 'done' ))
125- response_generator1 .__iter__ .side_effect = exc1
126- response_generator1 .done .return_value = True
127- response_generator2 = mock .MagicMock (spec = ('__iter__' , 'done' ))
128- response_generator2 .__iter__ .side_effect = exc2
149+ response_generator1 = RaisingResponseGenerator (exc1 )
150+ response_generator2 = RaisingResponseGenerator (exc2 )
129151 policy .call_rpc .side_effect = (response_generator1 , response_generator2 )
130152
131153 consumer = _consumer .Consumer ()
154+ consumer .resume ()
132155 consumer ._consumer_thread = mock .Mock (spec = threading .Thread )
133156
134157 # Establish that we get responses until we are sent the exiting event.
135- consumer ._blocking_consume (policy )
158+ assert consumer ._blocking_consume (policy ) is None
136159 assert consumer ._consumer_thread is None
137160
138161 # Check mocks.
139162 assert policy .call_rpc .call_count == 2
140- response_generator1 .__iter__ . assert_called_once_with ()
141- response_generator1 .done . assert_called_once_with ()
142- response_generator2 .__iter__ . assert_called_once_with ()
143- response_generator2 .done . assert_not_called ()
163+ assert response_generator1 .next_calls == 1
164+ assert response_generator1 .done_calls == 1
165+ assert response_generator2 .next_calls == 1
166+ assert response_generator2 .done_calls == 0
144167 policy .on_exception .assert_has_calls (
145168 [mock .call (exc1 ), mock .call (exc2 )])
146169
147170
171+ @mock .patch .object (_consumer , '_LOGGER' )
172+ def test_pause (_LOGGER ):
173+ consumer = _consumer .Consumer ()
174+ consumer ._can_consume .set ()
175+
176+ assert consumer .pause () is None
177+ assert not consumer ._can_consume .is_set ()
178+ _LOGGER .debug .assert_called_once_with ('Pausing consumer' )
179+
180+
181+ @mock .patch .object (_consumer , '_LOGGER' )
182+ def test_resume (_LOGGER ):
183+ consumer = _consumer .Consumer ()
184+ consumer ._can_consume .clear ()
185+
186+ assert consumer .resume () is None
187+ assert consumer ._can_consume .is_set ()
188+ _LOGGER .debug .assert_called_once_with ('Resuming consumer' )
189+
190+
148191def test_start_consuming ():
149192 creds = mock .Mock (spec = credentials .Credentials )
150193 client = subscriber .Client (credentials = creds )
0 commit comments