From 00168f2176602f8bad18984031c910bb625ad80c Mon Sep 17 00:00:00 2001 From: Alan Conway Date: Fri, 26 Oct 2007 19:48:31 +0000 Subject: Session resume support in client & broker: Client can resume a session after voluntary suspend() or network failure. Frames lost in network failure are automatically re-transmitted for transparent re-connection. client::Session improvements: - Locking to avoid races between network & user threads. - Replaced client::StateManager with sys::StateMonitor - avoid heap allocation. qpid::Exception clean up: - use QPID_MSG consistently to format exception messages. - throw typed exceptions (in reply_exceptions.h) for AMQP exceptions. - re-throw correct typed exception on client for exceptions from broker. - Removed QpidError.h rubygen/templates/constants.rb: - constants.h: Added FOO_CLASS_ID and FOO_BAR_METHOD_ID constants. - reply_constants.h: Added throwReplyException(code, text) log::Logger: - Fixed shutdown race in Statement::~Initializer() git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk@588761 13f79535-47bb-0310-9956-ffa450edef68 --- qpid/cpp/src/tests/SessionState.cpp | 142 ++++++++++++++++++++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100644 qpid/cpp/src/tests/SessionState.cpp (limited to 'qpid/cpp/src/tests/SessionState.cpp') diff --git a/qpid/cpp/src/tests/SessionState.cpp b/qpid/cpp/src/tests/SessionState.cpp new file mode 100644 index 0000000000..c8d912801e --- /dev/null +++ b/qpid/cpp/src/tests/SessionState.cpp @@ -0,0 +1,142 @@ +/* + * + * Copyright (c) 2006 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "qpid/framing/SessionState.h" + +#define BOOST_AUTO_TEST_MAIN +#include +#include + +using namespace std; +using namespace qpid::framing; +using namespace boost; + +// Create a frame with a one-char string. +AMQFrame& frame(char s) { + static AMQFrame frame; + frame.setBody(AMQContentBody(string(&s, 1))); + return frame; +} + +// Extract the one-char string from a frame. +char charFromFrame(const AMQFrame& f) { + const AMQContentBody* b=dynamic_cast(f.getBody()); + BOOST_REQUIRE(b && b->getData().size() > 0); + return b->getData()[0]; +} + +// Sent chars as frames +void sent(SessionState& session, const std::string& frames) { + for_each(frames.begin(), frames.end(), + bind(&SessionState::sent, ref(session), bind(frame, _1))); +} + +// Received chars as frames +void received(SessionState& session, const std::string& frames) { + for_each(frames.begin(), frames.end(), + bind(&SessionState::received, session, bind(frame, _1))); +} + +// Make a string from a ReplayRange. +std::string replayChars(const SessionState::Replay& frames) { + string result(frames.size(), ' '); + transform(frames.begin(), frames.end(), result.begin(), + bind(&charFromFrame, _1)); + return result; +} + +namespace qpid { +namespace framing { + +bool operator==(const AMQFrame& a, const AMQFrame& b) { + const AMQContentBody* ab=dynamic_cast(a.getBody()); + const AMQContentBody* bb=dynamic_cast(b.getBody()); + return ab && bb && ab->getData() == bb->getData(); +} + +}} // namespace qpid::framing + + +BOOST_AUTO_TEST_CASE(testSent) { + // Test that we send solicit-ack at the right interval. + AMQContentBody f; + SessionState s1(1); + BOOST_CHECK(s1.sent(f)); + BOOST_CHECK(s1.sent(f)); + BOOST_CHECK(s1.sent(f)); + + SessionState s3(3); + BOOST_CHECK(!s3.sent(f)); + BOOST_CHECK(!s3.sent(f)); + BOOST_CHECK(s3.sent(f)); + + BOOST_CHECK(!s3.sent(f)); + BOOST_CHECK(!s3.sent(f)); + s3.receivedAck(4); + BOOST_CHECK(!s3.sent(f)); + BOOST_CHECK(!s3.sent(f)); + BOOST_CHECK(s3.sent(f)); +} + +BOOST_AUTO_TEST_CASE(testReplay) { + // Replay of all frames. + SessionState session(100); + sent(session, "abc"); + session.suspend(); session.resuming(); + session.receivedAck(-1); + BOOST_CHECK_EQUAL(replayChars(session.replay()), "abc"); + + // Replay with acks + session.receivedAck(0); // ack a. + session.suspend(); + session.resuming(); + session.receivedAck(1); // ack b. + BOOST_CHECK_EQUAL(replayChars(session.replay()), "c"); + + // Replay after further frames. + sent(session, "def"); + session.suspend(); + session.resuming(); + session.receivedAck(3); + BOOST_CHECK_EQUAL(replayChars(session.replay()), "ef"); + + // Bad ack, too high + try { + session.receivedAck(6); + BOOST_FAIL("expected exception"); + } catch(const qpid::Exception&) {} + +} + +BOOST_AUTO_TEST_CASE(testReceived) { + // Check that we request acks at the right interval. + AMQContentBody f; + SessionState s1(1); + BOOST_CHECK_EQUAL(0u, *s1.received(f)); + BOOST_CHECK_EQUAL(1u, *s1.received(f)); + BOOST_CHECK_EQUAL(2u, *s1.received(f)); + + SessionState s3(3); + BOOST_CHECK(!s3.received(f)); + BOOST_CHECK(!s3.received(f)); + BOOST_CHECK_EQUAL(2u, *s3.received(f)); + + BOOST_CHECK(!s3.received(f)); + BOOST_CHECK(!s3.received(f)); + BOOST_CHECK_EQUAL(5u, *s3.received(f)); +} -- cgit v1.2.1 From e7b39d571cf5a805af19c9286ba1a404534b8c93 Mon Sep 17 00:00:00 2001 From: Alan Conway Date: Wed, 31 Oct 2007 16:56:57 +0000 Subject: Simplify SessionState, preparing for session thread safety fixes. git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk@590751 13f79535-47bb-0310-9956-ffa450edef68 --- qpid/cpp/src/tests/SessionState.cpp | 5 ----- 1 file changed, 5 deletions(-) (limited to 'qpid/cpp/src/tests/SessionState.cpp') diff --git a/qpid/cpp/src/tests/SessionState.cpp b/qpid/cpp/src/tests/SessionState.cpp index c8d912801e..19a146c759 100644 --- a/qpid/cpp/src/tests/SessionState.cpp +++ b/qpid/cpp/src/tests/SessionState.cpp @@ -97,21 +97,16 @@ BOOST_AUTO_TEST_CASE(testReplay) { // Replay of all frames. SessionState session(100); sent(session, "abc"); - session.suspend(); session.resuming(); session.receivedAck(-1); BOOST_CHECK_EQUAL(replayChars(session.replay()), "abc"); // Replay with acks session.receivedAck(0); // ack a. - session.suspend(); - session.resuming(); session.receivedAck(1); // ack b. BOOST_CHECK_EQUAL(replayChars(session.replay()), "c"); // Replay after further frames. sent(session, "def"); - session.suspend(); - session.resuming(); session.receivedAck(3); BOOST_CHECK_EQUAL(replayChars(session.replay()), "ef"); -- cgit v1.2.1 From 6ff9cc1db2af388c9fe00c140f555f7c30c5df6d Mon Sep 17 00:00:00 2001 From: Alan Conway Date: Thu, 1 Nov 2007 00:38:58 +0000 Subject: Preparation for session thread safety overhaul: - simplified SessionState, responsibility for protocol states now in Handlers - qpid::RefCounted, qpid::intrusive_ptr reference counting support. - build boost unit tests as single exe, speeds up testing. - fixed leak in AsynchIOAcceptor.cpp git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk@590869 13f79535-47bb-0310-9956-ffa450edef68 --- qpid/cpp/src/tests/SessionState.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'qpid/cpp/src/tests/SessionState.cpp') diff --git a/qpid/cpp/src/tests/SessionState.cpp b/qpid/cpp/src/tests/SessionState.cpp index 19a146c759..f021861cd4 100644 --- a/qpid/cpp/src/tests/SessionState.cpp +++ b/qpid/cpp/src/tests/SessionState.cpp @@ -18,9 +18,9 @@ #include "qpid/framing/SessionState.h" -#define BOOST_AUTO_TEST_MAIN -#include #include +#include +BOOST_AUTO_TEST_SUITE(SessionState); using namespace std; using namespace qpid::framing; @@ -97,16 +97,21 @@ BOOST_AUTO_TEST_CASE(testReplay) { // Replay of all frames. SessionState session(100); sent(session, "abc"); + session.suspend(); session.resuming(); session.receivedAck(-1); BOOST_CHECK_EQUAL(replayChars(session.replay()), "abc"); // Replay with acks session.receivedAck(0); // ack a. + session.suspend(); + session.resuming(); session.receivedAck(1); // ack b. BOOST_CHECK_EQUAL(replayChars(session.replay()), "c"); // Replay after further frames. sent(session, "def"); + session.suspend(); + session.resuming(); session.receivedAck(3); BOOST_CHECK_EQUAL(replayChars(session.replay()), "ef"); @@ -135,3 +140,5 @@ BOOST_AUTO_TEST_CASE(testReceived) { BOOST_CHECK(!s3.received(f)); BOOST_CHECK_EQUAL(5u, *s3.received(f)); } + +BOOST_AUTO_TEST_SUITE_END(); -- cgit v1.2.1 From 1644c002ac05fdc9cb88c9698aa6e4d20dcc4fb3 Mon Sep 17 00:00:00 2001 From: Gordon Sim Date: Thu, 1 Nov 2007 14:44:30 +0000 Subject: locking around access to the unacked out buffer git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk@591026 13f79535-47bb-0310-9956-ffa450edef68 --- qpid/cpp/src/tests/SessionState.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'qpid/cpp/src/tests/SessionState.cpp') diff --git a/qpid/cpp/src/tests/SessionState.cpp b/qpid/cpp/src/tests/SessionState.cpp index f021861cd4..b8d0560c48 100644 --- a/qpid/cpp/src/tests/SessionState.cpp +++ b/qpid/cpp/src/tests/SessionState.cpp @@ -49,7 +49,7 @@ void sent(SessionState& session, const std::string& frames) { // Received chars as frames void received(SessionState& session, const std::string& frames) { for_each(frames.begin(), frames.end(), - bind(&SessionState::received, session, bind(frame, _1))); + bind(&SessionState::received, ref(session), bind(frame, _1))); } // Make a string from a ReplayRange. -- cgit v1.2.1 From acd260bce099be36b879826a0921daf9cb2fe140 Mon Sep 17 00:00:00 2001 From: Alan Conway Date: Wed, 28 Nov 2007 17:13:28 +0000 Subject: Fixed to build with boost 1.34 as well as boost 1.33 - boost::ptr_map API changed. - Boost.Test unit test framework changes. git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk@599067 13f79535-47bb-0310-9956-ffa450edef68 --- qpid/cpp/src/tests/SessionState.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'qpid/cpp/src/tests/SessionState.cpp') diff --git a/qpid/cpp/src/tests/SessionState.cpp b/qpid/cpp/src/tests/SessionState.cpp index b8d0560c48..56d0055ed8 100644 --- a/qpid/cpp/src/tests/SessionState.cpp +++ b/qpid/cpp/src/tests/SessionState.cpp @@ -17,10 +17,12 @@ */ #include "qpid/framing/SessionState.h" +#include "qpid/Exception.h" #include -#include -BOOST_AUTO_TEST_SUITE(SessionState); +#include "unit_test.h" + +QPID_AUTO_TEST_SUITE(SessionStateTestSuite) using namespace std; using namespace qpid::framing; @@ -119,7 +121,7 @@ BOOST_AUTO_TEST_CASE(testReplay) { try { session.receivedAck(6); BOOST_FAIL("expected exception"); - } catch(const qpid::Exception&) {} + } catch(const std::exception&) {} } @@ -141,4 +143,4 @@ BOOST_AUTO_TEST_CASE(testReceived) { BOOST_CHECK_EQUAL(5u, *s3.received(f)); } -BOOST_AUTO_TEST_SUITE_END(); +QPID_AUTO_TEST_SUITE_END() -- cgit v1.2.1 From 1b4a961ec807e5e61cd232b08020a935a4f76f4c Mon Sep 17 00:00:00 2001 From: Andrew Stitcher Date: Thu, 17 Apr 2008 21:46:22 +0000 Subject: Patch for improved compatibility with gcc 3.4 and boost 1.33 git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk@649294 13f79535-47bb-0310-9956-ffa450edef68 --- qpid/cpp/src/tests/SessionState.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'qpid/cpp/src/tests/SessionState.cpp') diff --git a/qpid/cpp/src/tests/SessionState.cpp b/qpid/cpp/src/tests/SessionState.cpp index 56d0055ed8..318bfbbddd 100644 --- a/qpid/cpp/src/tests/SessionState.cpp +++ b/qpid/cpp/src/tests/SessionState.cpp @@ -74,7 +74,7 @@ bool operator==(const AMQFrame& a, const AMQFrame& b) { }} // namespace qpid::framing -BOOST_AUTO_TEST_CASE(testSent) { +QPID_AUTO_TEST_CASE(testSent) { // Test that we send solicit-ack at the right interval. AMQContentBody f; SessionState s1(1); @@ -95,7 +95,7 @@ BOOST_AUTO_TEST_CASE(testSent) { BOOST_CHECK(s3.sent(f)); } -BOOST_AUTO_TEST_CASE(testReplay) { +QPID_AUTO_TEST_CASE(testReplay) { // Replay of all frames. SessionState session(100); sent(session, "abc"); @@ -125,7 +125,7 @@ BOOST_AUTO_TEST_CASE(testReplay) { } -BOOST_AUTO_TEST_CASE(testReceived) { +QPID_AUTO_TEST_CASE(testReceived) { // Check that we request acks at the right interval. AMQContentBody f; SessionState s1(1); -- cgit v1.2.1 From 9acf66d9c848809e3308e50998d38a0183b038a4 Mon Sep 17 00:00:00 2001 From: Alan Conway Date: Sun, 27 Apr 2008 18:32:26 +0000 Subject: Session state as per AMQP 0-10 specification. git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk@651997 13f79535-47bb-0310-9956-ffa450edef68 --- qpid/cpp/src/tests/SessionState.cpp | 254 ++++++++++++++++++++++++++++++++---- 1 file changed, 229 insertions(+), 25 deletions(-) (limited to 'qpid/cpp/src/tests/SessionState.cpp') diff --git a/qpid/cpp/src/tests/SessionState.cpp b/qpid/cpp/src/tests/SessionState.cpp index 318bfbbddd..752d6d3e75 100644 --- a/qpid/cpp/src/tests/SessionState.cpp +++ b/qpid/cpp/src/tests/SessionState.cpp @@ -16,17 +16,33 @@ * */ -#include "qpid/framing/SessionState.h" +#include "unit_test.h" + +#include "qpid/framing/SessionState.h" // FIXME aconway 2008-04-23: preview code to remove. +#include "qpid/SessionState.h" #include "qpid/Exception.h" +#include "qpid/framing/MessageTransferBody.h" +#include "qpid/framing/SessionFlushBody.h" #include -#include "unit_test.h" +#include +#include +#include QPID_AUTO_TEST_SUITE(SessionStateTestSuite) using namespace std; -using namespace qpid::framing; using namespace boost; +using namespace qpid::framing; + +// ================================================================ +// Utility functions. + +// Apply f to [begin, end) and accumulate the result +template +T applyAccumulate(Iter begin, Iter end, T seed, const F& f) { + return std::accumulate(begin, end, seed, bind(std::plus(), _1, bind(f, _2))); +} // Create a frame with a one-char string. AMQFrame& frame(char s) { @@ -35,13 +51,215 @@ AMQFrame& frame(char s) { return frame; } -// Extract the one-char string from a frame. -char charFromFrame(const AMQFrame& f) { - const AMQContentBody* b=dynamic_cast(f.getBody()); - BOOST_REQUIRE(b && b->getData().size() > 0); - return b->getData()[0]; +// Simple string representation of a frame. +string str(const AMQFrame& f) { + if (f.getMethod()) return "C"; // Command or Control + const AMQContentBody* c = dynamic_cast(f.getBody()); + if (c) return c->getData(); // Return data for content frames. + return "H"; // Must be a header. +} +// Make a string from a range of frames. +string str(const vector& frames) { + string (*strFrame)(const AMQFrame&) = str; + return applyAccumulate(frames.begin(), frames.end(), string(), ptr_fun(strFrame)); +} +// Make a transfer command frame. +AMQFrame transferFrame(bool hasContent) { + AMQFrame t(in_place()); + t.setFirstFrame(); + t.setLastFrame(); + t.setFirstSegment(); + t.setLastSegment(!hasContent); + return t; +} +// Make a content frame +AMQFrame contentFrame(string content, bool isLast=true) { + AMQFrame f(in_place(content)); + f.setFirstFrame(); + f.setLastFrame(); + f.setLastSegment(isLast); + return f; +} +AMQFrame contentFrameChar(char content, bool isLast=true) { + return contentFrame(string(1, content), isLast); +} + +// Send frame & return size of frame. +size_t send(qpid::SessionState& s, const AMQFrame& f) { s.send(f); return f.size(); } +// Send transfer command with no content. +size_t transfer0(qpid::SessionState& s) { return send(s, transferFrame(false)); } +// Send transfer frame with single content frame. +size_t transfer1(qpid::SessionState& s, string content) { + return send(s,transferFrame(true)) + send(s,contentFrame(content)); +} +size_t transfer1Char(qpid::SessionState& s, char content) { + return transfer1(s, string(1,content)); +} + +// Send transfer frame with multiple single-byte content frames. +size_t transferN(qpid::SessionState& s, string content) { + size_t size=send(s, transferFrame(!content.empty())); + if (!content.empty()) { + char last = content[content.size()-1]; + content.resize(content.size()-1); + size += applyAccumulate(content.begin(), content.end(), 0, + bind(&send, ref(s), + bind(contentFrameChar, _1, false))); + size += send(s, contentFrameChar(last, true)); + } + return size; +} + +// Send multiple transfers with single-byte content. +size_t transfers(qpid::SessionState& s, string content) { + return applyAccumulate(content.begin(), content.end(), 0, + bind(transfer1Char, ref(s), _1)); +} + +size_t contentFrameSize(size_t n=1) { return AMQFrame(in_place()).size() + n; } +size_t transferFrameSize() { return AMQFrame(in_place()).size(); } + +// ==== qpid::SessionState test classes + +using qpid::SessionId; +using qpid::SessionPoint; + + +QPID_AUTO_TEST_CASE(testSendGetReplyList) { + qpid::SessionState s; + transfer1(s, "abc"); + transfers(s, "def"); + transferN(s, "xyz"); + BOOST_CHECK_EQUAL(str(s.getReplayList()),"CabcCdCeCfCxyz"); + // Ignore controls. + s.send(AMQFrame(in_place())); + BOOST_CHECK_EQUAL(str(s.getReplayList()),"CabcCdCeCfCxyz"); +} + +QPID_AUTO_TEST_CASE(testNeedFlush) { + qpid::SessionState::Configuration c; + // sync after 2 1-byte transfers or equivalent bytes. + c.replaySyncSize = 2*(transferFrameSize()+contentFrameSize()); + qpid::SessionState s(SessionId(), c); + transfers(s, "a"); + BOOST_CHECK(!s.needFlush()); + transfers(s, "b"); + BOOST_CHECK(s.needFlush()); + s.sendFlush(); + BOOST_CHECK(!s.needFlush()); + transfers(s, "c"); + BOOST_CHECK(!s.needFlush()); + transfers(s, "d"); + BOOST_CHECK(s.needFlush()); + BOOST_CHECK_EQUAL(str(s.getReplayList()), "CaCbCcCd"); } +QPID_AUTO_TEST_CASE(testPeerConfirmed) { + qpid::SessionState::Configuration c; + // sync after 2 1-byte transfers or equivalent bytes. + c.replaySyncSize = 2*(transferFrameSize()+contentFrameSize()); + qpid::SessionState s(SessionId(), c); + transfers(s, "ab"); + BOOST_CHECK(s.needFlush()); + transfers(s, "cd"); + BOOST_CHECK_EQUAL(str(s.getReplayList()), "CaCbCcCd"); + s.peerConfirmed(SessionPoint(3)); + BOOST_CHECK_EQUAL(str(s.getReplayList()), "Cd"); + BOOST_CHECK(!s.needFlush()); + + // Never go backwards. + s.peerConfirmed(SessionPoint(2)); + s.peerConfirmed(SessionPoint(3)); + + // Multi-frame transfer. + transfer1(s, "efg"); + transfers(s, "xy"); + BOOST_CHECK_EQUAL(str(s.getReplayList()), "CdCefgCxCy"); + BOOST_CHECK(s.needFlush()); + + s.peerConfirmed(SessionPoint(4)); + BOOST_CHECK_EQUAL(str(s.getReplayList()), "CefgCxCy"); + BOOST_CHECK(s.needFlush()); + + s.peerConfirmed(SessionPoint(5)); + BOOST_CHECK_EQUAL(str(s.getReplayList()), "CxCy"); + BOOST_CHECK(s.needFlush()); + + s.peerConfirmed(SessionPoint(6)); + BOOST_CHECK_EQUAL(str(s.getReplayList()), "Cy"); + BOOST_CHECK(!s.needFlush()); +} + +QPID_AUTO_TEST_CASE(testPeerCompleted) { + qpid::SessionState s; + // Completion implies confirmation + transfers(s, "abc"); + BOOST_CHECK_EQUAL(str(s.getReplayList()), "CaCbCc"); + SequenceSet set(SequenceSet() + 0 + 1); + s.peerCompleted(set); + BOOST_CHECK_EQUAL(str(s.getReplayList()), "Cc"); + + transfers(s, "def"); + // We dont do out-of-order confirmation, so this will only confirm up to 3: + set = SequenceSet(SequenceSet() + 2 + 3 + 5); + s.peerCompleted(set); + BOOST_CHECK_EQUAL(str(s.getReplayList()), "CeCf"); +} + +QPID_AUTO_TEST_CASE(testReceive) { + // Advance expecting/received correctly + qpid::SessionState s; + BOOST_CHECK(!s.hasState()); + BOOST_CHECK_EQUAL(s.getExpecting(), SessionPoint(0)); + BOOST_CHECK_EQUAL(s.getReceived(), SessionPoint(0)); + + BOOST_CHECK(s.receive(transferFrame(false))); + BOOST_CHECK(s.hasState()); + BOOST_CHECK_EQUAL(s.getExpecting(), SessionPoint(1)); + BOOST_CHECK_EQUAL(s.getReceived(), SessionPoint(1)); + + BOOST_CHECK(s.receive(transferFrame(true))); + SessionPoint point = SessionPoint(1, transferFrameSize()); + BOOST_CHECK_EQUAL(s.getExpecting(), point); + BOOST_CHECK_EQUAL(s.getReceived(), point); + BOOST_CHECK(s.receive(contentFrame("", false))); + point.offset += contentFrameSize(0); + BOOST_CHECK_EQUAL(s.getExpecting(), point); + BOOST_CHECK_EQUAL(s.getReceived(), point); + BOOST_CHECK(s.receive(contentFrame("", true))); + BOOST_CHECK_EQUAL(s.getExpecting(), SessionPoint(2)); + BOOST_CHECK_EQUAL(s.getReceived(), SessionPoint(2)); + + // Idempotence barrier, rewind expecting & receive some duplicates. + s.setExpecting(SessionPoint(1)); + BOOST_CHECK(!s.receive(transferFrame(false))); + BOOST_CHECK_EQUAL(s.getExpecting(), SessionPoint(2)); + BOOST_CHECK_EQUAL(s.getReceived(), SessionPoint(2)); + BOOST_CHECK(s.receive(transferFrame(false))); + BOOST_CHECK_EQUAL(s.getExpecting(), SessionPoint(3)); + BOOST_CHECK_EQUAL(s.getReceived(), SessionPoint(3)); +} + +QPID_AUTO_TEST_CASE(testCompleted) { + // completed & unknownCompleted + qpid::SessionState s; + s.receive(transferFrame(false)); + s.receive(transferFrame(false)); + s.receive(transferFrame(false)); + s.localCompleted(1); + BOOST_CHECK_EQUAL(s.getReceivedCompleted(), SequenceSet(SequenceSet()+1)); + s.localCompleted(0); + BOOST_CHECK_EQUAL(s.getReceivedCompleted(), + SequenceSet(SequenceSet() + SequenceSet::Range(0,2))); + s.peerKnownComplete(SequenceSet(SequenceSet()+1)); + BOOST_CHECK_EQUAL(s.getReceivedCompleted(), SequenceSet(SequenceSet()+2)); +} + +// ================================================================ +// FIXME aconway 2008-04-23: Below here is old preview framing::SessionState test, remove with preview code. + +using namespace qpid::framing; + // Sent chars as frames void sent(SessionState& session, const std::string& frames) { for_each(frames.begin(), frames.end(), @@ -54,26 +272,12 @@ void received(SessionState& session, const std::string& frames) { bind(&SessionState::received, ref(session), bind(frame, _1))); } -// Make a string from a ReplayRange. -std::string replayChars(const SessionState::Replay& frames) { - string result(frames.size(), ' '); - transform(frames.begin(), frames.end(), result.begin(), - bind(&charFromFrame, _1)); - return result; -} - -namespace qpid { -namespace framing { - bool operator==(const AMQFrame& a, const AMQFrame& b) { const AMQContentBody* ab=dynamic_cast(a.getBody()); const AMQContentBody* bb=dynamic_cast(b.getBody()); return ab && bb && ab->getData() == bb->getData(); } -}} // namespace qpid::framing - - QPID_AUTO_TEST_CASE(testSent) { // Test that we send solicit-ack at the right interval. AMQContentBody f; @@ -101,21 +305,21 @@ QPID_AUTO_TEST_CASE(testReplay) { sent(session, "abc"); session.suspend(); session.resuming(); session.receivedAck(-1); - BOOST_CHECK_EQUAL(replayChars(session.replay()), "abc"); + BOOST_CHECK_EQUAL(str(session.replay()), "abc"); // Replay with acks session.receivedAck(0); // ack a. session.suspend(); session.resuming(); session.receivedAck(1); // ack b. - BOOST_CHECK_EQUAL(replayChars(session.replay()), "c"); + BOOST_CHECK_EQUAL(str(session.replay()), "c"); // Replay after further frames. sent(session, "def"); session.suspend(); session.resuming(); session.receivedAck(3); - BOOST_CHECK_EQUAL(replayChars(session.replay()), "ef"); + BOOST_CHECK_EQUAL(str(session.replay()), "ef"); // Bad ack, too high try { -- cgit v1.2.1 From 3eedb6bffa26b6beed6776277f70479d91a31ca0 Mon Sep 17 00:00:00 2001 From: Alan Conway Date: Fri, 9 May 2008 18:46:17 +0000 Subject: Support for 0-10 sessions, not yet integrated. Misc minor fixes. git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk@654913 13f79535-47bb-0310-9956-ffa450edef68 --- qpid/cpp/src/tests/SessionState.cpp | 236 +++++++++++------------------------- 1 file changed, 74 insertions(+), 162 deletions(-) (limited to 'qpid/cpp/src/tests/SessionState.cpp') diff --git a/qpid/cpp/src/tests/SessionState.cpp b/qpid/cpp/src/tests/SessionState.cpp index 752d6d3e75..71b90ea9f1 100644 --- a/qpid/cpp/src/tests/SessionState.cpp +++ b/qpid/cpp/src/tests/SessionState.cpp @@ -18,7 +18,6 @@ #include "unit_test.h" -#include "qpid/framing/SessionState.h" // FIXME aconway 2008-04-23: preview code to remove. #include "qpid/SessionState.h" #include "qpid/Exception.h" #include "qpid/framing/MessageTransferBody.h" @@ -85,7 +84,7 @@ AMQFrame contentFrameChar(char content, bool isLast=true) { } // Send frame & return size of frame. -size_t send(qpid::SessionState& s, const AMQFrame& f) { s.send(f); return f.size(); } +size_t send(qpid::SessionState& s, const AMQFrame& f) { s.sender.record(f); return f.size(); } // Send transfer command with no content. size_t transfer0(qpid::SessionState& s) { return send(s, transferFrame(false)); } // Send transfer frame with single content frame. @@ -127,13 +126,14 @@ using qpid::SessionPoint; QPID_AUTO_TEST_CASE(testSendGetReplyList) { qpid::SessionState s; + s.sender.getCommandPoint(); transfer1(s, "abc"); transfers(s, "def"); transferN(s, "xyz"); - BOOST_CHECK_EQUAL(str(s.getReplayList()),"CabcCdCeCfCxyz"); + BOOST_CHECK_EQUAL(str(s.sender.getReplayList()),"CabcCdCeCfCxyz"); // Ignore controls. - s.send(AMQFrame(in_place())); - BOOST_CHECK_EQUAL(str(s.getReplayList()),"CabcCdCeCfCxyz"); + s.sender.record(AMQFrame(in_place())); + BOOST_CHECK_EQUAL(str(s.sender.getReplayList()),"CabcCdCeCfCxyz"); } QPID_AUTO_TEST_CASE(testNeedFlush) { @@ -141,17 +141,18 @@ QPID_AUTO_TEST_CASE(testNeedFlush) { // sync after 2 1-byte transfers or equivalent bytes. c.replaySyncSize = 2*(transferFrameSize()+contentFrameSize()); qpid::SessionState s(SessionId(), c); + s.sender.getCommandPoint(); transfers(s, "a"); - BOOST_CHECK(!s.needFlush()); + BOOST_CHECK(!s.sender.needFlush()); transfers(s, "b"); - BOOST_CHECK(s.needFlush()); - s.sendFlush(); - BOOST_CHECK(!s.needFlush()); + BOOST_CHECK(s.sender.needFlush()); + s.sender.recordFlush(); + BOOST_CHECK(!s.sender.needFlush()); transfers(s, "c"); - BOOST_CHECK(!s.needFlush()); + BOOST_CHECK(!s.sender.needFlush()); transfers(s, "d"); - BOOST_CHECK(s.needFlush()); - BOOST_CHECK_EQUAL(str(s.getReplayList()), "CaCbCcCd"); + BOOST_CHECK(s.sender.needFlush()); + BOOST_CHECK_EQUAL(str(s.sender.getReplayList()), "CaCbCcCd"); } QPID_AUTO_TEST_CASE(testPeerConfirmed) { @@ -159,192 +160,103 @@ QPID_AUTO_TEST_CASE(testPeerConfirmed) { // sync after 2 1-byte transfers or equivalent bytes. c.replaySyncSize = 2*(transferFrameSize()+contentFrameSize()); qpid::SessionState s(SessionId(), c); + s.sender.getCommandPoint(); transfers(s, "ab"); - BOOST_CHECK(s.needFlush()); + BOOST_CHECK(s.sender.needFlush()); transfers(s, "cd"); - BOOST_CHECK_EQUAL(str(s.getReplayList()), "CaCbCcCd"); - s.peerConfirmed(SessionPoint(3)); - BOOST_CHECK_EQUAL(str(s.getReplayList()), "Cd"); - BOOST_CHECK(!s.needFlush()); + BOOST_CHECK_EQUAL(str(s.sender.getReplayList()), "CaCbCcCd"); + s.sender.confirmed(SessionPoint(3)); + BOOST_CHECK_EQUAL(str(s.sender.getReplayList()), "Cd"); + BOOST_CHECK(!s.sender.needFlush()); // Never go backwards. - s.peerConfirmed(SessionPoint(2)); - s.peerConfirmed(SessionPoint(3)); + s.sender.confirmed(SessionPoint(2)); + s.sender.confirmed(SessionPoint(3)); // Multi-frame transfer. transfer1(s, "efg"); transfers(s, "xy"); - BOOST_CHECK_EQUAL(str(s.getReplayList()), "CdCefgCxCy"); - BOOST_CHECK(s.needFlush()); + BOOST_CHECK_EQUAL(str(s.sender.getReplayList()), "CdCefgCxCy"); + BOOST_CHECK(s.sender.needFlush()); - s.peerConfirmed(SessionPoint(4)); - BOOST_CHECK_EQUAL(str(s.getReplayList()), "CefgCxCy"); - BOOST_CHECK(s.needFlush()); + s.sender.confirmed(SessionPoint(4)); + BOOST_CHECK_EQUAL(str(s.sender.getReplayList()), "CefgCxCy"); + BOOST_CHECK(s.sender.needFlush()); - s.peerConfirmed(SessionPoint(5)); - BOOST_CHECK_EQUAL(str(s.getReplayList()), "CxCy"); - BOOST_CHECK(s.needFlush()); + s.sender.confirmed(SessionPoint(5)); + BOOST_CHECK_EQUAL(str(s.sender.getReplayList()), "CxCy"); + BOOST_CHECK(s.sender.needFlush()); - s.peerConfirmed(SessionPoint(6)); - BOOST_CHECK_EQUAL(str(s.getReplayList()), "Cy"); - BOOST_CHECK(!s.needFlush()); + s.sender.confirmed(SessionPoint(6)); + BOOST_CHECK_EQUAL(str(s.sender.getReplayList()), "Cy"); + BOOST_CHECK(!s.sender.needFlush()); } QPID_AUTO_TEST_CASE(testPeerCompleted) { qpid::SessionState s; + s.sender.getCommandPoint(); // Completion implies confirmation transfers(s, "abc"); - BOOST_CHECK_EQUAL(str(s.getReplayList()), "CaCbCc"); + BOOST_CHECK_EQUAL(str(s.sender.getReplayList()), "CaCbCc"); SequenceSet set(SequenceSet() + 0 + 1); - s.peerCompleted(set); - BOOST_CHECK_EQUAL(str(s.getReplayList()), "Cc"); + s.sender.completed(set); + BOOST_CHECK_EQUAL(str(s.sender.getReplayList()), "Cc"); transfers(s, "def"); // We dont do out-of-order confirmation, so this will only confirm up to 3: set = SequenceSet(SequenceSet() + 2 + 3 + 5); - s.peerCompleted(set); - BOOST_CHECK_EQUAL(str(s.getReplayList()), "CeCf"); + s.sender.completed(set); + BOOST_CHECK_EQUAL(str(s.sender.getReplayList()), "CeCf"); } QPID_AUTO_TEST_CASE(testReceive) { - // Advance expecting/received correctly + // Advance expected/received correctly qpid::SessionState s; - BOOST_CHECK(!s.hasState()); - BOOST_CHECK_EQUAL(s.getExpecting(), SessionPoint(0)); - BOOST_CHECK_EQUAL(s.getReceived(), SessionPoint(0)); + s.receiver.setCommandPoint(SessionPoint()); + BOOST_CHECK_EQUAL(s.receiver.getExpected(), SessionPoint(0)); + BOOST_CHECK_EQUAL(s.receiver.getReceived(), SessionPoint(0)); - BOOST_CHECK(s.receive(transferFrame(false))); - BOOST_CHECK(s.hasState()); - BOOST_CHECK_EQUAL(s.getExpecting(), SessionPoint(1)); - BOOST_CHECK_EQUAL(s.getReceived(), SessionPoint(1)); + BOOST_CHECK(s.receiver.record(transferFrame(false))); + BOOST_CHECK_EQUAL(s.receiver.getExpected(), SessionPoint(1)); + BOOST_CHECK_EQUAL(s.receiver.getReceived(), SessionPoint(1)); - BOOST_CHECK(s.receive(transferFrame(true))); + BOOST_CHECK(s.receiver.record(transferFrame(true))); SessionPoint point = SessionPoint(1, transferFrameSize()); - BOOST_CHECK_EQUAL(s.getExpecting(), point); - BOOST_CHECK_EQUAL(s.getReceived(), point); - BOOST_CHECK(s.receive(contentFrame("", false))); + BOOST_CHECK_EQUAL(s.receiver.getExpected(), point); + BOOST_CHECK_EQUAL(s.receiver.getReceived(), point); + BOOST_CHECK(s.receiver.record(contentFrame("", false))); point.offset += contentFrameSize(0); - BOOST_CHECK_EQUAL(s.getExpecting(), point); - BOOST_CHECK_EQUAL(s.getReceived(), point); - BOOST_CHECK(s.receive(contentFrame("", true))); - BOOST_CHECK_EQUAL(s.getExpecting(), SessionPoint(2)); - BOOST_CHECK_EQUAL(s.getReceived(), SessionPoint(2)); - - // Idempotence barrier, rewind expecting & receive some duplicates. - s.setExpecting(SessionPoint(1)); - BOOST_CHECK(!s.receive(transferFrame(false))); - BOOST_CHECK_EQUAL(s.getExpecting(), SessionPoint(2)); - BOOST_CHECK_EQUAL(s.getReceived(), SessionPoint(2)); - BOOST_CHECK(s.receive(transferFrame(false))); - BOOST_CHECK_EQUAL(s.getExpecting(), SessionPoint(3)); - BOOST_CHECK_EQUAL(s.getReceived(), SessionPoint(3)); + BOOST_CHECK_EQUAL(s.receiver.getExpected(), point); + BOOST_CHECK_EQUAL(s.receiver.getReceived(), point); + BOOST_CHECK(s.receiver.record(contentFrame("", true))); + BOOST_CHECK_EQUAL(s.receiver.getExpected(), SessionPoint(2)); + BOOST_CHECK_EQUAL(s.receiver.getReceived(), SessionPoint(2)); + + // Idempotence barrier, rewind expected & receive some duplicates. + s.receiver.setCommandPoint(SessionPoint(1)); + BOOST_CHECK(!s.receiver.record(transferFrame(false))); + BOOST_CHECK_EQUAL(s.receiver.getExpected(), SessionPoint(2)); + BOOST_CHECK_EQUAL(s.receiver.getReceived(), SessionPoint(2)); + BOOST_CHECK(s.receiver.record(transferFrame(false))); + BOOST_CHECK_EQUAL(s.receiver.getExpected(), SessionPoint(3)); + BOOST_CHECK_EQUAL(s.receiver.getReceived(), SessionPoint(3)); } QPID_AUTO_TEST_CASE(testCompleted) { // completed & unknownCompleted qpid::SessionState s; - s.receive(transferFrame(false)); - s.receive(transferFrame(false)); - s.receive(transferFrame(false)); - s.localCompleted(1); - BOOST_CHECK_EQUAL(s.getReceivedCompleted(), SequenceSet(SequenceSet()+1)); - s.localCompleted(0); - BOOST_CHECK_EQUAL(s.getReceivedCompleted(), + s.receiver.setCommandPoint(SessionPoint()); + s.receiver.record(transferFrame(false)); + s.receiver.record(transferFrame(false)); + s.receiver.record(transferFrame(false)); + s.receiver.completed(1); + BOOST_CHECK_EQUAL(s.receiver.getUnknownComplete(), SequenceSet(SequenceSet()+1)); + s.receiver.completed(0); + BOOST_CHECK_EQUAL(s.receiver.getUnknownComplete(), SequenceSet(SequenceSet() + SequenceSet::Range(0,2))); - s.peerKnownComplete(SequenceSet(SequenceSet()+1)); - BOOST_CHECK_EQUAL(s.getReceivedCompleted(), SequenceSet(SequenceSet()+2)); -} - -// ================================================================ -// FIXME aconway 2008-04-23: Below here is old preview framing::SessionState test, remove with preview code. - -using namespace qpid::framing; - -// Sent chars as frames -void sent(SessionState& session, const std::string& frames) { - for_each(frames.begin(), frames.end(), - bind(&SessionState::sent, ref(session), bind(frame, _1))); -} - -// Received chars as frames -void received(SessionState& session, const std::string& frames) { - for_each(frames.begin(), frames.end(), - bind(&SessionState::received, ref(session), bind(frame, _1))); -} - -bool operator==(const AMQFrame& a, const AMQFrame& b) { - const AMQContentBody* ab=dynamic_cast(a.getBody()); - const AMQContentBody* bb=dynamic_cast(b.getBody()); - return ab && bb && ab->getData() == bb->getData(); -} - -QPID_AUTO_TEST_CASE(testSent) { - // Test that we send solicit-ack at the right interval. - AMQContentBody f; - SessionState s1(1); - BOOST_CHECK(s1.sent(f)); - BOOST_CHECK(s1.sent(f)); - BOOST_CHECK(s1.sent(f)); - - SessionState s3(3); - BOOST_CHECK(!s3.sent(f)); - BOOST_CHECK(!s3.sent(f)); - BOOST_CHECK(s3.sent(f)); - - BOOST_CHECK(!s3.sent(f)); - BOOST_CHECK(!s3.sent(f)); - s3.receivedAck(4); - BOOST_CHECK(!s3.sent(f)); - BOOST_CHECK(!s3.sent(f)); - BOOST_CHECK(s3.sent(f)); -} - -QPID_AUTO_TEST_CASE(testReplay) { - // Replay of all frames. - SessionState session(100); - sent(session, "abc"); - session.suspend(); session.resuming(); - session.receivedAck(-1); - BOOST_CHECK_EQUAL(str(session.replay()), "abc"); - - // Replay with acks - session.receivedAck(0); // ack a. - session.suspend(); - session.resuming(); - session.receivedAck(1); // ack b. - BOOST_CHECK_EQUAL(str(session.replay()), "c"); - - // Replay after further frames. - sent(session, "def"); - session.suspend(); - session.resuming(); - session.receivedAck(3); - BOOST_CHECK_EQUAL(str(session.replay()), "ef"); - - // Bad ack, too high - try { - session.receivedAck(6); - BOOST_FAIL("expected exception"); - } catch(const std::exception&) {} - -} - -QPID_AUTO_TEST_CASE(testReceived) { - // Check that we request acks at the right interval. - AMQContentBody f; - SessionState s1(1); - BOOST_CHECK_EQUAL(0u, *s1.received(f)); - BOOST_CHECK_EQUAL(1u, *s1.received(f)); - BOOST_CHECK_EQUAL(2u, *s1.received(f)); - - SessionState s3(3); - BOOST_CHECK(!s3.received(f)); - BOOST_CHECK(!s3.received(f)); - BOOST_CHECK_EQUAL(2u, *s3.received(f)); - - BOOST_CHECK(!s3.received(f)); - BOOST_CHECK(!s3.received(f)); - BOOST_CHECK_EQUAL(5u, *s3.received(f)); + s.receiver.knownCompleted(SequenceSet(SequenceSet()+1)); + BOOST_CHECK_EQUAL(s.receiver.getUnknownComplete(), SequenceSet(SequenceSet()+2)); + // TODO aconway 2008-04-30: missing tests for known-completed. } QPID_AUTO_TEST_SUITE_END() -- cgit v1.2.1 From 5bb0604473b2367218c297927d578d19951ed775 Mon Sep 17 00:00:00 2001 From: Alan Conway Date: Tue, 20 May 2008 13:44:34 +0000 Subject: Support for AMQP 0-10 sessions in C++ broker. git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk@658246 13f79535-47bb-0310-9956-ffa450edef68 --- qpid/cpp/src/tests/SessionState.cpp | 146 ++++++++++++++++++------------------ 1 file changed, 71 insertions(+), 75 deletions(-) (limited to 'qpid/cpp/src/tests/SessionState.cpp') diff --git a/qpid/cpp/src/tests/SessionState.cpp b/qpid/cpp/src/tests/SessionState.cpp index 71b90ea9f1..4beef87cfe 100644 --- a/qpid/cpp/src/tests/SessionState.cpp +++ b/qpid/cpp/src/tests/SessionState.cpp @@ -58,7 +58,7 @@ string str(const AMQFrame& f) { return "H"; // Must be a header. } // Make a string from a range of frames. -string str(const vector& frames) { +string str(const boost::iterator_range::const_iterator>& frames) { string (*strFrame)(const AMQFrame&) = str; return applyAccumulate(frames.begin(), frames.end(), string(), ptr_fun(strFrame)); } @@ -84,7 +84,7 @@ AMQFrame contentFrameChar(char content, bool isLast=true) { } // Send frame & return size of frame. -size_t send(qpid::SessionState& s, const AMQFrame& f) { s.sender.record(f); return f.size(); } +size_t send(qpid::SessionState& s, const AMQFrame& f) { s.senderRecord(f); return f.size(); } // Send transfer command with no content. size_t transfer0(qpid::SessionState& s) { return send(s, transferFrame(false)); } // Send transfer frame with single content frame. @@ -126,136 +126,132 @@ using qpid::SessionPoint; QPID_AUTO_TEST_CASE(testSendGetReplyList) { qpid::SessionState s; - s.sender.getCommandPoint(); + s.senderGetCommandPoint(); transfer1(s, "abc"); transfers(s, "def"); transferN(s, "xyz"); - BOOST_CHECK_EQUAL(str(s.sender.getReplayList()),"CabcCdCeCfCxyz"); + BOOST_CHECK_EQUAL(str(s.senderExpected(SessionPoint(0,0))),"CabcCdCeCfCxyz"); // Ignore controls. - s.sender.record(AMQFrame(in_place())); - BOOST_CHECK_EQUAL(str(s.sender.getReplayList()),"CabcCdCeCfCxyz"); + s.senderRecord(AMQFrame(in_place())); + BOOST_CHECK_EQUAL(str(s.senderExpected(SessionPoint(2,0))),"CeCfCxyz"); } QPID_AUTO_TEST_CASE(testNeedFlush) { qpid::SessionState::Configuration c; // sync after 2 1-byte transfers or equivalent bytes. - c.replaySyncSize = 2*(transferFrameSize()+contentFrameSize()); + c.replayFlushLimit = 2*(transferFrameSize()+contentFrameSize()); qpid::SessionState s(SessionId(), c); - s.sender.getCommandPoint(); + s.senderGetCommandPoint(); transfers(s, "a"); - BOOST_CHECK(!s.sender.needFlush()); + BOOST_CHECK(!s.senderNeedFlush()); transfers(s, "b"); - BOOST_CHECK(s.sender.needFlush()); - s.sender.recordFlush(); - BOOST_CHECK(!s.sender.needFlush()); + BOOST_CHECK(s.senderNeedFlush()); + s.senderRecordFlush(); + BOOST_CHECK(!s.senderNeedFlush()); transfers(s, "c"); - BOOST_CHECK(!s.sender.needFlush()); + BOOST_CHECK(!s.senderNeedFlush()); transfers(s, "d"); - BOOST_CHECK(s.sender.needFlush()); - BOOST_CHECK_EQUAL(str(s.sender.getReplayList()), "CaCbCcCd"); + BOOST_CHECK(s.senderNeedFlush()); + BOOST_CHECK_EQUAL(str(s.senderExpected(SessionPoint())), "CaCbCcCd"); } QPID_AUTO_TEST_CASE(testPeerConfirmed) { qpid::SessionState::Configuration c; // sync after 2 1-byte transfers or equivalent bytes. - c.replaySyncSize = 2*(transferFrameSize()+contentFrameSize()); + c.replayFlushLimit = 2*(transferFrameSize()+contentFrameSize()); qpid::SessionState s(SessionId(), c); - s.sender.getCommandPoint(); + s.senderGetCommandPoint(); transfers(s, "ab"); - BOOST_CHECK(s.sender.needFlush()); + BOOST_CHECK(s.senderNeedFlush()); transfers(s, "cd"); - BOOST_CHECK_EQUAL(str(s.sender.getReplayList()), "CaCbCcCd"); - s.sender.confirmed(SessionPoint(3)); - BOOST_CHECK_EQUAL(str(s.sender.getReplayList()), "Cd"); - BOOST_CHECK(!s.sender.needFlush()); - - // Never go backwards. - s.sender.confirmed(SessionPoint(2)); - s.sender.confirmed(SessionPoint(3)); + BOOST_CHECK_EQUAL(str(s.senderExpected(SessionPoint(0,0))), "CaCbCcCd"); + s.senderConfirmed(SessionPoint(3)); + BOOST_CHECK_EQUAL(str(s.senderExpected(SessionPoint(3,0))), "Cd"); + BOOST_CHECK(!s.senderNeedFlush()); // Multi-frame transfer. transfer1(s, "efg"); transfers(s, "xy"); - BOOST_CHECK_EQUAL(str(s.sender.getReplayList()), "CdCefgCxCy"); - BOOST_CHECK(s.sender.needFlush()); + BOOST_CHECK_EQUAL(str(s.senderExpected(SessionPoint(3,0))), "CdCefgCxCy"); + BOOST_CHECK(s.senderNeedFlush()); - s.sender.confirmed(SessionPoint(4)); - BOOST_CHECK_EQUAL(str(s.sender.getReplayList()), "CefgCxCy"); - BOOST_CHECK(s.sender.needFlush()); + s.senderConfirmed(SessionPoint(4)); + BOOST_CHECK_EQUAL(str(s.senderExpected(SessionPoint(4,0))), "CefgCxCy"); + BOOST_CHECK(s.senderNeedFlush()); - s.sender.confirmed(SessionPoint(5)); - BOOST_CHECK_EQUAL(str(s.sender.getReplayList()), "CxCy"); - BOOST_CHECK(s.sender.needFlush()); + s.senderConfirmed(SessionPoint(5)); + BOOST_CHECK_EQUAL(str(s.senderExpected(SessionPoint(5,0))), "CxCy"); + BOOST_CHECK(s.senderNeedFlush()); - s.sender.confirmed(SessionPoint(6)); - BOOST_CHECK_EQUAL(str(s.sender.getReplayList()), "Cy"); - BOOST_CHECK(!s.sender.needFlush()); + s.senderConfirmed(SessionPoint(6)); + BOOST_CHECK_EQUAL(str(s.senderExpected(SessionPoint(6,0))), "Cy"); + BOOST_CHECK(!s.senderNeedFlush()); } QPID_AUTO_TEST_CASE(testPeerCompleted) { qpid::SessionState s; - s.sender.getCommandPoint(); + s.senderGetCommandPoint(); // Completion implies confirmation transfers(s, "abc"); - BOOST_CHECK_EQUAL(str(s.sender.getReplayList()), "CaCbCc"); + BOOST_CHECK_EQUAL(str(s.senderExpected(SessionPoint(0,0))), "CaCbCc"); SequenceSet set(SequenceSet() + 0 + 1); - s.sender.completed(set); - BOOST_CHECK_EQUAL(str(s.sender.getReplayList()), "Cc"); + s.senderCompleted(set); + BOOST_CHECK_EQUAL(str(s.senderExpected(SessionPoint(2,0))), "Cc"); transfers(s, "def"); // We dont do out-of-order confirmation, so this will only confirm up to 3: set = SequenceSet(SequenceSet() + 2 + 3 + 5); - s.sender.completed(set); - BOOST_CHECK_EQUAL(str(s.sender.getReplayList()), "CeCf"); + s.senderCompleted(set); + BOOST_CHECK_EQUAL(str(s.senderExpected(SessionPoint(4,0))), "CeCf"); } QPID_AUTO_TEST_CASE(testReceive) { // Advance expected/received correctly qpid::SessionState s; - s.receiver.setCommandPoint(SessionPoint()); - BOOST_CHECK_EQUAL(s.receiver.getExpected(), SessionPoint(0)); - BOOST_CHECK_EQUAL(s.receiver.getReceived(), SessionPoint(0)); + s.receiverSetCommandPoint(SessionPoint()); + BOOST_CHECK_EQUAL(s.receiverGetExpected(), SessionPoint(0)); + BOOST_CHECK_EQUAL(s.receiverGetReceived(), SessionPoint(0)); - BOOST_CHECK(s.receiver.record(transferFrame(false))); - BOOST_CHECK_EQUAL(s.receiver.getExpected(), SessionPoint(1)); - BOOST_CHECK_EQUAL(s.receiver.getReceived(), SessionPoint(1)); + BOOST_CHECK(s.receiverRecord(transferFrame(false))); + BOOST_CHECK_EQUAL(s.receiverGetExpected(), SessionPoint(1)); + BOOST_CHECK_EQUAL(s.receiverGetReceived(), SessionPoint(1)); - BOOST_CHECK(s.receiver.record(transferFrame(true))); + BOOST_CHECK(s.receiverRecord(transferFrame(true))); SessionPoint point = SessionPoint(1, transferFrameSize()); - BOOST_CHECK_EQUAL(s.receiver.getExpected(), point); - BOOST_CHECK_EQUAL(s.receiver.getReceived(), point); - BOOST_CHECK(s.receiver.record(contentFrame("", false))); + BOOST_CHECK_EQUAL(s.receiverGetExpected(), point); + BOOST_CHECK_EQUAL(s.receiverGetReceived(), point); + BOOST_CHECK(s.receiverRecord(contentFrame("", false))); point.offset += contentFrameSize(0); - BOOST_CHECK_EQUAL(s.receiver.getExpected(), point); - BOOST_CHECK_EQUAL(s.receiver.getReceived(), point); - BOOST_CHECK(s.receiver.record(contentFrame("", true))); - BOOST_CHECK_EQUAL(s.receiver.getExpected(), SessionPoint(2)); - BOOST_CHECK_EQUAL(s.receiver.getReceived(), SessionPoint(2)); + BOOST_CHECK_EQUAL(s.receiverGetExpected(), point); + BOOST_CHECK_EQUAL(s.receiverGetReceived(), point); + BOOST_CHECK(s.receiverRecord(contentFrame("", true))); + BOOST_CHECK_EQUAL(s.receiverGetExpected(), SessionPoint(2)); + BOOST_CHECK_EQUAL(s.receiverGetReceived(), SessionPoint(2)); // Idempotence barrier, rewind expected & receive some duplicates. - s.receiver.setCommandPoint(SessionPoint(1)); - BOOST_CHECK(!s.receiver.record(transferFrame(false))); - BOOST_CHECK_EQUAL(s.receiver.getExpected(), SessionPoint(2)); - BOOST_CHECK_EQUAL(s.receiver.getReceived(), SessionPoint(2)); - BOOST_CHECK(s.receiver.record(transferFrame(false))); - BOOST_CHECK_EQUAL(s.receiver.getExpected(), SessionPoint(3)); - BOOST_CHECK_EQUAL(s.receiver.getReceived(), SessionPoint(3)); + s.receiverSetCommandPoint(SessionPoint(1)); + BOOST_CHECK(!s.receiverRecord(transferFrame(false))); + BOOST_CHECK_EQUAL(s.receiverGetExpected(), SessionPoint(2)); + BOOST_CHECK_EQUAL(s.receiverGetReceived(), SessionPoint(2)); + BOOST_CHECK(s.receiverRecord(transferFrame(false))); + BOOST_CHECK_EQUAL(s.receiverGetExpected(), SessionPoint(3)); + BOOST_CHECK_EQUAL(s.receiverGetReceived(), SessionPoint(3)); } QPID_AUTO_TEST_CASE(testCompleted) { // completed & unknownCompleted qpid::SessionState s; - s.receiver.setCommandPoint(SessionPoint()); - s.receiver.record(transferFrame(false)); - s.receiver.record(transferFrame(false)); - s.receiver.record(transferFrame(false)); - s.receiver.completed(1); - BOOST_CHECK_EQUAL(s.receiver.getUnknownComplete(), SequenceSet(SequenceSet()+1)); - s.receiver.completed(0); - BOOST_CHECK_EQUAL(s.receiver.getUnknownComplete(), + s.receiverSetCommandPoint(SessionPoint()); + s.receiverRecord(transferFrame(false)); + s.receiverRecord(transferFrame(false)); + s.receiverRecord(transferFrame(false)); + s.receiverCompleted(1); + BOOST_CHECK_EQUAL(s.receiverGetUnknownComplete(), SequenceSet(SequenceSet()+1)); + s.receiverCompleted(0); + BOOST_CHECK_EQUAL(s.receiverGetUnknownComplete(), SequenceSet(SequenceSet() + SequenceSet::Range(0,2))); - s.receiver.knownCompleted(SequenceSet(SequenceSet()+1)); - BOOST_CHECK_EQUAL(s.receiver.getUnknownComplete(), SequenceSet(SequenceSet()+2)); + s.receiverKnownCompleted(SequenceSet(SequenceSet()+1)); + BOOST_CHECK_EQUAL(s.receiverGetUnknownComplete(), SequenceSet(SequenceSet()+2)); // TODO aconway 2008-04-30: missing tests for known-completed. } -- cgit v1.2.1 From 558dcdd6eefd334cd81fcf0c4a3843097974f652 Mon Sep 17 00:00:00 2001 From: Alan Conway Date: Fri, 23 May 2008 13:39:07 +0000 Subject: qpid::SessionState: Added error checking for invalid frame sequences. client: Fix client crash on error during connection shutdown. git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk@659538 13f79535-47bb-0310-9956-ffa450edef68 --- qpid/cpp/src/tests/SessionState.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) (limited to 'qpid/cpp/src/tests/SessionState.cpp') diff --git a/qpid/cpp/src/tests/SessionState.cpp b/qpid/cpp/src/tests/SessionState.cpp index 4beef87cfe..40922b3be8 100644 --- a/qpid/cpp/src/tests/SessionState.cpp +++ b/qpid/cpp/src/tests/SessionState.cpp @@ -65,17 +65,18 @@ string str(const boost::iterator_range::const_iterator>& frames // Make a transfer command frame. AMQFrame transferFrame(bool hasContent) { AMQFrame t(in_place()); - t.setFirstFrame(); - t.setLastFrame(); - t.setFirstSegment(); + t.setFirstFrame(true); + t.setLastFrame(true); + t.setFirstSegment(true); t.setLastSegment(!hasContent); return t; } // Make a content frame AMQFrame contentFrame(string content, bool isLast=true) { AMQFrame f(in_place(content)); - f.setFirstFrame(); - f.setLastFrame(); + f.setFirstFrame(true); + f.setLastFrame(true); + f.setFirstSegment(false); f.setLastSegment(isLast); return f; } -- cgit v1.2.1 From a7ebef746a0a312d49eae6b9cf10c7f02293acb5 Mon Sep 17 00:00:00 2001 From: Alan Conway Date: Mon, 26 May 2008 20:51:31 +0000 Subject: Speculative "fix" for solaris compile errors discussed on qpid-dev. git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk@660302 13f79535-47bb-0310-9956-ffa450edef68 --- qpid/cpp/src/tests/SessionState.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'qpid/cpp/src/tests/SessionState.cpp') diff --git a/qpid/cpp/src/tests/SessionState.cpp b/qpid/cpp/src/tests/SessionState.cpp index 40922b3be8..43b949cfff 100644 --- a/qpid/cpp/src/tests/SessionState.cpp +++ b/qpid/cpp/src/tests/SessionState.cpp @@ -250,7 +250,7 @@ QPID_AUTO_TEST_CASE(testCompleted) { BOOST_CHECK_EQUAL(s.receiverGetUnknownComplete(), SequenceSet(SequenceSet()+1)); s.receiverCompleted(0); BOOST_CHECK_EQUAL(s.receiverGetUnknownComplete(), - SequenceSet(SequenceSet() + SequenceSet::Range(0,2))); + SequenceSet(SequenceSet() + qpid::Range(0,2))); s.receiverKnownCompleted(SequenceSet(SequenceSet()+1)); BOOST_CHECK_EQUAL(s.receiverGetUnknownComplete(), SequenceSet(SequenceSet()+2)); // TODO aconway 2008-04-30: missing tests for known-completed. -- cgit v1.2.1 From 56694ed82a8132f0985166ab6288a51eaf7c1a76 Mon Sep 17 00:00:00 2001 From: Gordon Sim Date: Thu, 29 May 2008 11:45:29 +0000 Subject: Only record frames for replay if timeout is non-zero. git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk@661302 13f79535-47bb-0310-9956-ffa450edef68 --- qpid/cpp/src/tests/SessionState.cpp | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'qpid/cpp/src/tests/SessionState.cpp') diff --git a/qpid/cpp/src/tests/SessionState.cpp b/qpid/cpp/src/tests/SessionState.cpp index 43b949cfff..51259bac2b 100644 --- a/qpid/cpp/src/tests/SessionState.cpp +++ b/qpid/cpp/src/tests/SessionState.cpp @@ -127,6 +127,7 @@ using qpid::SessionPoint; QPID_AUTO_TEST_CASE(testSendGetReplyList) { qpid::SessionState s; + s.setTimeout(1); s.senderGetCommandPoint(); transfer1(s, "abc"); transfers(s, "def"); @@ -142,6 +143,7 @@ QPID_AUTO_TEST_CASE(testNeedFlush) { // sync after 2 1-byte transfers or equivalent bytes. c.replayFlushLimit = 2*(transferFrameSize()+contentFrameSize()); qpid::SessionState s(SessionId(), c); + s.setTimeout(1); s.senderGetCommandPoint(); transfers(s, "a"); BOOST_CHECK(!s.senderNeedFlush()); @@ -161,6 +163,7 @@ QPID_AUTO_TEST_CASE(testPeerConfirmed) { // sync after 2 1-byte transfers or equivalent bytes. c.replayFlushLimit = 2*(transferFrameSize()+contentFrameSize()); qpid::SessionState s(SessionId(), c); + s.setTimeout(1); s.senderGetCommandPoint(); transfers(s, "ab"); BOOST_CHECK(s.senderNeedFlush()); @@ -191,6 +194,7 @@ QPID_AUTO_TEST_CASE(testPeerConfirmed) { QPID_AUTO_TEST_CASE(testPeerCompleted) { qpid::SessionState s; + s.setTimeout(1); s.senderGetCommandPoint(); // Completion implies confirmation transfers(s, "abc"); -- cgit v1.2.1 From 563e02f00fd35634cde9db8eaa6c9f29c1456afb Mon Sep 17 00:00:00 2001 From: Alan Conway Date: Wed, 4 Jun 2008 16:00:17 +0000 Subject: Increased default flush interval to 1MB, send spontaneous known-completed at the flush interval. git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk@663271 13f79535-47bb-0310-9956-ffa450edef68 --- qpid/cpp/src/tests/SessionState.cpp | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) (limited to 'qpid/cpp/src/tests/SessionState.cpp') diff --git a/qpid/cpp/src/tests/SessionState.cpp b/qpid/cpp/src/tests/SessionState.cpp index 51259bac2b..ba966da9b1 100644 --- a/qpid/cpp/src/tests/SessionState.cpp +++ b/qpid/cpp/src/tests/SessionState.cpp @@ -260,4 +260,41 @@ QPID_AUTO_TEST_CASE(testCompleted) { // TODO aconway 2008-04-30: missing tests for known-completed. } +QPID_AUTO_TEST_CASE(testNeedKnownCompleted) { + size_t flushInterval= 2*(transferFrameSize()+contentFrameSize())+1; + qpid::SessionState::Configuration c(flushInterval); + qpid::SessionState s(qpid::SessionId(), c); + s.senderGetCommandPoint(); + transfers(s, "a"); + SequenceSet set(SequenceSet() + 0); + s.senderCompleted(set); + BOOST_CHECK(!s.senderNeedKnownCompleted()); + + transfers(s, "b"); + set += 1; + s.senderCompleted(set); + BOOST_CHECK(!s.senderNeedKnownCompleted()); + + transfers(s, "c"); + set += 2; + s.senderCompleted(set); + BOOST_CHECK(s.senderNeedKnownCompleted()); + s.senderRecordKnownCompleted(); + BOOST_CHECK(!s.senderNeedKnownCompleted()); + + transfers(s, "de"); + set += 3; + set += 4; + s.senderCompleted(set); + BOOST_CHECK(!s.senderNeedKnownCompleted()); + + transfers(s, "f"); + set += 2; + s.senderCompleted(set); + BOOST_CHECK(s.senderNeedKnownCompleted()); + s.senderRecordKnownCompleted(); + BOOST_CHECK(!s.senderNeedKnownCompleted()); +} + + QPID_AUTO_TEST_SUITE_END() -- cgit v1.2.1 From 071fff099bd18bbbadbb90e344052ef877cefc32 Mon Sep 17 00:00:00 2001 From: Alan Conway Date: Tue, 7 Oct 2008 17:24:24 +0000 Subject: Rename size() to encodedSize() for encoded types to allow std collection interfaces for types like FieldTable and Array. git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk@702551 13f79535-47bb-0310-9956-ffa450edef68 --- qpid/cpp/src/tests/SessionState.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'qpid/cpp/src/tests/SessionState.cpp') diff --git a/qpid/cpp/src/tests/SessionState.cpp b/qpid/cpp/src/tests/SessionState.cpp index ba966da9b1..2db25f9fe8 100644 --- a/qpid/cpp/src/tests/SessionState.cpp +++ b/qpid/cpp/src/tests/SessionState.cpp @@ -85,7 +85,7 @@ AMQFrame contentFrameChar(char content, bool isLast=true) { } // Send frame & return size of frame. -size_t send(qpid::SessionState& s, const AMQFrame& f) { s.senderRecord(f); return f.size(); } +size_t send(qpid::SessionState& s, const AMQFrame& f) { s.senderRecord(f); return f.encodedSize(); } // Send transfer command with no content. size_t transfer0(qpid::SessionState& s) { return send(s, transferFrame(false)); } // Send transfer frame with single content frame. @@ -116,8 +116,8 @@ size_t transfers(qpid::SessionState& s, string content) { bind(transfer1Char, ref(s), _1)); } -size_t contentFrameSize(size_t n=1) { return AMQFrame(in_place()).size() + n; } -size_t transferFrameSize() { return AMQFrame(in_place()).size(); } +size_t contentFrameSize(size_t n=1) { return AMQFrame(in_place()).encodedSize() + n; } +size_t transferFrameSize() { return AMQFrame(in_place()).encodedSize(); } // ==== qpid::SessionState test classes -- cgit v1.2.1 From 3e26ae40844c3f9e612a0e3a2f98ba1576ee520c Mon Sep 17 00:00:00 2001 From: Alan Conway Date: Thu, 22 Jan 2009 20:29:12 +0000 Subject: Removed BodyHolder: minor performance improvement, opens the way for more efficient memory management. git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@736783 13f79535-47bb-0310-9956-ffa450edef68 --- qpid/cpp/src/tests/SessionState.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) (limited to 'qpid/cpp/src/tests/SessionState.cpp') diff --git a/qpid/cpp/src/tests/SessionState.cpp b/qpid/cpp/src/tests/SessionState.cpp index 2db25f9fe8..5e21ff2b70 100644 --- a/qpid/cpp/src/tests/SessionState.cpp +++ b/qpid/cpp/src/tests/SessionState.cpp @@ -45,8 +45,7 @@ T applyAccumulate(Iter begin, Iter end, T seed, const F& f) { // Create a frame with a one-char string. AMQFrame& frame(char s) { - static AMQFrame frame; - frame.setBody(AMQContentBody(string(&s, 1))); + static AMQFrame frame((AMQContentBody(string(&s, 1)))); return frame; } @@ -64,7 +63,7 @@ string str(const boost::iterator_range::const_iterator>& frames } // Make a transfer command frame. AMQFrame transferFrame(bool hasContent) { - AMQFrame t(in_place()); + AMQFrame t((MessageTransferBody())); t.setFirstFrame(true); t.setLastFrame(true); t.setFirstSegment(true); @@ -73,7 +72,7 @@ AMQFrame transferFrame(bool hasContent) { } // Make a content frame AMQFrame contentFrame(string content, bool isLast=true) { - AMQFrame f(in_place(content)); + AMQFrame f((AMQContentBody(content))); f.setFirstFrame(true); f.setLastFrame(true); f.setFirstSegment(false); @@ -116,8 +115,8 @@ size_t transfers(qpid::SessionState& s, string content) { bind(transfer1Char, ref(s), _1)); } -size_t contentFrameSize(size_t n=1) { return AMQFrame(in_place()).encodedSize() + n; } -size_t transferFrameSize() { return AMQFrame(in_place()).encodedSize(); } +size_t contentFrameSize(size_t n=1) { return AMQFrame(( AMQContentBody())).encodedSize() + n; } +size_t transferFrameSize() { return AMQFrame((MessageTransferBody())).encodedSize(); } // ==== qpid::SessionState test classes @@ -134,7 +133,7 @@ QPID_AUTO_TEST_CASE(testSendGetReplyList) { transferN(s, "xyz"); BOOST_CHECK_EQUAL(str(s.senderExpected(SessionPoint(0,0))),"CabcCdCeCfCxyz"); // Ignore controls. - s.senderRecord(AMQFrame(in_place())); + s.senderRecord(AMQFrame(new SessionFlushBody())); BOOST_CHECK_EQUAL(str(s.senderExpected(SessionPoint(2,0))),"CeCfCxyz"); } -- cgit v1.2.1 From ffd20ee19a5fd027e0007c27a12dd402dbeca4f8 Mon Sep 17 00:00:00 2001 From: Alan Conway Date: Tue, 14 Jul 2009 14:32:39 +0000 Subject: Add directory to #include git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@793909 13f79535-47bb-0310-9956-ffa450edef68 --- qpid/cpp/src/tests/SessionState.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'qpid/cpp/src/tests/SessionState.cpp') diff --git a/qpid/cpp/src/tests/SessionState.cpp b/qpid/cpp/src/tests/SessionState.cpp index 5e21ff2b70..41010d7ef3 100644 --- a/qpid/cpp/src/tests/SessionState.cpp +++ b/qpid/cpp/src/tests/SessionState.cpp @@ -16,7 +16,7 @@ * */ -#include "unit_test.h" +#include "tests/unit_test.h" #include "qpid/SessionState.h" #include "qpid/Exception.h" -- cgit v1.2.1 From 795b3bb9e5c033abf33635119694e21e7143fc0a Mon Sep 17 00:00:00 2001 From: Alan Conway Date: Tue, 14 Jul 2009 14:41:22 +0000 Subject: Remove incorrect directory from #include git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@793912 13f79535-47bb-0310-9956-ffa450edef68 --- qpid/cpp/src/tests/SessionState.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'qpid/cpp/src/tests/SessionState.cpp') diff --git a/qpid/cpp/src/tests/SessionState.cpp b/qpid/cpp/src/tests/SessionState.cpp index 41010d7ef3..5e21ff2b70 100644 --- a/qpid/cpp/src/tests/SessionState.cpp +++ b/qpid/cpp/src/tests/SessionState.cpp @@ -16,7 +16,7 @@ * */ -#include "tests/unit_test.h" +#include "unit_test.h" #include "qpid/SessionState.h" #include "qpid/Exception.h" -- cgit v1.2.1 From 9259c46ecb8c5f3e98441080a26914bdea59bffe Mon Sep 17 00:00:00 2001 From: Andrew Stitcher Date: Wed, 9 Sep 2009 19:46:56 +0000 Subject: Tidied up namespace usage Miscelleneous whitespace fixes git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@813094 13f79535-47bb-0310-9956-ffa450edef68 --- qpid/cpp/src/tests/SessionState.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) (limited to 'qpid/cpp/src/tests/SessionState.cpp') diff --git a/qpid/cpp/src/tests/SessionState.cpp b/qpid/cpp/src/tests/SessionState.cpp index 5e21ff2b70..157cabfb63 100644 --- a/qpid/cpp/src/tests/SessionState.cpp +++ b/qpid/cpp/src/tests/SessionState.cpp @@ -28,6 +28,9 @@ #include #include +namespace qpid { +namespace tests { + QPID_AUTO_TEST_SUITE(SessionStateTestSuite) using namespace std; @@ -94,7 +97,7 @@ size_t transfer1(qpid::SessionState& s, string content) { size_t transfer1Char(qpid::SessionState& s, char content) { return transfer1(s, string(1,content)); } - + // Send transfer frame with multiple single-byte content frames. size_t transferN(qpid::SessionState& s, string content) { size_t size=send(s, transferFrame(!content.empty())); @@ -134,7 +137,7 @@ QPID_AUTO_TEST_CASE(testSendGetReplyList) { BOOST_CHECK_EQUAL(str(s.senderExpected(SessionPoint(0,0))),"CabcCdCeCfCxyz"); // Ignore controls. s.senderRecord(AMQFrame(new SessionFlushBody())); - BOOST_CHECK_EQUAL(str(s.senderExpected(SessionPoint(2,0))),"CeCfCxyz"); + BOOST_CHECK_EQUAL(str(s.senderExpected(SessionPoint(2,0))),"CeCfCxyz"); } QPID_AUTO_TEST_CASE(testNeedFlush) { @@ -185,7 +188,7 @@ QPID_AUTO_TEST_CASE(testPeerConfirmed) { s.senderConfirmed(SessionPoint(5)); BOOST_CHECK_EQUAL(str(s.senderExpected(SessionPoint(5,0))), "CxCy"); BOOST_CHECK(s.senderNeedFlush()); - + s.senderConfirmed(SessionPoint(6)); BOOST_CHECK_EQUAL(str(s.senderExpected(SessionPoint(6,0))), "Cy"); BOOST_CHECK(!s.senderNeedFlush()); @@ -195,7 +198,7 @@ QPID_AUTO_TEST_CASE(testPeerCompleted) { qpid::SessionState s; s.setTimeout(1); s.senderGetCommandPoint(); - // Completion implies confirmation + // Completion implies confirmation transfers(s, "abc"); BOOST_CHECK_EQUAL(str(s.senderExpected(SessionPoint(0,0))), "CaCbCc"); SequenceSet set(SequenceSet() + 0 + 1); @@ -205,7 +208,7 @@ QPID_AUTO_TEST_CASE(testPeerCompleted) { transfers(s, "def"); // We dont do out-of-order confirmation, so this will only confirm up to 3: set = SequenceSet(SequenceSet() + 2 + 3 + 5); - s.senderCompleted(set); + s.senderCompleted(set); BOOST_CHECK_EQUAL(str(s.senderExpected(SessionPoint(4,0))), "CeCf"); } @@ -215,11 +218,11 @@ QPID_AUTO_TEST_CASE(testReceive) { s.receiverSetCommandPoint(SessionPoint()); BOOST_CHECK_EQUAL(s.receiverGetExpected(), SessionPoint(0)); BOOST_CHECK_EQUAL(s.receiverGetReceived(), SessionPoint(0)); - + BOOST_CHECK(s.receiverRecord(transferFrame(false))); BOOST_CHECK_EQUAL(s.receiverGetExpected(), SessionPoint(1)); BOOST_CHECK_EQUAL(s.receiverGetReceived(), SessionPoint(1)); - + BOOST_CHECK(s.receiverRecord(transferFrame(true))); SessionPoint point = SessionPoint(1, transferFrameSize()); BOOST_CHECK_EQUAL(s.receiverGetExpected(), point); @@ -297,3 +300,5 @@ QPID_AUTO_TEST_CASE(testNeedKnownCompleted) { QPID_AUTO_TEST_SUITE_END() + +}} // namespace qpid::tests -- cgit v1.2.1