public int OnSubscriptionEvent(SubscriptionEvent e) { return (getClass() == SipCallback.class) ? tinyWRAPJNI.SipCallback_OnSubscriptionEvent( swigCPtr, this, SubscriptionEvent.getCPtr(e), e) : tinyWRAPJNI.SipCallback_OnSubscriptionEventSwigExplicitSipCallback( swigCPtr, this, SubscriptionEvent.getCPtr(e), e); }
@Test public void testPassingValidSubscriptionSendsOutExpectedNotifications() throws Exception { IQ request = toIq( readStanzaAsString("/iq/pubsub/subscribe/authorizationPendingGrantReply.stanza") .replaceFirst("subscription='subscribed'", "subscription='subscribed'")); NodeAffiliation subscriptionMockActor = Mockito.mock(NodeAffiliation.class); Mockito.when(subscriptionMockActor.getAffiliation()).thenReturn(Affiliations.owner); NodeSubscription subscriptionMockSubscriber = Mockito.mock(NodeSubscription.class); Mockito.when(subscriptionMockSubscriber.getSubscription()).thenReturn(Subscriptions.subscribed); Mockito.when(dataStore.nodeExists(node)).thenReturn(true); Mockito.when(dataStore.getUserAffiliation(node, jid)).thenReturn(subscriptionMockActor); Mockito.when(dataStore.getUserSubscription(node, new JID(subscriber))) .thenReturn(subscriptionMockSubscriber); event.setChannelManager(dataStore); ArrayList<NodeSubscription> subscribers = new ArrayList<NodeSubscription>(); subscribers.add(new NodeSubscriptionMock(new JID("*****@*****.**"))); subscribers.add(new NodeSubscriptionMock(new JID("*****@*****.**"))); Mockito.doReturn(new ResultSetImpl<NodeSubscription>(subscribers)) .when(dataStore) .getNodeSubscriptionListeners(Mockito.anyString()); event.setChannelManager(dataStore); event.process(element, jid, request, null); Assert.assertEquals(2, queue.size()); Packet notification = queue.poll(100, TimeUnit.MILLISECONDS); Assert.assertEquals("*****@*****.**", notification.getTo().toString()); notification = queue.poll(100, TimeUnit.MILLISECONDS); Assert.assertEquals("*****@*****.**", notification.getTo().toString()); Assert.assertEquals( node, notification.getElement().element("event").element("subscription").attributeValue("node")); Assert.assertTrue(notification.toXML().contains(JabberPubsub.NS_PUBSUB_EVENT)); Assert.assertEquals( "subscribed", notification .getElement() .element("event") .element("subscription") .attributeValue("subscription")); Assert.assertEquals( subscriber, notification.getElement().element("event").element("subscription").attributeValue("jid")); }
@Test public void testNonExistantNodeRetunsErrorStanza() throws Exception { Mockito.when(dataStore.nodeExists(node)).thenReturn(false); event.setChannelManager(dataStore); event.process(element, jid, request, null); Packet response = queue.poll(100, TimeUnit.MILLISECONDS); PacketError error = response.getError(); Assert.assertNotNull(error); Assert.assertEquals(PacketError.Type.cancel, error.getType()); Assert.assertEquals(PacketError.Condition.item_not_found, error.getCondition()); }
@Test public void testUserWithoutSubscriptionReturnsErrorStanza() throws Exception { Mockito.when(dataStore.nodeExists(node)).thenReturn(true); Mockito.when(dataStore.getUserSubscription(node, jid)).thenReturn(null); event.setChannelManager(dataStore); event.process(element, jid, request, null); Packet response = queue.poll(100, TimeUnit.MILLISECONDS); PacketError error = response.getError(); Assert.assertNotNull(error); Assert.assertEquals(PacketError.Type.auth, error.getType()); Assert.assertEquals(PacketError.Condition.not_authorized, error.getCondition()); }
@Before public void setUp() throws Exception { queue = new LinkedBlockingQueue<Packet>(); event = new SubscriptionEvent(queue, dataStore); request = readStanzaAsIq("/iq/pubsub/subscribe/authorizationPendingGrantReply.stanza"); event.setServerDomain("shakespeare.lit"); element = new BaseElement("subscriptions"); element.addAttribute("node", node); dataStore = Mockito.mock(ChannelManager.class); Mockito.when(dataStore.isLocalNode(Mockito.anyString())).thenReturn(true); event.setChannelManager(dataStore); }
@Test public void testUserWhoIsntOwnerOrModeratorCantUpdateSubscription() throws Exception { NodeAffiliation subscriptionMock = Mockito.mock(NodeAffiliation.class); Mockito.when(subscriptionMock.getAffiliation()).thenReturn(Affiliations.member); Mockito.when(dataStore.nodeExists(node)).thenReturn(true); Mockito.when(dataStore.getUserAffiliation(node, jid)).thenReturn(subscriptionMock); event.setChannelManager(dataStore); event.process(element, jid, request, null); Packet response = queue.poll(100, TimeUnit.MILLISECONDS); PacketError error = response.getError(); Assert.assertNotNull(error); Assert.assertEquals(PacketError.Type.auth, error.getType()); Assert.assertEquals(PacketError.Condition.not_authorized, error.getCondition()); }
@Test public void testSubscribingUserMustHaveExistingSubscriptionToUpdate() throws Exception { NodeAffiliation subscriptionMockActor = Mockito.mock(NodeAffiliation.class); Mockito.when(subscriptionMockActor.getAffiliation()).thenReturn(Affiliations.owner); Mockito.when(dataStore.nodeExists(node)).thenReturn(true); Mockito.when(dataStore.getUserAffiliation(node, jid)).thenReturn(subscriptionMockActor); Mockito.when(dataStore.getUserSubscription(node, new JID(subscriber))).thenReturn(null); event.setChannelManager(dataStore); event.process(element, jid, request, null); Packet response = queue.poll(100, TimeUnit.MILLISECONDS); PacketError error = response.getError(); Assert.assertNotNull(error); Assert.assertEquals(PacketError.Type.modify, error.getType()); Assert.assertEquals(PacketError.Condition.unexpected_request, error.getCondition()); }
@Test public void testNotProvidingNodeAttributeReturnsErrorStanza() throws Exception { BaseElement element = new BaseElement("subscriptions"); event.process(element, jid, request, null); Packet response = queue.poll(100, TimeUnit.MILLISECONDS); PacketError error = response.getError(); Assert.assertNotNull(error); Assert.assertEquals(PacketError.Type.modify, error.getType()); Assert.assertEquals("nodeid-required", error.getApplicationConditionName()); }
@Test public void testNodeStoreExceptionResultsInInternalServerErrorStanza() throws Exception { Mockito.when(dataStore.nodeExists(Mockito.anyString())).thenThrow(NodeStoreException.class); event.process(element, jid, request, null); Packet response = queue.poll(100, TimeUnit.MILLISECONDS); PacketError error = response.getError(); Assert.assertNotNull(error); Assert.assertEquals(PacketError.Type.wait, error.getType()); Assert.assertEquals(PacketError.Condition.internal_server_error, error.getCondition()); }
@Test @Ignore("Need to work out how to check set subscription values") public void testPassingInvalidSubscriptionTypeSetsSubscriptionToNone() throws Exception { IQ request = toIq( readStanzaAsString("/iq/pubsub/subscribe/authorizationPendingGrantReply.stanza") .replaceFirst( "subscription='subscribed'", "subscription='i-can-haz-all-the-items'")); NodeAffiliation subscriptionMockActor = Mockito.mock(NodeAffiliation.class); Mockito.when(subscriptionMockActor.getAffiliation()).thenReturn(Affiliations.owner); NodeSubscription subscriptionMockSubscriber = Mockito.mock(NodeSubscription.class); Mockito.when(subscriptionMockSubscriber.getSubscription()).thenReturn(Subscriptions.subscribed); Mockito.when(dataStore.nodeExists(node)).thenReturn(true); Mockito.when(dataStore.getUserAffiliation(node, jid)).thenReturn(subscriptionMockActor); Mockito.doCallRealMethod() .when(dataStore) .addUserSubscription(Mockito.any(NodeSubscription.class)); Mockito.when(dataStore.getUserSubscription(node, new JID(subscriber))) .thenReturn(subscriptionMockSubscriber); event.setChannelManager(dataStore); event.process(element, jid, request, null); NodeSubscription subscriptionMock = new NodeSubscriptionImpl( node, new JID("*****@*****.**"), new JID("*****@*****.**"), Subscriptions.none); /* * subscriptionMock Mockito.anyString(), Mockito.any(JID.class), * Mockito.any(JID.class), Mockito.eq(Subscriptions.none)); */ Mockito.verify(dataStore).addUserSubscription(subscriptionMock); }
@Test public void testNotProvidingSubscriptionAttributeReturnsErrorStanza() throws Exception { IQ request = toIq( readStanzaAsString("/iq/pubsub/subscribe/authorizationPendingGrantReply.stanza") .replaceFirst("subscription='subscribed'", "")); event.process(element, jid, request, null); Packet response = queue.poll(100, TimeUnit.MILLISECONDS); PacketError error = response.getError(); Assert.assertNotNull(error); Assert.assertEquals(PacketError.Type.modify, error.getType()); Assert.assertEquals(PacketError.Condition.bad_request, error.getCondition()); }
@Test public void testPassingNotSubscriptionsAsElementNameReturnsFalse() { Element element = new BaseElement("not-subscriptions"); Assert.assertFalse(event.accept(element)); }
@Test public void testPassingSubscriptionsAsElementNameReturnsTrue() { Element element = new BaseElement("subscriptions"); Assert.assertTrue(event.accept(element)); }
/** * We unsubscribe from presence notification deliveries concerning IcqTesterAgent's presence * status and verify that we receive the subscription removed event. We then make the tester agent * change status and make sure that no notifications are delivered. * * @throws java.lang.Exception in case unsubscribing fails. */ public void postTestUnsubscribe() throws Exception { logger.debug("Testing Unsubscribe and unsubscription event dispatch."); // First create a subscription and verify that it really gets created. SubscriptionEventCollector subEvtCollector = new SubscriptionEventCollector(); operationSetPresence.addSubscriptionListener(subEvtCollector); Contact icqTesterAgentContact = operationSetPresence.findContactByID(fixture.testerAgent.getIcqUIN()); assertNotNull( "Failed to find an existing subscription for the tester agent", icqTesterAgentContact); synchronized (subEvtCollector) { operationSetPresence.unsubscribe(icqTesterAgentContact); subEvtCollector.waitForEvent(40000); // don't want any more events operationSetPresence.removeSubscriptionListener(subEvtCollector); } assertEquals( "Subscription event dispatching failed.", 1, subEvtCollector.collectedEvents.size()); SubscriptionEvent subEvt = (SubscriptionEvent) subEvtCollector.collectedEvents.get(0); assertEquals("SubscriptionEvent Source:", icqTesterAgentContact, subEvt.getSource()); assertEquals( "SubscriptionEvent Source Contact:", icqTesterAgentContact, subEvt.getSourceContact()); assertSame("SubscriptionEvent Source Provider:", fixture.provider, subEvt.getSourceProvider()); subEvtCollector.collectedEvents.clear(); // make the user agent tester change its states and make sure we don't // get notifications as we're now unsubscribed. logger.debug("Testing (lack of) presence notifications."); IcqStatusEnum testerAgentOldStatus = fixture.testerAgent.getPresneceStatus(); IcqStatusEnum testerAgentNewStatus = IcqStatusEnum.FREE_FOR_CHAT; long testerAgentNewStatusLong = FullUserInfo.ICQSTATUS_FFC; // in case we are by any chance already in a FREE_FOR_CHAT status, we'll // be changing to something else if (testerAgentOldStatus.equals(testerAgentNewStatus)) { testerAgentNewStatus = IcqStatusEnum.DO_NOT_DISTURB; testerAgentNewStatusLong = FullUserInfo.ICQSTATUS_DND; } // now do the actual status notification testing ContactPresenceEventCollector contactPresEvtCollector = new ContactPresenceEventCollector(fixture.testerAgent.getIcqUIN(), null); operationSetPresence.addContactPresenceStatusListener(contactPresEvtCollector); synchronized (contactPresEvtCollector) { if (!fixture.testerAgent.enterStatus(testerAgentNewStatusLong)) { throw new RuntimeException( "Tester UserAgent Failed to switch to the " + testerAgentNewStatus.getStatusName() + " state."); } // we may already have the event, but it won't hurt to check. contactPresEvtCollector.waitForEvent(10000); operationSetPresence.removeContactPresenceStatusListener(contactPresEvtCollector); } assertEquals( "Presence Notifications were received after unsubscibing.", 0, contactPresEvtCollector.collectedEvents.size()); }
/** * The method would add a subscription for a contact, wait for a subscription event confirming the * subscription, then change the status of the newly added contact (which is actually the * IcqTesterAgent) and make sure that the corresponding notification events have been generated. * * @throws java.lang.Exception if an exception occurs during testing. */ public void postTestSubscribe() throws Exception { logger.debug("Testing Subscription and Subscription Event Dispatch."); // First create a subscription and verify that it really gets created. SubscriptionEventCollector subEvtCollector = new SubscriptionEventCollector(); logger.trace("set Auth Handler"); operationSetPresence.setAuthorizationHandler(authEventCollector); synchronized (authEventCollector) { authEventCollector.authorizationRequestReason = "Please deny my request!"; fixture.testerAgent.getAuthCmdFactory().responseReasonStr = "First authorization I will Deny!!!"; fixture.testerAgent.getAuthCmdFactory().ACCEPT = false; operationSetPresence.subscribe(fixture.testerAgent.getIcqUIN()); // this one collects event that the buddy has been added // to the list as awaiting SubscriptionEventCollector moveEvtCollector = new SubscriptionEventCollector(); operationSetPresence.addSubscriptionListener(moveEvtCollector); logger.debug("Waiting for authorization error and authorization response..."); authEventCollector.waitForAuthResponse(15000); assertTrue( "Error adding buddy not recieved or the buddy(" + fixture.testerAgent.getIcqUIN() + ") doesn't require authorization", authEventCollector.isAuthorizationRequestSent); assertNotNull( "Agent haven't received any reason for authorization", fixture.testerAgent.getAuthCmdFactory().requestReasonStr); assertEquals( "Error sent request reason is not as the received one", authEventCollector.authorizationRequestReason, fixture.testerAgent.getAuthCmdFactory().requestReasonStr); logger.debug( "authEventCollector.isAuthorizationResponseReceived " + authEventCollector.isAuthorizationResponseReceived); assertTrue("Response not received!", authEventCollector.isAuthorizationResponseReceived); boolean isAcceptedAuthReuest = authEventCollector.response.getResponseCode().equals(AuthorizationResponse.ACCEPT); assertEquals( "Response is not as the sent one", fixture.testerAgent.getAuthCmdFactory().ACCEPT, isAcceptedAuthReuest); assertNotNull( "We didn't receive any reason! ", authEventCollector.authorizationResponseString); assertEquals( "The sent response reason is not as the received one", fixture.testerAgent.getAuthCmdFactory().responseReasonStr, authEventCollector.authorizationResponseString); // here we must wait for server to move the awaiting buddy // to the first specified group synchronized (moveEvtCollector) { moveEvtCollector.waitForEvent(20000); // don't want any more events operationSetPresence.removeSubscriptionListener(moveEvtCollector); } Contact c = operationSetPresence.findContactByID(fixture.testerAgent.getIcqUIN()); logger.debug("I will remove " + c + " from group : " + c.getParentContactGroup()); UnsubscribeWait unsubscribeEvtCollector = new UnsubscribeWait(); operationSetPresence.addSubscriptionListener(unsubscribeEvtCollector); synchronized (unsubscribeEvtCollector) { operationSetPresence.unsubscribe(c); logger.debug("Waiting to be removed..."); unsubscribeEvtCollector.waitForUnsubscribre(20000); logger.debug("Received unsubscribed ok or we lost patients!"); // don't want any more events operationSetPresence.removeSubscriptionListener(unsubscribeEvtCollector); } // so we haven't asserted so everithing is fine lets try to be authorized authEventCollector.authorizationRequestReason = "Please accept my request!"; fixture.testerAgent.getAuthCmdFactory().responseReasonStr = "Second authorization I will Accept!!!"; fixture.testerAgent.getAuthCmdFactory().ACCEPT = true; // clear some things authEventCollector.isAuthorizationRequestSent = false; authEventCollector.isAuthorizationResponseReceived = false; authEventCollector.authorizationResponseString = null; logger.debug( "I will add buddy does it exists ? " + (operationSetPresence.findContactByID(fixture.testerAgent.getIcqUIN()) != null)); // add the listener beacuse now our authorization will be accepted // and so the buddy will be finally added to the list operationSetPresence.addSubscriptionListener(subEvtCollector); // subscribe again so we can trigger again the authorization procedure operationSetPresence.subscribe(fixture.testerAgent.getIcqUIN()); logger.debug( "Waiting ... Subscribe must fail and the authorization process " + "to be trigered again so waiting for auth response ..."); authEventCollector.waitForAuthResponse(15000); assertTrue( "Error adding buddy not recieved or the buddy(" + fixture.testerAgent.getIcqUIN() + ") doesn't require authorization", authEventCollector.isAuthorizationRequestSent); assertNotNull( "Agent haven't received any reason for authorization", fixture.testerAgent.getAuthCmdFactory().requestReasonStr); // not working for now assertEquals( "Error sent request reason", authEventCollector.authorizationRequestReason, fixture.testerAgent.getAuthCmdFactory().requestReasonStr); // wait for authorization process to be finnished // the modification of buddy (server will inform us // that he removed - awaiting authorization flag) Object obj = new Object(); synchronized (obj) { logger.debug("wait for authorization process to be finnished"); obj.wait(10000); logger.debug("Stop waiting!"); } subEvtCollector.waitForEvent(10000); // don't want any more events operationSetPresence.removeSubscriptionListener(subEvtCollector); } // after adding awaitingAuthorization group here are catched 3 events // 1 - creating unresolved contact // 2 - move of the contact to awaitingAuthorization group // 3 - move of the contact from awaitingAuthorization group to original group assertTrue( "Subscription event dispatching failed.", subEvtCollector.collectedEvents.size() > 0); EventObject evt = null; Iterator<EventObject> events = subEvtCollector.collectedEvents.iterator(); while (events.hasNext()) { EventObject elem = events.next(); if (elem instanceof SubscriptionEvent) { if (((SubscriptionEvent) elem).getEventID() == SubscriptionEvent.SUBSCRIPTION_CREATED) evt = (SubscriptionEvent) elem; } } Object source = null; Contact srcContact = null; ProtocolProviderService srcProvider = null; // the event can be SubscriptionEvent and the new added one // SubscriptionMovedEvent if (evt instanceof SubscriptionEvent) { SubscriptionEvent subEvt = (SubscriptionEvent) evt; source = subEvt.getSource(); srcContact = subEvt.getSourceContact(); srcProvider = subEvt.getSourceProvider(); } assertEquals( "SubscriptionEvent Source:", fixture.testerAgent.getIcqUIN(), ((Contact) source).getAddress()); assertEquals( "SubscriptionEvent Source Contact:", fixture.testerAgent.getIcqUIN(), srcContact.getAddress()); assertSame("SubscriptionEvent Source Provider:", fixture.provider, srcProvider); subEvtCollector.collectedEvents.clear(); // make the user agent tester change its states and make sure we are // notified logger.debug("Testing presence notifications."); IcqStatusEnum testerAgentOldStatus = fixture.testerAgent.getPresneceStatus(); IcqStatusEnum testerAgentNewStatus = IcqStatusEnum.FREE_FOR_CHAT; long testerAgentNewStatusLong = FullUserInfo.ICQSTATUS_FFC; // in case we are by any chance already in a FREE_FOR_CHAT status, we'll // be changing to something else if (testerAgentOldStatus.equals(testerAgentNewStatus)) { testerAgentNewStatus = IcqStatusEnum.DO_NOT_DISTURB; testerAgentNewStatusLong = FullUserInfo.ICQSTATUS_DND; } // now do the actual status notification testing ContactPresenceEventCollector contactPresEvtCollector = new ContactPresenceEventCollector(fixture.testerAgent.getIcqUIN(), testerAgentNewStatus); operationSetPresence.addContactPresenceStatusListener(contactPresEvtCollector); synchronized (contactPresEvtCollector) { if (!fixture.testerAgent.enterStatus(testerAgentNewStatusLong)) { throw new RuntimeException( "Tester UserAgent Failed to switch to the " + testerAgentNewStatus.getStatusName() + " state."); } // we may already have the event, but it won't hurt to check. contactPresEvtCollector.waitForEvent(12000); operationSetPresence.removeContactPresenceStatusListener(contactPresEvtCollector); } if (contactPresEvtCollector.collectedEvents.size() == 0) { logger.info( "PROBLEM. Authorisation process doesn't have finnished " + "Server doesn't report us for changing authorization flag! Will try to authorize once again"); fixture.testerAgent.sendAuthorizationReplay( fixture.icqAccountID.getUserID(), fixture.testerAgent.getAuthCmdFactory().responseReasonStr, fixture.testerAgent.getAuthCmdFactory().ACCEPT); Object obj = new Object(); synchronized (obj) { logger.debug("wait for authorization process to be finnished for second time"); obj.wait(10000); logger.debug("Stop waiting!"); } testerAgentOldStatus = fixture.testerAgent.getPresneceStatus(); testerAgentNewStatusLong = FullUserInfo.ICQSTATUS_FFC; // in case we are by any chance already in a FREE_FOR_CHAT status, we'll // be changing to something else if (testerAgentOldStatus.equals(testerAgentNewStatus)) { testerAgentNewStatus = IcqStatusEnum.OCCUPIED; testerAgentNewStatusLong = FullUserInfo.ICQSTATUS_OCCUPIED; } contactPresEvtCollector = new ContactPresenceEventCollector(fixture.testerAgent.getIcqUIN(), testerAgentNewStatus); operationSetPresence.addContactPresenceStatusListener(contactPresEvtCollector); synchronized (contactPresEvtCollector) { if (!fixture.testerAgent.enterStatus(testerAgentNewStatusLong)) { throw new RuntimeException( "Tester UserAgent Failed to switch to the " + testerAgentNewStatus.getStatusName() + " state."); } // we may already have the event, but it won't hurt to check. contactPresEvtCollector.waitForEvent(12000); operationSetPresence.removeContactPresenceStatusListener(contactPresEvtCollector); } } assertEquals( "Presence Notif. event dispatching failed.", 1, contactPresEvtCollector.collectedEvents.size()); ContactPresenceStatusChangeEvent presEvt = (ContactPresenceStatusChangeEvent) contactPresEvtCollector.collectedEvents.get(0); assertEquals( "Presence Notif. event Source:", fixture.testerAgent.getIcqUIN(), ((Contact) presEvt.getSource()).getAddress()); assertEquals( "Presence Notif. event Source Contact:", fixture.testerAgent.getIcqUIN(), presEvt.getSourceContact().getAddress()); assertSame( "Presence Notif. event Source Provider:", fixture.provider, presEvt.getSourceProvider()); PresenceStatus reportedNewStatus = presEvt.getNewStatus(); PresenceStatus reportedOldStatus = presEvt.getOldStatus(); assertEquals("Reported new PresenceStatus: ", testerAgentNewStatus, reportedNewStatus); // don't require equality between the reported old PresenceStatus and // the actual presence status of the tester agent because a first // notification is not supposed to have the old status as it really was. assertNotNull("Reported old PresenceStatus: ", reportedOldStatus); /** @todo tester agent changes status message we see the new message */ /** @todo we should see the alias of the tester agent. */ Object obj = new Object(); synchronized (obj) { logger.debug("wait a moment. give time to server"); obj.wait(4000); } }