/*
* Copyright (C) 2015 Orange
*
* This software is distributed under the terms and conditions of the 'GNU GENERAL PUBLIC LICENSE
* Version 2' license which can be found in the file 'LICENSE.txt' in this package distribution or
* at 'http://www.gnu.org/licenses/gpl-2.0-standalone.html'.
*/
package com.orange.cepheus.cep;
import com.orange.cepheus.cep.exception.ConfigurationException;
import com.orange.cepheus.cep.exception.EventProcessingException;
import com.orange.cepheus.cep.model.*;
import com.orange.cepheus.geo.GeoUtil;
import com.orange.cepheus.geo.Geospatial;
import com.orange.ngsi.model.ContextAttribute;
import com.orange.ngsi.model.ContextElement;
import com.orange.ngsi.model.ContextMetadata;
import com.orange.ngsi.model.EntityId;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.Point;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.*;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
/**
* Test the EventMapper class
*/
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
public class EventMapperTest {
@Autowired
public EventMapper eventMapper;
/**
* Test that esperTypeFromEventType return the right Java types
*/
@Test
public void testEsperTypes() {
EventType e = new EventType("ID", "TYPE", false);
e.addAttribute(new Attribute("1", "string"));
e.addAttribute(new Attribute("2", "double"));
e.addAttribute(new Attribute("3", "int"));
e.addAttribute(new Attribute("4", "float"));
e.addAttribute(new Attribute("5", "boolean"));
e.addAttribute(new Attribute("6", "XXXX"));
e.addAttribute(new Attribute("7", "long"));
e.addAttribute(new Attribute("8", "date"));
e.addAttribute(new Attribute("9", "geo:point"));
Map<String, Object> map = eventMapper.esperTypeFromEventType(e);
assertEquals(String.class, map.get("id"));
assertEquals(String.class, map.get("1"));
assertEquals(double.class, map.get("2"));
assertEquals(int.class, map.get("3"));
assertEquals(float.class, map.get("4"));
assertEquals(boolean.class, map.get("5"));
assertEquals(long.class, map.get("7"));
assertEquals(Date.class, map.get("8"));
assertEquals(Geometry.class, map.get("9"));
}
/**
* Test that conversion fails on null attribute
* @throws Exception
*/
@Test(expected = EventProcessingException.class)
public void testContextElementConversionNull() throws Exception {
ContextElement ce = new ContextElement();
ce.setEntityId(new EntityId("S1", "TempSensor", false));
List<ContextAttribute> attributes = new LinkedList<>();
attributes.add(new ContextAttribute("1", "string", null));
ce.setContextAttributeList(attributes);
eventMapper.eventFromContextElement(ce).getValues();
}
/**
* Test that the ContextElement is correctly converted to an Esper map
* @throws Exception
*/
@Test
public void testContextElementConversion() throws Exception {
ContextElement ce = new ContextElement();
ce.setEntityId(new EntityId("S1", "TempSensor", false));
List<ContextAttribute> attributes = new LinkedList<>();
attributes.add(new ContextAttribute("1", "string", "hello"));
attributes.add(new ContextAttribute("1_string", null, "hello"));
attributes.add(new ContextAttribute("2", "float", 1.4f));
attributes.add(new ContextAttribute("3", "double", 3.1d));
attributes.add(new ContextAttribute("4", "int", 3));
attributes.add(new ContextAttribute("5", "long", 3l));
attributes.add(new ContextAttribute("6", "boolean", true));
attributes.add(new ContextAttribute("7", "boolean", false));
attributes.add(new ContextAttribute("8", "date", "2015-12-01T17:12:28Z"));
attributes.add(new ContextAttribute("9", "geo:point", "39.23, -10.3"));
ce.setContextAttributeList(attributes);
Map<String, Object> values = eventMapper.eventFromContextElement(ce).getValues();
assertEquals("S1", values.get("id"));
assertEquals("hello", values.get("1"));
assertEquals("hello", values.get("1_string"));
assertEquals(1.4f, values.get("2"));
assertEquals(3.1d, values.get("3"));
assertEquals(3, values.get("4"));
assertEquals(3l, values.get("5"));
assertEquals(true, values.get("6"));
assertEquals(false, values.get("7"));
assertEquals(new Date(1448989948000l), values.get("8"));
assertEquals(Geospatial.readGeometry("POINT(39.23 -10.3)"), values.get("9"));
}
/**
* Test that the ContextElement from string values is correctly converted to an Esper map
* @throws Exception
*/
@Test
public void testContextElementConversionString() throws Exception {
ContextElement ce = new ContextElement();
ce.setEntityId(new EntityId("S1", "TempSensor", false));
List<ContextAttribute> attributes = new LinkedList<>();
attributes.add(new ContextAttribute("1", "string", "hello"));
attributes.add(new ContextAttribute("2", "float", "1.4"));
attributes.add(new ContextAttribute("3", "double", "3.1"));
attributes.add(new ContextAttribute("4", "int", "3"));
attributes.add(new ContextAttribute("5", "long", "3"));
attributes.add(new ContextAttribute("6", "boolean", "true"));
attributes.add(new ContextAttribute("7", "boolean", "false"));
ce.setContextAttributeList(attributes);
Map<String, Object> values = eventMapper.eventFromContextElement(ce).getValues();
assertEquals("S1", values.get("id"));
assertEquals("hello", values.get("1"));
assertEquals(1.4f, values.get("2"));
assertEquals(3.1d, values.get("3"));
assertEquals(3, values.get("4"));
assertEquals(3l, values.get("5"));
assertEquals(true, values.get("6"));
assertEquals(false, values.get("7"));
}
/**
* Test that the ContextElement with metadata is correctly converted to an Esper map
* @throws Exception
*/
@Test
public void testContextElementConversionMetadata() throws Exception {
ContextElement ce = new ContextElement();
ce.setEntityId(new EntityId("S1", "TempSensor", false));
ContextAttribute ca = new ContextAttribute("ATTR1", "string", "hello");
ce.setContextAttributeList(Collections.singletonList(ca));
List<ContextMetadata> metadatas = new LinkedList<>();
metadatas.add(new ContextMetadata("1", "string", "hello"));
metadatas.add(new ContextMetadata("2", "float", 1.4f));
metadatas.add(new ContextMetadata("3", "double", 3.1d));
metadatas.add(new ContextMetadata("4", "int", 3));
metadatas.add(new ContextMetadata("5", "long", 3l));
metadatas.add(new ContextMetadata("6", "boolean", true));
metadatas.add(new ContextMetadata("7", "boolean", false));
ca.setMetadata(metadatas);
Map<String, Object> values = eventMapper.eventFromContextElement(ce).getValues();
assertEquals("hello", values.get("ATTR1_1"));
assertEquals(1.4f, values.get("ATTR1_2"));
assertEquals(3.1d, values.get("ATTR1_3"));
assertEquals(3, values.get("ATTR1_4"));
assertEquals(3l, values.get("ATTR1_5"));
assertEquals(true, values.get("ATTR1_6"));
assertEquals(false, values.get("ATTR1_7"));
}
/**
* Test that the ContextElement with string metadata is correctly converted to an Esper map
* @throws Exception
*/
@Test
public void testContextElementConversionMetadataString() throws Exception {
ContextElement ce = new ContextElement();
ce.setEntityId(new EntityId("S1", "TempSensor", false));
ContextAttribute ca = new ContextAttribute("ATTR1", "string", "hello");
ce.setContextAttributeList(Collections.singletonList(ca));
List<ContextMetadata> metadatas = new LinkedList<>();
metadatas.add(new ContextMetadata("1", "string", "hello"));
metadatas.add(new ContextMetadata("2", "float", "1.4"));
metadatas.add(new ContextMetadata("3", "double", "3.1"));
metadatas.add(new ContextMetadata("4", "int", "3"));
metadatas.add(new ContextMetadata("5", "long", "3"));
metadatas.add(new ContextMetadata("6", "boolean", "true"));
metadatas.add(new ContextMetadata("7", "boolean", "false"));
ca.setMetadata(metadatas);
Map<String, Object> values = eventMapper.eventFromContextElement(ce).getValues();
assertEquals("hello", values.get("ATTR1_1"));
assertEquals(1.4f, values.get("ATTR1_2"));
assertEquals(3.1d, values.get("ATTR1_3"));
assertEquals(3, values.get("ATTR1_4"));
assertEquals(3l, values.get("ATTR1_5"));
assertEquals(true, values.get("ATTR1_6"));
assertEquals(false, values.get("ATTR1_7"));
}
/**
* Test that the ContextElement conversion fails
* @throws Exception
*/
@Test(expected = EventProcessingException.class)
public void testContextElementConversionFailConv() throws Exception {
ContextElement ce = new ContextElement();
ce.setEntityId(new EntityId("S1", "TempSensor", false));
ContextAttribute ca = new ContextAttribute("ATTR1", "string", "hello");
ce.setContextAttributeList(Collections.singletonList(ca));
List<ContextMetadata> metadatas = new LinkedList<>();
metadatas.add(new ContextMetadata("1", "float", "hello"));
ca.setMetadata(metadatas);
eventMapper.eventFromContextElement(ce).getValues();
}
/**
* Test that the ContextElement with string metadata is correctly converted to an Esper map
* @throws Exception
*/
@Test
public void testContextElementJsonPath_OK() throws Exception {
Attribute a = new Attribute("Attr", "string");
a.setJsonpath("$.test[0]");
EventTypeIn e = new EventTypeIn("S.*", "TempSensor", true);
e.setAttributes(Collections.singleton(a));
Configuration configuration = new Configuration();
configuration.setEventTypeIns(Collections.singletonList(e));
eventMapper.setConfiguration(configuration);
ContextElement ce = new ContextElement();
ce.setEntityId(new EntityId("S1", "TempSensor", false));
ContextAttribute ca = new ContextAttribute("Attr", "string", Collections.singletonMap("test", Collections.singletonList("hello")));
ce.setContextAttributeList(Collections.singletonList(ca));
Map<String, Object> values = eventMapper.eventFromContextElement(ce).getValues();
assertEquals("hello", values.get("Attr"));
}
/**
* Test that the ContextElement with a bad jsonpath in attribute will trigger exception
* @throws Exception
*/
@Test(expected = ConfigurationException.class)
public void testContextElementWithBadJsonPathInAttribute() throws ConfigurationException {
Attribute a = new Attribute("Attr", "string");
a.setJsonpath("$BADJSONPATH");
EventTypeIn e = new EventTypeIn("S.*", "TempSensor", true);
e.setAttributes(Collections.singleton(a));
Configuration configuration = new Configuration();
configuration.setEventTypeIns(Collections.singletonList(e));
eventMapper.setConfiguration(configuration);
}
/**
* Test that the ContextElement with a bad jsonpath in metadata will trigger exception
* @throws Exception
*/
@Test(expected = ConfigurationException.class)
public void testContextElementWithBadJsonPathInMetadata() throws ConfigurationException {
Metadata m = new Metadata("Meta", "string");
m.setJsonpath("$BADJSONPATH2");
Attribute a = new Attribute("Attr", "string");
a.setMetadata(Collections.singleton(m));
EventTypeIn e = new EventTypeIn("S.*", "TempSensor", true);
e.setAttributes(Collections.singleton(a));
Configuration configuration = new Configuration();
configuration.setEventTypeIns(Collections.singletonList(e));
eventMapper.setConfiguration(configuration);
}
}