/*
* Copyright 2002-2009 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.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.flex.messaging;
import org.junit.After;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
import static org.mockito.Matchers.isA;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import java.beans.PropertyEditor;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;
import org.springframework.flex.config.json.JsonConfigMapPropertyEditor;
import org.springframework.flex.core.AbstractMessageBrokerTests;
import org.springframework.test.util.ReflectionTestUtils;
import flex.messaging.FlexContext;
import flex.messaging.MessageDestination;
import flex.messaging.cluster.ClusterManager;
import flex.messaging.config.ConfigMap;
import flex.messaging.config.SecurityConstraint;
import flex.messaging.config.ThrottleSettings;
import flex.messaging.security.LoginManager;
import flex.messaging.services.MessageService;
import flex.messaging.services.messaging.adapters.ActionScriptAdapter;
import flex.messaging.services.messaging.adapters.MessagingAdapter;
public class MessageDestinationFactoryTests extends AbstractMessageBrokerTests {
MessageDestinationFactory factory;
MessageService service;
@Mock
private BeanFactory beanFactory;
@Mock
LoginManager loginManager;
@Mock
ClusterManager clusterManager;
LoginManager originalLoginManager;
ClusterManager originalClusterManager;
@Before
public void setUp() throws Exception {
if (!getServicesConfigPath().equals(getCurrentConfigPath())) {
setDirty();
}
MockitoAnnotations.initMocks(this);
this.service = (MessageService) getMessageBroker().getServiceByType(MessageService.class.getName());
this.originalLoginManager = getMessageBroker().getLoginManager();
this.originalClusterManager = getMessageBroker().getClusterManager();
getMessageBroker().setLoginManager(this.loginManager);
ReflectionTestUtils.setField(getMessageBroker(), "clusterManager", this.clusterManager);
}
@After
public void tearDown() throws Exception {
getMessageBroker().setLoginManager(this.originalLoginManager);
ReflectionTestUtils.setField(getMessageBroker(), "clusterManager", this.originalClusterManager);
}
@Test
public void defaultDestinationCreated() throws Exception {
this.factory = new MessageDestinationFactory();
this.factory.setBeanName("foo1");
this.factory.setMessageBroker(getMessageBroker());
this.factory.setBeanFactory(this.beanFactory);
this.factory.afterPropertiesSet();
MessageDestination destination = (MessageDestination) this.service.getDestination("foo1");
assertNotNull(destination);
assertEquals("foo1", destination.getId());
assertTrue(destination.isStarted());
assertNotNull(destination.getAdapter());
assertTrue(destination.getAdapter() instanceof ActionScriptAdapter);
assertTrue(destination.getAdapter().isStarted());
assertTrue(destination.getServerSettings().isDisallowWildcardSubtopics());
}
@Test
public void destinationWithExplicitProperties() throws Exception {
this.factory = new MessageDestinationFactory();
this.factory.setBeanName("foo-factory");
this.factory.setDestinationId("foo2");
String[] channels = new String[] { "my-amf", "my-polling-amf" };
this.factory.setChannels(channels);
this.factory.setAllowSubtopics("true");
this.factory.setClusterMessageRouting("broadcast");
this.factory.setClusterRef("default-cluster");
this.factory.setDisallowWildcardSubtopics("false");
this.factory.setMessageTimeToLive("1");
this.factory.setSubscriptionTimeoutMinutes("1");
this.factory.setSubtopicSeparator("/");
this.factory.setThrottleInboundMaxFrequency("500");
this.factory.setThrottleInboundPolicy("ERROR");
this.factory.setThrottleOutboundMaxFrequency("500");
this.factory.setThrottleOutboundPolicy("IGNORE");
this.factory.setMessageBroker(getMessageBroker());
this.factory.setBeanFactory(this.beanFactory);
this.factory.afterPropertiesSet();
MessageDestination destination = (MessageDestination) this.service.getDestination("foo2");
assertNotNull(destination);
assertEquals("foo2", destination.getId());
assertTrue(destination.getChannels().containsAll(Arrays.asList(channels)));
assertTrue(destination.getServerSettings().getAllowSubtopics());
assertFalse(destination.getServerSettings().isDisallowWildcardSubtopics());
assertTrue(destination.getServerSettings().isBroadcastRoutingMode());
assertEquals("default-cluster", destination.getNetworkSettings().getClusterId());
assertEquals(1, destination.getServerSettings().getMessageTTL());
assertEquals(1, destination.getNetworkSettings().getSubscriptionTimeoutMinutes());
assertEquals("/", destination.getServerSettings().getSubtopicSeparator());
assertEquals(500, destination.getNetworkSettings().getThrottleSettings().getIncomingDestinationFrequency());
assertEquals(ThrottleSettings.parsePolicy("ERROR"), destination.getNetworkSettings().getThrottleSettings().getInboundPolicy());
assertEquals(500, destination.getNetworkSettings().getThrottleSettings().getOutgoingDestinationFrequency());
assertEquals(ThrottleSettings.parsePolicy("IGNORE"), destination.getNetworkSettings().getThrottleSettings().getOutboundPolicy());
}
@Test
public void destinationWithJsonConfigMap() throws Exception {
PropertyEditor editor = new JsonConfigMapPropertyEditor();
editor.setAsText(readJsonFile());
this.factory = new MessageDestinationFactory((ConfigMap) editor.getValue());
this.factory.setBeanName("foo-factory");
this.factory.setDestinationId("foo4");
String[] channels = new String[] { "my-amf", "my-polling-amf" };
this.factory.setChannels(channels);
this.factory.setMessageBroker(getMessageBroker());
this.factory.setBeanFactory(this.beanFactory);
this.factory.afterPropertiesSet();
MessageDestination destination = (MessageDestination) this.service.getDestination("foo4");
assertNotNull(destination);
assertEquals("foo4", destination.getId());
assertTrue(destination.getChannels().containsAll(Arrays.asList(channels)));
assertTrue(destination.getServerSettings().getAllowSubtopics());
assertFalse(destination.getServerSettings().isDisallowWildcardSubtopics());
assertTrue(destination.getServerSettings().isBroadcastRoutingMode());
assertEquals(1, destination.getServerSettings().getMessageTTL());
assertEquals(1, destination.getNetworkSettings().getSubscriptionTimeoutMinutes());
assertEquals("/", destination.getServerSettings().getSubtopicSeparator());
assertEquals(500, destination.getNetworkSettings().getThrottleSettings().getIncomingDestinationFrequency());
assertEquals(ThrottleSettings.parsePolicy("ERROR"), destination.getNetworkSettings().getThrottleSettings().getInboundPolicy());
assertEquals(500, destination.getNetworkSettings().getThrottleSettings().getOutgoingDestinationFrequency());
assertEquals(ThrottleSettings.parsePolicy("IGNORE"), destination.getNetworkSettings().getThrottleSettings().getOutboundPolicy());
}
@Test
public void destinationWithSecurityConstraints() throws Exception {
this.factory = new MessageDestinationFactory();
this.factory.setBeanName("foo3");
this.factory.setSendSecurityConstraint("spring-security-users");
this.factory.setSubscribeSecurityConstraint("spring-security-users");
this.factory.setMessageBroker(getMessageBroker());
this.factory.setBeanFactory(this.beanFactory);
this.factory.afterPropertiesSet();
try {
FlexContext.setMessageFromPeer(false);
MessageDestination destination = (MessageDestination) this.service.getDestination("foo3");
assertNotNull(destination);
assertEquals("foo3", destination.getId());
MessagingAdapter adapter = (MessagingAdapter) destination.getAdapter();
adapter.getSecurityConstraintManager().assertSendAuthorization();
adapter.getSecurityConstraintManager().assertSubscribeAuthorization();
verify(this.loginManager, times(2)).checkConstraint(isA(SecurityConstraint.class));
} finally {
FlexContext.clearThreadLocalObjects();
}
}
private String readJsonFile() throws Exception {
Resource jsonFile = new DefaultResourceLoader().getResource("classpath:org/springframework/flex/messaging/MessageDestinationProps.json");
BufferedReader br = new BufferedReader(new InputStreamReader(jsonFile.getInputStream()));
StringBuilder builder = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
builder.append(line);
}
return builder.toString();
}
}