/*
* RHQ Management Platform
* Copyright (C) 2005-2014 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
package org.rhq.enterprise.server.measurement.test;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Random;
import java.util.Set;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import org.testng.annotations.Test;
import org.rhq.core.clientapi.agent.measurement.MeasurementAgentService;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.criteria.MeasurementDataTraitCriteria;
import org.rhq.core.domain.measurement.DataType;
import org.rhq.core.domain.measurement.DisplayType;
import org.rhq.core.domain.measurement.MeasurementCategory;
import org.rhq.core.domain.measurement.MeasurementData;
import org.rhq.core.domain.measurement.MeasurementDataPK;
import org.rhq.core.domain.measurement.MeasurementDataTrait;
import org.rhq.core.domain.measurement.MeasurementDefinition;
import org.rhq.core.domain.measurement.MeasurementReport;
import org.rhq.core.domain.measurement.MeasurementSchedule;
import org.rhq.core.domain.measurement.MeasurementScheduleRequest;
import org.rhq.core.domain.measurement.MeasurementUnits;
import org.rhq.core.domain.measurement.calltime.CallTimeData;
import org.rhq.core.domain.measurement.calltime.CallTimeDataComposite;
import org.rhq.core.domain.measurement.calltime.CallTimeDataKey;
import org.rhq.core.domain.resource.Agent;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceCategory;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.resource.group.ResourceGroup;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.server.measurement.CallTimeDataManagerLocal;
import org.rhq.enterprise.server.measurement.MeasurementDataManagerLocal;
import org.rhq.enterprise.server.purge.PurgeManagerLocal;
import org.rhq.enterprise.server.test.AbstractEJB3Test;
import org.rhq.enterprise.server.test.TestServerCommunicationsService;
import org.rhq.enterprise.server.util.LookupUtil;
import org.rhq.enterprise.server.util.ResourceTreeHelper;
/**
* Test some measurement subsystem functionality
* @author Heiko W. Rupp
*/
public class MeasurementDataManagerTest extends AbstractEJB3Test {
private static final int DELTA = 20;
private MeasurementDataManagerLocal measurementDataManager;
private CallTimeDataManagerLocal callTimeDataManager;
private PurgeManagerLocal purgeManager;
private Subject overlord;
private Resource resource1, resource2;
private ResourceGroup group;
private MeasurementDefinition definitionCt1, definitionCt2, definitionCt3;
private MeasurementSchedule schedule1, schedule2, schedule3;
private ResourceType theResourceType;
private Agent theAgent;
private Set<MeasurementData> expectedResult1, expectedResult2, expectedResult3, expectedResult4;
@Override
protected void beforeMethod() {
try {
this.measurementDataManager = LookupUtil.getMeasurementDataManager();
this.callTimeDataManager = LookupUtil.getCallTimeDataManager();
this.purgeManager = LookupUtil.getPurgeManager();
this.overlord = LookupUtil.getSubjectManager().getOverlord();
} catch (Throwable t) {
// Catch RuntimeExceptions and Errors and dump their stack trace, because Surefire will completely swallow them
// and throw a cryptic NPE (see http://jira.codehaus.org/browse/SUREFIRE-157)!
t.printStackTrace();
throw new RuntimeException(t);
}
}
@Override
protected void afterMethod() {
try {
// delete values
purgeManager.purgeCallTimeData(System.currentTimeMillis());
beginTx();
// delete keys
List<Integer> resourceIds = new ArrayList<Integer>();
resourceIds.add(resource1.getId());
resourceIds.add(resource2.getId());
Query q = em.createNamedQuery(CallTimeDataKey.QUERY_DELETE_BY_RESOURCES);
q.setParameter("resourceIds", resourceIds);
q.executeUpdate();
resource1 = em.merge(resource1);
for (MeasurementSchedule sched : resource1.getSchedules()) {
em.remove(sched);
}
ResourceTreeHelper.deleteResource(em, resource1);
resource2 = em.merge(resource2);
for (MeasurementSchedule sched : resource2.getSchedules()) {
em.remove(sched);
}
ResourceTreeHelper.deleteResource(em, resource2);
definitionCt1 = em.merge(definitionCt1);
em.remove(definitionCt1);
definitionCt2 = em.merge(definitionCt2);
em.remove(definitionCt2);
if (definitionCt3 != null) {
definitionCt3 = em.merge(definitionCt3);
em.remove(definitionCt3);
}
theResourceType = em.merge(theResourceType);
em.remove(theResourceType);
// delete group (if exist)
if (group != null) {
group = em.merge(group);
em.remove(group);
}
theAgent = em.merge(theAgent);
em.remove(theAgent);
commit();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
@Test
public void bz658491() throws Exception {
try {
beginTx();
setupResources(em);
em.flush();
long now = System.currentTimeMillis();
MeasurementScheduleRequest request1 = new MeasurementScheduleRequest(schedule1);
MeasurementScheduleRequest request2 = new MeasurementScheduleRequest(schedule2);
CallTimeData data1 = new CallTimeData(request1);
CallTimeData data2 = new CallTimeData(request2);
data1.addCallData("/foo", new Date(), 100);
data2.addCallData("/bar", new Date(), 200);
MeasurementReport report = new MeasurementReport();
report.addData(data1);
report.addData(data2);
commit();
measurementDataManager.mergeMeasurementReport(report);
// Do not remove this sleep -- the previous is is asynchronous
// and the sleep "guarantees" that data is actually hitting the db
Thread.sleep(10000);
PageList<CallTimeDataComposite> list1 = callTimeDataManager.findCallTimeDataForResource(overlord,
schedule1.getId(), now - DELTA, System.currentTimeMillis() + DELTA, new PageControl());
PageList<CallTimeDataComposite> list2 = callTimeDataManager.findCallTimeDataForResource(overlord,
schedule2.getId(), now - DELTA, System.currentTimeMillis() + DELTA, new PageControl());
assert list1 != null;
assert list2 != null;
assert list1.size() == 1 : "List 1 returned " + list1.size() + " entries, expected was 1";
assert list2.size() == 1 : "List 2 returned " + list2.size() + " entries, expected was 1";
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
@Test
public void bz658491OneResource() throws Exception {
try {
beginTx();
setupResources(em);
em.flush();
long now = System.currentTimeMillis();
MeasurementScheduleRequest request1 = new MeasurementScheduleRequest(schedule1);
MeasurementScheduleRequest request2 = new MeasurementScheduleRequest(schedule2);
CallTimeData data1 = new CallTimeData(request1);
CallTimeData data2 = new CallTimeData(request2);
data1.addCallData("/foo", new Date(), 100);
data2.addCallData("/bar", new Date(), 200);
MeasurementReport report = new MeasurementReport();
report.addData(data1);
report.addData(data2);
commit();
measurementDataManager.mergeMeasurementReport(report);
// Do not remove this sleep -- the previous is is asynchronous
// and the sleep "guarantees" that data is actually hitting the db
Thread.sleep(10000);
PageList<CallTimeDataComposite> list1 = callTimeDataManager.findCallTimeDataForResource(overlord,
schedule1.getId(), now - DELTA, System.currentTimeMillis() + DELTA, new PageControl());
PageList<CallTimeDataComposite> list2 = callTimeDataManager.findCallTimeDataForResource(overlord,
schedule2.getId(), now - DELTA, System.currentTimeMillis() + DELTA, new PageControl());
assert list1 != null;
assert list2 != null;
assert list1.size() == 1 : "List 1 returned " + list1.size() + " entries, expected was 1";
assert list2.size() == 1 : "List 2 returned " + list2.size() + " entries, expected was 1";
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
@Test
public void testFindCallTimeDataRaw() throws Exception {
try {
beginTx();
setupResources(em);
em.flush();
long now = System.currentTimeMillis();
MeasurementScheduleRequest request1 = new MeasurementScheduleRequest(schedule1);
CallTimeData data1 = new CallTimeData(request1);
CallTimeData data2 = new CallTimeData(request1);
Date dNow = new Date();
dNow.setTime(now);
data1.addCallData("/1", dNow, 1);
data1.addCallData("/1", dNow, 1);
dNow.setTime(now + 1);
data2.addCallData("/1", dNow, 3);
dNow.setTime(now + 2);
data2.addCallData("/2a", dNow, 4);
dNow.setTime(now + 3);
data2.addCallData("/2b", dNow, 5);
commit();
MeasurementReport report = new MeasurementReport();
report.addData(data1);
measurementDataManager.mergeMeasurementReport(report);
report = new MeasurementReport();
report.addData(data2);
measurementDataManager.mergeMeasurementReport(report);
// Do not remove this sleep -- the previous is is asynchronous
// and the sleep "guarantees" that data is actually hitting the db
Thread.sleep(10000);
PageList<CallTimeDataComposite> list = callTimeDataManager.findCallTimeDataRawForResource(overlord,
schedule1.getId(), now - DELTA, System.currentTimeMillis() + DELTA, new PageControl());
assert list != null;
assert list.size() == 4 : "List 1 returned " + list.size() + " entries, expected was 4";
assert list.get(0).getTotal() == 2 : "First value must be total = 2, but was "+list.get(0).getTotal();
assert list.get(1).getTotal() == 3 : "Second value must be total = 3, but was "+list.get(1).getTotal();
assert list.get(2).getTotal() == 4 : "Third value must be total = 4, but was "+list.get(2).getTotal();
assert list.get(3).getTotal() == 5 : "Fourth value must be total = 5, but was "+list.get(3).getTotal();
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
/**
* Just set up two resources plus measurement definitions
*
* @param em The EntityManager to use
*
*/
private void setupResources(EntityManager em) {
theAgent = new Agent("testagent", "localhost", 1234, "", "randomToken");
em.persist(theAgent);
theResourceType = new ResourceType("test-plat", "test-plugin", ResourceCategory.PLATFORM, null);
em.persist(theResourceType);
definitionCt1 = new MeasurementDefinition("CT-Def1", MeasurementCategory.PERFORMANCE,
MeasurementUnits.MILLISECONDS, DataType.CALLTIME, true, 60000, DisplayType.SUMMARY);
definitionCt1.setResourceType(theResourceType);
em.persist(definitionCt1);
definitionCt2 = new MeasurementDefinition("CT-Def2", MeasurementCategory.PERFORMANCE,
MeasurementUnits.MILLISECONDS, DataType.CALLTIME, true, 60000, DisplayType.SUMMARY);
definitionCt2.setResourceType(theResourceType);
em.persist(definitionCt2);
resource1 = new Resource("test-platform-key1", "test-platform-name", theResourceType);
resource1.setUuid("" + new Random().nextInt());
resource1.setAgent(theAgent);
em.persist(resource1);
resource2 = new Resource("test-platform-key2", "test-platform-name", theResourceType);
resource2.setUuid("" + new Random().nextInt());
resource2.setAgent(theAgent);
em.persist(resource2);
schedule1 = new MeasurementSchedule(definitionCt1, resource1);
em.persist(schedule1);
definitionCt1.addSchedule(schedule1);
resource1.addSchedule(schedule1);
schedule2 = new MeasurementSchedule(definitionCt2, resource1);
em.persist(schedule2);
definitionCt1.addSchedule(schedule2);
resource2.addSchedule(schedule2);
}
/**
* Just set up the group of two resources plus measurement definitions
*
* @param em The EntityManager to use
*
*/
@SuppressWarnings("unchecked")
private void setupGroupOfResources(EntityManager em) {
theAgent = new Agent("testagent", "localhost", 1234, "", "randomToken");
em.persist(theAgent);
theResourceType = new ResourceType("test-plat", "test-plugin", ResourceCategory.PLATFORM, null);
em.persist(theResourceType);
definitionCt1 = new MeasurementDefinition("CT-Def1", MeasurementCategory.PERFORMANCE,
MeasurementUnits.MILLISECONDS, DataType.CALLTIME, true, 60000, DisplayType.SUMMARY);
definitionCt1.setResourceType(theResourceType);
em.persist(definitionCt1);
definitionCt2 = new MeasurementDefinition("CT-Def2", MeasurementCategory.PERFORMANCE,
MeasurementUnits.MILLISECONDS, DataType.CALLTIME, true, 60000, DisplayType.SUMMARY);
definitionCt2.setResourceType(theResourceType);
em.persist(definitionCt2);
definitionCt3 = new MeasurementDefinition("CT-Def3", MeasurementCategory.PERFORMANCE,
MeasurementUnits.MILLISECONDS, DataType.CALLTIME, true, 60000, DisplayType.SUMMARY);
definitionCt3.setResourceType(theResourceType);
em.persist(definitionCt3);
resource1 = new Resource("test-platform-key1", "test-platform-name", theResourceType);
resource1.setUuid("" + new Random().nextInt());
resource1.setAgent(theAgent);
em.persist(resource1);
resource2 = new Resource("test-platform-key2", "test-platform-name", theResourceType);
resource2.setUuid("" + new Random().nextInt());
resource2.setAgent(theAgent);
em.persist(resource2);
schedule1 = new MeasurementSchedule(definitionCt1, resource1);
em.persist(schedule1);
definitionCt1.addSchedule(schedule1);
resource1.addSchedule(schedule1);
schedule2 = new MeasurementSchedule(definitionCt2, resource2);
em.persist(schedule2);
definitionCt2.addSchedule(schedule2);
resource2.addSchedule(schedule2);
schedule3 = new MeasurementSchedule(definitionCt3, resource2);
em.persist(schedule3);
definitionCt3.addSchedule(schedule3);
resource2.addSchedule(schedule3);
group = new ResourceGroup("test-group", theResourceType);
em.persist(group);
// prepare return values and expected values
long time1 = System.currentTimeMillis();
long time2 = time1 + 1;
long time3 = time2 + 1;
long time4 = time3 + 1;
String name1 = "a";
String name2 = "b";
String name3 = "c";
String name4 = "d";
String value1 = "test-value1";
String value2 = "test-value2";
String value3 = "test-value3";
String value4 = "test-value4";
// method findLiveDataForGroup adds prefix with resource id which is part of equals
MeasurementData expectedData1 = makeMeasurement(time1, schedule1.getId(), value1, name1);
expectedData1.setName(resource1.getId() + ":" + name1);
MeasurementData expectedData2 = makeMeasurement(time2, schedule2.getId(), value2, name2);
expectedData2.setName(resource2.getId() + ":" + name2);
MeasurementData expectedData3 = makeMeasurement(time3, schedule3.getId(), value3, name3);
expectedData3.setName(resource2.getId() + ":" + name3);
MeasurementData expectedData4 = makeMeasurement(time4, schedule2.getId(), value4, name4);
expectedData4.setName(resource2.getId() + ":" + name4);
expectedResult1 = new HashSet<MeasurementData>(1);
expectedResult1.add(expectedData1);
expectedResult2 = new HashSet<MeasurementData>(2);
expectedResult2.add(expectedData2);
expectedResult2.add(expectedData3);
expectedResult3 = new HashSet<MeasurementData>(3);
expectedResult3.addAll(expectedResult1);
expectedResult3.addAll(expectedResult2);
expectedResult4 = new HashSet<MeasurementData>(2);
expectedResult4.add(expectedData2);
expectedResult4.add(expectedData4);
// mock the MeasurementAgentService
MeasurementAgentService mockedMeasurementService = mock(MeasurementAgentService.class);
when(mockedMeasurementService.getRealTimeMeasurementValue(eq(resource1.getId()), any(Set.class))).thenReturn(
new HashSet<MeasurementData>(Arrays.asList(makeMeasurement(time1, schedule1.getId(), value1, name1))));
when(mockedMeasurementService.getRealTimeMeasurementValue(eq(resource2.getId()), any(Set.class))).thenReturn(
new HashSet<MeasurementData>(Arrays.asList(makeMeasurement(time2, schedule2.getId(), value2, name2),
makeMeasurement(time3, schedule3.getId(), value3, name3))));
TestServerCommunicationsService agentServiceContainer = prepareForTestAgents();
agentServiceContainer.measurementService = mockedMeasurementService;
}
@Test
public void testFindLiveDataForGroup1() throws Exception {
// prepare DB
beginTx();
setupGroupOfResources(em);
commit();
try {
Set<MeasurementData> actualResult = measurementDataManager.findLiveDataForGroup(overlord, group.getId(),
new int[] { resource1.getId() }, new int[] { definitionCt1.getId() });
Set<MeasurementData> actualResultWithNewHashCodes = new HashSet<MeasurementData>(actualResult);
assertEquals(expectedResult1, actualResultWithNewHashCodes);
actualResult = measurementDataManager.findLiveDataForGroup(overlord, group.getId(),
new int[] { resource2.getId() }, new int[] { definitionCt2.getId(), definitionCt3.getId() });
actualResultWithNewHashCodes = new HashSet<MeasurementData>(actualResult);
assertEquals(expectedResult2, actualResultWithNewHashCodes);
} catch (Exception e) {
e.printStackTrace();
fail();
throw e;
}
}
@Test
public void testFindLiveDataForGroup2() throws Exception {
// prepare DB
beginTx();
setupGroupOfResources(em);
commit();
try {
Set<MeasurementData> actualResult = measurementDataManager.findLiveDataForGroup(overlord, group.getId(),
new int[] { resource1.getId(), resource2.getId() },
new int[] { definitionCt1.getId(), definitionCt2.getId(), definitionCt3.getId() });
Set<MeasurementData> actualResultWithNewHashCodes = new HashSet<MeasurementData>(actualResult);
assertEquals(expectedResult3, actualResultWithNewHashCodes);
} catch (Exception e) {
e.printStackTrace();
fail();
throw e;
}
}
@Test
public void testFindLiveDataForGroup3() throws Exception {
// prepare DB
beginTx();
setupGroupOfResources(em);
commit();
try {
Set<MeasurementData> actualResult = measurementDataManager.findLiveDataForGroup(overlord, group.getId(),
null, new int[] { definitionCt1.getId() });
assertEquals(Collections.emptySet(), actualResult);
} catch (Exception e) {
e.printStackTrace();
fail();
throw e;
}
}
@Test
public void testFindLiveDataForGroup4() throws Exception {
// prepare DB
beginTx();
setupGroupOfResources(em);
commit();
try {
measurementDataManager.findLiveDataForGroup(null, group.getId(), new int[] { resource1.getId() },
new int[] { definitionCt1.getId() });
fail();
} catch (Exception e) {
// ok, it was expected
}
}
@Test
public void testAddAndFindTrait1() throws Exception {
// prepare DB
beginTx();
setupGroupOfResources(em);
commit();
try {
Set<MeasurementDataTrait> expectedResult = new HashSet<MeasurementDataTrait>();
for (MeasurementData data : expectedResult1) {
data.setName(null);
expectedResult.add((MeasurementDataTrait) data);
}
// add the trait data (it stores it in db (without name field))
measurementDataManager.addTraitData(expectedResult);
// get back the trait data
List<MeasurementDataTrait> actualResult = measurementDataManager.findTraits(overlord, resource1.getId(), definitionCt1.getId());
Set<MeasurementData> actualResultSet = new HashSet<MeasurementData>(actualResult);
assertEquals(expectedResult, actualResultSet);
} catch (Exception e) {
e.printStackTrace();
fail();
throw e;
}
}
@Test
public void testAddAndFindTrait2() throws Exception {
// prepare DB
beginTx();
setupGroupOfResources(em);
commit();
try {
Set<MeasurementDataTrait> expectedResult = new HashSet<MeasurementDataTrait>();
for (MeasurementData data : expectedResult4) {
data.setName(null);
expectedResult.add((MeasurementDataTrait) data);
}
// add the trait data (it stores it in db (without name field))
measurementDataManager.addTraitData(expectedResult);
// get back the trait data
List<MeasurementDataTrait> actualResult = measurementDataManager.findTraits(overlord, resource2.getId(), definitionCt2.getId());
Set<MeasurementData> actualResultSet = new HashSet<MeasurementData>(actualResult);
assertEquals(expectedResult, actualResultSet);
} catch (Exception e) {
e.printStackTrace();
fail();
throw e;
}
}
@Test
public void testAddAndFindTrait3() throws Exception {
// prepare DB
beginTx();
setupGroupOfResources(em);
commit();
try {
Set<MeasurementDataTrait> traitsData = new HashSet<MeasurementDataTrait>();
Set<MeasurementDataTrait> expectedResult = new HashSet<MeasurementDataTrait>();
for (MeasurementData data : expectedResult2) {
data.setName(null);
traitsData.add((MeasurementDataTrait) data);
if (data.getScheduleId() == schedule2.getId()){
expectedResult.add((MeasurementDataTrait) data);
}
}
// add the trait data (it stores it in db (without name field))
measurementDataManager.addTraitData(traitsData);
// get back the trait data
List<MeasurementDataTrait> actualResult = measurementDataManager.findTraits(overlord, resource2.getId(), definitionCt2.getId());
Set<MeasurementData> actualResultSet = new HashSet<MeasurementData>(actualResult);
assertEquals(expectedResult, actualResultSet);
} catch (Exception e) {
e.printStackTrace();
fail();
throw e;
}
}
@Test
public void testFindNonExistentTraitByResourceId() throws Exception {
// prepare DB
beginTx();
setupGroupOfResources(em);
commit();
try {
// get back the trait data
List<MeasurementDataTrait> actualResult = measurementDataManager.findTraits(overlord, resource2.getId(), definitionCt2.getId());
Set<MeasurementData> actualResultSet = new HashSet<MeasurementData>(actualResult);
assertEquals(Collections.<MeasurementData> emptySet(), actualResultSet);
} catch (Exception e) {
e.printStackTrace();
fail();
throw e;
}
}
/**
* This test tests more combination of criteria
* @throws Exception
*/
@Test
public void testAddAndFindByCriteria() throws Exception {
// prepare DB
beginTx();
setupGroupOfResources(em);
commit();
try {
Set<MeasurementDataTrait> expectedResult = new HashSet<MeasurementDataTrait>();
for (MeasurementData data : expectedResult1) {
data.setName(null);
expectedResult.add((MeasurementDataTrait) data);
}
// add the trait data (it stores it in db (without name field))
measurementDataManager.addTraitData(expectedResult);
// get back the trait data by schedule id
MeasurementDataTraitCriteria criteria = new MeasurementDataTraitCriteria();
criteria.addFilterScheduleId(schedule1.getId());
List<MeasurementDataTrait> actualResult = measurementDataManager.findTraitsByCriteria(overlord, criteria);
Set<MeasurementData> actualResultSet = new HashSet<MeasurementData>(actualResult);
assertEquals(expectedResult, actualResultSet);
// get back the trait data by resource id
criteria = new MeasurementDataTraitCriteria();
criteria.addFilterResourceId(resource1.getId());
actualResult = measurementDataManager.findTraitsByCriteria(overlord, criteria);
actualResultSet = new HashSet<MeasurementData>(actualResult);
assertEquals(expectedResult, actualResultSet);
// get back the trait data by schedule id and resource id
criteria = new MeasurementDataTraitCriteria();
criteria.addFilterScheduleId(schedule1.getId());
criteria.addFilterResourceId(resource1.getId());
actualResult = measurementDataManager.findTraitsByCriteria(overlord, criteria);
actualResultSet = new HashSet<MeasurementData>(actualResult);
assertEquals(expectedResult, actualResultSet);
// get back the trait data by wrong schedule id
criteria = new MeasurementDataTraitCriteria();
criteria.addFilterScheduleId(Integer.MIN_VALUE);
actualResult = measurementDataManager.findTraitsByCriteria(overlord, criteria);
assertTrue(actualResult.isEmpty());
} catch (Exception e) {
e.printStackTrace();
fail();
throw e;
}
}
@Test
public void testAddAndFindCurrentTraitByResourceId() throws Exception {
// prepare DB
beginTx();
setupGroupOfResources(em);
commit();
try {
// get back the trait data
List<MeasurementDataTrait> actualResult = measurementDataManager.findCurrentTraitsForResource(overlord, resource1.getId(), null);
assertTrue(actualResult.isEmpty());
} catch (Exception e) {
e.printStackTrace();
fail();
throw e;
}
}
@Test
public void testAddAndFindCurrentTraitByResourceIdAcrossMoreSchedules() throws Exception {
// prepare DB
beginTx();
setupGroupOfResources(em);
commit();
try {
Set<MeasurementDataTrait> expectedResult = new HashSet<MeasurementDataTrait>();
for (MeasurementData data : expectedResult2) {
data.setName(null);
expectedResult.add((MeasurementDataTrait) data);
}
// add the trait data (it stores it in db (without name field))
measurementDataManager.addTraitData(expectedResult);
// get back the trait data
List<MeasurementDataTrait> actualResult = measurementDataManager.findCurrentTraitsForResource(overlord, resource2.getId(), null);
Set<MeasurementData> actualResultSet = new HashSet<MeasurementData>(actualResult);
assertEquals(expectedResult, actualResultSet);
} catch (Exception e) {
e.printStackTrace();
fail();
throw e;
}
}
@Test
public void testFindNonExistentCurrentTraitByResourceId() throws Exception {
// prepare DB
beginTx();
setupGroupOfResources(em);
commit();
try {
Set<MeasurementDataTrait> expectedResult = new HashSet<MeasurementDataTrait>();
for (MeasurementData data : expectedResult2) {
data.setName(null);
expectedResult.add((MeasurementDataTrait) data);
}
// add the trait data (it stores it in db (without name field))
measurementDataManager.addTraitData(expectedResult);
// get back the trait data
List<MeasurementDataTrait> actualResult = measurementDataManager.findCurrentTraitsForResource(overlord, resource2.getId(), null);
Set<MeasurementData> actualResultSet = new HashSet<MeasurementData>(actualResult);
assertEquals(expectedResult, actualResultSet);
} catch (Exception e) {
e.printStackTrace();
fail();
throw e;
}
}
private MeasurementData makeMeasurement(long time, int scheduleId, String value, String name) {
MeasurementData measurement = new MeasurementDataTrait(new MeasurementDataPK(time, scheduleId), value);
measurement.setName(name);
return measurement;
}
private void beginTx() throws Exception {
getTransactionManager().begin();
}
private void commit() throws Exception {
em.flush();
getTransactionManager().commit();
}
}