/*
* 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.analytics.situation.store.jpa;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.overlord.rtgov.analytics.situation.store.ResolutionState.IN_PROGRESS;
import java.net.URL;
import java.util.Collections;
import java.util.List;
import java.util.Properties;
import javax.naming.NamingException;
import org.hibernate.Session;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestName;
import org.overlord.rtgov.activity.model.ActivityTypeId;
import org.overlord.rtgov.activity.model.Context;
import org.overlord.rtgov.analytics.situation.Situation;
import org.overlord.rtgov.analytics.situation.Situation.Severity;
import org.overlord.rtgov.analytics.situation.store.SituationStore;
import org.overlord.rtgov.analytics.situation.store.SituationsQuery;
import org.overlord.rtgov.analytics.situation.store.ResolutionState;
import org.overlord.rtgov.common.jpa.JpaStore;
import org.overlord.rtgov.common.jpa.JpaStore.JpaWork;
import com.google.common.base.Strings;
import com.google.common.collect.Sets;
public class JPASituationStoreTest {
@Rule public TestName name = new TestName();
private static JpaStore _jpaStore;
private static JPASituationStore _situationStore;
@Before
public void init() throws NamingException {
final URL configXml = JPASituationStoreTest.class.getClassLoader().getResource("hibernate-test.cfg.xml");
_jpaStore = new JpaStore(configXml);
_situationStore = new JPASituationStore(_jpaStore);
}
@Test
public void getSituationById() throws Exception {
Situation situation = new Situation();
situation.setId("getSituationNotFound");
situation.setTimestamp(System.currentTimeMillis());
persist(situation);
assertEquals(situation.getId(), _situationStore.getSituation(situation.getId()).getId());
}
@Test
public void getSituationsByOpenResolutionState() throws Exception {
Situation unresolvedSituation = new Situation();
unresolvedSituation.setId("unresolvedSituation");
unresolvedSituation.setTimestamp(System.currentTimeMillis());
persist(unresolvedSituation);
Situation openSituation = new Situation();
openSituation.setId("inprogressSituation");
openSituation.setTimestamp(System.currentTimeMillis());
openSituation.getSituationProperties().put("resolutionState", ResolutionState.IN_PROGRESS.name());
persist(openSituation);
Situation closedSituation = new Situation();
closedSituation.setId("closedSituation");
closedSituation.setTimestamp(System.currentTimeMillis());
closedSituation.getSituationProperties().put("resolutionState", ResolutionState.RESOLVED.name());
persist(closedSituation);
SituationsQuery sitQuery = new SituationsQuery();
sitQuery.setResolutionState(ResolutionState.OPEN.name());
java.util.List<Situation> situations = _situationStore.getSituations(sitQuery);
Assert.assertNotNull(situations);
Assert.assertTrue(2 == situations.size());
Assert.assertTrue(situations.contains(unresolvedSituation));
Assert.assertTrue(situations.contains(openSituation));
}
@Test
public void findByEqualsHostText() throws Exception {
Situation situation = new Situation();
situation.setId(name.getMethodName());
situation.setSubject(name.getMethodName());
situation.setTimestamp(System.currentTimeMillis());
situation.getSituationProperties().put(SituationStore.HOST_PROPERTY, name.getMethodName());
persist(situation);
SituationsQuery sitQuery = new SituationsQuery();
Properties properties = new Properties();
properties.setProperty("host", name.getMethodName());
sitQuery.setProperties(properties);
java.util.List<Situation> situations = _situationStore.getSituations(sitQuery);
Assert.assertNotNull(situations);
Assert.assertTrue(1 == situations.size());
Assert.assertEquals(situation.getId(), situations.get(0).getId());
}
@Test
public void findLikeHostText() throws Exception {
Situation situation = new Situation();
situation.setId(name.getMethodName());
situation.setSubject(name.getMethodName());
situation.setTimestamp(System.currentTimeMillis());
situation.getSituationProperties().put(SituationStore.HOST_PROPERTY, name.getMethodName());
persist(situation);
SituationsQuery sitQuery = new SituationsQuery();
Properties properties = new Properties();
properties.setProperty("host", name.getMethodName().substring(3));
sitQuery.setProperties(properties);
java.util.List<Situation> situations = _situationStore.getSituations(sitQuery);
Assert.assertNotNull(situations);
Assert.assertTrue(1 == situations.size());
Assert.assertEquals(situation.getId(), situations.get(0).getId());
}
@Test
public void findEqualsSubjectText() throws Exception {
Situation situation = new Situation();
situation.setId(name.getMethodName());
situation.setSubject(name.getMethodName());
situation.setTimestamp(System.currentTimeMillis());
persist(situation);
SituationsQuery sitQuery = new SituationsQuery();
sitQuery.setSubject(name.getMethodName());
java.util.List<Situation> situations = _situationStore.getSituations(sitQuery);
Assert.assertNotNull(situations);
Assert.assertTrue(1 == situations.size());
Assert.assertEquals(situation.getId(), situations.get(0).getId());
}
@Test
public void findLikeSubjectText() throws Exception {
Situation situation = new Situation();
situation.setId(name.getMethodName());
situation.setSubject(name.getMethodName());
situation.setTimestamp(System.currentTimeMillis());
persist(situation);
SituationsQuery sitQuery = new SituationsQuery();
sitQuery.setSubject(name.getMethodName().substring(3));
java.util.List<Situation> situations = _situationStore.getSituations(sitQuery);
Assert.assertNotNull(situations);
Assert.assertTrue(1 == situations.size());
Assert.assertEquals(situation.getId(), situations.get(0).getId());
}
@Test
public void findIgnoreCaseSubjectText() throws Exception {
Situation situation = new Situation();
situation.setId(name.getMethodName());
situation.setSubject(name.getMethodName().toUpperCase());
situation.setTimestamp(System.currentTimeMillis());
persist(situation);
SituationsQuery sitQuery = new SituationsQuery();
sitQuery.setSubject(name.getMethodName().substring(3).toLowerCase());
java.util.List<Situation> situations = _situationStore.getSituations(sitQuery);
Assert.assertNotNull(situations);
Assert.assertTrue(1 == situations.size());
Assert.assertEquals(situation.getId(), situations.get(0).getId());
}
@Test
public void findEqualsDescriptionText() throws Exception {
Situation situation = new Situation();
situation.setId(name.getMethodName());
situation.setDescription(name.getMethodName());
situation.setTimestamp(System.currentTimeMillis());
persist(situation);
SituationsQuery sitQuery = new SituationsQuery();
sitQuery.setDescription(name.getMethodName());
java.util.List<Situation> situations = _situationStore.getSituations(sitQuery);
Assert.assertNotNull(situations);
Assert.assertTrue(1 == situations.size());
Assert.assertEquals(situation.getId(), situations.get(0).getId());
}
@Test
public void findEndsWithDescriptionText() throws Exception {
Situation situation = new Situation();
situation.setId(name.getMethodName());
situation.setDescription(name.getMethodName());
situation.setTimestamp(System.currentTimeMillis());
persist(situation);
SituationsQuery sitQuery = new SituationsQuery();
sitQuery.setDescription(name.getMethodName().substring(5));
java.util.List<Situation> situations = _situationStore.getSituations(sitQuery);
Assert.assertNotNull(situations);
Assert.assertTrue(1 == situations.size());
Assert.assertEquals(situation.getId(), situations.get(0).getId());
}
@Test
public void findStartsWithDescriptionText() throws Exception {
Situation situation = new Situation();
situation.setId(name.getMethodName());
situation.setDescription(name.getMethodName());
situation.setTimestamp(System.currentTimeMillis());
persist(situation);
SituationsQuery sitQuery = new SituationsQuery();
sitQuery.setDescription(name.getMethodName().substring(0, 5));
java.util.List<Situation> situations = _situationStore.getSituations(sitQuery);
Assert.assertNotNull(situations);
Assert.assertTrue(1 == situations.size());
Assert.assertEquals(situation.getId(), situations.get(0).getId());
}
@Test
public void findIgnoreCaseDescriptionText() throws Exception {
Situation situation = new Situation();
situation.setId(name.getMethodName());
situation.setDescription(name.getMethodName().toLowerCase());
situation.setTimestamp(System.currentTimeMillis());
persist(situation);
SituationsQuery sitQuery = new SituationsQuery();
sitQuery.setDescription(name.getMethodName().substring(5).toUpperCase());
java.util.List<Situation> situations = _situationStore.getSituations(sitQuery);
Assert.assertNotNull(situations);
Assert.assertTrue(1 == situations.size());
Assert.assertEquals(situation.getId(), situations.get(0).getId());
}
@Test
public void findDescriptionTextNegative() throws Exception {
Situation situation = new Situation();
situation.setId(name.getMethodName());
situation.setDescription(name.getMethodName().toLowerCase());
situation.setTimestamp(System.currentTimeMillis());
persist(situation);
SituationsQuery sitQuery = new SituationsQuery();
sitQuery.setDescription("other");
java.util.List<Situation> situations = _situationStore.getSituations(sitQuery);
Assert.assertNotNull(situations);
Assert.assertTrue(situations.isEmpty());
}
@Test
public void findSituationBySeverity() throws Exception {
Situation situation1 = new Situation();
situation1.setId(name.getMethodName()+"1");
situation1.setDescription(name.getMethodName().toLowerCase());
situation1.setTimestamp(System.currentTimeMillis());
situation1.setSeverity(Severity.Critical);
persist(situation1);
Situation situation2 = new Situation();
situation2.setId(name.getMethodName()+"2");
situation2.setDescription(name.getMethodName().toLowerCase());
situation2.setTimestamp(System.currentTimeMillis());
situation2.setSeverity(Severity.Low);
persist(situation2);
SituationsQuery sitQuery = new SituationsQuery();
sitQuery.setSeverity(Severity.Low);
java.util.List<Situation> situations = _situationStore.getSituations(sitQuery);
Assert.assertNotNull(situations);
Assert.assertTrue(situations.size()==1);
Assert.assertTrue(situations.get(0).getId().equals(name.getMethodName()+"2"));
}
@Test
public void getSituationsByUnresolvedResolutionState() throws Exception {
Situation unresolvedSituation = new Situation();
unresolvedSituation.setId("unresolvedSituation");
unresolvedSituation.setTimestamp(System.currentTimeMillis());
persist(unresolvedSituation);
SituationsQuery sitQuery = new SituationsQuery();
sitQuery.setResolutionState(ResolutionState.UNRESOLVED.name());
java.util.List<Situation> situations = _situationStore.getSituations(sitQuery);
Assert.assertNotNull(situations);
Assert.assertTrue(1 == situations.size());
Assert.assertEquals(unresolvedSituation.getId(), situations.get(0).getId());
}
@Test
public void assignSituation() throws Exception {
Situation situation = new Situation();
situation.setId("assignSituation");
situation.setTimestamp(System.currentTimeMillis());
persist(situation);
Situation reload = _situationStore.getSituation(situation.getId());
assertEquals(situation.getId(), reload.getId());
assertFalse(reload.getSituationProperties().containsKey("assignedTo"));
assertFalse(reload.getSituationProperties().containsKey("resolutionState"));
_situationStore.assignSituation(situation.getId(), "junit");
reload = _situationStore.getSituation(situation.getId());
assertEquals("junit",reload.getSituationProperties().get("assignedTo"));
}
@Test
public void closeSituationAndRemoveAssignment() throws Exception {
Situation situation = new Situation();
situation.setId("deassignSituation");
situation.setTimestamp(System.currentTimeMillis());
persist(situation);
_situationStore.assignSituation(situation.getId(), "junit");
Situation reload = _situationStore.getSituation(situation.getId());
assertEquals("junit",reload.getSituationProperties().get("assignedTo"));
_situationStore.unassignSituation(situation.getId());
reload = _situationStore.getSituation(situation.getId());
assertFalse(reload.getSituationProperties().containsKey("assignedTo"));
}
@Test
public void deleteSituation() throws Exception {
Situation situation = new Situation();
situation.setId("deleteSituation");
situation.setDescription("deleteSituation");
situation.setTimestamp(System.currentTimeMillis());
situation.setSituationProperties(Collections.singletonMap("1", "1"));
situation.setContext(Sets.newHashSet(new Context(Context.Type.Conversation, "1")));
situation.setActivityTypeIds(Sets.newHashSet(new ActivityTypeId("1", 0)));
persist(situation);
SituationsQuery situationQuery = new SituationsQuery();
situationQuery.setDescription(situation.getDescription());
_situationStore.delete(situationQuery);
List<Situation> situations = _situationStore.getSituations(situationQuery);
assertTrue(situations.isEmpty());
}
@Test
public void closeSituationResetOpenResolution() throws Exception {
Situation situation = new Situation();
situation.setId("deassignSituation");
situation.setTimestamp(System.currentTimeMillis());
persist(situation);
_situationStore.assignSituation(situation.getId(), "junit");
_situationStore.updateResolutionState(situation.getId(),IN_PROGRESS);
Situation reload = _situationStore.getSituation(situation.getId());
assertEquals("junit",reload.getSituationProperties().get(SituationStore.ASSIGNED_TO_PROPERTY));
_situationStore.unassignSituation(situation.getId());
reload = _situationStore.getSituation(situation.getId());
assertFalse(reload.getSituationProperties().containsKey(SituationStore.RESOLUTION_STATE_PROPERTY));
assertFalse(reload.getSituationProperties().containsKey(SituationStore.ASSIGNED_TO_PROPERTY));
}
@Test
public void updateResolutionState() throws Exception {
Situation situation = new Situation();
situation.setId("updateResolutionState");
situation.setTimestamp(System.currentTimeMillis());
persist(situation);
Situation reload = _situationStore.getSituation(situation.getId());
assertFalse(reload.getSituationProperties().containsKey(SituationStore.RESOLUTION_STATE_PROPERTY));
_situationStore.updateResolutionState(situation.getId(),ResolutionState.IN_PROGRESS);
reload = _situationStore.getSituation(situation.getId());
assertEquals(ResolutionState.IN_PROGRESS.name(), reload.getSituationProperties().get(SituationStore.RESOLUTION_STATE_PROPERTY));
}
@Test
public void recordResubmit() throws Exception {
Situation situation = new Situation();
situation.setId(name.getMethodName());
situation.setTimestamp(System.currentTimeMillis());
persist(situation);
_situationStore.recordSuccessfulResubmit(situation.getId(), name.getMethodName());
Situation reload = _situationStore.getSituation(situation.getId());
assertEquals(name.getMethodName(), reload.getSituationProperties().get(SituationStore.RESUBMIT_BY_PROPERTY));
assertEquals(SituationStore.RESUBMIT_RESULT_SUCCESS, reload.getSituationProperties().get(SituationStore.RESUBMIT_RESULT_PROPERTY));
assertTrue(reload.getSituationProperties().containsKey(SituationStore.RESUBMIT_AT_PROPERTY));
assertFalse(reload.getSituationProperties().containsKey(SituationStore.RESUBMIT_ERROR_MESSAGE));
}
@Test
public void recordResubmitFailure() throws Exception {
Situation situation = new Situation();
situation.setId(name.getMethodName());
situation.setTimestamp(System.currentTimeMillis());
persist(situation);
_situationStore.recordResubmitFailure(situation.getId(), name.getMethodName(), name.getMethodName());
Situation reload = _situationStore.getSituation(situation.getId());
assertEquals(name.getMethodName(), reload.getSituationProperties().get(SituationStore.RESUBMIT_BY_PROPERTY));
assertEquals(name.getMethodName(), reload.getSituationProperties().get(SituationStore.RESUBMIT_ERROR_MESSAGE));
assertTrue(reload.getSituationProperties().containsKey(SituationStore.RESUBMIT_AT_PROPERTY));
assertEquals(SituationStore.RESUBMIT_RESULT_ERROR,
reload.getSituationProperties().get(SituationStore.RESUBMIT_RESULT_PROPERTY));
}
@Test
public void recordResubmitErrorMessageMaxLength() throws Exception {
Situation situation = new Situation();
situation.setId(name.getMethodName());
situation.setTimestamp(System.currentTimeMillis());
persist(situation);
_situationStore.recordResubmitFailure(situation.getId(),
Strings.padEnd(name.getMethodName(), 10000, '*'), name.getMethodName());
Situation reload = _situationStore.getSituation(situation.getId());
assertEquals(name.getMethodName(), reload.getSituationProperties().get(SituationStore.RESUBMIT_BY_PROPERTY));
String errorMessage = reload.getSituationProperties().get(SituationStore.RESUBMIT_ERROR_MESSAGE);
assertEquals(Strings.padEnd(name.getMethodName(), 250, '*'), errorMessage);
assertTrue(reload.getSituationProperties().containsKey(SituationStore.RESUBMIT_AT_PROPERTY));
assertEquals(SituationStore.RESUBMIT_RESULT_ERROR,
reload.getSituationProperties().get(SituationStore.RESUBMIT_RESULT_PROPERTY));
}
private void persist(final Situation situation) {
_jpaStore.withJpa(new JpaWork<Void>() {
public Void perform(Session s) {
s.persist(situation);
return null;
}
});
}
}