INT-3541: The XMPP Extension Support on Outbound

JIRA: https://jira.spring.io/browse/INT-3541

Address PR comments
This commit is contained in:
Artem Bilan
2016-03-25 16:28:47 -04:00
committed by Gary Russell
parent c97ac195a5
commit b363bdb15e
7 changed files with 192 additions and 26 deletions

View File

@@ -13,10 +13,13 @@
<int:channel id="outboundEventChannel"/>
<bean id="testExtensionProvider" class="org.jivesoftware.smackx.gcm.provider.GcmExtensionProvider"/>
<int-xmpp:outbound-channel-adapter id="outboundEventAdapter"
channel="outboundEventChannel"
xmpp-connection="testConnection"
mapped-request-headers="foo*, bar*"/>
mapped-request-headers="foo*, bar*"
extension-provider="testExtensionProvider"/>
<int:channel id="outboundPollingChannel">
<int:queue/>

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2015 the original author or authors.
* Copyright 2002-2016 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -17,12 +17,14 @@
package org.springframework.integration.xmpp.config;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.provider.ExtensionElementProvider;
import org.jivesoftware.smackx.jiveproperties.JivePropertiesManager;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -32,21 +34,21 @@ import org.mockito.stubbing.Answer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.integration.mapping.AbstractHeaderMapper;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageChannel;
import org.springframework.integration.channel.QueueChannel;
import org.springframework.messaging.MessageHandler;
import org.springframework.messaging.SubscribableChannel;
import org.springframework.integration.endpoint.EventDrivenConsumer;
import org.springframework.integration.endpoint.PollingConsumer;
import org.springframework.integration.handler.advice.AbstractRequestHandlerAdvice;
import org.springframework.messaging.support.GenericMessage;
import org.springframework.integration.mapping.AbstractHeaderMapper;
import org.springframework.integration.support.MessageBuilder;
import org.springframework.integration.test.util.TestUtils;
import org.springframework.integration.xmpp.XmppHeaders;
import org.springframework.integration.xmpp.support.DefaultXmppHeaderMapper;
import org.springframework.integration.xmpp.support.XmppHeaderMapper;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.MessageHandler;
import org.springframework.messaging.SubscribableChannel;
import org.springframework.messaging.support.GenericMessage;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@@ -67,6 +69,9 @@ public class ChatMessageOutboundChannelAdapterParserTests {
@Autowired
private XmppHeaderMapper headerMapper;
@Autowired
private ExtensionElementProvider<?> extensionElementProvider;
private static volatile int adviceCalled;
@Test
@@ -107,6 +112,11 @@ public class ChatMessageOutboundChannelAdapterParserTests {
assertFalse(requestHeaderMatcher.matchHeader("biz"));
assertFalse(requestHeaderMatcher.matchHeader("else"));
assertTrue(eventConsumer instanceof EventDrivenConsumer);
MessageHandler outboundEventAdapterHandle =
context.getBean("outboundEventAdapter.handler", MessageHandler.class);
assertSame(this.extensionElementProvider,
TestUtils.getPropertyValue(outboundEventAdapterHandle, "extensionProvider"));
}
@SuppressWarnings("rawtypes")

View File

@@ -16,14 +16,21 @@
package org.springframework.integration.xmpp.outbound;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smackx.gcm.packet.GcmPacketExtension;
import org.jivesoftware.smackx.gcm.provider.GcmExtensionProvider;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.ArgumentMatcher;
import org.mockito.Mockito;
@@ -46,7 +53,7 @@ public class ChatMessageSendingMessageHandlerTests {
@Test
public void validateMessagePostAsString() throws Exception {
public void testSendMessages() throws Exception {
XMPPConnection connection = mock(XMPPConnection.class);
ChatMessageSendingMessageHandler handler = new ChatMessageSendingMessageHandler(connection);
handler.setBeanFactory(mock(BeanFactory.class));
@@ -92,6 +99,28 @@ public class ChatMessageSendingMessageHandlerTests {
// in threaded conversation we need to look for existing chat
verify(connection, times(1)).sendStanza(Mockito.argThat(new EqualSmackMessageWithThreadId()));
reset(connection);
final String json = "{\"foo\": \"bar\"}";
message = MessageBuilder.withPayload(new GcmPacketExtension(json))
.setHeader(XmppHeaders.TO, "kermit@frog.com")
.build();
handler.handleMessage(message);
class EqualExtension extends ArgumentMatcher<org.jivesoftware.smack.packet.Message> {
@Override
public boolean matches(Object msg) {
org.jivesoftware.smack.packet.Message smackMessage = (org.jivesoftware.smack.packet.Message) msg;
boolean bodyMatches = smackMessage.getBody() == null;
boolean toMatches = smackMessage.getTo().equals("kermit@frog.com");
GcmPacketExtension gcmPacketExtension = GcmPacketExtension.from(smackMessage);
boolean jsonMatches = gcmPacketExtension != null && gcmPacketExtension.getJson().equals(json);
return bodyMatches & toMatches & jsonMatches;
}
}
verify(connection, times(1)).sendStanza(Mockito.argThat(new EqualExtension()));
}
@Test
@@ -124,6 +153,39 @@ public class ChatMessageSendingMessageHandlerTests {
verify(connection, times(1)).sendStanza(smackMessage);
}
@Test
public void testExtensionProvider() throws Exception {
XMPPConnection connection = mock(XMPPConnection.class);
ChatMessageSendingMessageHandler handler = new ChatMessageSendingMessageHandler(connection);
GcmExtensionProvider extensionElementProvider = spy(new GcmExtensionProvider());
handler.setExtensionProvider(extensionElementProvider);
handler.setBeanFactory(mock(BeanFactory.class));
handler.afterPropertiesSet();
final String json = "{\"foo\": \"bar\"}";
Message<?> message = MessageBuilder.withPayload(" <f foo='foo'>" + json + "</f> ")
.setHeader(XmppHeaders.TO, "kermit@frog.com")
.build();
handler.handleMessage(message);
ArgumentCaptor<org.jivesoftware.smack.packet.Message> argumentCaptor =
ArgumentCaptor.forClass(org.jivesoftware.smack.packet.Message.class);
verify(connection).sendStanza(argumentCaptor.capture());
org.jivesoftware.smack.packet.Message smackMessage = argumentCaptor.getValue();
assertNull(smackMessage.getBody());
assertEquals("kermit@frog.com", smackMessage.getTo());
GcmPacketExtension gcmPacketExtension = GcmPacketExtension.from(smackMessage);
assertNotNull(gcmPacketExtension);
assertEquals(json, gcmPacketExtension.getJson());
verify(extensionElementProvider).from(eq(json));
}
@Test(expected = MessageHandlingException.class)
public void validateFailureNoChatToUser() throws Exception {
ChatMessageSendingMessageHandler handler = new ChatMessageSendingMessageHandler(mock(XMPPConnection.class));