/**
* 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
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* 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.flume.node;
import com.google.common.collect.Maps;
import junit.framework.Assert;
import org.apache.flume.Channel;
import org.apache.flume.ChannelException;
import org.apache.flume.Context;
import org.apache.flume.Event;
import org.apache.flume.EventDeliveryException;
import org.apache.flume.Transaction;
import org.apache.flume.annotations.Disposable;
import org.apache.flume.annotations.Recyclable;
import org.apache.flume.channel.AbstractChannel;
import org.apache.flume.conf.Configurable;
import org.apache.flume.conf.FlumeConfiguration;
import org.apache.flume.sink.AbstractSink;
import org.apache.flume.source.AbstractSource;
import org.junit.Test;
import java.util.Map;
public class TestAbstractConfigurationProvider {
@Test
public void testDispoableChannel() throws Exception {
String agentName = "agent1";
Map<String, String> properties = getPropertiesForChannel(agentName,
DisposableChannel.class.getName());
MemoryConfigurationProvider provider =
new MemoryConfigurationProvider(agentName, properties);
MaterializedConfiguration config1 = provider.getConfiguration();
Channel channel1 = config1.getChannels().values().iterator().next();
Assert.assertTrue(channel1 instanceof DisposableChannel);
MaterializedConfiguration config2 = provider.getConfiguration();
Channel channel2 = config2.getChannels().values().iterator().next();
Assert.assertTrue(channel2 instanceof DisposableChannel);
Assert.assertNotSame(channel1, channel2);
}
@Test
public void testReusableChannel() throws Exception {
String agentName = "agent1";
Map<String, String> properties = getPropertiesForChannel(agentName,
RecyclableChannel.class.getName());
MemoryConfigurationProvider provider =
new MemoryConfigurationProvider(agentName, properties);
MaterializedConfiguration config1 = provider.getConfiguration();
Channel channel1 = config1.getChannels().values().iterator().next();
Assert.assertTrue(channel1 instanceof RecyclableChannel);
MaterializedConfiguration config2 = provider.getConfiguration();
Channel channel2 = config2.getChannels().values().iterator().next();
Assert.assertTrue(channel2 instanceof RecyclableChannel);
Assert.assertSame(channel1, channel2);
}
@Test
public void testUnspecifiedChannel() throws Exception {
String agentName = "agent1";
Map<String, String> properties = getPropertiesForChannel(agentName,
UnspecifiedChannel.class.getName());
MemoryConfigurationProvider provider =
new MemoryConfigurationProvider(agentName, properties);
MaterializedConfiguration config1 = provider.getConfiguration();
Channel channel1 = config1.getChannels().values().iterator().next();
Assert.assertTrue(channel1 instanceof UnspecifiedChannel);
MaterializedConfiguration config2 = provider.getConfiguration();
Channel channel2 = config2.getChannels().values().iterator().next();
Assert.assertTrue(channel2 instanceof UnspecifiedChannel);
Assert.assertSame(channel1, channel2);
}
@Test
public void testReusableChannelNotReusedLater() throws Exception {
String agentName = "agent1";
Map<String, String> propertiesReusable = getPropertiesForChannel(agentName,
RecyclableChannel.class
.getName());
Map<String, String> propertiesDispoable = getPropertiesForChannel(agentName,
DisposableChannel.class
.getName());
MemoryConfigurationProvider provider =
new MemoryConfigurationProvider(agentName, propertiesReusable);
MaterializedConfiguration config1 = provider.getConfiguration();
Channel channel1 = config1.getChannels().values().iterator().next();
Assert.assertTrue(channel1 instanceof RecyclableChannel);
provider.setProperties(propertiesDispoable);
MaterializedConfiguration config2 = provider.getConfiguration();
Channel channel2 = config2.getChannels().values().iterator().next();
Assert.assertTrue(channel2 instanceof DisposableChannel);
provider.setProperties(propertiesReusable);
MaterializedConfiguration config3 = provider.getConfiguration();
Channel channel3 = config3.getChannels().values().iterator().next();
Assert.assertTrue(channel3 instanceof RecyclableChannel);
Assert.assertNotSame(channel1, channel3);
}
@Test
public void testSourceThrowsExceptionDuringConfiguration() throws Exception {
String agentName = "agent1";
String sourceType = UnconfigurableSource.class.getName();
String channelType = "memory";
String sinkType = "null";
Map<String, String> properties = getProperties(agentName, sourceType,
channelType, sinkType);
MemoryConfigurationProvider provider =
new MemoryConfigurationProvider(agentName, properties);
MaterializedConfiguration config = provider.getConfiguration();
Assert.assertTrue(config.getSourceRunners().size() == 0);
Assert.assertTrue(config.getChannels().size() == 1);
Assert.assertTrue(config.getSinkRunners().size() == 1);
}
@Test
public void testChannelThrowsExceptionDuringConfiguration() throws Exception {
String agentName = "agent1";
String sourceType = "seq";
String channelType = UnconfigurableChannel.class.getName();
String sinkType = "null";
Map<String, String> properties = getProperties(agentName, sourceType,
channelType, sinkType);
MemoryConfigurationProvider provider =
new MemoryConfigurationProvider(agentName, properties);
MaterializedConfiguration config = provider.getConfiguration();
Assert.assertTrue(config.getSourceRunners().size() == 0);
Assert.assertTrue(config.getChannels().size() == 0);
Assert.assertTrue(config.getSinkRunners().size() == 0);
}
@Test
public void testSinkThrowsExceptionDuringConfiguration() throws Exception {
String agentName = "agent1";
String sourceType = "seq";
String channelType = "memory";
String sinkType = UnconfigurableSink.class.getName();
Map<String, String> properties = getProperties(agentName, sourceType,
channelType, sinkType);
MemoryConfigurationProvider provider =
new MemoryConfigurationProvider(agentName, properties);
MaterializedConfiguration config = provider.getConfiguration();
Assert.assertTrue(config.getSourceRunners().size() == 1);
Assert.assertTrue(config.getChannels().size() == 1);
Assert.assertTrue(config.getSinkRunners().size() == 0);
}
@Test
public void testSourceAndSinkThrowExceptionDuringConfiguration()
throws Exception {
String agentName = "agent1";
String sourceType = UnconfigurableSource.class.getName();
String channelType = "memory";
String sinkType = UnconfigurableSink.class.getName();
Map<String, String> properties = getProperties(agentName, sourceType,
channelType, sinkType);
MemoryConfigurationProvider provider =
new MemoryConfigurationProvider(agentName, properties);
MaterializedConfiguration config = provider.getConfiguration();
Assert.assertTrue(config.getSourceRunners().size() == 0);
Assert.assertTrue(config.getChannels().size() == 0);
Assert.assertTrue(config.getSinkRunners().size() == 0);
}
private Map<String, String> getProperties(String agentName,
String sourceType, String channelType,
String sinkType) {
Map<String, String> properties = Maps.newHashMap();
properties.put(agentName + ".sources", "source1");
properties.put(agentName + ".channels", "channel1");
properties.put(agentName + ".sinks", "sink1");
properties.put(agentName + ".sources.source1.type", sourceType);
properties.put(agentName + ".sources.source1.channels", "channel1");
properties.put(agentName + ".channels.channel1.type", channelType);
properties.put(agentName + ".channels.channel1.capacity", "100");
properties.put(agentName + ".sinks.sink1.type", sinkType);
properties.put(agentName + ".sinks.sink1.channel", "channel1");
return properties;
}
private Map<String, String> getPropertiesForChannel(String agentName, String channelType) {
return getProperties(agentName, "seq", channelType, "null");
}
public static class MemoryConfigurationProvider extends AbstractConfigurationProvider {
private Map<String, String> properties;
public MemoryConfigurationProvider(String agentName, Map<String, String> properties) {
super(agentName);
this.properties = properties;
}
public void setProperties(Map<String, String> properties) {
this.properties = properties;
}
@Override
protected FlumeConfiguration getFlumeConfiguration() {
return new FlumeConfiguration(properties);
}
}
@Disposable
public static class DisposableChannel extends AbstractChannel {
@Override
public void put(Event event) throws ChannelException {
throw new UnsupportedOperationException();
}
@Override
public Event take() throws ChannelException {
throw new UnsupportedOperationException();
}
@Override
public Transaction getTransaction() {
throw new UnsupportedOperationException();
}
}
@Recyclable
public static class RecyclableChannel extends AbstractChannel {
@Override
public void put(Event event) throws ChannelException {
throw new UnsupportedOperationException();
}
@Override
public Event take() throws ChannelException {
throw new UnsupportedOperationException();
}
@Override
public Transaction getTransaction() {
throw new UnsupportedOperationException();
}
}
public static class UnspecifiedChannel extends AbstractChannel {
@Override
public void put(Event event) throws ChannelException {
throw new UnsupportedOperationException();
}
@Override
public Event take() throws ChannelException {
throw new UnsupportedOperationException();
}
@Override
public Transaction getTransaction() {
throw new UnsupportedOperationException();
}
}
public static class UnconfigurableChannel extends AbstractChannel {
@Override
public void configure(Context context) {
throw new RuntimeException("expected");
}
@Override
public void put(Event event) throws ChannelException {
throw new UnsupportedOperationException();
}
@Override
public Event take() throws ChannelException {
throw new UnsupportedOperationException();
}
@Override
public Transaction getTransaction() {
throw new UnsupportedOperationException();
}
}
public static class UnconfigurableSource extends AbstractSource implements Configurable {
@Override
public void configure(Context context) {
throw new RuntimeException("expected");
}
}
public static class UnconfigurableSink extends AbstractSink implements Configurable {
@Override
public void configure(Context context) {
throw new RuntimeException("expected");
}
@Override
public Status process() throws EventDeliveryException {
throw new UnsupportedOperationException();
}
}
}