def testRetriableStatus(self): self.assertTrue( api_utils._should_retry( test_utils.MockUrlFetchResult(httplib.REQUEST_TIMEOUT, None, None))) self.assertTrue( api_utils._should_retry( test_utils.MockUrlFetchResult(555, None, None)))
def testRetryAfterNoRequsetResponseTimeout(self): api = rest_api._RestApi('scope') fut = ndb.Future() fut.set_result( test_utils.MockUrlFetchResult(httplib.REQUEST_TIMEOUT, None, None)) ndb.Context.urlfetch = mock.create_autospec(ndb.Context.urlfetch, return_value=fut) with mock.patch('google.appengine.api.urlfetch' '.fetch') as f: f.return_value = test_utils.MockUrlFetchResult( httplib.ACCEPTED, None, None) self.assertEqual(httplib.ACCEPTED, api.do_request('foo')[0])
def testRetryAfterDoRequestResponseTimeout(self): api = rest_api._RestApi('scope') resp_fut1 = ndb.Future() resp_fut1.set_result( test_utils.MockUrlFetchResult(httplib.REQUEST_TIMEOUT, None, None)) resp_fut2 = ndb.Future() resp_fut2.set_result( test_utils.MockUrlFetchResult(httplib.ACCEPTED, None, None)) ndb.Context.urlfetch = mock.create_autospec( ndb.Context.urlfetch, side_effect=[resp_fut1, resp_fut2]) self.assertEqual(httplib.ACCEPTED, api.do_request('foo')[0]) self.assertEqual(2, ndb.Context.urlfetch.call_count)
def testBasicCall(self): api = rest_api._RestApi('scope') self.assertEqual(api.scopes, ['scope']) fut_get_token = ndb.Future() fut_get_token.set_result('blah') api.get_token_async = mock.create_autospec(api.get_token_async, return_value=fut_get_token) fut_urlfetch = ndb.Future() fut_urlfetch.set_result( test_utils.MockUrlFetchResult(200, {'foo': 'bar'}, 'yoohoo')) api.urlfetch_async = mock.create_autospec(api.urlfetch_async, return_value=fut_urlfetch) res = api.do_request('http://example.com') self.assertEqual(res, (200, {'foo': 'bar'}, 'yoohoo')) api.urlfetch_async.assert_called_once_with( 'http://example.com', headers={'authorization': 'OAuth blah'}, follow_redirects=False, payload=None, method='GET', deadline=None, callback=None)
def testPickling(self): retry_params = api_utils.RetryParams(max_retries=1000) api = rest_api._RestApi('scope', service_account_id=1, retry_params=retry_params) self.assertNotEqual(None, api.get_token()) pickled_api = pickle.loads(pickle.dumps(api)) self.assertEqual( 0, len(set(api.__dict__.keys()) ^ set(pickled_api.__dict__.keys()))) for k, v in api.__dict__.iteritems(): if not hasattr(v, '__call__'): self.assertEqual(v, pickled_api.__dict__[k]) pickled_api.token = None fut_urlfetch = ndb.Future() fut_urlfetch.set_result( test_utils.MockUrlFetchResult(200, {'foo': 'bar'}, 'yoohoo')) pickled_api.urlfetch_async = mock.create_autospec( pickled_api.urlfetch_async, return_value=fut_urlfetch) res = pickled_api.do_request('http://example.com') self.assertEqual(res, (200, {'foo': 'bar'}, 'yoohoo'))
def testBasicCallWithUserAgent(self): user_agent = 'Test User Agent String' retry_params = api_utils.RetryParams(_user_agent=user_agent) api = rest_api._RestApi('scope', retry_params=retry_params) self.assertEqual(api.scopes, ['scope']) fut_get_token = ndb.Future() fut_get_token.set_result('blah') api.get_token_async = mock.create_autospec(api.get_token_async, return_value=fut_get_token) fut_urlfetch = ndb.Future() fut_urlfetch.set_result( test_utils.MockUrlFetchResult(200, {'foo': 'bar'}, 'yoohoo')) ctx_urlfetch = mock.Mock(return_value=fut_urlfetch) ndb.get_context().urlfetch = ctx_urlfetch res = api.do_request('http://example.com') self.assertEqual(res, (200, {'foo': 'bar'}, 'yoohoo')) ctx_urlfetch.assert_called_once_with( 'http://example.com', headers={'authorization': 'OAuth blah', 'User-Agent': user_agent}, follow_redirects=False, payload=None, method='GET', deadline=None, callback=None)
def testNoToken(self): api = rest_api._RestApi('scope') self.assertEqual(api.scopes, ['scope']) fut_get_token = ndb.Future() fut_get_token.set_result(None) api.get_token_async = mock.create_autospec(api.get_token_async, return_value=fut_get_token) fut_urlfetch = ndb.Future() fut_urlfetch.set_result( test_utils.MockUrlFetchResult(200, {'foo': 'bar'}, 'yoohoo')) ctx_urlfetch = mock.Mock(return_value=fut_urlfetch) ndb.get_context().urlfetch = ctx_urlfetch res = api.do_request('http://example.com') self.assertEqual(res, (200, {'foo': 'bar'}, 'yoohoo')) ctx_urlfetch.assert_called_once_with( 'http://example.com', headers={'User-Agent': 'AppEngine-Python-GCS'}, follow_redirects=False, payload=None, method='GET', deadline=None, callback=None)
def testRetrySuccess(self): self.results.append( test_utils.MockUrlFetchResult(httplib.REQUEST_TIMEOUT, None, None)) self.results.append( test_utils.MockUrlFetchResult(httplib.SERVICE_UNAVAILABLE, None, None)) self.results.append(urlfetch.DownloadError()) self.results.append(apiproxy_errors.Error()) self.results.append( test_utils.MockUrlFetchResult(httplib.ACCEPTED, None, None)) with mock.patch.object(api_utils.urlfetch, 'fetch') as f: f.side_effect = self._SideEffect self.assertEqual( httplib.ACCEPTED, api_utils._retry_fetch('foo', self.retry_params, deadline=1000).status_code) self.assertEqual(1000, f.call_args[1]['deadline'])
def testNoRetryAfterDoRequestResponseTimeout(self): retry_params = api_utils.RetryParams(max_retries=0) api = rest_api._RestApi('scope', retry_params=retry_params) fut = ndb.Future() fut.set_result( test_utils.MockUrlFetchResult(httplib.REQUEST_TIMEOUT, None, None)) ndb.Context.urlfetch = mock.create_autospec(ndb.Context.urlfetch, return_value=fut) self.assertEqual(httplib.REQUEST_TIMEOUT, api.do_request('foo')[0])
def testRetryFailWithResponseTimeOut(self): self.results.extend([urlfetch.DownloadError()] * (self.max_retries - 1)) self.results.append( test_utils.MockUrlFetchResult(httplib.REQUEST_TIMEOUT, None, None)) with mock.patch.object(api_utils.urlfetch, 'fetch') as f: f.side_effect = self._SideEffect self.assertEqual( httplib.REQUEST_TIMEOUT, api_utils._retry_fetch('foo', self.retry_params).status_code)
def testRetryAfterDoRequestUrlFetchTimeout(self): api = rest_api._RestApi('scope') fut = ndb.Future() fut.set_exception(urlfetch.DownloadError()) ndb.Context.urlfetch = mock.create_autospec(ndb.Context.urlfetch, return_value=fut) with mock.patch('google.appengine.api.urlfetch' '.fetch') as f: f.return_value = test_utils.MockUrlFetchResult( httplib.ACCEPTED, None, None) self.assertEqual(httplib.ACCEPTED, api.do_request('foo')[0])
def testRefreshToken(self): api = rest_api._RestApi('scope') fut_get_token1 = ndb.Future() fut_get_token1.set_result('blah') fut_get_token2 = ndb.Future() fut_get_token2.set_result('bleh') api.get_token_async = mock.create_autospec( api.get_token_async, side_effect=[fut_get_token1, fut_get_token2]) fut_urlfetch1 = ndb.Future() fut_urlfetch1.set_result(test_utils.MockUrlFetchResult(401, {}, '')) fut_urlfetch2 = ndb.Future() fut_urlfetch2.set_result( test_utils.MockUrlFetchResult(200, {'foo': 'bar'}, 'yoohoo')) api.urlfetch_async = mock.create_autospec( api.urlfetch_async, side_effect=[fut_urlfetch1, fut_urlfetch2]) res = api.do_request('http://example.com') self.assertEqual(res, (200, {'foo': 'bar'}, 'yoohoo')) self.assertEqual(api.urlfetch_async.call_args_list, [ mock.call('http://example.com', headers={'authorization': 'OAuth bleh'}, follow_redirects=False, payload=None, method='GET', deadline=None, callback=None), mock.call('http://example.com', headers={'authorization': 'OAuth bleh'}, follow_redirects=False, payload=None, method='GET', deadline=None, callback=None) ])
def testCallUrlFetch(self): api = rest_api._RestApi('scope') fut = ndb.Future() fut.set_result(test_utils.MockUrlFetchResult(200, {}, 'response')) ndb.Context.urlfetch = mock.create_autospec( ndb.Context.urlfetch, return_value=fut) res = api.urlfetch('http://example.com', method='PUT', headers={'a': 'b'}) self.assertEqual(res.status_code, 200) self.assertEqual(res.content, 'response')
def testUrlFetchCalledWithUserProvidedDeadline(self): retry_params = api_utils.RetryParams(urlfetch_timeout=90) api = rest_api._RestApi('scope', retry_params=retry_params) resp_fut1 = ndb.Future() resp_fut1.set_exception(urlfetch.DownloadError()) resp_fut2 = ndb.Future() resp_fut2.set_result( test_utils.MockUrlFetchResult(httplib.ACCEPTED, None, None)) ndb.Context.urlfetch = mock.create_autospec( ndb.Context.urlfetch, side_effect=[resp_fut1, resp_fut2]) self.assertEqual(httplib.ACCEPTED, api.do_request('foo')[0]) self.assertEqual(90, ndb.Context.urlfetch.call_args_list[0][1]['deadline']) self.assertEqual(90, ndb.Context.urlfetch.call_args_list[1][1]['deadline'])
def testAsyncCall(self): api = rest_api._RestApi('scope') fut_urlfetch = ndb.Future() fut_urlfetch.set_result( test_utils.MockUrlFetchResult(200, {'foo': 'bar'}, 'yoohoo')) api.urlfetch_async = mock.create_autospec(api.urlfetch_async, return_value=fut_urlfetch) fut = api.do_request_async('http://example.com') res = fut.get_result() self.assertEqual(res, (200, {'foo': 'bar'}, 'yoohoo')) api.urlfetch_async.assert_called_once_with('http://example.com', headers=mock.ANY, follow_redirects=False, payload=None, method='GET', deadline=None, callback=None)
def testRetryAfterAppIdentityError(self): api = rest_api._RestApi('scope') token_fut = ndb.Future() token_fut.set_result('token1') api.get_token_async = mock.create_autospec( api.get_token_async, side_effect=[app_identity.InternalError, app_identity.InternalError, token_fut]) resp_fut = ndb.Future() resp_fut.set_result(test_utils.MockUrlFetchResult(httplib.ACCEPTED, None, None)) ndb.Context.urlfetch = mock.create_autospec( ndb.Context.urlfetch, side_effect=[resp_fut]) self.assertEqual(httplib.ACCEPTED, api.do_request('foo')[0]) self.assertEqual( 'OAuth token1', ndb.Context.urlfetch.call_args[1]['headers']['authorization']) self.assertEqual(3, api.get_token_async.call_count)