Skip to content

Commit 4d94911

Browse files
committed
Merge pull request googleapis#1440 from tseaver/1439-pubsub-harden_against_missing_keys
Harden pubsub client against keys omitted in back-end responses
2 parents d56ea3d + e6616ca commit 4d94911

3 files changed

Lines changed: 47 additions & 2 deletions

File tree

gcloud/pubsub/client.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ def list_topics(self, page_size=None, page_token=None):
7777
resp = self.connection.api_request(method='GET', path=path,
7878
query_params=params)
7979
topics = [Topic.from_api_repr(resource, self)
80-
for resource in resp['topics']]
80+
for resource in resp.get('topics', ())]
8181
return topics, resp.get('nextPageToken')
8282

8383
def list_subscriptions(self, page_size=None, page_token=None,
@@ -128,7 +128,7 @@ def list_subscriptions(self, page_size=None, page_token=None,
128128
topics = {}
129129
subscriptions = [Subscription.from_api_repr(resource, self,
130130
topics=topics)
131-
for resource in resp['subscriptions']]
131+
for resource in resp.get('subscriptions', ())]
132132
return subscriptions, resp.get('nextPageToken')
133133

134134
def topic(self, name, timestamp_messages=False):

gcloud/pubsub/test_client.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,27 @@ def test_list_topics_with_paging(self):
8282
self.assertEqual(req['query_params'],
8383
{'pageSize': SIZE, 'pageToken': TOKEN1})
8484

85+
def test_list_topics_missing_key(self):
86+
PROJECT = 'PROJECT'
87+
CREDS = _Credentials()
88+
89+
CLIENT_OBJ = self._makeOne(project=PROJECT, credentials=CREDS)
90+
91+
RETURNED = {}
92+
# Replace the connection on the client with one of our own.
93+
CLIENT_OBJ.connection = _Connection(RETURNED)
94+
95+
# Execute request.
96+
topics, next_page_token = CLIENT_OBJ.list_topics()
97+
# Test values are correct.
98+
self.assertEqual(len(topics), 0)
99+
self.assertEqual(next_page_token, None)
100+
self.assertEqual(len(CLIENT_OBJ.connection._requested), 1)
101+
req = CLIENT_OBJ.connection._requested[0]
102+
self.assertEqual(req['method'], 'GET')
103+
self.assertEqual(req['path'], '/projects/%s/topics' % PROJECT)
104+
self.assertEqual(req['query_params'], {})
105+
85106
def test_list_subscriptions_no_paging(self):
86107
from gcloud.pubsub.subscription import Subscription
87108
PROJECT = 'PROJECT'
@@ -154,6 +175,27 @@ def test_list_subscriptions_with_paging(self):
154175
self.assertEqual(req['query_params'],
155176
{'pageSize': SIZE, 'pageToken': TOKEN1})
156177

178+
def test_list_subscriptions_w_missing_key(self):
179+
PROJECT = 'PROJECT'
180+
CREDS = _Credentials()
181+
182+
CLIENT_OBJ = self._makeOne(project=PROJECT, credentials=CREDS)
183+
184+
RETURNED = {}
185+
# Replace the connection on the client with one of our own.
186+
CLIENT_OBJ.connection = _Connection(RETURNED)
187+
188+
# Execute request.
189+
subscriptions, next_page_token = CLIENT_OBJ.list_subscriptions()
190+
# Test values are correct.
191+
self.assertEqual(len(subscriptions), 0)
192+
self.assertEqual(next_page_token, None)
193+
self.assertEqual(len(CLIENT_OBJ.connection._requested), 1)
194+
req = CLIENT_OBJ.connection._requested[0]
195+
self.assertEqual(req['method'], 'GET')
196+
self.assertEqual(req['path'], '/projects/%s/subscriptions' % PROJECT)
197+
self.assertEqual(req['query_params'], {})
198+
157199
def test_list_subscriptions_with_topic_name(self):
158200
from gcloud.pubsub.subscription import Subscription
159201
PROJECT = 'PROJECT'

system_tests/pubsub.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,9 @@ def test_list_subscriptions(self):
118118
self.assertFalse(topic.exists())
119119
topic.create()
120120
self.to_delete.append(topic)
121+
empty, _ = Config.CLIENT.list_subscriptions(
122+
topic_name=DEFAULT_TOPIC_NAME)
123+
self.assertEqual(len(empty), 0)
121124
subscriptions_to_create = [
122125
'new%d' % (1000 * time.time(),),
123126
'newer%d' % (1000 * time.time(),),

0 commit comments

Comments
 (0)