/**
* Copyright (C) 2010-14 diirt developers. See COPYRIGHT.TXT
* All rights reserved. Use is subject to license terms. See LICENSE.TXT
*/
package org.diirt.datasource;
import org.diirt.datasource.test.MockDataSource;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;
/**
* Tests CompositeDataSource.
*
* @author carcassi
*/
public class CompositeDataSourceTest {
@Before
public void setUp() {
mock1 = new MockDataSource();
mock2 = new MockDataSource();
}
@After
public void tearDown() {
}
MockDataSource mock1;
MockDataSource mock2;
@Test
public void testAllDefault() {
// Setup composite
CompositeDataSource composite = new CompositeDataSource();
composite.putDataSource("mock1", mock1);
composite.putDataSource("mock2", mock2);
composite.setConfiguration(new CompositeDataSourceConfiguration().defaultDataSource("mock1"));
// Call only default
ReadRecipeBuilder builder = new ReadRecipeBuilder();
builder.addChannel("pv01", new ValueCacheImpl<Double>(Double.class));
builder.addChannel("pv03", new ValueCacheImpl<Double>(Double.class));
ReadRecipe recipe = builder.build(new ValueCacheImpl<Exception>(Exception.class), new ConnectionCollector());
// Call and check
composite.connectRead(recipe);
assertThat(mock1.getReadRecipe().getChannelReadRecipes(), equalTo(recipe.getChannelReadRecipes()));
assertThat(mock2.getReadRecipe(), nullValue());
}
@Test
public void testMixedCall() {
// Setup composite
CompositeDataSource composite = new CompositeDataSource();
composite.putDataSource("mock1", mock1);
composite.putDataSource("mock2", mock2);
composite.setConfiguration(new CompositeDataSourceConfiguration().defaultDataSource("mock1"));
// Call only default
ReadRecipeBuilder builder = new ReadRecipeBuilder();
builder.addChannel("pv01", new ValueCacheImpl<Double>(Double.class));
builder.addChannel("pv03", new ValueCacheImpl<Double>(Double.class));
builder.addChannel("mock1://pv02", new ValueCacheImpl<Double>(Double.class));
builder.addChannel("mock2://pv04", new ValueCacheImpl<Double>(Double.class));
builder.addChannel("mock1://pv05", new ValueCacheImpl<Double>(Double.class));
ReadRecipe recipe = builder.build(new ValueCacheImpl<Exception>(Exception.class), new ConnectionCollector());
// Call and check
composite.connectRead(recipe);
Collection<ChannelReadRecipe> mock1Caches = mock1.getReadRecipe().getChannelReadRecipes();
Collection<ChannelReadRecipe> mock2Caches = mock2.getReadRecipe().getChannelReadRecipes();
assertThat(mock1Caches.size(), equalTo(4));
assertThat(mock2Caches.size(), equalTo(1));
assertThat(channelNames(mock1Caches), hasItems("pv01", "pv02", "pv03", "pv05"));
assertThat(channelNames(mock2Caches), hasItem("pv04"));
// Check close
ReadRecipe mock1Connect = mock1.getReadRecipe();
ReadRecipe mock2Connect = mock2.getReadRecipe();
composite.disconnectRead(recipe);
assertEquals(mock1Connect, mock1.getReadRecipe());
assertEquals(mock2Connect, mock2.getReadRecipe());
}
private Set<String> channelNames(Collection<ChannelReadRecipe> channelRecipes) {
Set<String> names = new HashSet<String>();
for (ChannelReadRecipe channelRecipe : channelRecipes) {
names.add(channelRecipe.getChannelName());
}
return names;
}
private Set<String> channelWriteNames(Collection<ChannelWriteRecipe> channelWriteBuffers) {
Set<String> names = new HashSet<String>();
for (ChannelWriteRecipe channelWriteBuffer : channelWriteBuffers) {
names.add(channelWriteBuffer.getChannelName());
}
return names;
}
@Test(expected=IllegalArgumentException.class)
public void testNoDefault() {
// Setup composite
CompositeDataSource composite = new CompositeDataSource();
composite.putDataSource("mock1", mock1);
composite.putDataSource("mock2", mock2);
// Call only default
ReadRecipeBuilder builder = new ReadRecipeBuilder();
builder.addChannel("pv01", new ValueCacheImpl<Double>(Double.class));
builder.addChannel("pv03", new ValueCacheImpl<Double>(Double.class));
ReadRecipe recipe = builder.build(new ValueCacheImpl<Exception>(Exception.class), new ConnectionCollector());
// Should cause error
composite.connectRead(recipe);
}
@Test(expected=IllegalArgumentException.class)
public void testDefaultDoesntExist() {
// Setup composite
CompositeDataSource composite = new CompositeDataSource();
composite.putDataSource("mock1", mock1);
composite.putDataSource("mock2", mock2);
composite.setConfiguration(new CompositeDataSourceConfiguration().defaultDataSource("wrong"));
// Call only default
ReadRecipeBuilder builder = new ReadRecipeBuilder();
builder.addChannel("pv01", new ValueCacheImpl<Double>(Double.class));
builder.addChannel("pv03", new ValueCacheImpl<Double>(Double.class));
ReadRecipe recipe = builder.build(new ValueCacheImpl<Exception>(Exception.class), new ConnectionCollector());
// Should cause error
composite.connectRead(recipe);
}
@Test
public void testDifferentDelimiter() {
// Setup composite
CompositeDataSource composite = new CompositeDataSource();
composite.putDataSource("mock1", mock1);
composite.putDataSource("mock2", mock2);
composite.setConfiguration(new CompositeDataSourceConfiguration().defaultDataSource("mock1").delimiter("?"));
// Call only default
ReadRecipeBuilder builder = new ReadRecipeBuilder();
builder.addChannel("pv01", new ValueCacheImpl<Double>(Double.class));
builder.addChannel("pv03", new ValueCacheImpl<Double>(Double.class));
builder.addChannel("mock1?pv02", new ValueCacheImpl<Double>(Double.class));
builder.addChannel("mock2?pv04", new ValueCacheImpl<Double>(Double.class));
builder.addChannel("mock1?pv05", new ValueCacheImpl<Double>(Double.class));
ReadRecipe recipe = builder.build(new ValueCacheImpl<Exception>(Exception.class), new ConnectionCollector());
// Call and check
composite.connectRead(recipe);
Collection<ChannelReadRecipe> mock1Caches = mock1.getReadRecipe().getChannelReadRecipes();
Collection<ChannelReadRecipe> mock2Caches = mock2.getReadRecipe().getChannelReadRecipes();
assertThat(mock1Caches.size(), equalTo(4));
assertThat(mock2Caches.size(), equalTo(1));
assertThat(channelNames(mock1Caches), hasItems("pv01", "pv02", "pv03", "pv05"));
assertThat(channelNames(mock2Caches), hasItem("pv04"));
}
@Test (expected=IllegalArgumentException.class)
public void testReadEmpty() {
// Setup composite
CompositeDataSource composite = new CompositeDataSource();
ReadRecipeBuilder builder = new ReadRecipeBuilder();
builder.addChannel("mock://pv03", new ValueCacheImpl<Double>(Double.class));
ReadRecipe recipe = builder.build(new ValueCacheImpl<Exception>(Exception.class), new ConnectionCollector());
// Should cause error
composite.connectRead(recipe);
}
@Test (expected=IllegalArgumentException.class)
public void testWriteEmpty() {
// Setup composite
CompositeDataSource composite = new CompositeDataSource();
// Write pv with no datasource match
WriteRecipeBuilder builder = new WriteRecipeBuilder();
builder.addChannel("mock://pv03", new WriteCache<>("mock://pv03"));
WriteRecipe buffer = builder.build(new ValueCacheImpl<Exception>(Exception.class), new ConnectionCollector());
// Should cause error
composite.connectWrite(buffer);
}
@Test
public void testWriteMixedCall() {
// Setup composite
CompositeDataSource composite = new CompositeDataSource();
composite.putDataSource("mock1", mock1);
composite.putDataSource("mock2", mock2);
composite.setConfiguration(new CompositeDataSourceConfiguration().defaultDataSource("mock1"));
WriteRecipeBuilder builder = new WriteRecipeBuilder();
builder.addChannel("pv01", new WriteCache<>("pv01"));
builder.addChannel("pv03", new WriteCache<>("pv03"));
builder.addChannel("mock1://pv02", new WriteCache<>("mock1://pv02"));
builder.addChannel("mock2://pv04", new WriteCache<>("mock2://pv04"));
builder.addChannel("mock1://pv05", new WriteCache<>("mock1://pv05"));
WriteRecipe buffer = builder.build(new ValueCacheImpl<Exception>(Exception.class), new ConnectionCollector());
// Call and check
composite.connectWrite(buffer);
Collection<ChannelWriteRecipe> mock1Buffers = mock1.getWriteRecipe().getChannelWriteRecipes();
Collection<ChannelWriteRecipe> mock2Buffers = mock2.getWriteRecipe().getChannelWriteRecipes();
assertThat(mock1Buffers.size(), equalTo(4));
assertThat(mock2Buffers.size(), equalTo(1));
assertThat(channelWriteNames(mock1Buffers), hasItems("pv01", "pv02", "pv03", "pv05"));
assertThat(channelWriteNames(mock2Buffers), hasItem("pv04"));
// Check close
WriteRecipe mock1Connect = mock1.getWriteRecipe();
WriteRecipe mock2Connect = mock2.getWriteRecipe();
composite.disconnectWrite(buffer);
assertEquals(mock1Connect, mock1.getWriteRecipe());
assertEquals(mock2Connect, mock2.getWriteRecipe());
}
}