/* * 2012-3 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. */ package org.overlord.rtgov.activity.store.jpa; import static org.junit.Assert.fail; import java.net.URL; import org.hibernate.Session; import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.Test; 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.Context.Type; 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.server.QuerySpec; import org.overlord.rtgov.common.jpa.JpaStore; import org.overlord.rtgov.common.jpa.JpaStore.JpaWork; public class JPAActivityStoreTest { 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 final String JPQL_FORMAT = "jpql"; private static final String MONGODB_FORMAT = "mongodb"; private static final String OVERLORD_RTGOV_ACTIVITY_ORM = "overlord-rtgov-activity-orm"; private static final String OVERLORD_RTGOV_ACTIVITY_OGM_M = "overlord-rtgov-activity-ogm-mongodb"; private static JpaStore jpaStore; private static JPAActivityStore activityStore; @BeforeClass public static void initialiseEntityManager() throws Exception{ final URL configXml = JPAActivityStoreTest.class.getClassLoader().getResource("hibernate-test.cfg.xml"); jpaStore = new JpaStore(configXml); activityStore = new JPAActivityStore(jpaStore); } public 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"); 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); } protected void checkTableEmpty(final String table) { int rows = jpaStore.withJpa(new JpaWork<Integer>() { public Integer perform(Session s) { return s.createSQLQuery("SELECT * FROM "+table).list().size(); } }); if (rows != 0) { fail("Table '"+table+"' is not empty: "+rows); } } protected void checkAllTablesEmpty() { checkTableEmpty("RTGOV_ACTIVITY_UNITS"); checkTableEmpty("RTGOV_ACTIVITIES"); checkTableEmpty("RTGOV_ACTIVITY_CONTEXT"); checkTableEmpty("RTGOV_ACTIVITY_PROPERTIES"); } @Test public void testQueryUnsupportedFormat() { try { activityStore.query(new QuerySpec() .setFormat("mvel") .setExpression("true")); fail("Should have returned an exception"); } catch (IllegalArgumentException iae) { System.out.println("EXPECTED EXCEPTION="+iae); } catch (Exception e) { fail("Unexpected exception: "+e); } } @Test public void testQueryNotSelect() { try { activityStore.query(new QuerySpec() .setFormat("jpql") .setExpression("update activities")); fail("Should have returned an exception"); } catch (IllegalArgumentException iae) { System.out.println("EXPECTED EXCEPTION="+iae); } catch (Exception e) { fail("Unexpected exception: "+e); } } @Test public void testStoreAndQueryAllORM() { checkAllTablesEmpty(); java.util.List<ActivityType> results= testStoreAndQuery(OVERLORD_RTGOV_ACTIVITY_ORM, new QuerySpec() .setFormat(JPQL_FORMAT) .setExpression("SELECT at FROM ActivityType at")); if (results.size() != 4) { fail("Expected 4 entries: "+results.size()); } System.out.println("RESULTS="+results); checkAllTablesEmpty(); } @Test public void testQueryActivityFieldORM() { checkAllTablesEmpty(); java.util.List<ActivityType> results= testStoreAndQuery(OVERLORD_RTGOV_ACTIVITY_ORM, new QuerySpec() .setFormat(JPQL_FORMAT) .setExpression("SELECT at from ActivityType at "+ "WHERE at.operation = 'myOp' " + "AND at.fault = 'MyFault'")); //"join evt.properties p "+ //"where p.value = 'Joe'"); //"inner join evt.properties p \n"+ //"where p.name = 'trader' and p.value = 'Joe'"); if (results.size() != 2) { fail("Expected 2 entries: "+results.size()); } System.out.println("RESULTS="+results); checkAllTablesEmpty(); } @Test public void testStoreAndGetATsORM() { java.util.List<ActivityType> results=null; java.util.List<ActivityUnit> activities=new java.util.ArrayList<ActivityUnit>(); checkAllTablesEmpty(); 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 { activityStore.store(activities); } catch(Exception e) { fail("Failed to store activities: "+e); } try { Context query=new Context(); query.setType(Type.Conversation); query.setValue(CONV_ID_1); results = activityStore.getActivityTypes(query); } catch(Exception e) { fail("Failed to query activities: "+e); } finally { try { activityStore.remove(au1); activityStore.remove(au2); } catch (Exception e) { fail("Failed to remove activity units: "+e); } } System.out.println("RESULTS="+results); if (results.size() != 1) { fail("Only expecting a single activity event: "+results.size()); } checkAllTablesEmpty(); } @Test @Ignore("RTGOV-234 - awaiting support for hibernate OGM") public void testStoreAndQueryAllOGMM() { testStoreAndQuery(OVERLORD_RTGOV_ACTIVITY_OGM_M, new QuerySpec().setFormat(MONGODB_FORMAT). setExpression("db.ActivityType.find()")); } @Test public void testGetActivityTypesContextConversation() { java.util.List<ActivityType> results=null; java.util.List<ActivityUnit> activities=new java.util.ArrayList<ActivityUnit>(); checkAllTablesEmpty(); ActivityUnit au1=createTestActivityUnit("3", "3", "3", 0); ActivityUnit au2=createTestActivityUnit("4", "4", "4", 5000); activities.add(au1); activities.add(au2); try { activityStore.store(activities); } catch(Exception e) { fail("Failed to store activities: "+e); } try { Context context=new Context(); context.setType(Type.Conversation); context.setValue("3"); results = activityStore.getActivityTypes(context); } catch(Exception e) { fail("Failed to query activities: "+e); } finally { try { activityStore.remove(au1); activityStore.remove(au2); } catch (Exception e) { fail("Failed to remove activity units: "+e); } } if (results == null) { fail("Results is null"); } if (results.size() != 1) { fail("Expecting 1 result: "+results.size()); } if (!results.get(0).getUnitId().equals("3")) { fail("Expecting au 3: "+results.get(0).getUnitId()); } checkAllTablesEmpty(); } @Test public void testGetActivityTypesContextEndpoint() { java.util.List<ActivityType> results=null; java.util.List<ActivityUnit> activities=new java.util.ArrayList<ActivityUnit>(); checkAllTablesEmpty(); ActivityUnit au1=createTestActivityUnit("5", "5", "5", 0); ActivityUnit au2=createTestActivityUnit("6", "6", "6", 5000); activities.add(au1); activities.add(au2); try { activityStore.store(activities); } catch(Exception e) { fail("Failed to store activities: "+e); } try { Context context=new Context(); context.setType(Type.Endpoint); context.setValue("6"); results = activityStore.getActivityTypes(context); } catch(Exception e) { fail("Failed to query activities: "+e); } finally { try { activityStore.remove(au1); activityStore.remove(au2); } catch (Exception e) { fail("Failed to remove activity units: "+e); } } if (results == null) { fail("Results is null"); } if (results.size() != 1) { fail("Expecting 1 result: "+results.size()); } if (!results.get(0).getUnitId().equals("6")) { fail("Expecting au 6: "+results.get(0).getUnitId()); } checkAllTablesEmpty(); } @Test public void testGetActivityTypesContextTimeframe() { java.util.List<ActivityType> results1=null; java.util.List<ActivityType> results2=null; java.util.List<ActivityUnit> activities=new java.util.ArrayList<ActivityUnit>(); checkAllTablesEmpty(); ActivityUnit au1=createTestActivityUnit("7", "C1", "E1", 0); ActivityUnit au2=createTestActivityUnit("8", "C1", "E1", 5000); activities.add(au1); activities.add(au2); try { activityStore.store(activities); } catch(Exception e) { fail("Failed to store activities: "+e); } try { Context context1=new Context(); context1.setType(Type.Conversation); context1.setValue("C1"); results1 = activityStore.getActivityTypes(context1); Context context2=new Context(); context2.setType(Type.Conversation); context2.setValue("C1"); results2 = activityStore.getActivityTypes(context2, 2500, 7500); } catch(Exception e) { fail("Failed to query activities: "+e); } finally { try { activityStore.remove(au1); activityStore.remove(au2); } catch (Exception e) { fail("Failed to remove 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()); } checkAllTablesEmpty(); } @Test public void testGetActivityTypesNoContextTimeframe() { java.util.List<ActivityType> results1=null; java.util.List<ActivityUnit> activities=new java.util.ArrayList<ActivityUnit>(); checkAllTablesEmpty(); ActivityUnit au1=createTestActivityUnit("7", "C1", "E1", 0); ActivityUnit au2=createTestActivityUnit("8", "C1", "E1", 5000); activities.add(au1); activities.add(au2); try { activityStore.store(activities); } catch(Exception e) { fail("Failed to store activities: "+e); } try { results1 = activityStore.getActivityTypes(null, 2500, 7500); } catch(Exception e) { fail("Failed to query activities: "+e); } finally { try { activityStore.remove(au1); activityStore.remove(au2); } catch (Exception e) { fail("Failed to remove activity units: "+e); } } if (results1 == null) { fail("Results1 is null"); } if (results1.size() != 2) { fail("Expecting 2 results: "+results1.size()); } checkAllTablesEmpty(); } @Test public void testGetActivityTypesNoContextNoTimeframe() { java.util.List<ActivityUnit> activities=new java.util.ArrayList<ActivityUnit>(); checkAllTablesEmpty(); ActivityUnit au1=createTestActivityUnit("7", "C1", "E1", 0); ActivityUnit au2=createTestActivityUnit("8", "C1", "E1", 5000); activities.add(au1); activities.add(au2); try { activityStore.store(activities); } catch(Exception e) { fail("Failed to store activities: "+e); } try { activityStore.getActivityTypes(null, 0, 0); fail("Should have thrown exception"); } catch(Exception e) { } finally { try { activityStore.remove(au1); activityStore.remove(au2); } catch (Exception e) { fail("Failed to remove activity units: "+e); } } checkAllTablesEmpty(); } protected java.util.List<ActivityType> testStoreAndQuery(String emname, QuerySpec qs) { java.util.List<ActivityType> results=null; 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 { activityStore.store(activities); } catch(Exception e) { fail("Failed to store activities: "+e); } try { results = activityStore.query(qs); } catch(Exception e) { fail("Failed to query activities: "+e); } finally { try { activityStore.remove(au1); activityStore.remove(au2); } catch (Exception e) { fail("Failed to remove activity units: "+e); } } return (results); } }