/**
* This file is part of Graylog.
*
* Graylog is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Graylog is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Graylog. If not, see <http://www.gnu.org/licenses/>.
*/
package org.graylog2.outputs;
import com.google.common.collect.ImmutableSet;
import org.graylog2.plugin.Message;
import org.graylog2.plugin.outputs.MessageOutput;
import org.graylog2.plugin.streams.Output;
import org.graylog2.plugin.streams.Stream;
import org.junit.Rule;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import java.util.Collection;
import java.util.Set;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public class OutputRouterTest {
@Rule
public final MockitoRule mockitoRule = MockitoJUnit.rule();
@Mock
private MessageOutput defaultMessageOutput;
@Mock
private OutputRegistry outputRegistry;
@Test
public void testAlwaysIncludeDefaultOutput() throws Exception {
final Message message = mock(Message.class);
final OutputRouter outputRouter = new OutputRouter(defaultMessageOutput, outputRegistry);
final Collection<MessageOutput> messageOutputs = outputRouter.getOutputsForMessage(message);
assertEquals(messageOutputs.size(), 1);
assertTrue(messageOutputs.contains(defaultMessageOutput));
}
@Test
public void testGetMessageOutputsForEmptyStream() throws Exception {
final Stream stream = mock(Stream.class);
final OutputRouter outputRouter = new OutputRouter(defaultMessageOutput, outputRegistry);
final Collection<MessageOutput> messageOutputs = outputRouter.getMessageOutputsForStream(stream);
assertEquals(messageOutputs.size(), 0);
}
@Test
public void testGetMessageOutputsForSingleStream() throws Exception {
final Stream stream = mock(Stream.class);
final Output output = mock(Output.class);
final String outputId = "foobar";
final MessageOutput messageOutput = mock(MessageOutput.class);
final Set<Output> outputSet = ImmutableSet.of(output);
when(stream.getOutputs()).thenReturn(outputSet);
when(output.getId()).thenReturn(outputId);
when(outputRegistry.getOutputForIdAndStream(eq(outputId), eq(stream))).thenReturn(messageOutput);
final OutputRouter outputRouter = new OutputRouter(defaultMessageOutput, outputRegistry);
final Collection<MessageOutput> messageOutputs = outputRouter.getMessageOutputsForStream(stream);
assertEquals(messageOutputs.size(), 1);
assertTrue(messageOutputs.contains(messageOutput));
}
@Test
public void testGetMessageOutputsForStreamWithTwoOutputs() throws Exception {
final Stream stream = mock(Stream.class);
final Output output1 = mock(Output.class);
final Output output2 = mock(Output.class);
final String output1Id = "foo";
final String output2Id = "bar";
final MessageOutput messageOutput1 = mock(MessageOutput.class);
final MessageOutput messageOutput2 = mock(MessageOutput.class);
final Set<Output> outputSet = ImmutableSet.of(output1, output2);
when(stream.getOutputs()).thenReturn(outputSet);
when(output1.getId()).thenReturn(output1Id);
when(output2.getId()).thenReturn(output2Id);
when(outputRegistry.getOutputForIdAndStream(eq(output1Id), eq(stream))).thenReturn(messageOutput1);
when(outputRegistry.getOutputForIdAndStream(eq(output2Id), eq(stream))).thenReturn(messageOutput2);
final OutputRouter outputRouter = new OutputRouter(defaultMessageOutput, outputRegistry);
final Collection<MessageOutput> messageOutputs = outputRouter.getMessageOutputsForStream(stream);
assertEquals(messageOutputs.size(), 2);
assertTrue(messageOutputs.contains(messageOutput1));
assertTrue(messageOutputs.contains(messageOutput2));
}
@Test
public void testGetOutputFromSingleStreams() throws Exception {
final Stream stream = mock(Stream.class);
final Message message = mock(Message.class);
when(message.getStreams()).thenReturn(ImmutableSet.of(stream));
final MessageOutput messageOutput = mock(MessageOutput.class);
final Set<MessageOutput> messageOutputList = ImmutableSet.of(messageOutput);
final OutputRouter outputRouter = Mockito.spy(new OutputRouter(defaultMessageOutput, outputRegistry));
doReturn(messageOutputList).when(outputRouter).getMessageOutputsForStream(eq(stream));
// Call to test
final Collection<MessageOutput> messageOutputs = outputRouter.getOutputsForMessage(message);
// Verification
assertEquals(messageOutputs.size(), 2);
assertTrue(messageOutputs.contains(defaultMessageOutput));
assertTrue(messageOutputs.contains(messageOutput));
}
@Test
public void testGetOutputsFromTwoStreams() throws Exception {
final Stream stream1 = mock(Stream.class);
final Stream stream2 = mock(Stream.class);
final MessageOutput messageOutput1 = mock(MessageOutput.class);
final Set<MessageOutput> messageOutputSet1 = ImmutableSet.of(messageOutput1);
final MessageOutput messageOutput2 = mock(MessageOutput.class);
final Set<MessageOutput> messageOutputSet2 = ImmutableSet.of(messageOutput2);
final Message message = mock(Message.class);
when(message.getStreams()).thenReturn(ImmutableSet.of(stream1, stream2));
OutputRouter outputRouter = Mockito.spy(new OutputRouter(defaultMessageOutput, outputRegistry));
doReturn(messageOutputSet1).when(outputRouter).getMessageOutputsForStream(eq(stream1));
doReturn(messageOutputSet2).when(outputRouter).getMessageOutputsForStream(eq(stream2));
final Collection<MessageOutput> result = outputRouter.getOutputsForMessage(message);
assertEquals(result.size(), 3);
assertTrue(result.contains(defaultMessageOutput));
assertTrue(result.contains(messageOutput1));
assertTrue(result.contains(messageOutput2));
}
@Test
public void testGetOutputsWithIdenticalMessageOutputs() throws Exception {
final Stream stream1 = mock(Stream.class);
final Stream stream2 = mock(Stream.class);
final MessageOutput messageOutput = mock(MessageOutput.class);
final Set<MessageOutput> messageOutputSet = ImmutableSet.of(messageOutput);
final Message message = mock(Message.class);
when(message.getStreams()).thenReturn(ImmutableSet.of(stream1, stream2));
OutputRouter outputRouter = Mockito.spy(new OutputRouter(defaultMessageOutput, outputRegistry));
doReturn(messageOutputSet).when(outputRouter).getMessageOutputsForStream(eq(stream1));
doReturn(messageOutputSet).when(outputRouter).getMessageOutputsForStream(eq(stream2));
final Collection<MessageOutput> result = outputRouter.getOutputsForMessage(message);
assertEquals(result.size(), 2);
assertTrue(result.contains(defaultMessageOutput));
assertTrue(result.contains(messageOutput));
}
}