package org.overlord.rtgov.activity.store.elasticsearch;
/*
* 2012-4 Red Hat Inc. and/or its affiliates and other contributors.
*
* 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.
*/
/**
* User: imk@redhat.com
* Date: 22/04/14
* Time: 22:10
*/
import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.overlord.commons.services.ServiceRegistryUtil;
import org.overlord.rtgov.activity.model.ActivityType;
import org.overlord.rtgov.activity.model.ActivityUnit;
import org.overlord.rtgov.activity.model.Context;
import org.overlord.rtgov.activity.model.Origin;
import org.overlord.rtgov.activity.model.soa.RequestSent;
import org.overlord.rtgov.activity.model.soa.ResponseReceived;
import org.overlord.rtgov.activity.util.ActivityUtil;
import org.overlord.rtgov.common.elasticsearch.ElasticsearchNode;
import org.overlord.rtgov.common.util.RTGovProperties;
import org.overlord.rtgov.common.util.RTGovPropertiesProvider;
import org.overlord.rtgov.internal.common.elasticsearch.ElasticsearchNodeImpl;
import java.util.Properties;
import junit.framework.Assert;
import static org.junit.Assert.fail;
public class ElasticsearchActivityStoreTest {
private static final String ENDPOINT_ID_1 = "abc123";
private static final String ENDPOINT_ID_2 = "abc456";
private static final String AU_ID_2 = "au2";
private static final String AU_ID_1 = "au1";
private static final String CONV_ID_2 = "2";
private static final String CONV_ID_1 = "1";
private static ElasticsearchActivityStore _elasticsearchActivityStore;
private static ElasticsearchNodeImpl _node=null;
/**
* elastic search index to test against
*/
private final static String INDEX = "rtgovtest";
/**
* elastich search host
*/
private final static String HOST = "embedded";
/**
* elasticsearch port
*/
private final static int PORT = 9300;
/**
* elasticsearch type to test
*/
private final static String TYPE = "activity";
public static class TestPropertiesProvider implements RTGovPropertiesProvider {
private java.util.Properties _properties = new java.util.Properties();
public TestPropertiesProvider() {
System.setProperty("elasticsearch.config", "ElasticsearchActivityStoreTest-es.properties");
_properties = new Properties();
_properties.setProperty("Elasticsearch.hosts", HOST + ":" + 9300);
_properties.setProperty("Elasticsearch.schedule", "3000");
_properties.setProperty("ActivityStore.Elasticsearch.type", TYPE);
_properties.setProperty("ActivityStore.Elasticsearch.index", INDEX);
_properties.setProperty("elasticsearch.config", "ElasticsearchActivityStoreTest-es.properties");
}
public String getProperty(String name) {
return _properties.getProperty(name);
}
public Properties getProperties() {
return _properties;
}
}
/**
* tear down test index again.
* @throws Exception
*/
@AfterClass
public static void tearDown() throws Exception {
Client c = new TransportClient();
if (HOST.equals("embedded")) {
c = _node.getClient();
} else {
c = new TransportClient().addTransportAddress(new InetSocketTransportAddress(HOST, PORT));
}
c.admin().indices().prepareDelete(INDEX).execute().actionGet();
if (_node != null) {
_node.close();
}
if (_elasticsearchActivityStore != null) {
_elasticsearchActivityStore.close();
}
}
/**
* Initialize the store before each test.
*
* @throws Exception
*/
@BeforeClass
public static void initialiseStore() throws Exception {
TestPropertiesProvider provider = new TestPropertiesProvider();
Client c = null;
if (HOST.equals("embedded")) {
_node = (ElasticsearchNodeImpl)ServiceRegistryUtil.getSingleService(ElasticsearchNode.class);
_node.init();
c = _node.getClient();
} else {
c = new TransportClient().addTransportAddress(new InetSocketTransportAddress(HOST, PORT));
}
// remove index.
if (c.admin().indices().prepareExists(INDEX).execute().actionGet().isExists()) {
c.admin().indices().prepareDelete(INDEX).execute().actionGet();
}
RTGovProperties.setPropertiesProvider(provider);
_elasticsearchActivityStore = new ElasticsearchActivityStore();
_elasticsearchActivityStore.init();
}
@Test
public void testStoreAndGetActivityUnit() {
try {
java.util.List<ActivityUnit> list=new java.util.ArrayList<ActivityUnit>();
list.add(createTestActivityUnit(AU_ID_1, CONV_ID_1, ENDPOINT_ID_1, 0));
_elasticsearchActivityStore.store(list);
} catch (Exception e) {
fail("Could not store Add activity unit " + e);
}
try {
ActivityUnit au = _elasticsearchActivityStore.getActivityUnit(AU_ID_1);
if (au != null) {
if (!au.getId().equals(AU_ID_1))
fail("Activity unit reterive does not match activity unit stored. Could not get AU");
} else
fail("Activity unit is null. Could not get AU");
} catch (Exception e) {
fail("Could not get activity unit " + e);
}
try {
_elasticsearchActivityStore.getClient().remove(AU_ID_1);
} catch (Exception e) {
fail("Could not remove activity unit " + e);
}
}
/**
* ****Works*******
{
"query" : {
"nested" : {
"path" : "activityTypes",
"query" : {
"match" : {
"activityTypes.type" : "RequestSent"
}
}
}
}}
*/
/**
* ****Works*******
* <p/>
* {
* "query" : {
* "nested" : {
* "path" : "activityTypes",
* "query" : {
* "match" : {
* "activityTypes.type" : "RequestSent"
* }
* }
* }
* }}
*
* @return
*/
@Test
public void testStoreAndQuery() {
java.util.List<ActivityUnit> activities = new java.util.ArrayList<ActivityUnit>();
ActivityUnit au1 = createTestActivityUnit(AU_ID_1, CONV_ID_1, ENDPOINT_ID_1, 0);
ActivityUnit au2 = createTestActivityUnit(AU_ID_2, CONV_ID_2, ENDPOINT_ID_2, 5000);
activities.add(au1);
activities.add(au2);
try {
_elasticsearchActivityStore.store(activities);
// Delay to enable search index
synchronized (this) {
wait(2000);
}
} catch (Exception e) {
fail("Failed to store activities: " + e.getMessage() + ", ");
}
try {
ActivityUnit au1r = _elasticsearchActivityStore.getActivityUnit(AU_ID_1);
ActivityUnit au2r = _elasticsearchActivityStore.getActivityUnit(AU_ID_2);
if (au1r != null) {
if (!au1r.getId().equals(AU_ID_1)) {
fail("Activity unit reterive does not match activity unit stored. Could not get AU");
}
} else {
fail("Activity unit is null. Could not get AU");
}
if (au2r != null) {
if (!au2r.getId().equals(AU_ID_2)) {
fail("Activity unit reterive does not match activity unit stored. Could not get AU");
}
} else {
fail("Activity unit is null. Could not get AU");
}
// Check activity unit is the same
String au1ser=new String(ActivityUtil.serializeActivityUnit(au1));
String au1rser=new String(ActivityUtil.serializeActivityUnit(au1r));
// Unfortunately the context objects are not serialized in any particular order, so we need
// to test for equality in multiple steps
if (au1rser.length() != au1ser.length()) {
fail("Lengths don't match");
}
if (!au1ser.substring(0, 270).equals(au1rser.substring(0, 270))) {
fail("First 270 did not match");
}
if (!au1ser.substring(350).equals(au1rser.substring(350))) {
fail("From 350 did not match");
}
} catch (Exception e) {
fail("Could not get activity unit " + e);
}
try {
_elasticsearchActivityStore.getClient().remove(AU_ID_1);
_elasticsearchActivityStore.getClient().remove(AU_ID_2);
} catch (Exception e) {
fail("Could not remove activity unit " + e);
}
}
@Test
public void testGetActivityTypesWithContextAndTimeframe() {
java.util.List<ActivityType> results1 = null;
java.util.List<ActivityType> results2 = null;
java.util.List<ActivityUnit> activities = new java.util.ArrayList<ActivityUnit>();
ActivityUnit au1 = createTestActivityUnit("7", "C1", "E1", 10000);
ActivityUnit au2 = createTestActivityUnit("8", "C1", "E2", 15000);
// Setting endpoint value to C1 to make sure does not get value and type picked up
// from different context objects
ActivityUnit au3 = createTestActivityUnit("9", "C2", "C1", 20000);
activities.add(au1);
activities.add(au2);
activities.add(au3);
try {
//store both ATs
_elasticsearchActivityStore.store(activities);
} catch (Exception e) {
e.printStackTrace();
fail("Could not store activity units " + e);
}
Context context1 = new Context();
context1.setType(Context.Type.Conversation);
context1.setValue("C1");
try {
results1 = _elasticsearchActivityStore.getActivityTypes(context1);
} catch (Exception e) {
e.printStackTrace();
fail("Could not get activity units " + e);
}
Context context2 = new Context();
context2.setType(Context.Type.Conversation);
context2.setValue("C1");
try {
results2 = _elasticsearchActivityStore.getActivityTypes(context2, 12500, 17500);
} catch (Exception e) {
e.printStackTrace();
fail("Could not get activity units " + e);
}
if (results1 == null) {
fail("Results1 is null");
}
if (results1.size() != 2) {
fail("Expecting 2 results: " + results1.size());
}
if (results2 == null) {
fail("Results2 is null");
}
if (results2.size() != 1) {
fail("Expecting 1 result: " + results2.size());
}
if (!results2.get(0).getUnitId().equals("8")) {
fail("Expecting au 8: " + results2.get(0).getUnitId());
}
try {
_elasticsearchActivityStore.getClient().remove("7");
_elasticsearchActivityStore.getClient().remove("8");
_elasticsearchActivityStore.getClient().remove("9");
} catch (Exception e) {
fail("Could not remove activity unit " + e);
}
}
@Test
public void testGetActivityTypesWithNoContextAndTimeframe() {
java.util.List<ActivityType> results1 = null;
java.util.List<ActivityUnit> activities = new java.util.ArrayList<ActivityUnit>();
ActivityUnit au1 = createTestActivityUnit("7", "C1", "E1", 30000);
ActivityUnit au2 = createTestActivityUnit("8", "C1", "E2", 35000);
// Setting endpoint value to C1 to make sure does not get value and type picked up
// from different context objects
ActivityUnit au3 = createTestActivityUnit("9", "C2", "C1", 40000);
activities.add(au1);
activities.add(au2);
activities.add(au3);
try {
//store both ATs
_elasticsearchActivityStore.store(activities);
} catch (Exception e) {
e.printStackTrace();
fail("Could not store activity units " + e);
}
try {
results1 = _elasticsearchActivityStore.getActivityTypes(null, 32500, 37500);
} catch (Exception e) {
e.printStackTrace();
fail("Could not get activity units " + e);
}
if (results1 == null) {
fail("Results1 is null");
}
if (results1.size() != 2) {
fail("Expecting 2 results: " + results1.size());
}
try {
_elasticsearchActivityStore.getClient().remove("7");
_elasticsearchActivityStore.getClient().remove("8");
_elasticsearchActivityStore.getClient().remove("9");
} catch (Exception e) {
fail("Could not remove activity unit " + e);
}
}
@Test
public void testGetActivityTypesWithNoContextAndNoTimeframe() {
try {
_elasticsearchActivityStore.getActivityTypes(null, 0, 0);
fail("Should have reported exception");
} catch (Exception e) {
}
}
protected ActivityUnit createTestActivityUnit(String id, String convId, String endpointId, long baseTime) {
ActivityUnit act = new ActivityUnit();
act.setId(id);
Origin origin = new Origin();
origin.setHost("MyHost");
origin.setNode("MyNode");
origin.setPrincipal("Me");
origin.setThread("MyThread");
act.setOrigin(origin);
RequestSent me1 = new RequestSent();
me1.setUnitId(id);
me1.setUnitIndex(0);
me1.setTimestamp(baseTime + 1000);
me1.setContent("<tns:Order xmlns:tns=\"http://www.savara.org\" amount=\"100\" />");
me1.setMessageType("{http://message}Order");
me1.setOperation("myOp");
me1.setServiceType("{http://service}OrderService");
me1.setMessageId("corr1");
me1.getProperties().put("customer", "Fred");
me1.getProperties().put("trader", "Joe");
me1.getProperties().put("sss", "Joe");
me1.getProperties().put("sss", "Joe");
if (baseTime==0) {
me1.getProperties().put("cccc","ysdasdasdda");
}
Context c1 = new Context();
c1.setType(Context.Type.Conversation);
c1.setValue(convId);
me1.getContext().add(c1);
act.getActivityTypes().add(me1);
ResponseReceived me2 = new ResponseReceived();
me2.setUnitId(id);
me2.setUnitIndex(1);
me2.setTimestamp(baseTime + 2000);
me2.setContent("<tns:Confirmation xmlns:tns=\"http://www.savara.org\" amount=\"100\" />");
me2.setFault("MyFault");
me2.setMessageType("{http://message}Confirmation");
me2.setOperation("myOp");
me2.setServiceType("{http://service}OrderService");
me2.setMessageId("corr2");
me2.setReplyToId("corr1");
me2.getProperties().put("customer", "Fred");
me2.getProperties().put("manager", "Jane");
Context c2 = new Context();
c2.setType(Context.Type.Endpoint);
c2.setValue(endpointId);
me2.getContext().add(c2);
act.getActivityTypes().add(me2);
return (act);
}
}