@@ -1713,6 +1713,21 @@ def test_process_requests_no_errors():
1713
1713
assert not requests_to_retry
1714
1714
1715
1715
1716
+ def test_process_requests_no_errors_no_future ():
1717
+ # no errors, request should be completed, even when future is None.
1718
+ ack_reqs_dict = {
1719
+ "ackid1" : requests .AckRequest (
1720
+ ack_id = "ackid1" , byte_size = 0 , time_to_ack = 20 , ordering_key = "" , future = None
1721
+ )
1722
+ }
1723
+ errors_dict = {}
1724
+ requests_completed , requests_to_retry = streaming_pull_manager ._process_requests (
1725
+ None , ack_reqs_dict , errors_dict
1726
+ )
1727
+ assert requests_completed [0 ].ack_id == "ackid1"
1728
+ assert not requests_to_retry
1729
+
1730
+
1716
1731
def test_process_requests_permanent_error_raises_exception ():
1717
1732
# a permanent error raises an exception
1718
1733
future = futures .Future ()
@@ -1735,6 +1750,40 @@ def test_process_requests_permanent_error_raises_exception():
1735
1750
assert not requests_to_retry
1736
1751
1737
1752
1753
+ def test_process_requests_permanent_error_other_raises_exception ():
1754
+ # a permanent error of other raises an exception
1755
+ future = futures .Future ()
1756
+ ack_reqs_dict = {
1757
+ "ackid1" : requests .AckRequest (
1758
+ ack_id = "ackid1" , byte_size = 0 , time_to_ack = 20 , ordering_key = "" , future = future
1759
+ )
1760
+ }
1761
+ errors_dict = {"ackid1" : "PERMANENT_FAILURE_OTHER" }
1762
+ requests_completed , requests_to_retry = streaming_pull_manager ._process_requests (
1763
+ None , ack_reqs_dict , errors_dict
1764
+ )
1765
+ assert requests_completed [0 ].ack_id == "ackid1"
1766
+ with pytest .raises (subscriber_exceptions .AcknowledgeError ) as exc_info :
1767
+ future .result ()
1768
+ assert exc_info .value .error_code == subscriber_exceptions .AcknowledgeStatus .OTHER
1769
+ assert not requests_to_retry
1770
+
1771
+
1772
+ def test_process_requests_permanent_error_other_raises_exception_no_future ():
1773
+ # with a permanent error, request is completed even when future is None.
1774
+ ack_reqs_dict = {
1775
+ "ackid1" : requests .AckRequest (
1776
+ ack_id = "ackid1" , byte_size = 0 , time_to_ack = 20 , ordering_key = "" , future = None
1777
+ )
1778
+ }
1779
+ errors_dict = {"ackid1" : "PERMANENT_FAILURE_OTHER" }
1780
+ requests_completed , requests_to_retry = streaming_pull_manager ._process_requests (
1781
+ None , ack_reqs_dict , errors_dict
1782
+ )
1783
+ assert requests_completed [0 ].ack_id == "ackid1"
1784
+ assert not requests_to_retry
1785
+
1786
+
1738
1787
def test_process_requests_transient_error_returns_request_for_retrying ():
1739
1788
# a transient error returns the request in `requests_to_retry`
1740
1789
future = futures .Future ()
@@ -1872,6 +1921,23 @@ def test_process_requests_other_error_status_raises_exception():
1872
1921
assert not requests_to_retry
1873
1922
1874
1923
1924
+ def test_process_requests_other_error_status_raises_exception_no_future ():
1925
+ # with an unrecognized error status, requests are completed, even when
1926
+ # future is None.
1927
+ ack_reqs_dict = {
1928
+ "ackid1" : requests .AckRequest (
1929
+ ack_id = "ackid1" , byte_size = 0 , time_to_ack = 20 , ordering_key = "" , future = None
1930
+ )
1931
+ }
1932
+ st = status_pb2 .Status ()
1933
+ st .code = code_pb2 .Code .OUT_OF_RANGE
1934
+ requests_completed , requests_to_retry = streaming_pull_manager ._process_requests (
1935
+ st , ack_reqs_dict , None
1936
+ )
1937
+ assert requests_completed [0 ].ack_id == "ackid1"
1938
+ assert not requests_to_retry
1939
+
1940
+
1875
1941
def test_process_requests_mixed_success_and_failure_acks ():
1876
1942
# mixed success and failure (acks)
1877
1943
future1 = futures .Future ()
0 commit comments