This brings over the validation and convert_to methods from Neutron. Additional tests were added to improve coverage, and some supporting methods were added for these. Renamed validators to remove underscore, so that they can be imported into neutron/api/v2/attributes.py. Added devref docs to help developers in creating and using validators and converters. Change-Id: I81394dff69b816146e521bcd3e9641761178d6fd Implements: blueprint neutron-lib
170 lines
6.9 KiB
Python
170 lines
6.9 KiB
Python
# Copyright 2012 OpenStack Foundation
|
|
# 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 testtools
|
|
|
|
from neutron_lib.api import converters
|
|
from neutron_lib import exceptions as n_exc
|
|
from neutron_lib.tests import base
|
|
from neutron_lib.tests import tools
|
|
|
|
|
|
class TestConvertToBoolean(base.TestCase):
|
|
|
|
def test_convert_to_boolean_bool(self):
|
|
self.assertIs(converters.convert_to_boolean(True), True)
|
|
self.assertIs(converters.convert_to_boolean(False), False)
|
|
|
|
def test_convert_to_boolean_int(self):
|
|
self.assertIs(converters.convert_to_boolean(0), False)
|
|
self.assertIs(converters.convert_to_boolean(1), True)
|
|
self.assertRaises(n_exc.InvalidInput,
|
|
converters.convert_to_boolean,
|
|
7)
|
|
|
|
def test_convert_to_boolean_str(self):
|
|
self.assertIs(converters.convert_to_boolean('True'), True)
|
|
self.assertIs(converters.convert_to_boolean('true'), True)
|
|
self.assertIs(converters.convert_to_boolean('False'), False)
|
|
self.assertIs(converters.convert_to_boolean('false'), False)
|
|
self.assertIs(converters.convert_to_boolean('0'), False)
|
|
self.assertIs(converters.convert_to_boolean('1'), True)
|
|
self.assertRaises(n_exc.InvalidInput,
|
|
converters.convert_to_boolean,
|
|
'7')
|
|
|
|
def test_convert_to_boolean_if_not_none(self):
|
|
self.assertIsNone(converters.convert_to_boolean_if_not_none(None))
|
|
self.assertIs(converters.convert_to_boolean_if_not_none(1), True)
|
|
|
|
|
|
class TestConvertToInt(base.TestCase):
|
|
|
|
def test_convert_to_int_int(self):
|
|
self.assertEqual(-1, converters.convert_to_int(-1))
|
|
self.assertEqual(0, converters.convert_to_int(0))
|
|
self.assertEqual(1, converters.convert_to_int(1))
|
|
|
|
def test_convert_to_int_if_not_none(self):
|
|
self.assertEqual(-1, converters.convert_to_int_if_not_none(-1))
|
|
self.assertEqual(0, converters.convert_to_int_if_not_none(0))
|
|
self.assertEqual(1, converters.convert_to_int_if_not_none(1))
|
|
self.assertIsNone(converters.convert_to_int_if_not_none(None))
|
|
|
|
def test_convert_to_int_str(self):
|
|
self.assertEqual(4, converters.convert_to_int('4'))
|
|
self.assertEqual(6, converters.convert_to_int('6'))
|
|
self.assertRaises(n_exc.InvalidInput,
|
|
converters.convert_to_int,
|
|
'garbage')
|
|
|
|
def test_convert_to_int_none(self):
|
|
self.assertRaises(n_exc.InvalidInput,
|
|
converters.convert_to_int,
|
|
None)
|
|
|
|
def test_convert_none_to_empty_list_none(self):
|
|
self.assertEqual([], converters.convert_none_to_empty_list(None))
|
|
|
|
def test_convert_none_to_empty_dict(self):
|
|
self.assertEqual({}, converters.convert_none_to_empty_dict(None))
|
|
|
|
def test_convert_none_to_empty_list_value(self):
|
|
values = ['1', 3, [], [1], {}, {'a': 3}]
|
|
for value in values:
|
|
self.assertEqual(
|
|
value, converters.convert_none_to_empty_list(value))
|
|
|
|
|
|
class TestConvertToFloat(base.TestCase):
|
|
# NOTE: the routine being tested here is a plugin-specific extension
|
|
# module. As the plugin split proceed towards its second phase this
|
|
# test should either be remove, or the validation routine moved into
|
|
# neutron.api.v2.attributes
|
|
|
|
def test_convert_to_float_positve_value(self):
|
|
self.assertEqual(
|
|
1.111, converters.convert_to_positive_float_or_none(1.111))
|
|
self.assertEqual(1, converters.convert_to_positive_float_or_none(1))
|
|
self.assertEqual(0, converters.convert_to_positive_float_or_none(0))
|
|
|
|
def test_convert_to_float_negative_value(self):
|
|
self.assertRaises(n_exc.InvalidInput,
|
|
converters.convert_to_positive_float_or_none,
|
|
-1.11)
|
|
|
|
def test_convert_to_float_string(self):
|
|
self.assertEqual(4, converters.convert_to_positive_float_or_none('4'))
|
|
self.assertEqual(
|
|
4.44, converters.convert_to_positive_float_or_none('4.44'))
|
|
self.assertRaises(n_exc.InvalidInput,
|
|
converters.convert_to_positive_float_or_none,
|
|
'garbage')
|
|
|
|
def test_convert_to_float_none_value(self):
|
|
self.assertIsNone(converters.convert_to_positive_float_or_none(None))
|
|
|
|
|
|
class TestConvertKvp(base.TestCase):
|
|
|
|
def test_convert_kvp_list_to_dict_succeeds_for_missing_values(self):
|
|
result = converters.convert_kvp_list_to_dict(['True'])
|
|
self.assertEqual({}, result)
|
|
|
|
def test_convert_kvp_list_to_dict_succeeds_for_multiple_values(self):
|
|
result = converters.convert_kvp_list_to_dict(
|
|
['a=b', 'a=c', 'a=c', 'b=a'])
|
|
expected = {'a': tools.UnorderedList(['c', 'b']), 'b': ['a']}
|
|
self.assertEqual(expected, result)
|
|
|
|
def test_convert_kvp_list_to_dict_succeeds_for_values(self):
|
|
result = converters.convert_kvp_list_to_dict(['a=b', 'c=d'])
|
|
self.assertEqual({'a': ['b'], 'c': ['d']}, result)
|
|
|
|
def test_convert_kvp_str_to_list_fails_for_missing_key(self):
|
|
with testtools.ExpectedException(n_exc.InvalidInput):
|
|
converters.convert_kvp_str_to_list('=a')
|
|
|
|
def test_convert_kvp_str_to_list_fails_for_missing_equals(self):
|
|
with testtools.ExpectedException(n_exc.InvalidInput):
|
|
converters.convert_kvp_str_to_list('a')
|
|
|
|
def test_convert_kvp_str_to_list_succeeds_for_one_equals(self):
|
|
result = converters.convert_kvp_str_to_list('a=')
|
|
self.assertEqual(['a', ''], result)
|
|
|
|
def test_convert_kvp_str_to_list_succeeds_for_two_equals(self):
|
|
result = converters.convert_kvp_str_to_list('a=a=a')
|
|
self.assertEqual(['a', 'a=a'], result)
|
|
|
|
|
|
class TestConvertToList(base.TestCase):
|
|
|
|
def test_convert_to_empty_list(self):
|
|
for item in (None, [], (), {}):
|
|
self.assertEqual([], converters.convert_to_list(item))
|
|
|
|
def test_convert_to_list_string(self):
|
|
for item in ('', 'foo'):
|
|
self.assertEqual([item], converters.convert_to_list(item))
|
|
|
|
def test_convert_to_list_iterable(self):
|
|
for item in ([None], [1, 2, 3], (1, 2, 3), set([1, 2, 3]), ['foo']):
|
|
self.assertEqual(list(item), converters.convert_to_list(item))
|
|
|
|
def test_convert_to_list_non_iterable(self):
|
|
for item in (True, False, 1, 1.2, object()):
|
|
self.assertEqual([item], converters.convert_to_list(item))
|