blob: 810f4ceee6d3135f0891cf96a37151b5225d08f6 [file] [log] [blame]
#!/usr/bin/env python
import io
import re
import mock
from six.moves import http_client
import unittest2
from apitools.base.py import credentials_lib
from apitools.base.py import util
def CreateUriValidator(uri_regexp, content=''):
def CheckUri(uri, headers=None):
if 'X-Google-Metadata-Request' not in headers:
raise ValueError('Missing required header')
if uri_regexp.match(uri):
message = content
status = http_client.OK
else:
message = 'Expected uri matching pattern %s' % uri_regexp.pattern
status = http_client.BAD_REQUEST
return type('HttpResponse', (object,), {'status': status})(), message
return CheckUri
class CredentialsLibTest(unittest2.TestCase):
def _GetServiceCreds(self, service_account_name=None, scopes=None):
scopes = scopes or ['scope1']
kwargs = {}
if service_account_name is not None:
kwargs['service_account_name'] = service_account_name
service_account_name = service_account_name or 'default'
def MockMetadataCalls(request):
request_url = request.get_full_url()
if request_url.endswith('scopes'):
return io.BytesIO(''.join(scopes))
elif request_url.endswith('service-accounts'):
return io.BytesIO(service_account_name)
elif request_url.endswith(
'/service-accounts/%s/token' % service_account_name):
return io.BytesIO('{"access_token": "token"}')
self.fail('Unexpected HTTP request to %s' % request_url)
with mock.patch.object(credentials_lib, '_OpenNoProxy',
side_effect=MockMetadataCalls,
autospec=True) as opener_mock:
with mock.patch.object(util, 'DetectGce', autospec=True) as mock_detect:
mock_detect.return_value = True
validator = CreateUriValidator(
re.compile(r'.*/%s/.*' % service_account_name),
content='{"access_token": "token"}')
credentials = credentials_lib.GceAssertionCredentials(scopes, **kwargs)
self.assertIsNone(credentials._refresh(validator))
self.assertEqual(3, opener_mock.call_count)
def testGceServiceAccounts(self):
self._GetServiceCreds()
self._GetServiceCreds(service_account_name='my_service_account')
if __name__ == '__main__':
unittest2.main()