Skip to content

Commit 87c7a4c

Browse files
committed
Merge pull request #1481 from tseaver/1480-pubsub-empty_payload-missing_data
Harden 'Message.from_api_repr' against missing 'data'
2 parents 75a395f + 3b9b0b6 commit 87c7a4c

File tree

2 files changed

+34
-26
lines changed

2 files changed

+34
-26
lines changed

gcloud/pubsub/message.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,6 @@ def from_api_repr(cls, api_repr):
7171
:type api_repr: dict or None
7272
:param api_repr: The API representation of the message
7373
"""
74-
data = base64.b64decode(api_repr['data'])
74+
data = base64.b64decode(api_repr.get('data', b''))
7575
return cls(data=data, message_id=api_repr['messageId'],
7676
attributes=api_repr.get('attributes'))

gcloud/pubsub/test_message.py

Lines changed: 33 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -42,31 +42,6 @@ def test_ctor_w_attributes(self):
4242
self.assertEqual(message.message_id, MESSAGE_ID)
4343
self.assertEqual(message.attributes, ATTRS)
4444

45-
def test_from_api_repr_no_attributes(self):
46-
from base64 import b64encode as b64
47-
DATA = b'DEADBEEF'
48-
B64_DATA = b64(DATA)
49-
MESSAGE_ID = '12345'
50-
api_repr = {'data': B64_DATA, 'messageId': MESSAGE_ID}
51-
message = self._getTargetClass().from_api_repr(api_repr)
52-
self.assertEqual(message.data, DATA)
53-
self.assertEqual(message.message_id, MESSAGE_ID)
54-
self.assertEqual(message.attributes, {})
55-
56-
def test_from_api_repr_w_attributes(self):
57-
from base64 import b64encode as b64
58-
DATA = b'DEADBEEF'
59-
B64_DATA = b64(DATA)
60-
MESSAGE_ID = '12345'
61-
ATTRS = {'a': 'b'}
62-
api_repr = {'data': B64_DATA,
63-
'messageId': MESSAGE_ID,
64-
'attributes': ATTRS}
65-
message = self._getTargetClass().from_api_repr(api_repr)
66-
self.assertEqual(message.data, DATA)
67-
self.assertEqual(message.message_id, MESSAGE_ID)
68-
self.assertEqual(message.attributes, ATTRS)
69-
7045
def test_timestamp_no_attributes(self):
7146
DATA = b'DEADBEEF'
7247
MESSAGE_ID = b'12345'
@@ -102,3 +77,36 @@ def test_timestamp_w_timestamp_in_attributes(self):
10277
message = self._makeOne(data=DATA, message_id=MESSAGE_ID,
10378
attributes=ATTRS)
10479
self.assertEqual(message.timestamp, timestamp)
80+
81+
def test_from_api_repr_missing_data(self):
82+
MESSAGE_ID = '12345'
83+
api_repr = {'messageId': MESSAGE_ID}
84+
message = self._getTargetClass().from_api_repr(api_repr)
85+
self.assertEqual(message.data, b'')
86+
self.assertEqual(message.message_id, MESSAGE_ID)
87+
self.assertEqual(message.attributes, {})
88+
89+
def test_from_api_repr_no_attributes(self):
90+
from base64 import b64encode as b64
91+
DATA = b'DEADBEEF'
92+
B64_DATA = b64(DATA)
93+
MESSAGE_ID = '12345'
94+
api_repr = {'data': B64_DATA, 'messageId': MESSAGE_ID}
95+
message = self._getTargetClass().from_api_repr(api_repr)
96+
self.assertEqual(message.data, DATA)
97+
self.assertEqual(message.message_id, MESSAGE_ID)
98+
self.assertEqual(message.attributes, {})
99+
100+
def test_from_api_repr_w_attributes(self):
101+
from base64 import b64encode as b64
102+
DATA = b'DEADBEEF'
103+
B64_DATA = b64(DATA)
104+
MESSAGE_ID = '12345'
105+
ATTRS = {'a': 'b'}
106+
api_repr = {'data': B64_DATA,
107+
'messageId': MESSAGE_ID,
108+
'attributes': ATTRS}
109+
message = self._getTargetClass().from_api_repr(api_repr)
110+
self.assertEqual(message.data, DATA)
111+
self.assertEqual(message.message_id, MESSAGE_ID)
112+
self.assertEqual(message.attributes, ATTRS)

0 commit comments

Comments
 (0)