/** * 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.junit.*; import static org.junit.Assert.*; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import static org.hamcrest.Matchers.*; import static org.mockito.Mockito.*; import static org.diirt.datasource.ExpressionLanguage.*; /** * * @author carcassi */ public class DatasourceTest { public DatasourceTest() { } @Before public void initMocks() { MockitoAnnotations.initMocks(this); } private class MockDataSource extends DataSource { public MockDataSource(boolean writeable) { super(writeable); } @Override protected String channelHandlerLookupName(String channelName) { if ("changeit".equals(channelName)) return "first"; return channelName; } @Override protected ChannelHandler createChannel(String channelName) { throw new UnsupportedOperationException("Not supported yet."); } }; @Mock ChannelHandler channel1; @Mock ChannelHandler channel2; @Test public void connect1() { // A simple recipe with one channel ReadExpressionTester exp = new ReadExpressionTester(latestValueOf(channel("first"))); ReadRecipe dataRecipe = exp.getReadRecipe(); DataSource dataSource = spy(new MockDataSource(true)); doReturn(channel1).when(dataSource).createChannel("first"); dataSource.connectRead(dataRecipe); verify(dataSource, timeout(100)).channel("first"); verify(channel1, timeout(100)).addReader(exp.recipeFor("first").getReadSubscription()); } @Test public void connect2() { // A recipe with two channels ReadExpressionTester exp = new ReadExpressionTester(mapOf(latestValueOf(channel("first").and(channel("second"))))); ReadRecipe dataRecipe = exp.getReadRecipe(); DataSource dataSource = spy(new MockDataSource(true)); doReturn(channel1).when(dataSource).createChannel("first"); doReturn(channel2).when(dataSource).createChannel("second"); dataSource.connectRead(dataRecipe); verify(dataSource, timeout(100)).channel("first"); verify(dataSource, timeout(100)).channel("second"); verify(channel1, timeout(100)).addReader(exp.recipeFor("first").getReadSubscription()); verify(channel2, timeout(100)).addReader(exp.recipeFor("second").getReadSubscription()); } @Test public void connect3() { // Two recipe with the same channel: create only one ReadExpressionTester exp1 = new ReadExpressionTester(latestValueOf(channel("first"))); ReadExpressionTester exp2 = new ReadExpressionTester(latestValueOf(channel("first"))); ReadRecipe dataRecipe1 = exp1.getReadRecipe(); ReadRecipe dataRecipe2 = exp2.getReadRecipe(); DataSource dataSource = spy(new MockDataSource(true)); doReturn(channel1).when(dataSource).createChannel("first"); dataSource.connectRead(dataRecipe1); dataSource.connectRead(dataRecipe2); verify(dataSource, timeout(100).times(2)).channel("first"); verify(dataSource, timeout(100)).createChannel("first"); verify(channel1, timeout(100)).addReader(exp1.recipeFor("first").getReadSubscription()); verify(channel1, timeout(100)).addReader(exp2.recipeFor("first").getReadSubscription()); } @Test public void connect4() { // A simple recipe with one channel ReadExpressionTester exp = new ReadExpressionTester(latestValueOf(channel("changeit"))); ReadRecipe dataRecipe = exp.getReadRecipe(); DataSource dataSource = spy(new MockDataSource(true)); doReturn(channel1).when(dataSource).createChannel("changeit"); dataSource.connectRead(dataRecipe); verify(dataSource, timeout(100)).channel("changeit"); verify(dataSource, timeout(100)).createChannel("changeit"); verify(channel1, timeout(100)).addReader(exp.recipeFor("changeit").getReadSubscription()); assertThat(dataSource.getChannels().get("first"), not(equalTo(null))); assertThat(dataSource.getChannels().get("changeit"), equalTo(null)); } }