@Override public void initiateIncomingSession(final JingleTransportInitiationCallback callback) { LOGGER.log(Level.INFO, "Await Jingle InBandBytestream session."); InBandBytestreamManager.getByteStreamManager(jingleSession.getConnection()).addIncomingBytestreamListener(new BytestreamListener() { @Override public void incomingBytestreamRequest(BytestreamRequest request) { if (request.getFrom().asFullJidIfPossible().equals(jingleSession.getRemote()) && request.getSessionID().equals(theirProposal.getSessionId())) { BytestreamSession session; try { session = request.accept(); } catch (InterruptedException | SmackException | XMPPException.XMPPErrorException e) { callback.onException(e); return; } callback.onSessionInitiated(session); } } }); }
/** * If a user specific listener and an all requests listener is registered only the user specific * listener should be notified. * * @throws Exception should not happen */ @Test public void shouldNotInvokeAllRequestsListenerIfUserListenerExists() throws Exception { // add listener for all request InBandBytestreamListener allRequestsListener = mock(InBandBytestreamListener.class); byteStreamManager.addIncomingBytestreamListener(allRequestsListener); // add listener for request of user "initiator" InBandBytestreamListener userRequestsListener = mock(InBandBytestreamListener.class); byteStreamManager.addIncomingBytestreamListener(userRequestsListener, initiatorJID); // run the listener with the initiation packet initiationListener.handleIQRequest(initBytestream); // wait because packet is processed in an extra thread Thread.sleep(200); // assert user request listener is called once ArgumentCaptor<BytestreamRequest> byteStreamRequest = ArgumentCaptor.forClass(BytestreamRequest.class); verify(userRequestsListener).incomingBytestreamRequest(byteStreamRequest.capture()); // assert all requests listener is not called byteStreamRequest = ArgumentCaptor.forClass(BytestreamRequest.class); verify(allRequestsListener, never()).incomingBytestreamRequest(byteStreamRequest.capture()); }
/** * If a user specific listener and an all requests listener is registered only the all requests * listener should be notified on an incoming request for another user. * * @throws Exception should not happen */ @Test public void shouldInvokeAllRequestsListenerIfUserListenerExists() throws Exception { // add listener for all request InBandBytestreamListener allRequestsListener = mock(InBandBytestreamListener.class); byteStreamManager.addIncomingBytestreamListener(allRequestsListener); // add listener for request of user "other_initiator" InBandBytestreamListener userRequestsListener = mock(InBandBytestreamListener.class); byteStreamManager.addIncomingBytestreamListener(userRequestsListener, JidCreate.from("other_" + initiatorJID)); // run the listener with the initiation packet initiationListener.handleIQRequest(initBytestream); // wait because packet is processed in an extra thread Thread.sleep(200); // assert user request listener is not called ArgumentCaptor<BytestreamRequest> byteStreamRequest = ArgumentCaptor.forClass(BytestreamRequest.class); verify(userRequestsListener, never()).incomingBytestreamRequest(byteStreamRequest.capture()); // assert all requests listener is called byteStreamRequest = ArgumentCaptor.forClass(BytestreamRequest.class); verify(allRequestsListener).incomingBytestreamRequest(byteStreamRequest.capture()); }
/** * If a listener for all requests is registered it should be notified on incoming requests. * * @throws Exception should not happen */ @Test public void shouldInvokeListenerForAllRequests() throws Exception { // add listener InBandBytestreamListener listener = mock(InBandBytestreamListener.class); byteStreamManager.addIncomingBytestreamListener(listener); // run the listener with the initiation packet initiationListener.handleIQRequest(initBytestream); // wait because packet is processed in an extra thread Thread.sleep(200); // assert listener is called once ArgumentCaptor<BytestreamRequest> byteStreamRequest = ArgumentCaptor.forClass(BytestreamRequest.class); verify(listener).incomingBytestreamRequest(byteStreamRequest.capture()); // assert that listener is called for the correct request assertEquals(initiatorJID, byteStreamRequest.getValue().getFrom()); }
/** * If a listener for a specific user in registered it should be notified on incoming requests * for that user. * * @throws Exception should not happen */ @Test public void shouldInvokeListenerForUser() throws Exception { // add listener InBandBytestreamListener listener = mock(InBandBytestreamListener.class); byteStreamManager.addIncomingBytestreamListener(listener, initiatorJID); // run the listener with the initiation packet initiationListener.handleIQRequest(initBytestream); // wait because packet is processed in an extra thread Thread.sleep(200); // assert listener is called once ArgumentCaptor<BytestreamRequest> byteStreamRequest = ArgumentCaptor.forClass(BytestreamRequest.class); verify(listener).incomingBytestreamRequest(byteStreamRequest.capture()); // assert that reply is the correct error packet assertEquals(initiatorJID, byteStreamRequest.getValue().getFrom()); }
byteStreamManager.addIncomingBytestreamListener(allRequestsListener); byteStreamManager.addIncomingBytestreamListener(userRequestsListener, initiatorJID);
/** * If listener for a specific user is registered it should not be notified on incoming requests * from other users. * * @throws Exception should not happen */ @Test public void shouldNotInvokeListenerForUser() throws Exception { // add listener for request of user "other_initiator" InBandBytestreamListener listener = mock(InBandBytestreamListener.class); byteStreamManager.addIncomingBytestreamListener(listener, JidCreate.from("other_" + initiatorJID)); // run the listener with the initiation packet initiationListener.handleIQRequest(initBytestream); // wait because packet is processed in an extra thread Thread.sleep(200); // assert listener is not called ArgumentCaptor<BytestreamRequest> byteStreamRequest = ArgumentCaptor.forClass(BytestreamRequest.class); verify(listener, never()).incomingBytestreamRequest(byteStreamRequest.capture()); // capture reply to the In-Band Bytestream open request ArgumentCaptor<IQ> argument = ArgumentCaptor.forClass(IQ.class); verify(connection).sendStanza(argument.capture()); // assert that reply is the correct error packet assertEquals(initiatorJID, argument.getValue().getTo()); assertEquals(IQ.Type.error, argument.getValue().getType()); assertEquals(StanzaError.Condition.not_acceptable, argument.getValue().getError().getCondition()); }