package com.github.triceo.splitlog;
import java.util.Arrays;
import java.util.Collection;
import org.assertj.core.api.Assertions;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import com.github.triceo.splitlog.api.LogWatch;
import com.github.triceo.splitlog.api.LogWatchBuilder;
import com.github.triceo.splitlog.api.Message;
import com.github.triceo.splitlog.api.MessageDeliveryStatus;
import com.github.triceo.splitlog.api.MessageMeasure;
import com.github.triceo.splitlog.api.MessageMetric;
import com.github.triceo.splitlog.api.TailSplitter;
import com.github.triceo.splitlog.conditions.AllFollowerMessagesAcceptingCondition;
import com.github.triceo.splitlog.conditions.SplitlogMessagesRejectingCondition;
import com.github.triceo.splitlog.splitters.JBossServerLogTailSplitter;
import com.github.triceo.splitlog.splitters.SimpleTailSplitter;
@RunWith(Parameterized.class)
public class GatingTest extends DefaultFollowerBaseTest {
private static final String MEASURE_ID = "test";
// will verify various configs of log watch
@Parameters(name = "{index}: {0}, {1}")
public static Collection<Object[]> data() {
return Arrays.asList(new Object[][] {
{ LogWatchBuilder.getDefault().watchedFile(LogWriter.createTempFile()), false },
{
LogWatchBuilder.getDefault().watchedFile(LogWriter.createTempFile())
.withGateCondition(SplitlogMessagesRejectingCondition.INSTANCE), false },
{
LogWatchBuilder.getDefault().watchedFile(LogWriter.createTempFile())
.withGateCondition(AllFollowerMessagesAcceptingCondition.INSTANCE), true } });
}
private final boolean isGatingDisabled;
public GatingTest(final LogWatchBuilder builder, final boolean gatingDisabled) {
super(builder);
this.isGatingDisabled = gatingDisabled;
}
private MessageMetric<Integer, LogWatch> fillWithData(final DefaultLogWatch watch, final TailSplitter splitter) {
final MessageMetric<Integer, LogWatch> metric = watch.startMeasuring(new MessageMeasure<Integer, LogWatch>() {
@Override
public Integer initialValue() {
return 0;
}
@Override
public Integer update(final MessageMetric<Integer, LogWatch> metric, final Message evaluate,
final MessageDeliveryStatus status, final LogWatch source) {
if (status != MessageDeliveryStatus.INCOMING) {
return metric.getValue() + 1;
} else {
return metric.getValue();
}
}
}, GatingTest.MEASURE_ID);
watch.messageArrived(this.getMessage(
"07:30:02,670 INFO [org.jboss.msc] (main) JBoss MSC version 1.0.4.GA-redhat-1", splitter));
watch.messageArrived(this.getMessage("07:30:02,670 INFO [com.github.triceo.splitlog] (main) random", splitter));
watch.messageArrived(this.getMessage("07:30:02,670 INFO [com.github.triceo.splitlog.check] (main) random 2",
splitter));
watch.messageArrived(this.getMessage(
"07:30:02,739 DEBUG [org.jboss.as.config] (MSC service thread 1-7) Configured system properties:",
splitter));
watch.messageIncoming(this
.getMessage(
"07:30:02,731 INFO [org.jboss.as] (MSC service thread 1-7) JBAS015899: JBoss BRMS 6.0.1.GA (AS 7.2.1.Final-redhat-10) starting",
splitter));
watch.stop();
return metric;
}
private Message getMessage(final String line, final TailSplitter splitter) {
return new MessageBuilder(line).buildFinal(splitter);
}
private TailSplitter getProperSplitter() {
return (this.isGatingDisabled) ? new SimpleTailSplitter() : new JBossServerLogTailSplitter();
}
@Test
public void testDefaults() {
// with simple tail splitter, no gatting can take place
final DefaultLogWatch watch = (DefaultLogWatch) this.getLogWatch();
final MessageMetric<Integer, LogWatch> metric = this.fillWithData(watch, new SimpleTailSplitter());
Assertions.assertThat(metric.getValue()).isEqualTo(4);
}
@Test
public void testGatingCondition() {
final DefaultLogWatch watch = (DefaultLogWatch) this.getBuilder().buildWith(new JBossServerLogTailSplitter());
final MessageMetric<Integer, LogWatch> metric = this.fillWithData(watch, this.getProperSplitter());
if (this.isGatingDisabled) {
// all messages will be let through
Assertions.assertThat(metric.getValue()).isEqualTo(4);
} else {
// only messages not from splitlog will be let through
Assertions.assertThat(metric.getValue()).isEqualTo(2);
}
}
}