diff options
| author | Joe Gordon <jogo@cloudscaling.com> | 2011-12-21 20:52:13 -0500 |
|---|---|---|
| committer | Joe Gordon <jogo@cloudscaling.com> | 2012-01-19 15:38:59 -0800 |
| commit | 64341eedf993c0738dcd42fb41fd193c184f3464 (patch) | |
| tree | 4b0c7b3d2df9f90e213aa0c253dc5918b769e870 /nova/tests | |
| parent | 7265a71d998d5a6a4fc2a7f060178e365c882ca5 (diff) | |
aws/ec2 api validation
Adds middleware to validate user-input to the aws/ec2 api.
This patch is a port to gerrit of this launchpad merge request:
https://code.launchpad.net/~u-matt-h/nova/aws-api-validation/+merge/71962
blueprint aws-api-validation
bug 813685
Code started by Matthew Hooker, fixes by Joe Gordon
Change-Id: I9346ecd5e5051cb0126c13f7c771173bc23959b9
Diffstat (limited to 'nova/tests')
| -rw-r--r-- | nova/tests/api/test_validator.py | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/nova/tests/api/test_validator.py b/nova/tests/api/test_validator.py new file mode 100644 index 000000000..0562ddc18 --- /dev/null +++ b/nova/tests/api/test_validator.py @@ -0,0 +1,114 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 Cloudscaling, Inc. +# Author: Matthew Hooker <matt@cloudscaling.com> +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import base64 + +from nova import test +from nova.api import validator + + +class ValidatorTestCase(test.TestCase): + + def test_validate(self): + fixture = { + 'foo': lambda val: val == True + } + + self.assertTrue( + validator.validate({'foo': True}, fixture)) + self.assertFalse( + validator.validate({'foo': False}, fixture)) + + def test_only_tests_intersect(self): + """Test that validator.validate only tests the intersect of keys + from args and validator. + """ + + fixture = { + 'foo': lambda val: True, + 'bar': lambda val: True + } + + self.assertTrue( + validator.validate({'foo': True}, fixture)) + self.assertTrue( + validator.validate({'foo': True, 'bar': True}, fixture)) + self.assertTrue( + validator.validate({'foo': True, 'bar': True, 'baz': True}, + fixture)) + + def test_validate_str(self): + self.assertTrue(validator.validate_str()('foo')) + self.assertFalse(validator.validate_str()(1)) + self.assertTrue(validator.validate_str(4)('foo')) + self.assertFalse(validator.validate_str(2)('foo')) + self.assertFalse(validator.validate_str()(None)) + self.assertTrue(validator.validate_str()(u'foo')) + + def test_validate_int(self): + self.assertTrue(validator.validate_int()(1)) + self.assertFalse(validator.validate_int()('foo')) + self.assertTrue(validator.validate_int(100)(1)) + self.assertFalse(validator.validate_int(4)(5)) + self.assertFalse(validator.validate_int()(None)) + + def test_validate_ec2_id(self): + self.assertFalse(validator.validate_ec2_id('foobar')) + self.assertFalse(validator.validate_ec2_id('')) + self.assertFalse(validator.validate_ec2_id(1234)) + self.assertTrue(validator.validate_ec2_id('i-284f3a41')) + + def test_validate_ipv4(self): + self.assertTrue(validator.validate_ipv4('4.2.2.4')) + self.assertFalse(validator.validate_ipv4('foobar')) + self.assertFalse( + validator.validate_ipv4('2001:5a8:4:68e0:e6ce:8fff:fe27:d116')) + self.assertFalse(validator.validate_ipv4(123)) + self.assertFalse(validator.validate_ipv4('')) + + def test_validate_url_path(self): + self.assertTrue(validator.validate_url_path('/path/to/file')) + self.assertFalse(validator.validate_url_path('path/to/file')) + self.assertFalse( + validator.validate_url_path('#this is not a path!@#$%^&*()') + ) + self.assertFalse(validator.validate_url_path(None)) + self.assertFalse(validator.validate_url_path(123)) + + def test_validate_image_path(self): + self.assertTrue(validator.validate_image_path('path/to/file')) + self.assertFalse(validator.validate_image_path('/path/to/file')) + self.assertFalse(validator.validate_image_path('path')) + + def test_validate_user_data(self): + fixture = base64.b64encode('foo') + self.assertTrue(validator.validate_user_data(fixture)) + self.assertFalse(validator.validate_user_data(False)) + self.assertFalse(validator.validate_user_data('hello, world!')) + + def test_default_validator(self): + expect_pass = { + 'attribute': 'foobar' + } + self.assertTrue(validator.validate(expect_pass, + validator.DEFAULT_VALIDATOR)) + expect_fail = { + 'attribute': 0 + } + self.assertFalse(validator.validate(expect_fail, + validator.DEFAULT_VALIDATOR)) |
