Exemple #1
0
 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)))
Exemple #2
0
    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)
Exemple #4
0
    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)
Exemple #5
0
    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'))
Exemple #6
0
  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)
Exemple #7
0
  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)
Exemple #8
0
 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'])
Exemple #9
0
    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])
Exemple #10
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)
Exemple #11
0
    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])
Exemple #12
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)
        ])
Exemple #13
0
  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'])
Exemple #15
0
    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)
Exemple #16
0
  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)