Use rfc3986 library to validate URL paths and URIs

More work needs to be done in rfc3986 to give the user more control over what
they consider to be a valid URI in the context of RFC 3986. For example, a
previous incarnation of these tests checked that "1" and "abc" were invalid
when according to the RFC they are.

Update the API samples and tests to use valid URIs

DocImpact

Change-Id: I288fbaead64990db1053b7a11e82904611b8498f
This commit is contained in:
Ian Cordasco
2014-06-30 14:49:03 -05:00
parent dc7cfbd623
commit 86356bf6f1
26 changed files with 151 additions and 98 deletions

View File

@@ -5,6 +5,6 @@
"architecture": "x86",
"version": "8.0",
"md5hash": "add6bb58e139be103324d04d82d8f545",
"url": "xxxxxxxxxxxx"
"url": "http://example.com/path/to/resource"
}
}
}

View File

@@ -5,5 +5,5 @@
<architecture>x86</architecture>
<version>8.0</version>
<md5hash>add6bb58e139be103324d04d82d8f545</md5hash>
<url>xxxxxxxxxxxx</url>
</agent>
<url>http://example.com/path/to/resource</url>
</agent>

View File

@@ -5,7 +5,7 @@
"hypervisor": "hypervisor",
"md5hash": "add6bb58e139be103324d04d82d8f545",
"os": "os",
"url": "xxxxxxxxxxxx",
"url": "http://example.com/path/to/resource",
"version": "8.0"
}
}
}

View File

@@ -1,10 +1,10 @@
<?xml version='1.0' encoding='UTF-8'?>
<agent>
<url>xxxxxxxxxxxx</url>
<url>http://example.com/path/to/resource</url>
<hypervisor>hypervisor</hypervisor>
<md5hash>add6bb58e139be103324d04d82d8f545</md5hash>
<version>8.0</version>
<architecture>x86</architecture>
<os>os</os>
<agent_id>1</agent_id>
</agent>
</agent>

View File

@@ -1,7 +1,7 @@
{
"para": {
"url": "xxx://xxxx/xxx/xxx",
"url": "http://example.com/path/to/resource",
"md5hash": "add6bb58e139be103324d04d82d8f545",
"version": "7.0"
}
}
}

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<para>
<version>7.0</version>
<url>xxx://xxxx/xxx/xxx</url>
<url>http://example.com/path/to/resource</url>
<md5hash>add6bb58e139be103324d04d82d8f545</md5hash>
</para>
</para>

View File

@@ -2,7 +2,7 @@
"agent": {
"agent_id": "1",
"md5hash": "add6bb58e139be103324d04d82d8f545",
"url": "xxx://xxxx/xxx/xxx",
"url": "http://example.com/path/to/resource",
"version": "7.0"
}
}
}

View File

@@ -1,7 +1,7 @@
<?xml version='1.0' encoding='UTF-8'?>
<agent>
<url>xxx://xxxx/xxx/xxx</url>
<url>http://example.com/path/to/resource</url>
<version>7.0</version>
<agent_id>1</agent_id>
<md5hash>add6bb58e139be103324d04d82d8f545</md5hash>
</agent>
</agent>

View File

@@ -6,8 +6,8 @@
"hypervisor": "hypervisor",
"md5hash": "add6bb58e139be103324d04d82d8f545",
"os": "os",
"url": "xxxxxxxxxxxx",
"url": "http://example.com/path/to/resource",
"version": "8.0"
}
]
}
}

View File

@@ -1,4 +1,4 @@
<?xml version='1.0' encoding='UTF-8'?>
<agents>
<agent url="xxxxxxxxxxxx" hypervisor="hypervisor" md5hash="add6bb58e139be103324d04d82d8f545" version="8.0" architecture="x86" os="os" agent_id="1"/>
</agents>
<agent url="http://example.com/path/to/resource" hypervisor="hypervisor" md5hash="add6bb58e139be103324d04d82d8f545" version="8.0" architecture="x86" os="os" agent_id="1"/>
</agents>

