diff options
| -rw-r--r-- | Swiften/Queries/Request.cpp | 32 | ||||
| -rw-r--r-- | Swiften/Queries/UnitTest/RequestTest.cpp | 35 | 
2 files changed, 50 insertions, 17 deletions
| diff --git a/Swiften/Queries/Request.cpp b/Swiften/Queries/Request.cpp index 7adf13c..359c6a6 100644 --- a/Swiften/Queries/Request.cpp +++ b/Swiften/Queries/Request.cpp @@ -39,25 +39,27 @@ void Request::send() {  bool Request::handleIQ(boost::shared_ptr<IQ> iq) {  	bool handled = false; -	if (sent_ && iq->getID() == id_) { -		if (iq->getType() == IQ::Result) { -			boost::shared_ptr<Payload> payload = iq->getPayloadOfSameType(payload_); -			if (!payload && boost::dynamic_pointer_cast<RawXMLPayload>(payload_) && !iq->getPayloads().empty()) { -				payload = iq->getPayloads().front(); -			} -			handleResponse(payload, ErrorPayload::ref()); -		} -		else { -			ErrorPayload::ref errorPayload = iq->getPayload<ErrorPayload>(); -			if (errorPayload) { -				handleResponse(boost::shared_ptr<Payload>(), errorPayload); +	if (iq->getType() == IQ::Result || iq->getType() == IQ::Error) { +		if (sent_ && iq->getID() == id_) { +			if (iq->getType() == IQ::Result) { +				boost::shared_ptr<Payload> payload = iq->getPayloadOfSameType(payload_); +				if (!payload && boost::dynamic_pointer_cast<RawXMLPayload>(payload_) && !iq->getPayloads().empty()) { +					payload = iq->getPayloads().front(); +				} +				handleResponse(payload, ErrorPayload::ref());  			}  			else { -				handleResponse(boost::shared_ptr<Payload>(), ErrorPayload::ref(new ErrorPayload(ErrorPayload::UndefinedCondition))); +				ErrorPayload::ref errorPayload = iq->getPayload<ErrorPayload>(); +				if (errorPayload) { +					handleResponse(boost::shared_ptr<Payload>(), errorPayload); +				} +				else { +					handleResponse(boost::shared_ptr<Payload>(), ErrorPayload::ref(new ErrorPayload(ErrorPayload::UndefinedCondition))); +				}  			} +			router_->removeHandler(this); +			handled = true;  		} -		router_->removeHandler(this); -		handled = true;  	}  	return handled;  } diff --git a/Swiften/Queries/UnitTest/RequestTest.cpp b/Swiften/Queries/UnitTest/RequestTest.cpp index c2e2390..b1d1b07 100644 --- a/Swiften/Queries/UnitTest/RequestTest.cpp +++ b/Swiften/Queries/UnitTest/RequestTest.cpp @@ -29,6 +29,8 @@ class RequestTest : public CppUnit::TestFixture {  		CPPUNIT_TEST(testHandleIQ_BeforeSend);  		CPPUNIT_TEST(testHandleIQ_DifferentPayload);  		CPPUNIT_TEST(testHandleIQ_RawXMLPayload); +		CPPUNIT_TEST(testHandleIQ_GetWithSameID); +		CPPUNIT_TEST(testHandleIQ_SetWithSameID);  		CPPUNIT_TEST_SUITE_END();  	public: @@ -122,14 +124,14 @@ class RequestTest : public CppUnit::TestFixture {  			testling.send();  			boost::shared_ptr<IQ> error = createError("test-id"); -			boost::shared_ptr<Payload> errorPayload = boost::shared_ptr<ErrorPayload>(new ErrorPayload(ErrorPayload::FeatureNotImplemented)); +			boost::shared_ptr<Payload> errorPayload = boost::shared_ptr<ErrorPayload>(new ErrorPayload(ErrorPayload::InternalServerError));  			error->addPayload(errorPayload);  			channel_->onIQReceived(error);  			CPPUNIT_ASSERT_EQUAL(0, responsesReceived_);  			CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(receivedErrors.size()));  			CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(channel_->iqs_.size())); -			CPPUNIT_ASSERT_EQUAL(ErrorPayload::FeatureNotImplemented, receivedErrors[0].getCondition()); +			CPPUNIT_ASSERT_EQUAL(ErrorPayload::InternalServerError, receivedErrors[0].getCondition());  		}  		void testHandleIQ_ErrorWithoutPayload() { @@ -182,6 +184,35 @@ class RequestTest : public CppUnit::TestFixture {  			CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(channel_->iqs_.size()));  		} +	 void testHandleIQ_GetWithSameID() { +			MyRequest testling(IQ::Get, JID("foo@bar.com/baz"), payload_, router_); +			testling.onResponse.connect(boost::bind(&RequestTest::handleResponse, this, _1, _2)); +			testling.send(); + +			boost::shared_ptr<IQ> response = createResponse("test-id"); +			response->setType(IQ::Get); +			channel_->onIQReceived(response); + +			CPPUNIT_ASSERT_EQUAL(0, responsesReceived_); +			CPPUNIT_ASSERT_EQUAL(0, static_cast<int>(receivedErrors.size())); +			CPPUNIT_ASSERT_EQUAL(2, static_cast<int>(channel_->iqs_.size())); +		} + +		void testHandleIQ_SetWithSameID() { +			MyRequest testling(IQ::Get, JID("foo@bar.com/baz"), payload_, router_); +			testling.onResponse.connect(boost::bind(&RequestTest::handleResponse, this, _1, _2)); +			testling.send(); + +			boost::shared_ptr<IQ> response = createResponse("test-id"); +			response->setType(IQ::Set); +			channel_->onIQReceived(response); + +			CPPUNIT_ASSERT_EQUAL(0, responsesReceived_); +			CPPUNIT_ASSERT_EQUAL(0, static_cast<int>(receivedErrors.size())); +			CPPUNIT_ASSERT_EQUAL(2, static_cast<int>(channel_->iqs_.size())); +		} + +  	private:  		void handleResponse(boost::shared_ptr<Payload> p, ErrorPayload::ref e) {  			if (e) { | 
 Swift
 Swift