From 4794cf240cf11cae4ac924a2ae0b381d0832b9ea Mon Sep 17 00:00:00 2001 From: huangtianhua Date: Mon, 17 Oct 2016 18:45:19 +0800 Subject: [PATCH] Raise TypeError when a bool property has int value Change-Id: I0658964f1edb6e28c879b228f8363245edd3170f Closes-Bug: #1634096 --- heat/engine/properties.py | 15 +++++++++++---- heat/tests/test_properties.py | 6 +++++- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/heat/engine/properties.py b/heat/engine/properties.py index 92d4ac4da..87a2e73ad 100644 --- a/heat/engine/properties.py +++ b/heat/engine/properties.py @@ -313,15 +313,22 @@ class Property(object): validate)] def _get_bool(self, value): + """Get value for boolean property. + + Explicitly checking for bool, or string with lower value + "true" or "false", to avoid integer values. + """ if value is None: value = self.has_default() and self.default() or False if isinstance(value, bool): return value - normalised = value.lower() - if normalised not in ['true', 'false']: - raise ValueError(_('"%s" is not a valid boolean') % normalised) + if isinstance(value, six.string_types): + normalised = value.lower() + if normalised not in ['true', 'false']: + raise ValueError(_('"%s" is not a valid boolean') % normalised) + return normalised == 'true' - return normalised == 'true' + raise TypeError(_('"%s" is not a valid boolean') % value) def get_value(self, value, validate=False, template=None): """Get value from raw value and sanitize according to data type.""" diff --git a/heat/tests/test_properties.py b/heat/tests/test_properties.py index 09c8c39fa..ad33b1e82 100644 --- a/heat/tests/test_properties.py +++ b/heat/tests/test_properties.py @@ -887,10 +887,14 @@ class PropertyTest(common.HeatTestCase): self.assertIs(False, p.get_value('false')) self.assertIs(False, p.get_value(False)) - def test_boolean_invalid(self): + def test_boolean_invalid_string(self): p = properties.Property({'Type': 'Boolean'}) self.assertRaises(ValueError, p.get_value, 'fish') + def test_boolean_invalid_int(self): + p = properties.Property({'Type': 'Boolean'}) + self.assertRaises(TypeError, p.get_value, 5) + def test_list_string(self): p = properties.Property({'Type': 'List'}) self.assertRaises(TypeError, p.get_value, 'foo')