View File

@@ -5,6 +5,6 @@
"architecture": "x86",
"version": "8.0",
"md5hash": "add6bb58e139be103324d04d82d8f545",
"url": "xxxxxxxxxxxx"
"url": "http://example.com/path/to/resource"
}
}
}

View File

@@ -5,7 +5,7 @@
"hypervisor": "hypervisor",
"md5hash": "add6bb58e139be103324d04d82d8f545",
"os": "os",
"url": "xxxxxxxxxxxx",
"url": "http://example.com/path/to/resource",
"version": "8.0"
}
}
}

View File

@@ -1,6 +1,6 @@
{
"agent": {
"url": "xxx://xxxx/xxx/xxx",
"url": "http://example.com/path/to/resource",
"md5hash": "add6bb58e139be103324d04d82d8f545",
"version": "7.0"
}

View File

@@ -2,7 +2,7 @@
"agent": {
"agent_id": 1,
"md5hash": "add6bb58e139be103324d04d82d8f545",
"url": "xxx://xxxx/xxx/xxx",
"url": "http://example.com/path/to/resource",
"version": "7.0"
}
}
}

View File

@@ -6,8 +6,8 @@
"hypervisor": "hypervisor",
"md5hash": "add6bb58e139be103324d04d82d8f545",
"os": "os",
"url": "xxxxxxxxxxxx",
"url": "http://example.com/path/to/resource",
"version": "8.0"
}
]
}
}

View File

@@ -17,6 +17,7 @@ Internal implementation of request Body validating middleware.
"""
import jsonschema
import rfc3986
import six
from nova import exception
@@ -40,6 +41,12 @@ def _validate_uuid_format(instance):
return uuidutils.is_uuid_like(instance)
@jsonschema.FormatChecker.cls_checks('uri')
def _validate_uri(instance):
return rfc3986.is_valid_uri(instance, require_scheme=True,
require_authority=True)
class _SchemaValidator(object):
"""A validator class

View File

@@ -14,8 +14,8 @@
# under the License.
import base64
import re
import rfc3986
import six
from nova.openstack.common import log as logging
@@ -24,21 +24,6 @@ from nova.openstack.common import log as logging
LOG = logging.getLogger(__name__)
def _get_path_validator_regex():
# rfc3986 path validator regex from
# http://jmrware.com/articles/2009/uri_regexp/URI_regex.html
pchar = "([A-Za-z0-9\-._~!$&'()*+,;=:@]|%[0-9A-Fa-f]{2})"
path = "((/{pchar}*)*|"
path += "/({pchar}+(/{pchar}*)*)?|"
path += "{pchar}+(/{pchar}*)*|"
path += "{pchar}+(/{pchar}*)*|)"
path = path.format(pchar=pchar)
return re.compile(path)
VALIDATE_PATH_RE = _get_path_validator_regex()
def validate_str(max_length=None):
def _do(val):
@@ -69,7 +54,9 @@ def validate_url_path(val):
if not validate_str()(val):
return False
return VALIDATE_PATH_RE.match(val).end() == len(val)
uri = rfc3986.URIReference(None, None, val, None, None)
return uri.path_is_valid() and val.startswith('/')
def validate_image_path(val):

View File

