@@ -1846,7 +1846,7 @@ def test__on_response_disable_exactly_once():
1846
1846
assert manager ._stream_ack_deadline == 60
1847
1847
1848
1848
1849
- def test__on_response_exactly_once_immediate_modacks_fail ():
1849
+ def test__on_response_exactly_once_immediate_modacks_fail (caplog ):
1850
1850
manager , _ , dispatcher , leaser , _ , scheduler = make_running_manager ()
1851
1851
manager ._callback = mock .sentinel .callback
1852
1852
@@ -1890,7 +1890,8 @@ def complete_futures_with_error(*args, **kwargs):
1890
1890
1891
1891
fake_leaser_add (leaser , init_msg_count = 0 , assumed_msg_size = 10 )
1892
1892
1893
- manager ._on_response (response )
1893
+ with caplog .at_level (logging .WARNING ):
1894
+ manager ._on_response (response )
1894
1895
1895
1896
# The second messages should be scheduled, and not the first.
1896
1897
@@ -1902,13 +1903,93 @@ def complete_futures_with_error(*args, **kwargs):
1902
1903
assert call_args [1 ].message_id == "2"
1903
1904
1904
1905
assert manager ._messages_on_hold .size == 0
1906
+
1907
+ expected_warnings = [
1908
+ record .message .lower ()
1909
+ for record in caplog .records
1910
+ if "AcknowledgeError when lease-modacking a message." in record .message
1911
+ ]
1912
+ assert len (expected_warnings ) == 1
1913
+
1905
1914
# No messages available
1906
1915
assert manager ._messages_on_hold .get () is None
1907
1916
1908
1917
# do not add message
1909
1918
assert manager .load == 0.001
1910
1919
1911
1920
1921
+ def test__on_response_exactly_once_immediate_modacks_fail_non_invalid (caplog ):
1922
+ manager , _ , dispatcher , leaser , _ , scheduler = make_running_manager ()
1923
+ manager ._callback = mock .sentinel .callback
1924
+
1925
+ def complete_futures_with_error (* args , ** kwargs ):
1926
+ modack_requests = args [0 ]
1927
+ for req in modack_requests :
1928
+ if req .ack_id == "fack" :
1929
+ req .future .set_exception (
1930
+ subscriber_exceptions .AcknowledgeError (
1931
+ subscriber_exceptions .AcknowledgeStatus .OTHER , None
1932
+ )
1933
+ )
1934
+ else :
1935
+ req .future .set_exception (
1936
+ subscriber_exceptions .AcknowledgeError (
1937
+ subscriber_exceptions .AcknowledgeStatus .SUCCESS , None
1938
+ )
1939
+ )
1940
+
1941
+ dispatcher .modify_ack_deadline .side_effect = complete_futures_with_error
1942
+
1943
+ # Set up the messages.
1944
+ response = gapic_types .StreamingPullResponse (
1945
+ received_messages = [
1946
+ gapic_types .ReceivedMessage (
1947
+ ack_id = "fack" ,
1948
+ message = gapic_types .PubsubMessage (data = b"foo" , message_id = "1" ),
1949
+ ),
1950
+ gapic_types .ReceivedMessage (
1951
+ ack_id = "good" ,
1952
+ message = gapic_types .PubsubMessage (data = b"foo" , message_id = "2" ),
1953
+ ),
1954
+ ],
1955
+ subscription_properties = gapic_types .StreamingPullResponse .SubscriptionProperties (
1956
+ exactly_once_delivery_enabled = True
1957
+ ),
1958
+ )
1959
+
1960
+ # Actually run the method and prove that modack and schedule are called in
1961
+ # the expected way.
1962
+
1963
+ fake_leaser_add (leaser , init_msg_count = 0 , assumed_msg_size = 10 )
1964
+
1965
+ with caplog .at_level (logging .WARNING ):
1966
+ manager ._on_response (response )
1967
+
1968
+ # The second messages should be scheduled, and not the first.
1969
+
1970
+ schedule_calls = scheduler .schedule .mock_calls
1971
+ assert len (schedule_calls ) == 2
1972
+ call_args = schedule_calls [0 ][1 ]
1973
+ assert call_args [0 ] == mock .sentinel .callback
1974
+ assert isinstance (call_args [1 ], message .Message )
1975
+ assert call_args [1 ].message_id == "1"
1976
+
1977
+ assert manager ._messages_on_hold .size == 0
1978
+
1979
+ expected_warnings = [
1980
+ record .message .lower ()
1981
+ for record in caplog .records
1982
+ if "AcknowledgeError when lease-modacking a message." in record .message
1983
+ ]
1984
+ assert len (expected_warnings ) == 2
1985
+
1986
+ # No messages available
1987
+ assert manager ._messages_on_hold .get () is None
1988
+
1989
+ # do not add message
1990
+ assert manager .load == 0.002
1991
+
1992
+
1912
1993
def test__should_recover_true ():
1913
1994
manager = make_manager ()
1914
1995
0 commit comments