// Copyright 2014-2015 Boundary, Inc.
//
// Licensed 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
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// 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 com.boundary.sdk.event.syslog;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Calendar.Builder;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.camel.EndpointInject;
import org.apache.camel.Exchange;
import org.apache.camel.Produce;
import org.apache.camel.ProducerTemplate;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.component.syslog.SyslogFacility;
import org.apache.camel.component.syslog.SyslogMessage;
import org.apache.camel.component.syslog.SyslogSeverity;
import org.apache.camel.test.junit4.CamelTestSupport;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import com.boundary.sdk.event.RawEvent;
/**
* Test {@link SyslogToEvent} processor
*
*/
public class SyslogToEventProcessorTest extends CamelTestSupport {
private final static SyslogFacility EXPECTED_SYSLOG_FACILITY = SyslogFacility.DAEMON;
private final static String EXPECTED_HOST="foobar";
private final static String EXPECTED_SOURCE_TYPE="host";
private final static String EXPECTED_LOCAL_ADDRESS="127.0.0.1";
private final static String EXPECTED_LOG_MESSAGE="Hello Word";
private final static String EXPECTED_REMOTE_ADDRESS="10.10.10.10";
private final static SyslogSeverity EXPECTED_SYSLOG_SEVERITY=SyslogSeverity.ALERT;
@Produce(uri = "direct:in-translate")
protected ProducerTemplate inTranslate;
@EndpointInject(uri = "mock:out")
protected MockEndpoint out;
@Produce(uri = "direct:in-no-translate")
protected ProducerTemplate inNoTranslate;
private SyslogMessage syslogMessage;
private RawEvent event;
private List<String> expectedTags;
private Map<String,Object> expectedProperties;
private List<String> expectedFingerprintFields;
@Before
public void setUp() throws Exception {
Date now = new Date();
super.setUp();
Builder builder = new Calendar.Builder();
builder.setInstant(now);
syslogMessage = buildSyslogMessage(
EXPECTED_SYSLOG_FACILITY,
EXPECTED_HOST,
EXPECTED_LOCAL_ADDRESS,
EXPECTED_LOG_MESSAGE,
EXPECTED_REMOTE_ADDRESS,
EXPECTED_SYSLOG_SEVERITY,
builder.build());
event = new RawEvent();
event.addTag(SyslogFacility.DAEMON.toString());
event.getSource().setRef(EXPECTED_HOST).setType(EXPECTED_SOURCE_TYPE);
event.addTag(EXPECTED_SYSLOG_FACILITY.toString());
event.addTag(EXPECTED_HOST);
event.setCreatedAt(now);
event.addFingerprintField("facility");
event.addFingerprintField("hostname");
event.addFingerprintField("message");
event.setTitle(String.format("Syslog message from: %s",EXPECTED_HOST));
event.setMessage(EXPECTED_LOG_MESSAGE);
expectedTags = new ArrayList<String>();
expectedTags.add(SyslogFacility.DAEMON.toString());
expectedTags.add(EXPECTED_HOST);
expectedProperties = new HashMap<String,Object>();
expectedProperties.put("facility",SyslogFacility.DAEMON.toString());
expectedProperties.put("hostname",EXPECTED_HOST);
expectedProperties.put("message",EXPECTED_LOG_MESSAGE);
expectedFingerprintFields = new ArrayList<String>();
expectedFingerprintFields.add("facility");
expectedFingerprintFields.add("hostname");
expectedFingerprintFields.add("message");
}
@After
public void tearDown() throws Exception {
super.tearDown();
this.syslogMessage = null;
this.expectedTags = null;
}
private SyslogMessage buildSyslogMessage(
SyslogFacility facility,
String hostname,
String localAddress,
String logMessage,
String remoteAddress,
SyslogSeverity severity,
Calendar timestamp) {
SyslogMessage message = new SyslogMessage();
message.setFacility(facility);
message.setHostname(hostname);
message.setLocalAddress(localAddress);
message.setLogMessage(logMessage);
message.setRemoteAddress(remoteAddress);
message.setSeverity(severity);
message.setTimestamp(timestamp);
return message;
}
@Test
public void testTranslateEvent() throws Exception {
out.expectedMessageCount(1);
inTranslate.sendBody(syslogMessage);
out.assertIsSatisfied();
List<Exchange> exchanges = out.getExchanges();
Exchange exchange = exchanges.get(0);
RawEvent newEvent = exchange.getIn().getBody(RawEvent.class);
assertEquals("check Tags",this.expectedTags,newEvent.getTags());
assertEquals("check Source name",EXPECTED_HOST,newEvent.getSource().getRef());
assertEquals("check Source type",EXPECTED_SOURCE_TYPE,newEvent.getSource().getType());
assertTrue("check fingerprint fields #1",newEvent.getFingerprintFields().containsAll(expectedFingerprintFields));
assertTrue("check fingerprint fields #2",expectedFingerprintFields.containsAll(newEvent.getFingerprintFields()));
//@TODO
//assertTrue("check properties",expectedProperties.equals(newEvent.getProperties()));
}
@Test
public void testEventEquals() throws InterruptedException {
out.expectedMessageCount(1);
inTranslate.sendBody(syslogMessage);
out.assertIsSatisfied();
List<Exchange> exchanges = out.getExchanges();
Exchange exchange = exchanges.get(0);
RawEvent newEvent = exchange.getIn().getBody(RawEvent.class);
assertNotNull(newEvent);
assertEquals("check exchange count",1,exchanges.size());
}
@Ignore
@Test
public void testTranslate() throws InterruptedException {
out.expectedMessageCount(1);
inNoTranslate.sendBody(syslogMessage);
out.assertIsSatisfied();
List<Exchange> exchanges = out.getExchanges();
assertEquals("check exchange count",1,exchanges.size());
Exchange exchange = exchanges.get(0);
assertNotNull("check for Null Exchange",exchange);
RawEvent newEvent = exchange.getIn().getBody(RawEvent.class);
assertTrue("no translate check",event.equals(newEvent));
}
@Test
public void testNoTranslate() throws InterruptedException {
out.expectedMessageCount(1);
inNoTranslate.sendBody(syslogMessage);
out.assertIsSatisfied();
List<Exchange> exchanges = out.getExchanges();
assertEquals("check exchange count",1,exchanges.size());
Exchange exchange = exchanges.get(0);
assertNotNull("check for Null Exchange",exchange);
SyslogMessageEvent event = exchange.getIn().getBody(SyslogMessageEvent.class);
assertEquals("check host name",syslogMessage.getHostname(),event.getHostname());
assertEquals("check facility",syslogMessage.getFacility().toString(),event.getFacility());
assertEquals("check local address",syslogMessage.getLocalAddress(),event.getLocalAddress());
assertEquals("check log message",syslogMessage.getLogMessage(),event.getLogMessage());
assertEquals("check remote address",syslogMessage.getRemoteAddress(),event.getRemoteAddress());
assertEquals("check severity",syslogMessage.getSeverity().toString(),event.getSeverity());
assertEquals("check timestamp",syslogMessage.getTimestamp().getTime(),event.getTimestamp());
}
@Override
protected RouteBuilder createRouteBuilder() {
return new RouteBuilder() {
public void configure() {
from("direct:in-translate")
.process(new SyslogToEventProcessor(true))
.to("mock:out");
from("direct:in-no-translate")
.process(new SyslogToEventProcessor(false))
.to("mock:out");
}
};
}
}