Author: gsim
Date: Thu Oct  4 09:06:05 2007
New Revision: 581957

URL: http://svn.apache.org/viewvc?rev=581957&view=rev
Log:
Additional tests and fixes


Modified:
    incubator/qpid/trunk/qpid/cpp/src/qpid/broker/MessageHandlerImpl.cpp
    incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SemanticHandler.cpp
    incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SemanticHandler.h
    incubator/qpid/trunk/qpid/cpp/src/qpid/framing/AccumulatedAck.cpp
    incubator/qpid/trunk/qpid/cpp/src/qpid/framing/AccumulatedAck.h
    incubator/qpid/trunk/qpid/cpp/src/qpid/framing/SequenceNumberSet.cpp
    incubator/qpid/trunk/qpid/cpp/src/qpid/framing/SequenceNumberSet.h
    incubator/qpid/trunk/qpid/cpp/src/tests/AccumulatedAckTest.cpp
    incubator/qpid/trunk/qpid/python/tests_0-10/message.py

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/broker/MessageHandlerImpl.cpp
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/broker/MessageHandlerImpl.cpp?rev=581957&r1=581956&r2=581957&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/broker/MessageHandlerImpl.cpp 
(original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/broker/MessageHandlerImpl.cpp Thu 
Oct  4 09:06:05 2007
@@ -198,7 +198,8 @@
     //TODO: implement mode
 
     SequenceNumberSet results;
-    transfers.processRanges(boost::bind(&SemanticState::acquire, &state, _1, 
_2, results));
+    RangedOperation op = boost::bind(&SemanticState::acquire, &state, _1, _2, 
results);
+    transfers.processRanges(op);
     results = results.condense();
     getProxy().getMessage().acquired(results);
 }

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SemanticHandler.cpp
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SemanticHandler.cpp?rev=581957&r1=581956&r2=581957&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SemanticHandler.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SemanticHandler.cpp Thu Oct  
4 09:06:05 2007
@@ -31,12 +31,16 @@
 #include "qpid/framing/InvocationVisitor.h"
 
 #include <boost/format.hpp>
+#include <boost/bind.hpp>
 
 using namespace qpid::broker;
 using namespace qpid::framing;
 using namespace qpid::sys;
 
-SemanticHandler::SemanticHandler(SessionState& s) : state(*this,s), session(s) 
{}
+SemanticHandler::SemanticHandler(SessionState& s) : 
+    state(*this,s), session(s),
+    ackOp(boost::bind(&SemanticState::ackRange, &state, _1, _2))
+ {}
 
 void SemanticHandler::handle(framing::AMQFrame& frame) 
 {    
@@ -81,13 +85,7 @@
         //ack messages:
         state.ackCumulative(mark.getValue());
     }
