/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.apache.activemq.network;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import javax.jms.Connection;
import javax.jms.JMSException;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import org.apache.activemq.broker.BrokerService;
import org.apache.activemq.broker.ConnectionContext;
import org.apache.activemq.broker.region.Destination;
import org.apache.activemq.broker.region.DestinationFilter;
import org.apache.activemq.broker.region.DestinationStatistics;
import org.apache.activemq.broker.region.DurableTopicSubscription;
import org.apache.activemq.broker.region.Subscription;
import org.apache.activemq.broker.region.Topic;
import org.apache.activemq.command.ActiveMQTopic;
import org.apache.activemq.command.RemoveSubscriptionInfo;
import org.apache.activemq.util.SubscriptionKey;
import org.apache.activemq.util.Wait;
import org.apache.activemq.util.Wait.Condition;
import org.junit.Rule;
import org.junit.rules.TemporaryFolder;
public abstract class DynamicNetworkTestSupport {
protected Connection localConnection;
protected Connection remoteConnection;
protected BrokerService localBroker;
protected BrokerService remoteBroker;
protected Session localSession;
protected Session remoteSession;
protected ActiveMQTopic included;
protected ActiveMQTopic excluded;
protected String testTopicName = "include.test.bar";
protected String excludeTopicName = "exclude.test.bar";
protected String clientId = "clientId";
protected String subName = "subId";
@Rule
public TemporaryFolder tempFolder = new TemporaryFolder(new File("target"));
protected void doTearDown() throws Exception {
stopLocalBroker();
stopRemoteBroker();
}
protected void stopLocalBroker() throws Exception {
if (localConnection != null) {
localConnection.close();
}
if (localBroker != null) {
localBroker.stop();
localBroker.waitUntilStopped();
}
}
protected void stopRemoteBroker() throws Exception {
if (remoteConnection != null) {
remoteConnection.close();
}
if (remoteBroker != null) {
remoteBroker.stop();
remoteBroker.waitUntilStopped();
}
}
protected void assertBridgeStarted() throws Exception {
assertTrue(Wait.waitFor(new Condition() {
@Override
public boolean isSatisified() throws Exception {
return localBroker.getNetworkConnectors().get(0).activeBridges().size() == 1;
}
}, 10000, 500));
}
protected RemoveSubscriptionInfo getRemoveSubscriptionInfo(final ConnectionContext context,
final BrokerService brokerService) throws Exception {
RemoveSubscriptionInfo info = new RemoveSubscriptionInfo();
info.setClientId(clientId);
info.setSubcriptionName(subName);
context.setBroker(brokerService.getBroker());
context.setClientId(clientId);
return info;
}
protected void waitForConsumerCount(final DestinationStatistics destinationStatistics, final int count) throws Exception {
assertTrue(Wait.waitFor(new Wait.Condition() {
@Override
public boolean isSatisified() throws Exception {
//should only be 1 for the composite destination creation
return count == destinationStatistics.getConsumers().getCount();
}
}));
}
protected void waitForDispatchFromLocalBroker(final DestinationStatistics destinationStatistics, final int count) throws Exception {
assertTrue(Wait.waitFor(new Wait.Condition() {
@Override
public boolean isSatisified() throws Exception {
return count == destinationStatistics.getDequeues().getCount() &&
count == destinationStatistics.getDispatched().getCount() &&
count == destinationStatistics.getForwards().getCount();
}
}));
}
protected void assertLocalBrokerStatistics(final DestinationStatistics localStatistics, final int count) {
assertEquals("local broker dest stat dispatched", count, localStatistics.getDispatched().getCount());
assertEquals("local broker dest stat dequeues", count, localStatistics.getDequeues().getCount());
assertEquals("local broker dest stat forwards", count, localStatistics.getForwards().getCount());
}
protected interface ConsumerCreator {
MessageConsumer createConsumer() throws JMSException;
}
protected void assertNCDurableSubsCount(final BrokerService brokerService,
final ActiveMQTopic dest, final int count) throws Exception {
assertTrue(Wait.waitFor(new Condition() {
@Override
public boolean isSatisified() throws Exception {
return count == getNCDurableSubs(brokerService, dest).size();
}
}, 10000, 500));
}
protected void assertConsumersCount(final BrokerService brokerService,
final ActiveMQTopic dest, final int count) throws Exception {
assertTrue(Wait.waitFor(new Condition() {
@Override
public boolean isSatisified() throws Exception {
return count == getConsumers(brokerService, dest).size();
}
}, 10000, 500));
}
protected List<Subscription> getConsumers(final BrokerService brokerService,
final ActiveMQTopic dest) throws Exception {
Topic destination = (Topic) brokerService.getDestination(dest);
return destination.getConsumers();
}
protected List<DurableTopicSubscription> getSubscriptions(final BrokerService brokerService,
final ActiveMQTopic dest) throws Exception {
List<DurableTopicSubscription> subs = new ArrayList<>();
Topic destination = (Topic) brokerService.getDestination(dest);
for (SubscriptionKey key : destination.getDurableTopicSubs().keySet()) {
if (!key.getSubscriptionName().startsWith(DemandForwardingBridge.DURABLE_SUB_PREFIX)) {
DurableTopicSubscription sub = destination.getDurableTopicSubs().get(key);
if (sub != null) {
subs.add(sub);
}
}
}
return subs;
}
protected List<DurableTopicSubscription> getNCDurableSubs(final BrokerService brokerService,
final ActiveMQTopic dest) throws Exception {
List<DurableTopicSubscription> subs = new ArrayList<>();
Destination d = brokerService.getDestination(dest);
Topic destination = null;
if (d instanceof DestinationFilter){
destination = ((DestinationFilter) d).getAdaptor(Topic.class);
} else {
destination = (Topic) d;
}
for (SubscriptionKey key : destination.getDurableTopicSubs().keySet()) {
if (key.getSubscriptionName().startsWith(DemandForwardingBridge.DURABLE_SUB_PREFIX)) {
DurableTopicSubscription sub = destination.getDurableTopicSubs().get(key);
if (sub != null) {
subs.add(sub);
}
}
}
return subs;
}
protected void removeSubscription(final BrokerService brokerService, final ActiveMQTopic topic,
final String subName) throws Exception {
final RemoveSubscriptionInfo info = new RemoveSubscriptionInfo();
info.setClientId(clientId);
info.setSubscriptionName(subName);
final ConnectionContext context = new ConnectionContext();
context.setBroker(brokerService.getBroker());
context.setClientId(clientId);
brokerService.getBroker().removeSubscription(context, info);
}
protected void assertSubscriptionsCount(final BrokerService brokerService,
final ActiveMQTopic dest, final int count) throws Exception {
assertTrue(Wait.waitFor(new Condition() {
@Override
public boolean isSatisified() throws Exception {
return count == getSubscriptions(brokerService, dest).size();
}
}, 10000, 500));
}
}