summaryrefslogtreecommitdiff
path: root/cpp/src/tests/EventChannelConnectionTest.cpp
diff options
context:
space:
mode:
authorAndrew Stitcher <astitcher@apache.org>2007-04-02 11:40:48 +0000
committerAndrew Stitcher <astitcher@apache.org>2007-04-02 11:40:48 +0000
commit16e203a0d32df9829bcf4fb738ef89fc94404155 (patch)
treeb5dbb15f4a238ca377236ce16140443e20ed3e4a /cpp/src/tests/EventChannelConnectionTest.cpp
parentfb410c63d08e87019b3d2a8d85820ae809758f62 (diff)
downloadqpid-python-16e203a0d32df9829bcf4fb738ef89fc94404155.tar.gz
Fix for the most disruptive items in QPID-243.
* All #include lines now use '""' rather than '<>' where appropriate. * #include lines within the qpid project use relative includes so that the same path will work in /usr/include when installed as part of the client libraries. * All the source code has now been rearranged to be under src in a directory analogous to the namespace of the classes in it. git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@524769 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/tests/EventChannelConnectionTest.cpp')
-rw-r--r--cpp/src/tests/EventChannelConnectionTest.cpp109
1 files changed, 109 insertions, 0 deletions
diff --git a/cpp/src/tests/EventChannelConnectionTest.cpp b/cpp/src/tests/EventChannelConnectionTest.cpp
new file mode 100644
index 0000000000..24cd492441
--- /dev/null
+++ b/cpp/src/tests/EventChannelConnectionTest.cpp
@@ -0,0 +1,109 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 <iostream>
+#include <boost/bind.hpp>
+#include "../framing/AMQHeartbeatBody.h"
+#include "../framing/AMQFrame.h"
+#include "../sys/posix/EventChannelConnection.h"
+#include "../sys/ConnectionInputHandler.h"
+#include "../sys/ConnectionInputHandlerFactory.h"
+#include "../sys/Socket.h"
+#include "qpid_test_plugin.h"
+#include "MockConnectionInputHandler.h"
+
+using namespace qpid::sys;
+using namespace qpid::framing;
+using namespace std;
+
+class EventChannelConnectionTest : public CppUnit::TestCase
+{
+ CPPUNIT_TEST_SUITE(EventChannelConnectionTest);
+ CPPUNIT_TEST(testSendReceive);
+ CPPUNIT_TEST(testCloseExternal);
+ CPPUNIT_TEST(testCloseException);
+ CPPUNIT_TEST_SUITE_END();
+
+ public:
+
+ void setUp() {
+ threads = EventChannelThreads::create();
+ CPPUNIT_ASSERT_EQUAL(0, ::pipe(pipe));
+ connection.reset(
+ new EventChannelConnection(threads, factory, pipe[0], pipe[1]));
+ CPPUNIT_ASSERT(factory.handler != 0);
+ }
+
+ void tearDown() {
+ threads->shutdown();
+ threads->join();
+ }
+
+ void testSendReceive()
+ {
+ // Send a protocol initiation.
+ Buffer buf(1024);
+ ProtocolInitiation(4,2).encode(buf);
+ buf.flip();
+ ssize_t n = write(pipe[1], buf.start(), buf.available());
+ CPPUNIT_ASSERT_EQUAL(ssize_t(buf.available()), n);
+
+ // Verify session handler got the protocol init.
+ ProtocolInitiation init = factory.handler->waitForProtocolInit();
+ CPPUNIT_ASSERT_EQUAL(int(4), int(init.getMajor()));
+ CPPUNIT_ASSERT_EQUAL(int(2), int(init.getMinor()));
+
+ // Send a heartbeat frame, verify connection got it.
+ connection->send(new AMQFrame(42, new AMQHeartbeatBody()));
+ AMQFrame frame = factory.handler->waitForFrame();
+ CPPUNIT_ASSERT_EQUAL(uint16_t(42), frame.getChannel());
+ CPPUNIT_ASSERT_EQUAL(uint8_t(HEARTBEAT_BODY),
+ frame.getBody()->type());
+ threads->shutdown();
+ }
+
+ // Make sure the handler is closed if the connection is closed.
+ void testCloseExternal() {
+ connection->close();
+ factory.handler->waitForClosed();
+ }
+
+ // Make sure the handler is closed if the connection closes or fails.
+ // TODO aconway 2006-12-18: logs exception message in test output.
+ void testCloseException() {
+ ::close(pipe[0]);
+ ::close(pipe[1]);
+ // TODO aconway 2006-12-18: Shouldn't this be failing?
+ connection->send(new AMQFrame(42, new AMQHeartbeatBody()));
+ factory.handler->waitForClosed();
+ }
+
+ private:
+ EventChannelThreads::shared_ptr threads;
+ int pipe[2];
+ std::auto_ptr<EventChannelConnection> connection;
+ MockConnectionInputHandlerFactory factory;
+};
+
+// Make this test suite a plugin.
+CPPUNIT_PLUGIN_IMPLEMENT();
+CPPUNIT_TEST_SUITE_REGISTRATION(EventChannelConnectionTest);
+