Use testresources for example files
The example files were loaded at import time rather than used as a test fixture. Change-Id: I3c1ac4db4b269725bf83904c1568a86b45eb7e55
This commit is contained in:
@@ -16,7 +16,9 @@
|
||||
|
||||
import os
|
||||
|
||||
import fixtures
|
||||
import six
|
||||
import testresources
|
||||
|
||||
from keystoneclient.common import cms
|
||||
from keystoneclient.openstack.common import jsonutils
|
||||
@@ -30,279 +32,306 @@ CERTDIR = os.path.join(ROOTDIR, 'examples', 'pki', 'certs')
|
||||
CMSDIR = os.path.join(ROOTDIR, 'examples', 'pki', 'cms')
|
||||
KEYDIR = os.path.join(ROOTDIR, 'examples', 'pki', 'private')
|
||||
|
||||
# @TODO(mordred) This should become a testresources resource attached to the
|
||||
# class
|
||||
# The data for these tests are signed using openssl and are stored in files
|
||||
# in the signing subdirectory. In order to keep the values consistent between
|
||||
# the tests and the signed documents, we read them in for use in the tests.
|
||||
with open(os.path.join(CMSDIR, 'auth_token_scoped.pem')) as f:
|
||||
SIGNED_TOKEN_SCOPED = cms.cms_to_token(f.read())
|
||||
with open(os.path.join(CMSDIR, 'auth_token_unscoped.pem')) as f:
|
||||
SIGNED_TOKEN_UNSCOPED = cms.cms_to_token(f.read())
|
||||
with open(os.path.join(CMSDIR, 'auth_v3_token_scoped.pem')) as f:
|
||||
SIGNED_v3_TOKEN_SCOPED = cms.cms_to_token(f.read())
|
||||
with open(os.path.join(CMSDIR, 'auth_token_revoked.pem')) as f:
|
||||
REVOKED_TOKEN = cms.cms_to_token(f.read())
|
||||
with open(os.path.join(CMSDIR, 'auth_token_scoped_expired.pem')) as f:
|
||||
SIGNED_TOKEN_SCOPED_EXPIRED = cms.cms_to_token(f.read())
|
||||
with open(os.path.join(CMSDIR, 'auth_v3_token_revoked.pem')) as f:
|
||||
REVOKED_v3_TOKEN = cms.cms_to_token(f.read())
|
||||
with open(os.path.join(CMSDIR, 'revocation_list.json')) as f:
|
||||
REVOCATION_LIST = jsonutils.loads(f.read())
|
||||
with open(os.path.join(CMSDIR, 'revocation_list.pem')) as f:
|
||||
SIGNED_REVOCATION_LIST = jsonutils.dumps({'signed': f.read()})
|
||||
|
||||
SIGNING_CERT_FILE = os.path.join(CERTDIR, 'signing_cert.pem')
|
||||
with open(SIGNING_CERT_FILE) as f:
|
||||
SIGNING_CERT = f.read()
|
||||
class Examples(fixtures.Fixture):
|
||||
"""Example tokens and certs loaded from the examples directory.
|
||||
|
||||
SIGNING_KEY_FILE = os.path.join(KEYDIR, 'signing_key.pem')
|
||||
with open(SIGNING_KEY_FILE) as f:
|
||||
SIGNING_KEY = f.read()
|
||||
To use this class correctly, the module needs to override the test suite
|
||||
class to use testresources.OptimisingTestSuite (otherwise the files will
|
||||
be read on every test). This is done by defining a load_tests function
|
||||
in the module, like this:
|
||||
|
||||
SIGNING_CA_FILE = os.path.join(CERTDIR, 'cacert.pem')
|
||||
with open(SIGNING_CA_FILE) as f:
|
||||
SIGNING_CA = f.read()
|
||||
def load_tests(loader, tests, pattern):
|
||||
return testresources.OptimisingTestSuite(tests)
|
||||
|
||||
UUID_TOKEN_DEFAULT = "ec6c0710ec2f471498484c1b53ab4f9d"
|
||||
UUID_TOKEN_NO_SERVICE_CATALOG = '8286720fbe4941e69fa8241723bb02df'
|
||||
UUID_TOKEN_UNSCOPED = '731f903721c14827be7b2dc912af7776'
|
||||
VALID_DIABLO_TOKEN = 'b0cf19b55dbb4f20a6ee18e6c6cf1726'
|
||||
v3_UUID_TOKEN_DEFAULT = '5603457654b346fdbb93437bfe76f2f1'
|
||||
v3_UUID_TOKEN_UNSCOPED = 'd34835fdaec447e695a0a024d84f8d79'
|
||||
v3_UUID_TOKEN_DOMAIN_SCOPED = 'e8a7b63aaa4449f38f0c5c05c3581792'
|
||||
(see http://docs.python.org/2/library/unittest.html#load-tests-protocol )
|
||||
|
||||
REVOKED_TOKEN_HASH = utils.hash_signed_token(REVOKED_TOKEN)
|
||||
REVOKED_TOKEN_LIST = {'revoked': [{'id': REVOKED_TOKEN_HASH,
|
||||
'expires': timeutils.utcnow()}]}
|
||||
REVOKED_TOKEN_LIST_JSON = jsonutils.dumps(REVOKED_TOKEN_LIST)
|
||||
"""
|
||||
|
||||
REVOKED_v3_TOKEN_HASH = utils.hash_signed_token(REVOKED_v3_TOKEN)
|
||||
REVOKED_v3_TOKEN_LIST = {'revoked': [{'id': REVOKED_v3_TOKEN_HASH,
|
||||
'expires': timeutils.utcnow()}]}
|
||||
REVOKED_v3_TOKEN_LIST_JSON = jsonutils.dumps(REVOKED_v3_TOKEN_LIST)
|
||||
def setUp(self):
|
||||
super(Examples, self).setUp()
|
||||
|
||||
SIGNED_TOKEN_SCOPED_KEY = cms.cms_hash_token(SIGNED_TOKEN_SCOPED)
|
||||
SIGNED_TOKEN_UNSCOPED_KEY = cms.cms_hash_token(SIGNED_TOKEN_UNSCOPED)
|
||||
SIGNED_v3_TOKEN_SCOPED_KEY = cms.cms_hash_token(SIGNED_v3_TOKEN_SCOPED)
|
||||
# The data for several tests are signed using openssl and are stored in
|
||||
# files in the signing subdirectory. In order to keep the values
|
||||
# consistent between the tests and the signed documents, we read them
|
||||
# in for use in the tests.
|
||||
|
||||
INVALID_SIGNED_TOKEN = \
|
||||
"MIIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" \
|
||||
"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" \
|
||||
"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" \
|
||||
"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD" \
|
||||
"EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE" \
|
||||
"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" \
|
||||
"0000000000000000000000000000000000000000000000000000000000000000" \
|
||||
"1111111111111111111111111111111111111111111111111111111111111111" \
|
||||
"2222222222222222222222222222222222222222222222222222222222222222" \
|
||||
"3333333333333333333333333333333333333333333333333333333333333333" \
|
||||
"4444444444444444444444444444444444444444444444444444444444444444" \
|
||||
"5555555555555555555555555555555555555555555555555555555555555555" \
|
||||
"6666666666666666666666666666666666666666666666666666666666666666" \
|
||||
"7777777777777777777777777777777777777777777777777777777777777777" \
|
||||
"8888888888888888888888888888888888888888888888888888888888888888" \
|
||||
"9999999999999999999999999999999999999999999999999999999999999999" \
|
||||
"0000000000000000000000000000000000000000000000000000000000000000" \
|
||||
with open(os.path.join(CMSDIR, 'auth_token_scoped.pem')) as f:
|
||||
self.SIGNED_TOKEN_SCOPED = cms.cms_to_token(f.read())
|
||||
with open(os.path.join(CMSDIR, 'auth_token_unscoped.pem')) as f:
|
||||
self.SIGNED_TOKEN_UNSCOPED = cms.cms_to_token(f.read())
|
||||
with open(os.path.join(CMSDIR, 'auth_v3_token_scoped.pem')) as f:
|
||||
self.SIGNED_v3_TOKEN_SCOPED = cms.cms_to_token(f.read())
|
||||
with open(os.path.join(CMSDIR, 'auth_token_revoked.pem')) as f:
|
||||
self.REVOKED_TOKEN = cms.cms_to_token(f.read())
|
||||
with open(os.path.join(CMSDIR, 'auth_token_scoped_expired.pem')) as f:
|
||||
self.SIGNED_TOKEN_SCOPED_EXPIRED = cms.cms_to_token(f.read())
|
||||
with open(os.path.join(CMSDIR, 'auth_v3_token_revoked.pem')) as f:
|
||||
self.REVOKED_v3_TOKEN = cms.cms_to_token(f.read())
|
||||
with open(os.path.join(CMSDIR, 'revocation_list.json')) as f:
|
||||
self.REVOCATION_LIST = jsonutils.loads(f.read())
|
||||
with open(os.path.join(CMSDIR, 'revocation_list.pem')) as f:
|
||||
self.SIGNED_REVOCATION_LIST = jsonutils.dumps({'signed': f.read()})
|
||||
|
||||
self.SIGNING_CERT_FILE = os.path.join(CERTDIR, 'signing_cert.pem')
|
||||
with open(self.SIGNING_CERT_FILE) as f:
|
||||
self.SIGNING_CERT = f.read()
|
||||
|
||||
# JSON responses keyed by token ID
|
||||
TOKEN_RESPONSES = {
|
||||
UUID_TOKEN_DEFAULT: {
|
||||
'access': {
|
||||
'token': {
|
||||
'id': UUID_TOKEN_DEFAULT,
|
||||
'expires': '2020-01-01T00:00:10.000123Z',
|
||||
'tenant': {
|
||||
'id': 'tenant_id1',
|
||||
'name': 'tenant_name1',
|
||||
self.SIGNING_KEY_FILE = os.path.join(KEYDIR, 'signing_key.pem')
|
||||
with open(self.SIGNING_KEY_FILE) as f:
|
||||
self.SIGNING_KEY = f.read()
|
||||
|
||||
self.SIGNING_CA_FILE = os.path.join(CERTDIR, 'cacert.pem')
|
||||
with open(self.SIGNING_CA_FILE) as f:
|
||||
self.SIGNING_CA = f.read()
|
||||
|
||||
self.UUID_TOKEN_DEFAULT = "ec6c0710ec2f471498484c1b53ab4f9d"
|
||||
self.UUID_TOKEN_NO_SERVICE_CATALOG = '8286720fbe4941e69fa8241723bb02df'
|
||||
self.UUID_TOKEN_UNSCOPED = '731f903721c14827be7b2dc912af7776'
|
||||
self.VALID_DIABLO_TOKEN = 'b0cf19b55dbb4f20a6ee18e6c6cf1726'
|
||||
self.v3_UUID_TOKEN_DEFAULT = '5603457654b346fdbb93437bfe76f2f1'
|
||||
self.v3_UUID_TOKEN_UNSCOPED = 'd34835fdaec447e695a0a024d84f8d79'
|
||||
self.v3_UUID_TOKEN_DOMAIN_SCOPED = 'e8a7b63aaa4449f38f0c5c05c3581792'
|
||||
|
||||
self.REVOKED_TOKEN_HASH = utils.hash_signed_token(self.REVOKED_TOKEN)
|
||||
self.REVOKED_TOKEN_LIST = (
|
||||
{'revoked': [{'id': self.REVOKED_TOKEN_HASH,
|
||||
'expires': timeutils.utcnow()}]})
|
||||
self.REVOKED_TOKEN_LIST_JSON = jsonutils.dumps(self.REVOKED_TOKEN_LIST)
|
||||
|
||||
self.REVOKED_v3_TOKEN_HASH = utils.hash_signed_token(
|
||||
self.REVOKED_v3_TOKEN)
|
||||
self.REVOKED_v3_TOKEN_LIST = (
|
||||
{'revoked': [{'id': self.REVOKED_v3_TOKEN_HASH,
|
||||
'expires': timeutils.utcnow()}]})
|
||||
self.REVOKED_v3_TOKEN_LIST_JSON = jsonutils.dumps(
|
||||
self.REVOKED_v3_TOKEN_LIST)
|
||||
|
||||
self.SIGNED_TOKEN_SCOPED_KEY = cms.cms_hash_token(
|
||||
self.SIGNED_TOKEN_SCOPED)
|
||||
self.SIGNED_TOKEN_UNSCOPED_KEY = cms.cms_hash_token(
|
||||
self.SIGNED_TOKEN_UNSCOPED)
|
||||
self.SIGNED_v3_TOKEN_SCOPED_KEY = cms.cms_hash_token(
|
||||
self.SIGNED_v3_TOKEN_SCOPED)
|
||||
|
||||
self.INVALID_SIGNED_TOKEN = (
|
||||
"MIIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
|
||||
"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
|
||||
"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
|
||||
"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"
|
||||
"EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
|
||||
"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
|
||||
"0000000000000000000000000000000000000000000000000000000000000000"
|
||||
"1111111111111111111111111111111111111111111111111111111111111111"
|
||||
"2222222222222222222222222222222222222222222222222222222222222222"
|
||||
"3333333333333333333333333333333333333333333333333333333333333333"
|
||||
"4444444444444444444444444444444444444444444444444444444444444444"
|
||||
"5555555555555555555555555555555555555555555555555555555555555555"
|
||||
"6666666666666666666666666666666666666666666666666666666666666666"
|
||||
"7777777777777777777777777777777777777777777777777777777777777777"
|
||||
"8888888888888888888888888888888888888888888888888888888888888888"
|
||||
"9999999999999999999999999999999999999999999999999999999999999999"
|
||||
"0000000000000000000000000000000000000000000000000000000000000000")
|
||||
|
||||
# JSON responses keyed by token ID
|
||||
self.TOKEN_RESPONSES = {
|
||||
self.UUID_TOKEN_DEFAULT: {
|
||||
'access': {
|
||||
'token': {
|
||||
'id': self.UUID_TOKEN_DEFAULT,
|
||||
'expires': '2020-01-01T00:00:10.000123Z',
|
||||
'tenant': {
|
||||
'id': 'tenant_id1',
|
||||
'name': 'tenant_name1',
|
||||
},
|
||||
},
|
||||
'user': {
|
||||
'id': 'user_id1',
|
||||
'name': 'user_name1',
|
||||
'roles': [
|
||||
{'name': 'role1'},
|
||||
{'name': 'role2'},
|
||||
],
|
||||
},
|
||||
'serviceCatalog': {}
|
||||
},
|
||||
},
|
||||
'user': {
|
||||
'id': 'user_id1',
|
||||
'name': 'user_name1',
|
||||
'roles': [
|
||||
{'name': 'role1'},
|
||||
{'name': 'role2'},
|
||||
],
|
||||
},
|
||||
'serviceCatalog': {}
|
||||
},
|
||||
},
|
||||
VALID_DIABLO_TOKEN: {
|
||||
'access': {
|
||||
'token': {
|
||||
'id': VALID_DIABLO_TOKEN,
|
||||
'expires': '2020-01-01T00:00:10.000123Z',
|
||||
'tenantId': 'tenant_id1',
|
||||
},
|
||||
'user': {
|
||||
'id': 'user_id1',
|
||||
'name': 'user_name1',
|
||||
'roles': [
|
||||
{'name': 'role1'},
|
||||
{'name': 'role2'},
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
UUID_TOKEN_UNSCOPED: {
|
||||
'access': {
|
||||
'token': {
|
||||
'id': UUID_TOKEN_UNSCOPED,
|
||||
'expires': '2020-01-01T00:00:10.000123Z',
|
||||
},
|
||||
'user': {
|
||||
'id': 'user_id1',
|
||||
'name': 'user_name1',
|
||||
'roles': [
|
||||
{'name': 'role1'},
|
||||
{'name': 'role2'},
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
UUID_TOKEN_NO_SERVICE_CATALOG: {
|
||||
'access': {
|
||||
'token': {
|
||||
'id': 'valid-token',
|
||||
'expires': '2020-01-01T00:00:10.000123Z',
|
||||
'tenant': {
|
||||
'id': 'tenant_id1',
|
||||
'name': 'tenant_name1',
|
||||
self.VALID_DIABLO_TOKEN: {
|
||||
'access': {
|
||||
'token': {
|
||||
'id': self.VALID_DIABLO_TOKEN,
|
||||
'expires': '2020-01-01T00:00:10.000123Z',
|
||||
'tenantId': 'tenant_id1',
|
||||
},
|
||||
'user': {
|
||||
'id': 'user_id1',
|
||||
'name': 'user_name1',
|
||||
'roles': [
|
||||
{'name': 'role1'},
|
||||
{'name': 'role2'},
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
'user': {
|
||||
'id': 'user_id1',
|
||||
'name': 'user_name1',
|
||||
'roles': [
|
||||
{'name': 'role1'},
|
||||
{'name': 'role2'},
|
||||
],
|
||||
}
|
||||
},
|
||||
},
|
||||
v3_UUID_TOKEN_DEFAULT: {
|
||||
'token': {
|
||||
'expires_at': '2020-01-01T00:00:10.000123Z',
|
||||
'user': {
|
||||
'id': 'user_id1',
|
||||
'name': 'user_name1',
|
||||
'domain': {
|
||||
'id': 'domain_id1',
|
||||
'name': 'domain_name1'
|
||||
self.UUID_TOKEN_UNSCOPED: {
|
||||
'access': {
|
||||
'token': {
|
||||
'id': self.UUID_TOKEN_UNSCOPED,
|
||||
'expires': '2020-01-01T00:00:10.000123Z',
|
||||
},
|
||||
'user': {
|
||||
'id': 'user_id1',
|
||||
'name': 'user_name1',
|
||||
'roles': [
|
||||
{'name': 'role1'},
|
||||
{'name': 'role2'},
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
self.UUID_TOKEN_NO_SERVICE_CATALOG: {
|
||||
'access': {
|
||||
'token': {
|
||||
'id': 'valid-token',
|
||||
'expires': '2020-01-01T00:00:10.000123Z',
|
||||
'tenant': {
|
||||
'id': 'tenant_id1',
|
||||
'name': 'tenant_name1',
|
||||
},
|
||||
},
|
||||
'user': {
|
||||
'id': 'user_id1',
|
||||
'name': 'user_name1',
|
||||
'roles': [
|
||||
{'name': 'role1'},
|
||||
{'name': 'role2'},
|
||||
],
|
||||
}
|
||||
},
|
||||
},
|
||||
self.v3_UUID_TOKEN_DEFAULT: {
|
||||
'token': {
|
||||
'expires_at': '2020-01-01T00:00:10.000123Z',
|
||||
'user': {
|
||||
'id': 'user_id1',
|
||||
'name': 'user_name1',
|
||||
'domain': {
|
||||
'id': 'domain_id1',
|
||||
'name': 'domain_name1'
|
||||
}
|
||||
},
|
||||
'project': {
|
||||
'id': 'tenant_id1',
|
||||
'name': 'tenant_name1',
|
||||
'domain': {
|
||||
'id': 'domain_id1',
|
||||
'name': 'domain_name1'
|
||||
}
|
||||
},
|
||||
'roles': [
|
||||
{'name': 'role1', 'id': 'Role1'},
|
||||
{'name': 'role2', 'id': 'Role2'},
|
||||
],
|
||||
'catalog': {}
|
||||
}
|
||||
},
|
||||
'project': {
|
||||
'id': 'tenant_id1',
|
||||
'name': 'tenant_name1',
|
||||
'domain': {
|
||||
'id': 'domain_id1',
|
||||
'name': 'domain_name1'
|
||||
self.v3_UUID_TOKEN_UNSCOPED: {
|
||||
'token': {
|
||||
'expires_at': '2020-01-01T00:00:10.000123Z',
|
||||
'user': {
|
||||
'id': 'user_id1',
|
||||
'name': 'user_name1',
|
||||
'domain': {
|
||||
'id': 'domain_id1',
|
||||
'name': 'domain_name1'
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
self.v3_UUID_TOKEN_DOMAIN_SCOPED: {
|
||||
'token': {
|
||||
'expires_at': '2020-01-01T00:00:10.000123Z',
|
||||
'user': {
|
||||
'id': 'user_id1',
|
||||
'name': 'user_name1',
|
||||
'domain': {
|
||||
'id': 'domain_id1',
|
||||
'name': 'domain_name1'
|
||||
}
|
||||
},
|
||||
'domain': {
|
||||
'id': 'domain_id1',
|
||||
'name': 'domain_name1',
|
||||
},
|
||||
'roles': [
|
||||
{'name': 'role1', 'id': 'Role1'},
|
||||
{'name': 'role2', 'id': 'Role2'},
|
||||
],
|
||||
'catalog': {}
|
||||
}
|
||||
},
|
||||
self.SIGNED_TOKEN_SCOPED_KEY: {
|
||||
'access': {
|
||||
'token': {
|
||||
'id': self.SIGNED_TOKEN_SCOPED_KEY,
|
||||
},
|
||||
'user': {
|
||||
'id': 'user_id1',
|
||||
'name': 'user_name1',
|
||||
'tenantId': 'tenant_id1',
|
||||
'tenantName': 'tenant_name1',
|
||||
'roles': [
|
||||
{'name': 'role1'},
|
||||
{'name': 'role2'},
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
self.SIGNED_TOKEN_UNSCOPED_KEY: {
|
||||
'access': {
|
||||
'token': {
|
||||
'id': self.SIGNED_TOKEN_UNSCOPED_KEY,
|
||||
},
|
||||
'user': {
|
||||
'id': 'user_id1',
|
||||
'name': 'user_name1',
|
||||
'roles': [
|
||||
{'name': 'role1'},
|
||||
{'name': 'role2'},
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
self.SIGNED_v3_TOKEN_SCOPED_KEY: {
|
||||
'token': {
|
||||
'expires': '2020-01-01T00:00:10.000123Z',
|
||||
'user': {
|
||||
'id': 'user_id1',
|
||||
'name': 'user_name1',
|
||||
'domain': {
|
||||
'id': 'domain_id1',
|
||||
'name': 'domain_name1'
|
||||
}
|
||||
},
|
||||
'project': {
|
||||
'id': 'tenant_id1',
|
||||
'name': 'tenant_name1',
|
||||
'domain': {
|
||||
'id': 'domain_id1',
|
||||
'name': 'domain_name1'
|
||||
}
|
||||
},
|
||||
'roles': [
|
||||
{'name': 'role1'},
|
||||
{'name': 'role2'}
|
||||
],
|
||||
'catalog': {}
|
||||
}
|
||||
},
|
||||
'roles': [
|
||||
{'name': 'role1', 'id': 'Role1'},
|
||||
{'name': 'role2', 'id': 'Role2'},
|
||||
],
|
||||
'catalog': {}
|
||||
}
|
||||
},
|
||||
v3_UUID_TOKEN_UNSCOPED: {
|
||||
'token': {
|
||||
'expires_at': '2020-01-01T00:00:10.000123Z',
|
||||
'user': {
|
||||
'id': 'user_id1',
|
||||
'name': 'user_name1',
|
||||
'domain': {
|
||||
'id': 'domain_id1',
|
||||
'name': 'domain_name1'
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
v3_UUID_TOKEN_DOMAIN_SCOPED: {
|
||||
'token': {
|
||||
'expires_at': '2020-01-01T00:00:10.000123Z',
|
||||
'user': {
|
||||
'id': 'user_id1',
|
||||
'name': 'user_name1',
|
||||
'domain': {
|
||||
'id': 'domain_id1',
|
||||
'name': 'domain_name1'
|
||||
}
|
||||
},
|
||||
'domain': {
|
||||
'id': 'domain_id1',
|
||||
'name': 'domain_name1',
|
||||
},
|
||||
'roles': [
|
||||
{'name': 'role1', 'id': 'Role1'},
|
||||
{'name': 'role2', 'id': 'Role2'},
|
||||
],
|
||||
'catalog': {}
|
||||
}
|
||||
},
|
||||
SIGNED_TOKEN_SCOPED_KEY: {
|
||||
'access': {
|
||||
'token': {
|
||||
'id': SIGNED_TOKEN_SCOPED_KEY,
|
||||
},
|
||||
'user': {
|
||||
'id': 'user_id1',
|
||||
'name': 'user_name1',
|
||||
'tenantId': 'tenant_id1',
|
||||
'tenantName': 'tenant_name1',
|
||||
'roles': [
|
||||
{'name': 'role1'},
|
||||
{'name': 'role2'},
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
SIGNED_TOKEN_UNSCOPED_KEY: {
|
||||
'access': {
|
||||
'token': {
|
||||
'id': SIGNED_TOKEN_UNSCOPED_KEY,
|
||||
},
|
||||
'user': {
|
||||
'id': 'user_id1',
|
||||
'name': 'user_name1',
|
||||
'roles': [
|
||||
{'name': 'role1'},
|
||||
{'name': 'role2'},
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
SIGNED_v3_TOKEN_SCOPED_KEY: {
|
||||
'token': {
|
||||
'expires': '2020-01-01T00:00:10.000123Z',
|
||||
'user': {
|
||||
'id': 'user_id1',
|
||||
'name': 'user_name1',
|
||||
'domain': {
|
||||
'id': 'domain_id1',
|
||||
'name': 'domain_name1'
|
||||
}
|
||||
},
|
||||
'project': {
|
||||
'id': 'tenant_id1',
|
||||
'name': 'tenant_name1',
|
||||
'domain': {
|
||||
'id': 'domain_id1',
|
||||
'name': 'domain_name1'
|
||||
}
|
||||
},
|
||||
'roles': [
|
||||
{'name': 'role1'},
|
||||
{'name': 'role2'}
|
||||
],
|
||||
'catalog': {}
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
self.JSON_TOKEN_RESPONSES = dict([(k, jsonutils.dumps(v)) for k, v in
|
||||
six.iteritems(self.TOKEN_RESPONSES)])
|
||||
|
||||
|
||||
JSON_TOKEN_RESPONSES = dict([(k, jsonutils.dumps(v)) for k, v in
|
||||
six.iteritems(TOKEN_RESPONSES)])
|
||||
EXAMPLES_RESOURCE = testresources.FixtureResource(Examples())
|
||||
|
@@ -29,6 +29,7 @@ import uuid
|
||||
import fixtures
|
||||
import httpretty
|
||||
import mock
|
||||
import testresources
|
||||
import webob
|
||||
|
||||
from keystoneclient.common import cms
|
||||
@@ -320,7 +321,10 @@ if tuple(sys.version_info)[0:2] < (2, 7):
|
||||
BaseAuthTokenMiddlewareTest = AdjustedBaseAuthTokenMiddlewareTest
|
||||
|
||||
|
||||
class MultiStepAuthTokenMiddlewareTest(BaseAuthTokenMiddlewareTest):
|
||||
class MultiStepAuthTokenMiddlewareTest(BaseAuthTokenMiddlewareTest,
|
||||
testresources.ResourcedTestCase):
|
||||
|
||||
resources = [('examples', client_fixtures.EXAMPLES_RESOURCE)]
|
||||
|
||||
@httpretty.activate
|
||||
def test_fetch_revocation_list_with_expire(self):
|
||||
@@ -333,20 +337,24 @@ class MultiStepAuthTokenMiddlewareTest(BaseAuthTokenMiddlewareTest):
|
||||
|
||||
responses = [httpretty.Response(body='', status=401),
|
||||
httpretty.Response(
|
||||
body=client_fixtures.SIGNED_REVOCATION_LIST)]
|
||||
body=self.examples.SIGNED_REVOCATION_LIST)]
|
||||
|
||||
httpretty.register_uri(httpretty.GET,
|
||||
"%s/v2.0/tokens/revoked" % BASE_URI,
|
||||
responses=responses)
|
||||
|
||||
fetched_list = jsonutils.loads(self.middleware.fetch_revocation_list())
|
||||
self.assertEqual(fetched_list, client_fixtures.REVOCATION_LIST)
|
||||
self.assertEqual(fetched_list, self.examples.REVOCATION_LIST)
|
||||
|
||||
# Check that 4 requests have been made
|
||||
self.assertEqual(len(httpretty.httpretty.latest_requests), 4)
|
||||
|
||||
|
||||
class DiabloAuthTokenMiddlewareTest(BaseAuthTokenMiddlewareTest):
|
||||
class DiabloAuthTokenMiddlewareTest(BaseAuthTokenMiddlewareTest,
|
||||
testresources.ResourcedTestCase):
|
||||
|
||||
resources = [('examples', client_fixtures.EXAMPLES_RESOURCE)]
|
||||
|
||||
"""Auth Token middleware should understand Diablo keystone responses."""
|
||||
def setUp(self):
|
||||
# pre-diablo only had Tenant ID, which was also the Name
|
||||
@@ -372,8 +380,8 @@ class DiabloAuthTokenMiddlewareTest(BaseAuthTokenMiddlewareTest):
|
||||
"%s/v2.0/tokens" % BASE_URI,
|
||||
body=FAKE_ADMIN_TOKEN)
|
||||
|
||||
self.token_id = client_fixtures.VALID_DIABLO_TOKEN
|
||||
token_response = client_fixtures.JSON_TOKEN_RESPONSES[self.token_id]
|
||||
self.token_id = self.examples.VALID_DIABLO_TOKEN
|
||||
token_response = self.examples.JSON_TOKEN_RESPONSES[self.token_id]
|
||||
|
||||
httpretty.register_uri(httpretty.GET,
|
||||
"%s/v2.0/tokens/%s" % (BASE_URI, self.token_id),
|
||||
@@ -507,7 +515,7 @@ class CommonAuthTokenMiddlewareTest(object):
|
||||
tmp_name = uuid.uuid4().hex
|
||||
test_parent_signing_dir = "/tmp/%s" % tmp_name
|
||||
self.middleware.signing_dirname = "/tmp/%s/%s" % ((tmp_name,) * 2)
|
||||
self.middleware.signing_cert_file_name = "%s/test.pem" %\
|
||||
self.middleware.signing_cert_file_name = "%s/test.pem" % \
|
||||
self.middleware.signing_dirname
|
||||
self.middleware.verify_signing_dir()
|
||||
# NOTE(wu_wenxiang): Verify if the signing dir was created as expected.
|
||||
@@ -546,7 +554,7 @@ class CommonAuthTokenMiddlewareTest(object):
|
||||
def test_get_token_revocation_list_fetched_time_returns_utc(self):
|
||||
with TimezoneFixture('UTC-1'):
|
||||
self.middleware.token_revocation_list = jsonutils.dumps(
|
||||
client_fixtures.REVOCATION_LIST)
|
||||
self.examples.REVOCATION_LIST)
|
||||
self.middleware.token_revocation_list_fetched_time = None
|
||||
fetched_time = self.middleware.token_revocation_list_fetched_time
|
||||
self.assertTrue(timeutils.is_soon(fetched_time, 1))
|
||||
@@ -562,7 +570,7 @@ class CommonAuthTokenMiddlewareTest(object):
|
||||
self.middleware.token_revocation_list_fetched_time = None
|
||||
os.remove(self.middleware.revoked_file_name)
|
||||
self.assertEqual(self.middleware.token_revocation_list,
|
||||
client_fixtures.REVOCATION_LIST)
|
||||
self.examples.REVOCATION_LIST)
|
||||
|
||||
def test_get_revocation_list_returns_current_list_from_memory(self):
|
||||
self.assertEqual(self.middleware.token_revocation_list,
|
||||
@@ -586,7 +594,7 @@ class CommonAuthTokenMiddlewareTest(object):
|
||||
# auth_token uses v2 to fetch this, so don't allow the v3
|
||||
# tests to override the fake http connection
|
||||
fetched_list = jsonutils.loads(self.middleware.fetch_revocation_list())
|
||||
self.assertEqual(fetched_list, client_fixtures.REVOCATION_LIST)
|
||||
self.assertEqual(fetched_list, self.examples.REVOCATION_LIST)
|
||||
|
||||
def test_request_invalid_uuid_token(self):
|
||||
# remember because we are testing the middleware we stub the connection
|
||||
@@ -603,7 +611,7 @@ class CommonAuthTokenMiddlewareTest(object):
|
||||
|
||||
def test_request_invalid_signed_token(self):
|
||||
req = webob.Request.blank('/')
|
||||
req.headers['X-Auth-Token'] = client_fixtures.INVALID_SIGNED_TOKEN
|
||||
req.headers['X-Auth-Token'] = self.examples.INVALID_SIGNED_TOKEN
|
||||
self.middleware(req.environ, self.start_fake_response)
|
||||
self.assertEqual(self.response_status, 401)
|
||||
self.assertEqual(self.response_headers['WWW-Authenticate'],
|
||||
@@ -747,23 +755,23 @@ class CommonAuthTokenMiddlewareTest(object):
|
||||
self.assertFalse(auth_token.will_expire_soon(fortyseconds))
|
||||
|
||||
def test_token_is_v2_accepts_v2(self):
|
||||
token = client_fixtures.UUID_TOKEN_DEFAULT
|
||||
token_response = client_fixtures.TOKEN_RESPONSES[token]
|
||||
token = self.examples.UUID_TOKEN_DEFAULT
|
||||
token_response = self.examples.TOKEN_RESPONSES[token]
|
||||
self.assertTrue(auth_token._token_is_v2(token_response))
|
||||
|
||||
def test_token_is_v2_rejects_v3(self):
|
||||
token = client_fixtures.v3_UUID_TOKEN_DEFAULT
|
||||
token_response = client_fixtures.TOKEN_RESPONSES[token]
|
||||
token = self.examples.v3_UUID_TOKEN_DEFAULT
|
||||
token_response = self.examples.TOKEN_RESPONSES[token]
|
||||
self.assertFalse(auth_token._token_is_v2(token_response))
|
||||
|
||||
def test_token_is_v3_rejects_v2(self):
|
||||
token = client_fixtures.UUID_TOKEN_DEFAULT
|
||||
token_response = client_fixtures.TOKEN_RESPONSES[token]
|
||||
token = self.examples.UUID_TOKEN_DEFAULT
|
||||
token_response = self.examples.TOKEN_RESPONSES[token]
|
||||
self.assertFalse(auth_token._token_is_v3(token_response))
|
||||
|
||||
def test_token_is_v3_accepts_v3(self):
|
||||
token = client_fixtures.v3_UUID_TOKEN_DEFAULT
|
||||
token_response = client_fixtures.TOKEN_RESPONSES[token]
|
||||
token = self.examples.v3_UUID_TOKEN_DEFAULT
|
||||
token_response = self.examples.TOKEN_RESPONSES[token]
|
||||
self.assertTrue(auth_token._token_is_v3(token_response))
|
||||
|
||||
def test_encrypt_cache_data(self):
|
||||
@@ -895,7 +903,11 @@ class CommonAuthTokenMiddlewareTest(object):
|
||||
with_catalog=False)
|
||||
|
||||
|
||||
class CertDownloadMiddlewareTest(BaseAuthTokenMiddlewareTest):
|
||||
class CertDownloadMiddlewareTest(BaseAuthTokenMiddlewareTest,
|
||||
testresources.ResourcedTestCase):
|
||||
|
||||
resources = [('examples', client_fixtures.EXAMPLES_RESOURCE)]
|
||||
|
||||
def setUp(self):
|
||||
super(CertDownloadMiddlewareTest, self).setUp()
|
||||
self.base_dir = tempfile.mkdtemp()
|
||||
@@ -927,7 +939,7 @@ class CertDownloadMiddlewareTest(BaseAuthTokenMiddlewareTest):
|
||||
status=404)
|
||||
self.assertRaises(exceptions.CertificateConfigError,
|
||||
self.middleware.verify_signed_token,
|
||||
client_fixtures.SIGNED_TOKEN_SCOPED)
|
||||
self.examples.SIGNED_TOKEN_SCOPED)
|
||||
|
||||
def test_fetch_signing_cert(self):
|
||||
data = 'FAKE CERT'
|
||||
@@ -1005,7 +1017,8 @@ def network_error_response(method, uri, headers):
|
||||
|
||||
|
||||
class v2AuthTokenMiddlewareTest(BaseAuthTokenMiddlewareTest,
|
||||
CommonAuthTokenMiddlewareTest):
|
||||
CommonAuthTokenMiddlewareTest,
|
||||
testresources.ResourcedTestCase):
|
||||
"""v2 token specific tests.
|
||||
|
||||
There are some differences between how the auth-token middleware handles
|
||||
@@ -1022,17 +1035,19 @@ class v2AuthTokenMiddlewareTest(BaseAuthTokenMiddlewareTest,
|
||||
|
||||
"""
|
||||
|
||||
resources = [('examples', client_fixtures.EXAMPLES_RESOURCE)]
|
||||
|
||||
def setUp(self):
|
||||
super(v2AuthTokenMiddlewareTest, self).setUp()
|
||||
|
||||
self.token_dict = {
|
||||
'uuid_token_default': client_fixtures.UUID_TOKEN_DEFAULT,
|
||||
'uuid_token_unscoped': client_fixtures.UUID_TOKEN_UNSCOPED,
|
||||
'signed_token_scoped': client_fixtures.SIGNED_TOKEN_SCOPED,
|
||||
'uuid_token_default': self.examples.UUID_TOKEN_DEFAULT,
|
||||
'uuid_token_unscoped': self.examples.UUID_TOKEN_UNSCOPED,
|
||||
'signed_token_scoped': self.examples.SIGNED_TOKEN_SCOPED,
|
||||
'signed_token_scoped_expired':
|
||||
client_fixtures.SIGNED_TOKEN_SCOPED_EXPIRED,
|
||||
'revoked_token': client_fixtures.REVOKED_TOKEN,
|
||||
'revoked_token_hash': client_fixtures.REVOKED_TOKEN_HASH
|
||||
self.examples.SIGNED_TOKEN_SCOPED_EXPIRED,
|
||||
'revoked_token': self.examples.REVOKED_TOKEN,
|
||||
'revoked_token_hash': self.examples.REVOKED_TOKEN_HASH
|
||||
}
|
||||
|
||||
httpretty.httpretty.reset()
|
||||
@@ -1049,16 +1064,16 @@ class v2AuthTokenMiddlewareTest(BaseAuthTokenMiddlewareTest,
|
||||
|
||||
httpretty.register_uri(httpretty.GET,
|
||||
"%s/v2.0/tokens/revoked" % BASE_URI,
|
||||
body=client_fixtures.SIGNED_REVOCATION_LIST,
|
||||
body=self.examples.SIGNED_REVOCATION_LIST,
|
||||
status=200)
|
||||
|
||||
for token in (client_fixtures.UUID_TOKEN_DEFAULT,
|
||||
client_fixtures.UUID_TOKEN_UNSCOPED,
|
||||
client_fixtures.UUID_TOKEN_NO_SERVICE_CATALOG):
|
||||
for token in (self.examples.UUID_TOKEN_DEFAULT,
|
||||
self.examples.UUID_TOKEN_UNSCOPED,
|
||||
self.examples.UUID_TOKEN_NO_SERVICE_CATALOG):
|
||||
httpretty.register_uri(httpretty.GET,
|
||||
"%s/v2.0/tokens/%s" % (BASE_URI, token),
|
||||
body=
|
||||
client_fixtures.JSON_TOKEN_RESPONSES[token])
|
||||
self.examples.JSON_TOKEN_RESPONSES[token])
|
||||
|
||||
httpretty.register_uri(httpretty.GET,
|
||||
'%s/v2.0/tokens/%s' % (BASE_URI, ERROR_TOKEN),
|
||||
@@ -1088,11 +1103,11 @@ class v2AuthTokenMiddlewareTest(BaseAuthTokenMiddlewareTest,
|
||||
|
||||
def test_default_tenant_uuid_token(self):
|
||||
self.assert_unscoped_default_tenant_auto_scopes(
|
||||
client_fixtures.UUID_TOKEN_DEFAULT)
|
||||
self.examples.UUID_TOKEN_DEFAULT)
|
||||
|
||||
def test_default_tenant_signed_token(self):
|
||||
self.assert_unscoped_default_tenant_auto_scopes(
|
||||
client_fixtures.SIGNED_TOKEN_SCOPED)
|
||||
self.examples.SIGNED_TOKEN_SCOPED)
|
||||
|
||||
def assert_unscoped_token_receives_401(self, token):
|
||||
"""Unscoped requests with no default tenant ID should be rejected."""
|
||||
@@ -1105,24 +1120,27 @@ class v2AuthTokenMiddlewareTest(BaseAuthTokenMiddlewareTest,
|
||||
|
||||
def test_unscoped_uuid_token_receives_401(self):
|
||||
self.assert_unscoped_token_receives_401(
|
||||
client_fixtures.UUID_TOKEN_UNSCOPED)
|
||||
self.examples.UUID_TOKEN_UNSCOPED)
|
||||
|
||||
def test_unscoped_pki_token_receives_401(self):
|
||||
self.assert_unscoped_token_receives_401(
|
||||
client_fixtures.SIGNED_TOKEN_UNSCOPED)
|
||||
self.examples.SIGNED_TOKEN_UNSCOPED)
|
||||
|
||||
def test_request_prevent_service_catalog_injection(self):
|
||||
req = webob.Request.blank('/')
|
||||
req.headers['X-Service-Catalog'] = '[]'
|
||||
req.headers['X-Auth-Token'] = \
|
||||
client_fixtures.UUID_TOKEN_NO_SERVICE_CATALOG
|
||||
self.examples.UUID_TOKEN_NO_SERVICE_CATALOG
|
||||
body = self.middleware(req.environ, self.start_fake_response)
|
||||
self.assertEqual(self.response_status, 200)
|
||||
self.assertFalse(req.headers.get('X-Service-Catalog'))
|
||||
self.assertEqual(body, ['SUCCESS'])
|
||||
|
||||
|
||||
class CrossVersionAuthTokenMiddlewareTest(BaseAuthTokenMiddlewareTest):
|
||||
class CrossVersionAuthTokenMiddlewareTest(BaseAuthTokenMiddlewareTest,
|
||||
testresources.ResourcedTestCase):
|
||||
|
||||
resources = [('examples', client_fixtures.EXAMPLES_RESOURCE)]
|
||||
|
||||
@httpretty.activate
|
||||
def test_valid_uuid_request_forced_to_2_0(self):
|
||||
@@ -1149,27 +1167,28 @@ class CrossVersionAuthTokenMiddlewareTest(BaseAuthTokenMiddlewareTest):
|
||||
"%s/v2.0/tokens" % BASE_URI,
|
||||
body=FAKE_ADMIN_TOKEN)
|
||||
|
||||
token = client_fixtures.UUID_TOKEN_DEFAULT
|
||||
token = self.examples.UUID_TOKEN_DEFAULT
|
||||
httpretty.register_uri(httpretty.GET,
|
||||
"%s/v2.0/tokens/%s" % (BASE_URI, token),
|
||||
body=
|
||||
client_fixtures.JSON_TOKEN_RESPONSES[token])
|
||||
self.examples.JSON_TOKEN_RESPONSES[token])
|
||||
|
||||
self.set_middleware(conf=conf)
|
||||
|
||||
# This tests will only work is auth_token has chosen to use the
|
||||
# lower, v2, api version
|
||||
req = webob.Request.blank('/')
|
||||
req.headers['X-Auth-Token'] = client_fixtures.UUID_TOKEN_DEFAULT
|
||||
req.headers['X-Auth-Token'] = self.examples.UUID_TOKEN_DEFAULT
|
||||
self.middleware(req.environ, self.start_fake_response)
|
||||
self.assertEqual(self.response_status, 200)
|
||||
self.assertEqual("/testadmin/v2.0/tokens/%s" %
|
||||
client_fixtures.UUID_TOKEN_DEFAULT,
|
||||
self.examples.UUID_TOKEN_DEFAULT,
|
||||
httpretty.httpretty.last_request.path)
|
||||
|
||||
|
||||
class v3AuthTokenMiddlewareTest(BaseAuthTokenMiddlewareTest,
|
||||
CommonAuthTokenMiddlewareTest):
|
||||
CommonAuthTokenMiddlewareTest,
|
||||
testresources.ResourcedTestCase):
|
||||
"""Test auth_token middleware with v3 tokens.
|
||||
|
||||
Re-execute the AuthTokenMiddlewareTest class tests, but with the
|
||||
@@ -1193,19 +1212,22 @@ class v3AuthTokenMiddlewareTest(BaseAuthTokenMiddlewareTest,
|
||||
the highest available auth version, i.e. v3.0
|
||||
|
||||
"""
|
||||
|
||||
resources = [('examples', client_fixtures.EXAMPLES_RESOURCE)]
|
||||
|
||||
def setUp(self):
|
||||
super(v3AuthTokenMiddlewareTest, self).setUp(
|
||||
auth_version='v3.0',
|
||||
fake_app=v3FakeApp)
|
||||
|
||||
self.token_dict = {
|
||||
'uuid_token_default': client_fixtures.v3_UUID_TOKEN_DEFAULT,
|
||||
'uuid_token_unscoped': client_fixtures.v3_UUID_TOKEN_UNSCOPED,
|
||||
'signed_token_scoped': client_fixtures.SIGNED_v3_TOKEN_SCOPED,
|
||||
'uuid_token_default': self.examples.v3_UUID_TOKEN_DEFAULT,
|
||||
'uuid_token_unscoped': self.examples.v3_UUID_TOKEN_UNSCOPED,
|
||||
'signed_token_scoped': self.examples.SIGNED_v3_TOKEN_SCOPED,
|
||||
'signed_token_scoped_expired':
|
||||
client_fixtures.SIGNED_TOKEN_SCOPED_EXPIRED,
|
||||
'revoked_token': client_fixtures.REVOKED_v3_TOKEN,
|
||||
'revoked_token_hash': client_fixtures.REVOKED_v3_TOKEN_HASH
|
||||
self.examples.SIGNED_TOKEN_SCOPED_EXPIRED,
|
||||
'revoked_token': self.examples.REVOKED_v3_TOKEN,
|
||||
'revoked_token_hash': self.examples.REVOKED_v3_TOKEN_HASH
|
||||
}
|
||||
|
||||
httpretty.httpretty.reset()
|
||||
@@ -1225,7 +1247,7 @@ class v3AuthTokenMiddlewareTest(BaseAuthTokenMiddlewareTest,
|
||||
# TODO(jamielennox): there is no v3 revocation url yet, it uses v2
|
||||
httpretty.register_uri(httpretty.GET,
|
||||
"%s/v2.0/tokens/revoked" % BASE_URI,
|
||||
body=client_fixtures.SIGNED_REVOCATION_LIST,
|
||||
body=self.examples.SIGNED_REVOCATION_LIST,
|
||||
status=200)
|
||||
|
||||
httpretty.register_uri(httpretty.GET,
|
||||
@@ -1251,7 +1273,7 @@ class v3AuthTokenMiddlewareTest(BaseAuthTokenMiddlewareTest,
|
||||
raise auth_token.NetworkError("Network connection error.")
|
||||
|
||||
try:
|
||||
response = client_fixtures.JSON_TOKEN_RESPONSES[token_id]
|
||||
response = self.examples.JSON_TOKEN_RESPONSES[token_id]
|
||||
except KeyError:
|
||||
status = 404
|
||||
|
||||
@@ -1274,7 +1296,7 @@ class v3AuthTokenMiddlewareTest(BaseAuthTokenMiddlewareTest,
|
||||
'HTTP_X_ROLE': '',
|
||||
}
|
||||
self.set_middleware(expected_env=delta_expected_env)
|
||||
self.assert_valid_request_200(client_fixtures.v3_UUID_TOKEN_UNSCOPED,
|
||||
self.assert_valid_request_200(self.examples.v3_UUID_TOKEN_UNSCOPED,
|
||||
with_catalog=False)
|
||||
self.assertLastPath('/testadmin/v3/auth/tokens')
|
||||
|
||||
@@ -1293,7 +1315,7 @@ class v3AuthTokenMiddlewareTest(BaseAuthTokenMiddlewareTest,
|
||||
}
|
||||
self.set_middleware(expected_env=delta_expected_env)
|
||||
self.assert_valid_request_200(
|
||||
client_fixtures.v3_UUID_TOKEN_DOMAIN_SCOPED)
|
||||
self.examples.v3_UUID_TOKEN_DOMAIN_SCOPED)
|
||||
self.assertLastPath('/testadmin/v3/auth/tokens')
|
||||
|
||||
|
||||
@@ -1512,3 +1534,7 @@ class TokenExpirationTest(BaseAuthTokenMiddlewareTest):
|
||||
expires = timeutils.strtime(some_time_earlier) + '-02:00'
|
||||
self.middleware._cache_put(token, data, expires)
|
||||
self.assertIsNone(self.middleware._cache_get(token))
|
||||
|
||||
|
||||
def load_tests(loader, tests, pattern):
|
||||
return testresources.OptimisingTestSuite(tests)
|
||||
|
@@ -16,6 +16,7 @@ import os
|
||||
import subprocess
|
||||
|
||||
import mock
|
||||
import testresources
|
||||
|
||||
from keystoneclient.common import cms
|
||||
from keystoneclient import exceptions
|
||||
@@ -23,10 +24,12 @@ from keystoneclient.tests import client_fixtures
|
||||
from keystoneclient.tests import utils
|
||||
|
||||
|
||||
class CMSTest(utils.TestCase):
|
||||
class CMSTest(utils.TestCase, testresources.ResourcedTestCase):
|
||||
|
||||
"""Unit tests for the keystoneclient.common.cms module."""
|
||||
|
||||
resources = [('examples', client_fixtures.EXAMPLES_RESOURCE)]
|
||||
|
||||
def test_cms_verify(self):
|
||||
self.assertRaises(exceptions.CertificateConfigError,
|
||||
cms.cms_verify,
|
||||
@@ -39,33 +42,33 @@ class CMSTest(utils.TestCase):
|
||||
'auth_token_scoped.pem')) as f:
|
||||
AUTH_TOKEN_SCOPED_CMS = f.read()
|
||||
|
||||
self.assertEqual(cms.token_to_cms(client_fixtures.SIGNED_TOKEN_SCOPED),
|
||||
self.assertEqual(cms.token_to_cms(self.examples.SIGNED_TOKEN_SCOPED),
|
||||
AUTH_TOKEN_SCOPED_CMS)
|
||||
|
||||
tok = cms.cms_to_token(cms.token_to_cms(
|
||||
client_fixtures.SIGNED_TOKEN_SCOPED))
|
||||
self.assertEqual(tok, client_fixtures.SIGNED_TOKEN_SCOPED)
|
||||
self.examples.SIGNED_TOKEN_SCOPED))
|
||||
self.assertEqual(tok, self.examples.SIGNED_TOKEN_SCOPED)
|
||||
|
||||
def test_ans1_token(self):
|
||||
self.assertTrue(cms.is_ans1_token(client_fixtures.SIGNED_TOKEN_SCOPED))
|
||||
self.assertTrue(cms.is_ans1_token(self.examples.SIGNED_TOKEN_SCOPED))
|
||||
self.assertFalse(cms.is_ans1_token('FOOBAR'))
|
||||
|
||||
def test_cms_sign_token_no_files(self):
|
||||
self.assertRaises(subprocess.CalledProcessError,
|
||||
cms.cms_sign_token,
|
||||
client_fixtures.SIGNED_TOKEN_SCOPED,
|
||||
self.examples.SIGNED_TOKEN_SCOPED,
|
||||
'/no/such/file', '/no/such/key')
|
||||
|
||||
def test_cms_sign_token_success(self):
|
||||
self.assertTrue(
|
||||
cms.cms_sign_token(client_fixtures.SIGNED_TOKEN_SCOPED,
|
||||
client_fixtures.SIGNING_CERT_FILE,
|
||||
client_fixtures.SIGNING_KEY_FILE))
|
||||
cms.cms_sign_token(self.examples.SIGNED_TOKEN_SCOPED,
|
||||
self.examples.SIGNING_CERT_FILE,
|
||||
self.examples.SIGNING_KEY_FILE))
|
||||
|
||||
def test_cms_verify_token_no_files(self):
|
||||
self.assertRaises(exceptions.CertificateConfigError,
|
||||
cms.cms_verify,
|
||||
client_fixtures.SIGNED_TOKEN_SCOPED,
|
||||
self.examples.SIGNED_TOKEN_SCOPED,
|
||||
'/no/such/file', '/no/such/key')
|
||||
|
||||
def test_cms_verify_token_no_oserror(self):
|
||||
@@ -86,26 +89,30 @@ class CMSTest(utils.TestCase):
|
||||
self.fail('Expected subprocess.CalledProcessError')
|
||||
|
||||
def test_cms_verify_token_scoped(self):
|
||||
cms_content = cms.token_to_cms(client_fixtures.SIGNED_TOKEN_SCOPED)
|
||||
cms_content = cms.token_to_cms(self.examples.SIGNED_TOKEN_SCOPED)
|
||||
self.assertTrue(cms.cms_verify(cms_content,
|
||||
client_fixtures.SIGNING_CERT_FILE,
|
||||
client_fixtures.SIGNING_CA_FILE))
|
||||
self.examples.SIGNING_CERT_FILE,
|
||||
self.examples.SIGNING_CA_FILE))
|
||||
|
||||
def test_cms_verify_token_scoped_expired(self):
|
||||
cms_content = cms.token_to_cms(
|
||||
client_fixtures.SIGNED_TOKEN_SCOPED_EXPIRED)
|
||||
self.examples.SIGNED_TOKEN_SCOPED_EXPIRED)
|
||||
self.assertTrue(cms.cms_verify(cms_content,
|
||||
client_fixtures.SIGNING_CERT_FILE,
|
||||
client_fixtures.SIGNING_CA_FILE))
|
||||
self.examples.SIGNING_CERT_FILE,
|
||||
self.examples.SIGNING_CA_FILE))
|
||||
|
||||
def test_cms_verify_token_unscoped(self):
|
||||
cms_content = cms.token_to_cms(client_fixtures.SIGNED_TOKEN_UNSCOPED)
|
||||
cms_content = cms.token_to_cms(self.examples.SIGNED_TOKEN_UNSCOPED)
|
||||
self.assertTrue(cms.cms_verify(cms_content,
|
||||
client_fixtures.SIGNING_CERT_FILE,
|
||||
client_fixtures.SIGNING_CA_FILE))
|
||||
self.examples.SIGNING_CERT_FILE,
|
||||
self.examples.SIGNING_CA_FILE))
|
||||
|
||||
def test_cms_verify_token_v3_scoped(self):
|
||||
cms_content = cms.token_to_cms(client_fixtures.SIGNED_v3_TOKEN_SCOPED)
|
||||
cms_content = cms.token_to_cms(self.examples.SIGNED_v3_TOKEN_SCOPED)
|
||||
self.assertTrue(cms.cms_verify(cms_content,
|
||||
client_fixtures.SIGNING_CERT_FILE,
|
||||
client_fixtures.SIGNING_CA_FILE))
|
||||
self.examples.SIGNING_CERT_FILE,
|
||||
self.examples.SIGNING_CA_FILE))
|
||||
|
||||
|
||||
def load_tests(loader, tests, pattern):
|
||||
return testresources.OptimisingTestSuite(tests)
|
||||
|
@@ -14,6 +14,8 @@
|
||||
|
||||
import datetime
|
||||
|
||||
import testresources
|
||||
|
||||
from keystoneclient import access
|
||||
from keystoneclient.openstack.common import timeutils
|
||||
from keystoneclient.tests import client_fixtures as token_data
|
||||
@@ -22,11 +24,12 @@ from keystoneclient.tests.v2_0 import utils
|
||||
|
||||
UNSCOPED_TOKEN = client_fixtures.UNSCOPED_TOKEN
|
||||
PROJECT_SCOPED_TOKEN = client_fixtures.PROJECT_SCOPED_TOKEN
|
||||
DIABLO_TOKEN = token_data.TOKEN_RESPONSES[token_data.VALID_DIABLO_TOKEN]
|
||||
GRIZZLY_TOKEN = token_data.TOKEN_RESPONSES[token_data.SIGNED_TOKEN_SCOPED_KEY]
|
||||
|
||||
|
||||
class AccessInfoTest(utils.TestCase):
|
||||
class AccessInfoTest(utils.TestCase, testresources.ResourcedTestCase):
|
||||
|
||||
resources = [('examples', token_data.EXAMPLES_RESOURCE)]
|
||||
|
||||
def test_building_unscoped_accessinfo(self):
|
||||
auth_ref = access.AccessInfo.factory(body=UNSCOPED_TOKEN)
|
||||
|
||||
@@ -100,7 +103,9 @@ class AccessInfoTest(utils.TestCase):
|
||||
self.assertFalse(auth_ref.domain_scoped)
|
||||
|
||||
def test_diablo_token(self):
|
||||
auth_ref = access.AccessInfo.factory(body=DIABLO_TOKEN)
|
||||
diablo_token = self.examples.TOKEN_RESPONSES[
|
||||
self.examples.VALID_DIABLO_TOKEN]
|
||||
auth_ref = access.AccessInfo.factory(body=diablo_token)
|
||||
|
||||
self.assertTrue(auth_ref)
|
||||
self.assertEqual(auth_ref.username, 'user_name1')
|
||||
@@ -113,7 +118,9 @@ class AccessInfoTest(utils.TestCase):
|
||||
self.assertFalse(auth_ref.scoped)
|
||||
|
||||
def test_grizzly_token(self):
|
||||
auth_ref = access.AccessInfo.factory(body=GRIZZLY_TOKEN)
|
||||
grizzly_token = self.examples.TOKEN_RESPONSES[
|
||||
self.examples.SIGNED_TOKEN_SCOPED_KEY]
|
||||
auth_ref = access.AccessInfo.factory(body=grizzly_token)
|
||||
|
||||
self.assertEqual(auth_ref.project_id, 'tenant_id1')
|
||||
self.assertEqual(auth_ref.project_name, 'tenant_name1')
|
||||
@@ -121,3 +128,7 @@ class AccessInfoTest(utils.TestCase):
|
||||
self.assertEqual(auth_ref.project_domain_name, 'Default')
|
||||
self.assertEqual(auth_ref.user_domain_id, 'default')
|
||||
self.assertEqual(auth_ref.user_domain_name, 'Default')
|
||||
|
||||
|
||||
def load_tests(loader, tests, pattern):
|
||||
return testresources.OptimisingTestSuite(tests)
|
||||
|
Reference in New Issue
Block a user