@@ -24,25 +24,25 @@ from nova import test
fake_agents_list = [{'hypervisor': 'kvm', 'os': 'win',
'architecture': 'x86',
'version': '7.0',
'url': 'xxx://xxxx/xxx/xxx',
'url': 'http://example.com/path/to/resource',
'md5hash': 'add6bb58e139be103324d04d82d8f545',
'id': 1},
{'hypervisor': 'kvm', 'os': 'linux',
'architecture': 'x86',
'version': '16.0',
'url': 'xxx://xxxx/xxx/xxx1',
'url': 'http://example.com/path/to/resource1',
'md5hash': 'add6bb58e139be103324d04d82d8f546',
'id': 2},
{'hypervisor': 'xen', 'os': 'linux',
'architecture': 'x86',
'version': '16.0',
'url': 'xxx://xxxx/xxx/xxx2',
'url': 'http://example.com/path/to/resource2',
'md5hash': 'add6bb58e139be103324d04d82d8f547',
'id': 3},
{'hypervisor': 'xen', 'os': 'win',
'architecture': 'power',
'version': '7.0',
'url': 'xxx://xxxx/xxx/xxx3',
'url': 'http://example.com/path/to/resource3',
'md5hash': 'add6bb58e139be103324d04d82d8f548',
'id': 4},
]
@@ -106,13 +106,13 @@ class AgentsTest(test.NoDBTestCase):
'os': 'win',
'architecture': 'x86',
'version': '7.0',
'url': 'xxx://xxxx/xxx/xxx',
'url': 'http://example.com/path/to/resource',
'md5hash': 'add6bb58e139be103324d04d82d8f545'}}
response = {'agent': {'hypervisor': 'kvm',
'os': 'win',
'architecture': 'x86',
'version': '7.0',
'url': 'xxx://xxxx/xxx/xxx',
'url': 'http://example.com/path/to/resource',
'md5hash': 'add6bb58e139be103324d04d82d8f545',
'agent_id': 1}}
res_dict = self.controller.create(req, body)
@@ -151,7 +151,7 @@ class AgentsTest(test.NoDBTestCase):
'os': 'win',
'architecture': 'x86',
'version': '7.0',
'url': 'xxx://xxxx/xxx/xxx',
'url': 'http://example.com/path/to/resource',
'md5hash': 'add6bb58e139be103324d04d82d8f545'}}
body['agent'][key] = 'x' * 256
self.assertRaises(webob.exc.HTTPBadRequest,
@@ -185,25 +185,25 @@ class AgentsTest(test.NoDBTestCase):
agents_list = [{'hypervisor': 'kvm', 'os': 'win',
'architecture': 'x86',
'version': '7.0',
'url': 'xxx://xxxx/xxx/xxx',
'url': 'http://example.com/path/to/resource',
'md5hash': 'add6bb58e139be103324d04d82d8f545',
'agent_id': 1},
{'hypervisor': 'kvm', 'os': 'linux',
'architecture': 'x86',
'version': '16.0',
'url': 'xxx://xxxx/xxx/xxx1',
'url': 'http://example.com/path/to/resource1',
'md5hash': 'add6bb58e139be103324d04d82d8f546',
'agent_id': 2},
{'hypervisor': 'xen', 'os': 'linux',
'architecture': 'x86',
'version': '16.0',
'url': 'xxx://xxxx/xxx/xxx2',
'url': 'http://example.com/path/to/resource2',
'md5hash': 'add6bb58e139be103324d04d82d8f547',
'agent_id': 3},
{'hypervisor': 'xen', 'os': 'win',
'architecture': 'power',
'version': '7.0',
'url': 'xxx://xxxx/xxx/xxx3',
'url': 'http://example.com/path/to/resource3',
'md5hash': 'add6bb58e139be103324d04d82d8f548',
'agent_id': 4},
]
@@ -215,13 +215,13 @@ class AgentsTest(test.NoDBTestCase):
response = [{'hypervisor': 'kvm', 'os': 'win',
'architecture': 'x86',
'version': '7.0',
'url': 'xxx://xxxx/xxx/xxx',
'url': 'http://example.com/path/to/resource',
'md5hash': 'add6bb58e139be103324d04d82d8f545',
'agent_id': 1},
{'hypervisor': 'kvm', 'os': 'linux',
'architecture': 'x86',
'version': '16.0',
'url': 'xxx://xxxx/xxx/xxx1',
'url': 'http://example.com/path/to/resource1',
'md5hash': 'add6bb58e139be103324d04d82d8f546',
'agent_id': 2},
]
@@ -230,11 +230,11 @@ class AgentsTest(test.NoDBTestCase):
def test_agents_update(self):
req = FakeRequest()
body = {'para': {'version': '7.0',
'url': 'xxx://xxxx/xxx/xxx',
'url': 'http://example.com/path/to/resource',
'md5hash': 'add6bb58e139be103324d04d82d8f545'}}
response = {'agent': {'agent_id': 1,
'version': '7.0',
'url': 'xxx://xxxx/xxx/xxx',
'url': 'http://example.com/path/to/resource',
'md5hash': 'add6bb58e139be103324d04d82d8f545'}}
res_dict = self.controller.update(req, 1, body)
self.assertEqual(res_dict, response)
@@ -258,7 +258,7 @@ class AgentsTest(test.NoDBTestCase):
def _test_agents_update_with_invalid_length(self, key):
req = FakeRequest()
body = {'para': {'version': '7.0',
'url': 'xxx://xxxx/xxx/xxx',
'url': 'http://example.com/path/to/resource',
'md5hash': 'add6bb58e139be103324d04d82d8f545'}}
body['para'][key] = 'x' * 256
self.assertRaises(webob.exc.HTTPBadRequest,

View File

@@ -23,25 +23,25 @@ from nova import test
fake_agents_list = [{'hypervisor': 'kvm', 'os': 'win',
'architecture': 'x86',
'version': '7.0',
'url': 'xxx://xxxx/xxx/xxx',
'url': 'http://example.com/path/to/resource',
'md5hash': 'add6bb58e139be103324d04d82d8f545',
'id': 1},
{'hypervisor': 'kvm', 'os': 'linux',
'architecture': 'x86',
'version': '16.0',
'url': 'xxx://xxxx/xxx/xxx1',
'url': 'http://example.com/path/to/resource1',
'md5hash': 'add6bb58e139be103324d04d82d8f546',
'id': 2},
{'hypervisor': 'xen', 'os': 'linux',
'architecture': 'x86',
'version': '16.0',
'url': 'xxx://xxxx/xxx/xxx2',
'url': 'http://example.com/path/to/resource2',
'md5hash': 'add6bb58e139be103324d04d82d8f547',
'id': 3},
{'hypervisor': 'xen', 'os': 'win',
'architecture': 'power',
'version': '7.0',
'url': 'xxx://xxxx/xxx/xxx3',
'url': 'http://example.com/path/to/resource3',
'md5hash': 'add6bb58e139be103324d04d82d8f548',
'id': 4},
]
@@ -109,13 +109,13 @@ class AgentsTest(test.NoDBTestCase):
'os': 'win',
'architecture': 'x86',
'version': '7.0',
'url': 'xxx://xxxx/xxx/xxx',
'url': 'http://example.com/path/to/resource',
'md5hash': 'add6bb58e139be103324d04d82d8f545'}}
response = {'agent': {'hypervisor': 'kvm',
'os': 'win',
'architecture': 'x86',
'version': '7.0',
'url': 'xxx://xxxx/xxx/xxx',
'url': 'http://example.com/path/to/resource',
'md5hash': 'add6bb58e139be103324d04d82d8f545',
'agent_id': 1}}
res_dict = self.controller.create(req, body=body)
@@ -130,7 +130,7 @@ class AgentsTest(test.NoDBTestCase):
'os': 'win',
'architecture': 'x86',
'version': '7.0',
'url': 'xxx://xxxx/xxx/xxx',
'url': 'http://example.com/path/to/resource',
'md5hash': 'add6bb58e139be103324d04d82d8f545'}}
self.assertRaises(exc.HTTPConflict, self.controller.create, req,
body=body)
@@ -141,7 +141,7 @@ class AgentsTest(test.NoDBTestCase):
'os': 'win',
'architecture': 'x86',
'version': '7.0',
'url': 'xxx://xxxx/xxx/xxx'}}
'url': 'http://example.com/path/to/resource'}}
self.assertRaises(exception.ValidationError, self.controller.create,
req, body=body)
@@ -160,7 +160,7 @@ class AgentsTest(test.NoDBTestCase):
body = {'agent': {'hypervisor': 'kvm',
'os': 'win',
'architecture': 'x86',
'url': 'xxx://xxxx/xxx/xxx',
'url': 'http://example.com/path/to/resource',
'md5hash': 'add6bb58e139be103324d04d82d8f545'}}
self.assertRaises(exception.ValidationError, self.controller.create,
req, body=body)
@@ -170,7 +170,7 @@ class AgentsTest(test.NoDBTestCase):
body = {'agent': {'hypervisor': 'kvm',
'os': 'win',
'version': '7.0',
'url': 'xxx://xxxx/xxx/xxx',
'url': 'http://example.com/path/to/resource',
'md5hash': 'add6bb58e139be103324d04d82d8f545'}}
self.assertRaises(exception.ValidationError, self.controller.create,
req, body=body)
@@ -180,7 +180,7 @@ class AgentsTest(test.NoDBTestCase):
body = {'agent': {'hypervisor': 'kvm',
'architecture': 'x86',
'version': '7.0',
'url': 'xxx://xxxx/xxx/xxx',
'url': 'http://example.com/path/to/resource',
'md5hash': 'add6bb58e139be103324d04d82d8f545'}}
self.assertRaises(exception.ValidationError, self.controller.create,
req, body=body)
@@ -190,7 +190,7 @@ class AgentsTest(test.NoDBTestCase):
body = {'agent': {'os': 'win',
'architecture': 'x86',
'version': '7.0',
'url': 'xxx://xxxx/xxx/xxx',
'url': 'http://example.com/path/to/resource',
'md5hash': 'add6bb58e139be103324d04d82d8f545'}}
self.assertRaises(exception.ValidationError, self.controller.create,
req, body=body)
@@ -213,7 +213,7 @@ class AgentsTest(test.NoDBTestCase):
'os': 'win',
'architecture': 'x86',
'version': '7.0',
'url': 'xxx://xxxx/xxx/xxx',
'url': 'http://example.com/path/to/resource',
'md5hash': 'add6bb58e139be103324d04d82d8f545'}}
body['agent'][key] = 'x' * 256
self.assertRaises(exception.ValidationError, self.controller.create,
@@ -247,25 +247,25 @@ class AgentsTest(test.NoDBTestCase):
agents_list = [{'hypervisor': 'kvm', 'os': 'win',
'architecture': 'x86',
'version': '7.0',
'url': 'xxx://xxxx/xxx/xxx',
'url': 'http://example.com/path/to/resource',
'md5hash': 'add6bb58e139be103324d04d82d8f545',
'agent_id': 1},
{'hypervisor': 'kvm', 'os': 'linux',
'architecture': 'x86',
'version': '16.0',
'url': 'xxx://xxxx/xxx/xxx1',
'url': 'http://example.com/path/to/resource1',
'md5hash': 'add6bb58e139be103324d04d82d8f546',
'agent_id': 2},
{'hypervisor': 'xen', 'os': 'linux',
'architecture': 'x86',
'version': '16.0',
'url': 'xxx://xxxx/xxx/xxx2',
'url': 'http://example.com/path/to/resource2',
'md5hash': 'add6bb58e139be103324d04d82d8f547',
'agent_id': 3},
{'hypervisor': 'xen', 'os': 'win',
'architecture': 'power',
'version': '7.0',
'url': 'xxx://xxxx/xxx/xxx3',
'url': 'http://example.com/path/to/resource3',
'md5hash': 'add6bb58e139be103324d04d82d8f548',
'agent_id': 4},
]
@@ -277,13 +277,13 @@ class AgentsTest(test.NoDBTestCase):
response = [{'hypervisor': 'kvm', 'os': 'win',
'architecture': 'x86',
'version': '7.0',
'url': 'xxx://xxxx/xxx/xxx',
'url': 'http://example.com/path/to/resource',
'md5hash': 'add6bb58e139be103324d04d82d8f545',
'agent_id': 1},
{'hypervisor': 'kvm', 'os': 'linux',
'architecture': 'x86',
'version': '16.0',
'url': 'xxx://xxxx/xxx/xxx1',
'url': 'http://example.com/path/to/resource1',
'md5hash': 'add6bb58e139be103324d04d82d8f546',
'agent_id': 2},
]
@@ -292,11 +292,11 @@ class AgentsTest(test.NoDBTestCase):
def test_agents_update(self):
req = FakeRequest()
body = {'agent': {'version': '7.0',
'url': 'xxx://xxxx/xxx/xxx',
'url': 'http://example.com/path/to/resource',
'md5hash': 'add6bb58e139be103324d04d82d8f545'}}
response = {'agent': {'agent_id': 1,
'version': '7.0',
'url': 'xxx://xxxx/xxx/xxx',
'url': 'http://example.com/path/to/resource',
'md5hash': 'add6bb58e139be103324d04d82d8f545'}}
res_dict = self.controller.update(req, 1, body=body)
self.assertEqual(res_dict, response)
@@ -304,7 +304,7 @@ class AgentsTest(test.NoDBTestCase):
def test_agents_update_without_md5hash(self):
req = FakeRequest()
body = {'agent': {'version': '7.0',
'url': 'xxx://xxxx/xxx/xxx'}}
'url': 'http://example.com/path/to/resource'}}
self.assertRaises(exception.ValidationError, self.controller.update,
req, 1, body=body)
@@ -335,7 +335,7 @@ class AgentsTest(test.NoDBTestCase):
def _test_agents_update_with_invalid_length(self, key):
req = FakeRequest()
body = {'agent': {'version': '7.0',
'url': 'xxx://xxxx/xxx/xxx',
'url': 'http://example.com/path/to/resource',
'md5hash': 'add6bb58e139be103324d04d82d8f545'}}
body['agent'][key] = 'x' * 256
self.assertRaises(exception.ValidationError, self.controller.update,

View File

@@ -1378,7 +1378,7 @@ class AgentsJsonTest(ApiSampleTestBaseV2):
def setUp(self):
super(AgentsJsonTest, self).setUp()
fake_agents_list = [{'url': 'xxxxxxxxxxxx',
fake_agents_list = [{'url': 'http://example.com/path/to/resource',
'hypervisor': 'hypervisor',
'architecture': 'x86',
'os': 'os',
@@ -1419,7 +1419,7 @@ class AgentsJsonTest(ApiSampleTestBaseV2):
def test_agent_create(self):
# Creates a new agent build.
project = {'url': 'xxxxxxxxxxxx',
project = {'url': 'http://example.com/path/to/resource',
'hypervisor': 'hypervisor',
'architecture': 'x86',
'os': 'os',
@@ -1435,7 +1435,7 @@ class AgentsJsonTest(ApiSampleTestBaseV2):
def test_agent_list(self):
# Return a list of all agent builds.
response = self._do_get('os-agents')
project = {'url': 'xxxxxxxxxxxx',
project = {'url': 'http://example.com/path/to/resource',
'hypervisor': 'hypervisor',
'architecture': 'x86',
'os': 'os',
@@ -1449,7 +1449,7 @@ class AgentsJsonTest(ApiSampleTestBaseV2):
# Update an existing agent build.
agent_id = 1
subs = {'version': '7.0',
'url': 'xxx://xxxx/xxx/xxx',
'url': 'http://example.com/path/to/resource',
'md5hash': 'add6bb58e139be103324d04d82d8f545'}
response = self._do_put('os-agents/%s' % agent_id,
'agent-update-put-req', subs)

View File

@@ -5,7 +5,7 @@
"hypervisor": "hypervisor",
"md5hash": "add6bb58e139be103324d04d82d8f545",
"os": "os",
"url": "xxxxxxxxxxxx",
"url": "http://example.com/path/to/resource",
"version": "8.0"
}
}
}

View File

@@ -2,7 +2,7 @@
"agent": {
"agent_id": 1,
"md5hash": "add6bb58e139be103324d04d82d8f545",
"url": "xxx://xxxx/xxx/xxx",
"url": "http://example.com/path/to/resource",
"version": "7.0"
}
}
}

View File

@@ -6,8 +6,8 @@
"hypervisor": "hypervisor",
"md5hash": "add6bb58e139be103324d04d82d8f545",
"os": "os",
"url": "xxxxxxxxxxxx",
"url": "http://example.com/path/to/resource",
"version": "8.0"
}
]
}
}

