summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVictor Ryzhenkin <vryzhenkin@mirantis.com>2015-12-22 21:23:20 +0300
committerVictor Ryzhenkin <vryzhenkin@mirantis.com>2015-12-24 21:45:11 +0300
commit6910813552025e28031d80c7b8a09c7a0869d38c (patch)
treec83e21fcb4d5951f9c066d51ce28a62e3572642d
parent963f4943d69778dd8f1d5035e273652e3f0166fb (diff)
downloadtempest-lib-6910813552025e28031d80c7b8a09c7a0869d38c.tar.gz
Prevent StopIteration exception during parse response
- Parse response body only if there is one top-level element in JSON object because if there is nullable JSON in response body six will throw us an StopIteration exception from six.next Closes-Bug: #1529144 Change-Id: Iea2d0950b25cb8f576ca7e15383a205e04d7c9e3
-rw-r--r--tempest_lib/common/rest_client.py4
-rw-r--r--tempest_lib/tests/test_rest_client.py5
2 files changed, 8 insertions, 1 deletions
diff --git a/tempest_lib/common/rest_client.py b/tempest_lib/common/rest_client.py
index d833d5f..c5886e6 100644
--- a/tempest_lib/common/rest_client.py
+++ b/tempest_lib/common/rest_client.py
@@ -461,7 +461,9 @@ class RestClient(object):
# }
try:
# Ensure there are not more than one top-level keys
- if len(body.keys()) > 1:
+ # NOTE(freerunner): Ensure, that JSON is not nullable to
+ # to prevent StopIteration Exception
+ if len(body.keys()) != 1:
return body
# Just return the "wrapped" element
first_key, first_item = six.next(six.iteritems(body))
diff --git a/tempest_lib/tests/test_rest_client.py b/tempest_lib/tests/test_rest_client.py
index 0875092..452cef5 100644
--- a/tempest_lib/tests/test_rest_client.py
+++ b/tempest_lib/tests/test_rest_client.py
@@ -244,6 +244,7 @@ class TestRestClientParseRespJSON(BaseRestClientTestClass):
keys[0]: values[0],
keys[1]: values[1],
}}
+ null_dict = {}
def setUp(self):
self.fake_http = fake_http.fake_httplib2()
@@ -273,6 +274,10 @@ class TestRestClientParseRespJSON(BaseRestClientTestClass):
body = self.rest_client._parse_resp(json.dumps(data))
self.assertEqual(data, body)
+ def test_parse_nullable_dict(self):
+ body = self.rest_client._parse_resp(json.dumps(self.null_dict))
+ self.assertEqual(self.null_dict, body)
+
class TestRestClientErrorCheckerJSON(base.TestCase):
c_type = "application/json"