summaryrefslogtreecommitdiffstats
path: root/nova/tests
diff options
context:
space:
mode:
authorJoe Gordon <jogo@cloudscaling.com>2011-12-21 20:52:13 -0500
committerJoe Gordon <jogo@cloudscaling.com>2012-01-19 15:38:59 -0800
commit64341eedf993c0738dcd42fb41fd193c184f3464 (patch)
tree4b0c7b3d2df9f90e213aa0c253dc5918b769e870 /nova/tests
parent7265a71d998d5a6a4fc2a7f060178e365c882ca5 (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.py114
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))