This is an automated email from the ASF dual-hosted git repository.

astitcher pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-proton.git


The following commit(s) were added to refs/heads/main by this push:
     new 581a433fe PROTON-2883/PROTON-2884: Modified dispositions should 
default to failed = true
581a433fe is described below

commit 581a433fe3edffef0a724cec424bdffbf7072738
Author: Andrew Stitcher <astitc...@apache.org>
AuthorDate: Tue Apr 8 22:06:04 2025 -0400

    PROTON-2883/PROTON-2884: Modified dispositions should default to failed = 
true
---
 cpp/src/delivery.cpp                |  2 +-
 python/proton/_delivery.py          |  2 +-
 python/proton/_handlers.py          |  7 ++++---
 python/tests/proton_tests/engine.py | 22 ++++++++++++++++++++++
 4 files changed, 28 insertions(+), 5 deletions(-)

diff --git a/cpp/src/delivery.cpp b/cpp/src/delivery.cpp
index 8dc050e25..9f03eaf73 100644
--- a/cpp/src/delivery.cpp
+++ b/cpp/src/delivery.cpp
@@ -49,6 +49,6 @@ delivery::~delivery() = default;
 void delivery::accept() { settle_delivery(pn_object(), ACCEPTED); }
 void delivery::reject() { settle_delivery(pn_object(), REJECTED); }
 void delivery::release() { settle_delivery(pn_object(), RELEASED); }
-void delivery::modify() { settle_delivery(pn_object(), MODIFIED); }
+void delivery::modify() { 
pn_disposition_set_failed(pn_delivery_local(pn_object()), true); 
settle_delivery(pn_object(), MODIFIED); }
 
 }
diff --git a/python/proton/_delivery.py b/python/proton/_delivery.py
index 7fbf425e5..90bf3689f 100644
--- a/python/proton/_delivery.py
+++ b/python/proton/_delivery.py
@@ -425,7 +425,7 @@ class RejectedDisposition(LocalDisposition):
 
 class ModifiedDisposition(LocalDisposition):
 
-    def __init__(self, failed: bool = None, undeliverable: bool = None,
+    def __init__(self, failed: bool = True, undeliverable: bool = None,
                  annotations: Optional[dict['symbol', 'PythonAMQPData']] = 
None):
         self._failed = failed
         self._undeliverable = undeliverable
diff --git a/python/proton/_handlers.py b/python/proton/_handlers.py
index 08096c775..819f8431c 100644
--- a/python/proton/_handlers.py
+++ b/python/proton/_handlers.py
@@ -24,7 +24,7 @@ import time
 import weakref
 
 from ._condition import Condition
-from ._delivery import Delivery
+from ._delivery import Delivery, ModifiedDisposition
 from ._endpoints import Endpoint
 from ._events import Event, _dispatch
 from ._exceptions import ProtonException
@@ -187,7 +187,7 @@ class Acking(object):
         """
         self.settle(delivery, Delivery.REJECTED)
 
-    def release(self, delivery: Delivery, delivered: bool = True) -> None:
+    def release(self, delivery: Delivery, delivered: bool = True, failed: bool 
= True, undeliverable: bool = False) -> None:
         """
         Releases a received message, making it available at the source
         for any (other) interested receiver. The ``delivered``
@@ -206,7 +206,8 @@ class Acking(object):
             delivery flag :const:`proton.Delivery.RELEASED`
         """
         if delivered:
-            self.settle(delivery, Delivery.MODIFIED)
+            delivery.local = ModifiedDisposition(failed=failed, 
undeliverable=undeliverable)
+            self.settle(delivery)
         else:
             self.settle(delivery, Delivery.RELEASED)
 
diff --git a/python/tests/proton_tests/engine.py 
b/python/tests/proton_tests/engine.py
index 5289db059..8b99539d3 100644
--- a/python/tests/proton_tests/engine.py
+++ b/python/tests/proton_tests/engine.py
@@ -2380,6 +2380,25 @@ class NewModifiedTester(DispositionTester):
         assert dlv.remote.annotations == self._annotations, 
(dlv.remote.annotations, self._annotations)
 
 
+class NewDefaultModifiedTester(DispositionTester):
+    def __init__(self):
+        self._failed = True
+        self._undeliverable = False
+        self._annotations = None
+        super().__init__(Disposition.MODIFIED)
+
+    def apply(self, dlv: Delivery):
+        dlv.local = ModifiedDisposition()
+        dlv.update()
+
+    def check(self, dlv: Delivery):
+        assert dlv.remote_state == self._type
+        assert dlv.remote.type == self._type
+        assert dlv.remote.failed == self._failed, (dlv.remote.failed, 
self._failed)
+        assert dlv.remote.undeliverable == self._undeliverable, 
(dlv.remote.undeliverable, self._undeliverable)
+        assert dlv.remote.annotations == self._annotations, 
(dlv.remote.annotations, self._annotations)
+
+
 class CustomTester(DispositionTester):
     def __init__(self, type, data):
         self._data = data
@@ -2505,6 +2524,9 @@ class DeliveryTest(Test):
         self._testDisposition(NewModifiedTester(failed=True, 
undeliverable=True,
                                                 annotations={"key": "value"}))
 
+    def testNewDefaultModified(self):
+        self._testDisposition(NewDefaultModifiedTester())
+
     def testTransactional(self):
         self._testDisposition(TransactionalTester(id=b'1324xxx', 
outcome_type=Disposition.ACCEPTED))
 


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@qpid.apache.org
For additional commands, e-mail: commits-h...@qpid.apache.org

Reply via email to