View File

@@ -24,7 +24,7 @@ class AgentsJsonTest(api_sample_base.ApiSampleTestBaseV3):
def setUp(self):
super(AgentsJsonTest, self).setUp()
fake_agents_list = [{'url': 'xxxxxxxxxxxx',
fake_agents_list = [{'url': 'http://example.com/path/to/resource',
'hypervisor': 'hypervisor',
'architecture': 'x86',
'os': 'os',
@@ -65,7 +65,7 @@ class AgentsJsonTest(api_sample_base.ApiSampleTestBaseV3):
def test_agent_create(self):
# Creates a new agent build.
project = {'url': 'xxxxxxxxxxxx',
project = {'url': 'http://example.com/path/to/resource',
'hypervisor': 'hypervisor',
'architecture': 'x86',
'os': 'os',
@@ -85,7 +85,7 @@ class AgentsJsonTest(api_sample_base.ApiSampleTestBaseV3):
# Update an existing agent build.
agent_id = 1
subs = {'version': '7.0',
'url': 'xxx://xxxx/xxx/xxx',
'url': 'http://example.com/path/to/resource',
'md5hash': 'add6bb58e139be103324d04d82d8f545'}
response = self._do_put('os-agents/%s' % agent_id,
'agent-update-put-req', subs)

View File

@@ -692,6 +692,64 @@ class UuidTestCase(APIValidationTestCase):
expected_detail=detail)
class UriTestCase(APIValidationTestCase):
def setUp(self):
super(UriTestCase, self).setUp()
schema = {
'type': 'object',
'properties': {
'foo': {
'type': 'string',
'format': 'uri',
},
},
}
@validation.schema(request_body_schema=schema)
def post(body):
return 'Validation succeeded.'
self.post = post
def test_validate_uri(self):
self.assertEqual('Validation succeeded.',
self.post(
body={'foo': 'http://localhost:8774/v2/servers'}
))
self.assertEqual('Validation succeeded.',
self.post(
body={'foo': 'http://[::1]:8774/v2/servers'}
))
def test_validate_uri_fails(self):
base_detail = ("Invalid input for field/attribute foo. Value: {0}. "
"'{0}' is not a 'uri'")
invalid_uri = 'http://localhost:8774/v2/servers##'
self.check_validation_error(self.post,
body={'foo': invalid_uri},
expected_detail=base_detail.format(
invalid_uri))
invalid_uri = 'http://[fdf8:01]:8774/v2/servers'
self.check_validation_error(self.post,
body={'foo': invalid_uri},
expected_detail=base_detail.format(
invalid_uri))
invalid_uri = '1'
self.check_validation_error(self.post,
body={'foo': invalid_uri},
expected_detail=base_detail.format(
invalid_uri))
invalid_uri = 'abc'
self.check_validation_error(self.post,
body={'foo': invalid_uri},
expected_detail=base_detail.format(
invalid_uri))
class Ipv4TestCase(APIValidationTestCase):
def setUp(self):

View File

@@ -37,3 +37,4 @@ pycadf>=0.5.1
oslo.messaging>=1.4.0.0a3
oslo.i18n>=0.1.0 # Apache-2.0
lockfile>=0.8
rfc3986>=0.2.0 # Apache-2.0