/* * Copyright (c) 2013 Tobias Markmann * Licensed under the simplified BSD license. * See Documentation/Licenses/BSD-simplified.txt for more information. */ /* * Copyright (c) 2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include #include #include #include #include #include #include #include using namespace Swift; class ClientBlockListManagerTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(ClientBlockListManagerTest); CPPUNIT_TEST(testFetchBlockList); CPPUNIT_TEST(testBlockCommand); CPPUNIT_TEST(testUnblockCommand); CPPUNIT_TEST(testUnblockAllCommand); CPPUNIT_TEST_SUITE_END(); public: void setUp() { ownJID_ = JID("kev@wonderland.lit"); stanzaChannel_ = new DummyStanzaChannel(); iqRouter_ = new IQRouter(stanzaChannel_); iqRouter_->setJID(ownJID_); clientBlockListManager_ = new ClientBlockListManager(iqRouter_); } void testFetchBlockList() { std::vector blockJids; blockJids.push_back(JID("romeo@montague.net")); blockJids.push_back(JID("iago@shakespeare.lit")); helperInitialBlockListFetch(blockJids); CPPUNIT_ASSERT_EQUAL(static_cast(2), clientBlockListManager_->getBlockList()->getItems().size()); } void testBlockCommand() { // start with an already fetched block list helperInitialBlockListFetch(std::vector(1, JID("iago@shakespeare.lit"))); CPPUNIT_ASSERT_EQUAL(static_cast(1), clientBlockListManager_->getBlockList()->getItems().size()); CPPUNIT_ASSERT_EQUAL(BlockList::Available, clientBlockListManager_->getBlockList()->getState()); GenericRequest::ref blockRequest = clientBlockListManager_->createBlockJIDRequest(JID("romeo@montague.net")); blockRequest->send(); IQ::ref request = stanzaChannel_->getStanzaAtIndex(2); CPPUNIT_ASSERT(request.get() != nullptr); std::shared_ptr blockPayload = request->getPayload(); CPPUNIT_ASSERT(blockPayload.get() != nullptr); CPPUNIT_ASSERT_EQUAL(JID("romeo@montague.net"), blockPayload->getItems().at(0)); IQ::ref blockRequestResponse = IQ::createResult(request->getFrom(), JID(), request->getID()); stanzaChannel_->sendIQ(blockRequestResponse); stanzaChannel_->onIQReceived(blockRequestResponse); CPPUNIT_ASSERT_EQUAL(static_cast(1), clientBlockListManager_->getBlockList()->getItems().size()); // send block push std::shared_ptr pushPayload = std::make_shared(); pushPayload->addItem(JID("romeo@montague.net")); IQ::ref blockPush = IQ::createRequest(IQ::Set, ownJID_, "push1", pushPayload); stanzaChannel_->sendIQ(blockPush); stanzaChannel_->onIQReceived(blockPush); std::vector blockedJIDs = clientBlockListManager_->getBlockList()->getItems(); CPPUNIT_ASSERT(blockedJIDs.end() != std::find(blockedJIDs.begin(), blockedJIDs.end(), JID("romeo@montague.net"))); } void testUnblockCommand() { // start with an already fetched block list std::vector initialBlockList = std::vector(1, JID("iago@shakespeare.lit")); initialBlockList.push_back(JID("romeo@montague.net")); helperInitialBlockListFetch(initialBlockList); CPPUNIT_ASSERT_EQUAL(static_cast(2), clientBlockListManager_->getBlockList()->getItems().size()); CPPUNIT_ASSERT_EQUAL(BlockList::Available, clientBlockListManager_->getBlockList()->getState()); GenericRequest::ref unblockRequest = clientBlockListManager_->createUnblockJIDRequest(JID("romeo@montague.net")); unblockRequest->send(); IQ::ref request = stanzaChannel_->getStanzaAtIndex(2); CPPUNIT_ASSERT(request.get() != nullptr); std::shared_ptr unblockPayload = request->getPayload(); CPPUNIT_ASSERT(unblockPayload.get() != nullptr); CPPUNIT_ASSERT_EQUAL(JID("romeo@montague.net"), unblockPayload->getItems().at(0)); IQ::ref unblockRequestResponse = IQ::createResult(request->getFrom(), JID(), request->getID()); stanzaChannel_->sendIQ(unblockRequestResponse); stanzaChannel_->onIQReceived(unblockRequestResponse); CPPUNIT_ASSERT_EQUAL(static_cast(2), clientBlockListManager_->getBlockList()->getItems().size()); // send block push std::shared_ptr pushPayload = std::make_shared(); pushPayload->addItem(JID("romeo@montague.net")); IQ::ref unblockPush = IQ::createRequest(IQ::Set, ownJID_, "push1", pushPayload); stanzaChannel_->sendIQ(unblockPush); stanzaChannel_->onIQReceived(unblockPush); std::vector blockedJIDs = clientBlockListManager_->getBlockList()->getItems(); CPPUNIT_ASSERT(blockedJIDs.end() == std::find(blockedJIDs.begin(), blockedJIDs.end(), JID("romeo@montague.net"))); } void testUnblockAllCommand() { // start with an already fetched block list std::vector initialBlockList = std::vector(1, JID("iago@shakespeare.lit")); initialBlockList.push_back(JID("romeo@montague.net")); initialBlockList.push_back(JID("benvolio@montague.net")); helperInitialBlockListFetch(initialBlockList); CPPUNIT_ASSERT_EQUAL(static_cast(3), clientBlockListManager_->getBlockList()->getItems().size()); CPPUNIT_ASSERT_EQUAL(BlockList::Available, clientBlockListManager_->getBlockList()->getState()); GenericRequest::ref unblockRequest = clientBlockListManager_->createUnblockAllRequest(); unblockRequest->send(); IQ::ref request = stanzaChannel_->getStanzaAtIndex(2); CPPUNIT_ASSERT(request.get() != nullptr); std::shared_ptr unblockPayload = request->getPayload(); CPPUNIT_ASSERT(unblockPayload.get() != nullptr); CPPUNIT_ASSERT_EQUAL(true, unblockPayload->getItems().empty()); IQ::ref unblockRequestResponse = IQ::createResult(request->getFrom(), JID(), request->getID()); stanzaChannel_->sendIQ(unblockRequestResponse); stanzaChannel_->onIQReceived(unblockRequestResponse); CPPUNIT_ASSERT_EQUAL(static_cast(3), clientBlockListManager_->getBlockList()->getItems().size()); // send block push std::shared_ptr pushPayload = std::make_shared(); IQ::ref unblockPush = IQ::createRequest(IQ::Set, ownJID_, "push1", pushPayload); stanzaChannel_->sendIQ(unblockPush); stanzaChannel_->onIQReceived(unblockPush); CPPUNIT_ASSERT_EQUAL(true, clientBlockListManager_->getBlockList()->getItems().empty()); } void tearDown() { delete clientBlockListManager_; delete iqRouter_; delete stanzaChannel_; } private: void helperInitialBlockListFetch(const std::vector& blockedJids) { std::shared_ptr blockList = clientBlockListManager_->requestBlockList(); CPPUNIT_ASSERT(blockList); // check for IQ request IQ::ref request = stanzaChannel_->getStanzaAtIndex(0); CPPUNIT_ASSERT(request.get() != nullptr); std::shared_ptr requestPayload = request->getPayload(); CPPUNIT_ASSERT(requestPayload.get() != nullptr); CPPUNIT_ASSERT_EQUAL(BlockList::Requesting, blockList->getState()); CPPUNIT_ASSERT_EQUAL(BlockList::Requesting, clientBlockListManager_->getBlockList()->getState()); // build IQ response std::shared_ptr responsePayload = std::make_shared(); for (const auto& jid : blockedJids) { responsePayload->addItem(jid); } IQ::ref response = IQ::createResult(ownJID_, JID(), request->getID(), responsePayload); stanzaChannel_->sendIQ(response); stanzaChannel_->onIQReceived(response); CPPUNIT_ASSERT_EQUAL(BlockList::Available, clientBlockListManager_->getBlockList()->getState()); CPPUNIT_ASSERT(responsePayload->getItems() == clientBlockListManager_->getBlockList()->getItems()); } private: JID ownJID_; IQRouter* iqRouter_; DummyStanzaChannel* stanzaChannel_; ClientBlockListManager* clientBlockListManager_; }; CPPUNIT_TEST_SUITE_REGISTRATION(ClientBlockListManagerTest);