From eded58915fd89e8b008ba7e078c5967fdef9f4cb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Remko=20Tron=C3=A7on?= <git@el-tramo.be>
Date: Fri, 12 Jun 2009 12:03:34 +0200
Subject: Added IQRouterTest.


diff --git a/Swiften/Queries/UnitTest/IQRouterTest.cpp b/Swiften/Queries/UnitTest/IQRouterTest.cpp
new file mode 100644
index 0000000..8fa8d2a
--- /dev/null
+++ b/Swiften/Queries/UnitTest/IQRouterTest.cpp
@@ -0,0 +1,116 @@
+#include <cppunit/extensions/HelperMacros.h>
+#include <cppunit/extensions/TestFactoryRegistry.h>
+#include <boost/shared_ptr.hpp>
+#include <boost/bind.hpp>
+
+#include "Swiften/Queries/IQHandler.h"
+#include "Swiften/Queries/IQRouter.h"
+#include "Swiften/Queries/DummyIQChannel.h"
+
+using namespace Swift;
+
+class IQRouterTest : public CppUnit::TestFixture
+{
+		CPPUNIT_TEST_SUITE(IQRouterTest);
+		CPPUNIT_TEST(testHandleIQ_SuccesfulHandlerFirst);
+		CPPUNIT_TEST(testHandleIQ_SuccesfulHandlerLast);
+		CPPUNIT_TEST(testHandleIQ_NoSuccesfulHandler);
+		CPPUNIT_TEST(testHandleIQ_HandlerRemovedDuringHandle);
+		CPPUNIT_TEST_SUITE_END();
+
+	public:
+		IQRouterTest() {}
+
+		void setUp() {
+			channel_ = new DummyIQChannel();
+		}
+
+		void tearDown() {
+			delete channel_;
+		}
+
+		void testHandleIQ_SuccesfulHandlerFirst() {
+			IQRouter testling(channel_);
+			DummyIQHandler handler1(true, &testling);
+			DummyIQHandler handler2(false, &testling);
+
+			channel_->onIQReceived(boost::shared_ptr<IQ>(new IQ()));
+
+			CPPUNIT_ASSERT_EQUAL(1, handler1.called);
+			CPPUNIT_ASSERT_EQUAL(0, handler2.called);
+			CPPUNIT_ASSERT_EQUAL(0, static_cast<int>(channel_->iqs_.size()));
+		}
+
+		void testHandleIQ_SuccesfulHandlerLast() {
+			IQRouter testling(channel_);
+			DummyIQHandler handler1(false, &testling);
+			DummyIQHandler handler2(true, &testling);
+
+			channel_->onIQReceived(boost::shared_ptr<IQ>(new IQ()));
+
+			CPPUNIT_ASSERT_EQUAL(1, handler1.called);
+			CPPUNIT_ASSERT_EQUAL(1, handler2.called);
+			CPPUNIT_ASSERT_EQUAL(0, static_cast<int>(channel_->iqs_.size()));
+		}
+
+		void testHandleIQ_NoSuccesfulHandler() {
+			IQRouter testling(channel_);
+			DummyIQHandler handler(false, &testling);
+
+			channel_->onIQReceived(boost::shared_ptr<IQ>(new IQ()));
+
+			CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(channel_->iqs_.size()));
+			CPPUNIT_ASSERT(channel_->iqs_[0]->getPayload<Error>());
+		}
+
+
+		void testHandleIQ_HandlerRemovedDuringHandle() {
+			IQRouter testling(channel_);
+			RemovingIQHandler handler1(&testling);
+			DummyIQHandler handler2(true, &testling);
+
+			channel_->onIQReceived(boost::shared_ptr<IQ>(new IQ()));
+			channel_->onIQReceived(boost::shared_ptr<IQ>(new IQ()));
+
+			CPPUNIT_ASSERT_EQUAL(1, handler1.called);
+			CPPUNIT_ASSERT_EQUAL(2, handler2.called);
+		}
+	
+	private:
+		struct DummyIQHandler : public IQHandler {
+			DummyIQHandler(bool handle, IQRouter* router) : handle(handle), router(router), called(0) {
+				router->addHandler(this);
+			}
+
+			~DummyIQHandler() {
+				router->removeHandler(this);
+			}
+
+			virtual bool handleIQ(boost::shared_ptr<IQ>) {
+				called++;
+				return handle;
+			}
+			bool handle;
+			IQRouter* router;
+			int called;
+		};
+
+		struct RemovingIQHandler : public IQHandler {
+			RemovingIQHandler(IQRouter* router) : router(router), called(0) {
+				router->addHandler(this);
+			}
+
+			virtual bool handleIQ(boost::shared_ptr<IQ>) {
+				called++;
+				router->removeHandler(this);
+				return false;
+			}
+			IQRouter* router;
+			int called;
+		};
+
+
+		DummyIQChannel* channel_;
+};
+
+CPPUNIT_TEST_SUITE_REGISTRATION(IQRouterTest);
diff --git a/Swiften/Queries/UnitTest/Makefile.inc b/Swiften/Queries/UnitTest/Makefile.inc
index 265357f..a269c11 100644
--- a/Swiften/Queries/UnitTest/Makefile.inc
+++ b/Swiften/Queries/UnitTest/Makefile.inc
@@ -1,3 +1,4 @@
 UNITTEST_SOURCES += \
+	Swiften/Queries/UnitTest/IQRouterTest.cpp \
 	Swiften/Queries/UnitTest/RequestTest.cpp \
 	Swiften/Queries/UnitTest/ResponderTest.cpp
-- 
cgit v0.10.2-6-g49f6