-    if (range.size() % 2) { //must be even number        
-        throw ConnectionException(530, "Received odd number of elements in 
ranged mark");
-    } else {
-        for (SequenceNumberSet::const_iterator i = range.begin(); i != 
range.end(); i++) {
-            state.ackRange(*i, *(++i));
-        }
-    }
+    range.processRanges(ackOp);
 }
 
 void SemanticHandler::sendCompletion()

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SemanticHandler.h
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SemanticHandler.h?rev=581957&r1=581956&r2=581957&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SemanticHandler.h (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/broker/SemanticHandler.h Thu Oct  4 
09:06:05 2007
@@ -33,6 +33,8 @@
 #include "qpid/framing/FrameHandler.h"
 #include "qpid/framing/SequenceNumber.h"
 
+#include <boost/function.hpp>
+
 namespace qpid {
 
 namespace framing {
@@ -51,6 +53,8 @@
                         public framing::AMQP_ServerOperations::ExecutionHandler
     
 {
+    typedef boost::function<void(DeliveryId, DeliveryId)> RangedOperation;    
+
     SemanticState state;
     SessionState& session;
     // FIXME aconway 2007-09-20: Why are these on the handler rather than the
@@ -59,6 +63,7 @@
     framing::Window outgoing;
     sys::Mutex outLock;
     MessageBuilder msgBuilder;
+    RangedOperation ackOp;
 
     enum TrackId {EXECUTION_CONTROL_TRACK, MODEL_COMMAND_TRACK, 
MODEL_CONTENT_TRACK};
     TrackId getTrack(const framing::AMQFrame& frame);

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/framing/AccumulatedAck.cpp
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/framing/AccumulatedAck.cpp?rev=581957&r1=581956&r2=581957&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/framing/AccumulatedAck.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/framing/AccumulatedAck.cpp Thu Oct  
4 09:06:05 2007
@@ -22,12 +22,15 @@
 
 #include <assert.h>
 #include <iostream>
+#include <boost/bind.hpp>
 
 using std::list;
 using std::max;
 using std::min;
 using namespace qpid::framing;
 
+AccumulatedAck::AccumulatedAck(SequenceNumber r) : mark(r) {}
+
 void AccumulatedAck::update(SequenceNumber first, SequenceNumber last){
     assert(first <= last);
     if (last < mark) return;
@@ -103,9 +106,7 @@
 void AccumulatedAck::update(const SequenceNumber cumulative, const 
SequenceNumberSet& range)
 {
     update(mark, cumulative);
-    for (SequenceNumberSet::const_iterator i = range.begin(); i != 
range.end(); i++) {
-        update(*i, *(++i));
-    }
+    range.processRanges(*this);
 }
 
 

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/framing/AccumulatedAck.h
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/framing/AccumulatedAck.h?rev=581957&r1=581956&r2=581957&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/framing/AccumulatedAck.h (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/framing/AccumulatedAck.h Thu Oct  4 
09:06:05 2007
@@ -58,13 +58,14 @@
              */
             std::list<Range> ranges;
 
-            explicit AccumulatedAck(SequenceNumber r = SequenceNumber()) : 
mark(r) {}
+            explicit AccumulatedAck(SequenceNumber r = SequenceNumber());
             void update(SequenceNumber firstTag, SequenceNumber lastTag);
             void consolidate();
             void clear();
             bool covers(SequenceNumber tag) const;
             void collectRanges(SequenceNumberSet& set) const;
             void update(const SequenceNumber cumulative, const 
SequenceNumberSet& range);
+            void operator()(SequenceNumber first, SequenceNumber last) { 
update(first, last); }
         };
         std::ostream& operator<<(std::ostream&, const Range&);
         std::ostream& operator<<(std::ostream&, const AccumulatedAck&);

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/framing/SequenceNumberSet.cpp
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/framing/SequenceNumberSet.cpp?rev=581957&r1=581956&r2=581957&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/framing/SequenceNumberSet.cpp 
(original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/framing/SequenceNumberSet.cpp Thu 
Oct  4 09:06:05 2007
@@ -60,6 +60,12 @@
     return result;
 }
 
+void SequenceNumberSet::addRange(const SequenceNumber& start, const 
SequenceNumber& end)
+{
+    push_back(start);
+    push_back(end);
+}
+
 namespace qpid{
 namespace framing{
 

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/framing/SequenceNumberSet.h
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/framing/SequenceNumberSet.h?rev=581957&r1=581956&r2=581957&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/framing/SequenceNumberSet.h 
(original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/framing/SequenceNumberSet.h Thu Oct  
4 09:06:05 2007
@@ -41,17 +41,18 @@
     void decode(Buffer& buffer);
     uint32_t encodedSize() const;   
     SequenceNumberSet condense() const;
+    void addRange(const SequenceNumber& start, const SequenceNumber& end);
 
     template <class T>
-    void processRanges(T t) const
+    void processRanges(T& t) const
     {
         if (size() % 2) { //must be even number        
             throw InvalidArgumentException("SequenceNumberSet contains odd 
number of elements");
         }
     
         for (SequenceNumberSet::const_iterator i = begin(); i != end(); i++) {
-            SequenceNumber first = i->getValue();
-            SequenceNumber last = (++i)->getValue();
+            SequenceNumber first = *(i);
+            SequenceNumber last = *(++i);
             t(first, last);
         }
     }

Modified: incubator/qpid/trunk/qpid/cpp/src/tests/AccumulatedAckTest.cpp
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/tests/AccumulatedAckTest.cpp?rev=581957&r1=581956&r2=581957&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/tests/AccumulatedAckTest.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/tests/AccumulatedAckTest.cpp Thu Oct  4 
09:06:05 2007
@@ -32,6 +32,7 @@
     CPPUNIT_TEST_SUITE(AccumulatedAckTest);
     CPPUNIT_TEST(testGeneral);
     CPPUNIT_TEST(testCovers);
+    CPPUNIT_TEST(testUpdateFromCompletionData);
     CPPUNIT_TEST(testCase1);
     CPPUNIT_TEST(testCase2);
     CPPUNIT_TEST(testCase3);
@@ -39,6 +40,7 @@
     CPPUNIT_TEST(testConsolidation1);
     CPPUNIT_TEST(testConsolidation2);
     CPPUNIT_TEST(testConsolidation3);
+    CPPUNIT_TEST(testConsolidation4);
     CPPUNIT_TEST_SUITE_END();
 
 public:
@@ -97,6 +99,25 @@
         CPPUNIT_ASSERT(!covers(ack, 10));
     }
 
+    void testUpdateFromCompletionData()
+    {
+        AccumulatedAck ack(0);
+        SequenceNumber mark(2);
+        SequenceNumberSet ranges;
+        ranges.addRange(SequenceNumber(5), SequenceNumber(8));
+        ranges.addRange(SequenceNumber(10), SequenceNumber(15));
+        ranges.addRange(SequenceNumber(9), SequenceNumber(9));
+        ranges.addRange(SequenceNumber(3), SequenceNumber(4));
+
+        ack.update(mark, ranges);
+
+        for(int i = 0; i <= 15; i++) {            
+            CPPUNIT_ASSERT(covers(ack, i));
+        }
+        CPPUNIT_ASSERT(!covers(ack, 16));
+        CPPUNIT_ASSERT_EQUAL((uint32_t) 15, ack.mark.getValue());
+    }
+
     void testCase1()
     {
         AccumulatedAck ack(3);
@@ -203,6 +224,22 @@
         update(ack, 1,15);
         CPPUNIT_ASSERT_EQUAL((uint32_t) 15, ack.mark.getValue());
         CPPUNIT_ASSERT_EQUAL((size_t) 0, ack.ranges.size());
+    }
+
+    void testConsolidation4()
+    {
+        AccumulatedAck ack(0);
+        ack.update(SequenceNumber(0), SequenceNumber(2));
+        ack.update(SequenceNumber(5), SequenceNumber(8));
+        ack.update(SequenceNumber(10), SequenceNumber(15));
+        ack.update(SequenceNumber(9), SequenceNumber(9));
+        ack.update(SequenceNumber(3), SequenceNumber(4));
+
+        for(int i = 0; i <= 15; i++) {            
+            CPPUNIT_ASSERT(covers(ack, i));
+        }
+        CPPUNIT_ASSERT(!covers(ack, 16));
+        CPPUNIT_ASSERT_EQUAL((uint32_t) 15, ack.mark.getValue());
     }
 
 };

Modified: incubator/qpid/trunk/qpid/python/tests_0-10/message.py
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/python/tests_0-10/message.py?rev=581957&r1=581956&r2=581957&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/python/tests_0-10/message.py (original)
+++ incubator/qpid/trunk/qpid/python/tests_0-10/message.py Thu Oct  4 09:06:05 
2007
@@ -612,6 +612,29 @@
         for i in range (1, 11):
             self.assertEquals("released message %s" % (i), queue.get(timeout = 
1).content.body)
 
+    def test_ranged_ack(self):
+        """
+        Test acking of messages ranges
+        """
+        channel = self.channel
+        channel.queue_declare(queue = "q", exclusive=True)
+        for i in range (1, 11):
+            channel.message_transfer(content=Content(properties={'routing_key' 
: "q"}, body = "message %s" % (i)))
+
+        channel.message_subscribe(queue = "q", destination = "a", confirm_mode 
= 1)
+        channel.message_flow(unit = 0, value = 10, destination = "a")
+        channel.message_flow(unit = 1, value = 0xFFFFFFFF, destination = "a")
+        queue = self.client.queue("a")
+        for i in range (1, 11):        
+            self.assertEquals("message %s" % (i), queue.get(timeout = 
1).content.body)
+        self.assertEmpty(queue)
+
+        #ack all but the third message (command id 2)
+        channel.execution_complete(cumulative_execution_mark=0xFFFFFFFF, 
ranged_execution_set=[0,1,3,6,7,7,8,9])
+        channel.message_recover()
+        self.assertEquals("message 3", queue.get(timeout = 1).content.body)
+        self.assertEmpty(queue)
+
 
     def assertDataEquals(self, channel, msg, expected):
         self.assertEquals(expected, msg.content.body)


Reply via email to