@@ -99,6 +99,67 @@ def test_attempt_timeout_w_sleeps(self):
9999 expected_value -= sleep_time
100100
101101
102+ class TestBackoffGenerator :
103+ """
104+ test backoff_generator wrapper.
105+ Should wrap api_core.exponential_sleep_generator, with added history
106+ """
107+
108+ def test_defaults (self ):
109+ """
110+ expect defaults: initial=0.01, multiplier=2, maximum=60
111+ """
112+ with mock .patch (
113+ "google.cloud.bigtable.data._helpers.exponential_sleep_generator"
114+ ) as mock_exponential_sleep_generator :
115+ generator = _helpers .backoff_generator ()
116+ next (generator )
117+ assert mock_exponential_sleep_generator .call_args [0 ] == (0.01 , 2 , 60 )
118+
119+ def test_wraps_exponential_sleep_generator (self ):
120+ """test that it wraps exponential_sleep_generator"""
121+ args = (1 , 2 , 3 )
122+ with mock .patch (
123+ "google.cloud.bigtable.data._helpers.exponential_sleep_generator"
124+ ) as mock_exponential_sleep_generator :
125+ expected_results = [1 , 7 , 9 , "a" , "b" ]
126+ mock_exponential_sleep_generator .return_value = iter (expected_results )
127+ generator = _helpers .backoff_generator (* args )
128+ for val in expected_results :
129+ assert next (generator ) == val
130+ assert mock_exponential_sleep_generator .call_count == 1
131+ # args from backoff generator should be passed through
132+ assert mock_exponential_sleep_generator .call_args == mock .call (* args )
133+
134+ def test_send_gives_history (self ):
135+ """
136+ Calling send with an index should give back the value that was yeilded at that index
137+ """
138+ with mock .patch (
139+ "google.cloud.bigtable.data._helpers.exponential_sleep_generator"
140+ ) as mock_exponential_sleep_generator :
141+ expected_results = [2 , 4 , 6 , 8 , 10 ]
142+ mock_exponential_sleep_generator .return_value = iter (expected_results )
143+ generator = _helpers .backoff_generator ()
144+ # calling next should send values from wrapped iterator
145+ assert next (generator ) == 2
146+ assert next (generator ) == 4
147+ assert next (generator ) == 6
148+ # calling send with an index should return the value at that index
149+ assert generator .send (0 ) == expected_results [0 ]
150+ assert generator .send (2 ) == expected_results [2 ]
151+ assert generator .send (1 ) == expected_results [1 ]
152+ assert generator .send (0 ) == expected_results [0 ]
153+ assert generator .send (0 ) == expected_results [0 ]
154+ # should be able to continue iterating as normal
155+ assert next (generator ) == 8
156+ assert generator .send (0 ) == expected_results [0 ]
157+ assert next (generator ) == 10
158+ # calling an index out of range should raise an error
159+ with pytest .raises (IndexError ):
160+ generator .send (100 )
161+
162+
102163class TestValidateTimeouts :
103164 def test_validate_timeouts_error_messages (self ):
104165 with pytest .raises (ValueError ) as e :
0 commit comments