From 9f917b97669bb27a50537f4adeacd260a3111e0d Mon Sep 17 00:00:00 2001 From: quom Date: Fri, 16 Dec 2016 10:48:49 +0000 Subject: [PATCH 1/2] Check dict is not empty before acknowledging messages upon context exit. Closes #2878. --- pubsub/google/cloud/pubsub/subscription.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pubsub/google/cloud/pubsub/subscription.py b/pubsub/google/cloud/pubsub/subscription.py index c98277d660df..e76abcf94dd8 100644 --- a/pubsub/google/cloud/pubsub/subscription.py +++ b/pubsub/google/cloud/pubsub/subscription.py @@ -509,4 +509,5 @@ def __enter__(self): return self def __exit__(self, exc_type, exc_val, exc_tb): - self._subscription.acknowledge(list(self), self._client) + if self: + self._subscription.acknowledge(list(self), self._client) From 33cee118a0627f68747d5a2bfebdae82e8f51e64 Mon Sep 17 00:00:00 2001 From: quom Date: Fri, 16 Dec 2016 15:05:40 +0000 Subject: [PATCH 2/2] Add test to reproduce #2878 --- pubsub/unit_tests/test_subscription.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/pubsub/unit_tests/test_subscription.py b/pubsub/unit_tests/test_subscription.py index 6d4dc1068f2a..6078a3cc70c8 100644 --- a/pubsub/unit_tests/test_subscription.py +++ b/pubsub/unit_tests/test_subscription.py @@ -14,6 +14,8 @@ import unittest +import mock + class TestSubscription(unittest.TestCase): PROJECT = 'PROJECT' @@ -745,6 +747,16 @@ def test___exit___(self): [ACK_ID1, ACK_ID2]) self.assertIs(subscription._ack_client, CLIENT) + def test_empty_ack_no_acknowledge(self): + subscription = mock.Mock(_FauxSubscription) + subscription.pull = lambda *args: [] + + auto_ack = self._make_one(subscription) + with auto_ack: + pass + + subscription.acknowledge.assert_not_called() + class _FauxIAMPolicy(object):