serialization: catch yaml and json errors
It is necessary to catch yaml and json errors that come from invalid json / yaml streams like '{}}'. Having an enumeration after a key value was set is a yaml parser error. Change-Id: Ia8b298c3f1b36c6dee29326955d1e76ade3104b1
This commit is contained in:
parent
58dfb24a6a
commit
cbbcb98680
|
@ -15,39 +15,32 @@
|
||||||
import unittest
|
import unittest
|
||||||
|
|
||||||
import ddt
|
import ddt
|
||||||
import yaml
|
|
||||||
|
|
||||||
try:
|
|
||||||
import unittest.mock as mock
|
|
||||||
except ImportError:
|
|
||||||
import mock
|
|
||||||
|
|
||||||
from cloudbaseinit.utils import serialization
|
from cloudbaseinit.utils import serialization
|
||||||
|
|
||||||
|
YAML_PARSER_ERROR_STRING = b"""
|
||||||
|
a: b
|
||||||
|
- c: d
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
@ddt.ddt
|
@ddt.ddt
|
||||||
class SerializationUtilsTests(unittest.TestCase):
|
class SerializationUtilsTests(unittest.TestCase):
|
||||||
|
|
||||||
@ddt.data((b'', (None, False)),
|
@ddt.data((b'', (None, True)),
|
||||||
(b'{}', ({}, False)),
|
(b'{}', ({}, True)),
|
||||||
|
(YAML_PARSER_ERROR_STRING, (None, False)),
|
||||||
|
(b'{}}', (None, False)),
|
||||||
(b'---', (None, True)),
|
(b'---', (None, True)),
|
||||||
(b'test: test', ({"test": "test"}, True)))
|
(b'test: test', ({"test": "test"}, True)))
|
||||||
@ddt.unpack
|
@ddt.unpack
|
||||||
@mock.patch("json.loads")
|
|
||||||
@mock.patch("yaml.load")
|
|
||||||
def test_parse_data(self, stream, expected_parsed_output,
|
def test_parse_data(self, stream, expected_parsed_output,
|
||||||
mock_yaml_load, mock_json_loads):
|
):
|
||||||
if not expected_parsed_output[1]:
|
print(expected_parsed_output)
|
||||||
mock_json_loads.return_value = expected_parsed_output[0]
|
|
||||||
else:
|
|
||||||
mock_json_loads.side_effect = TypeError("Failed to parse json")
|
|
||||||
mock_yaml_load.return_value = expected_parsed_output[0]
|
|
||||||
|
|
||||||
parsed_output = serialization.parse_json_yaml(stream)
|
|
||||||
|
|
||||||
mock_json_loads.assert_called_once_with(stream)
|
|
||||||
if expected_parsed_output[1]:
|
if expected_parsed_output[1]:
|
||||||
loader = getattr(yaml, 'CLoader', yaml.Loader)
|
parsed_output = serialization.parse_json_yaml(stream)
|
||||||
mock_yaml_load.assert_called_once_with(stream, Loader=loader)
|
self.assertEqual(parsed_output, expected_parsed_output[0])
|
||||||
|
else:
|
||||||
self.assertEqual(parsed_output, expected_parsed_output[0])
|
with self.assertRaises(serialization.YamlParserConfigError):
|
||||||
|
serialization.parse_json_yaml(stream)
|
||||||
|
|
|
@ -26,9 +26,11 @@ def parse_json_yaml(raw_data):
|
||||||
|
|
||||||
try:
|
try:
|
||||||
return json.loads(raw_data)
|
return json.loads(raw_data)
|
||||||
except (TypeError, ValueError, AttributeError):
|
except (TypeError, ValueError, AttributeError,
|
||||||
|
json.decoder.JSONDecodeError):
|
||||||
loader = getattr(yaml, 'CLoader', yaml.Loader)
|
loader = getattr(yaml, 'CLoader', yaml.Loader)
|
||||||
try:
|
try:
|
||||||
return yaml.load(raw_data, Loader=loader)
|
return yaml.load(raw_data, Loader=loader)
|
||||||
except (TypeError, ValueError, AttributeError):
|
except (TypeError, ValueError, AttributeError,
|
||||||
|
yaml.parser.ParserError, yaml.scanner.ScannerError):
|
||||||
raise YamlParserConfigError("Invalid yaml data provided.")
|
raise YamlParserConfigError("Invalid yaml data provided.")
|
||||||
|
|
Loading…
Reference in New Issue