From 6910813552025e28031d80c7b8a09c7a0869d38c Mon Sep 17 00:00:00 2001 From: Victor Ryzhenkin Date: Tue, 22 Dec 2015 21:23:20 +0300 Subject: [PATCH] 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 --- tempest_lib/common/rest_client.py | 4 +++- tempest_lib/tests/test_rest_client.py | 5 +++++ 2 files changed, 8 insertions(+), 1 deletion(-) 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"