[rhq] Branch 'feature/cassandra-backend' - modules/enterprise
by John Sanda
modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/MetricsDAO.java | 52 +++++++-
modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/MetricsServer.java | 6 -
modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/RawNumericMetric.java | 7 +
modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/RawNumericMetricMapper.java | 31 +++++
modules/enterprise/server/server-metrics/src/test/java/org/rhq/server/metrics/MetricsDAOTest.java | 37 +++---
modules/enterprise/server/server-metrics/src/test/java/org/rhq/server/metrics/MetricsServerTest.java | 59 +++++-----
6 files changed, 141 insertions(+), 51 deletions(-)
New commits:
commit 43892b18eb56638b31eb01f59a37f9263b92a877
Author: John Sanda <jsanda(a)redhat.com>
Date: Tue Nov 6 21:38:17 2012 -0500
adding support for setting column meta data when inserting raw metrics
Each column in cassandra has a time to live (TTL) and timestamp attributes. If
the TTL is not set, then the column will not expire unless explicitly deleted.
If the TTL is set, Cassandra will delete the column after the specified number
of seconds has passed. The timestamp attribute is basically the insertion time.
It is used for conflict resolution between replicas. The TTL for raw metrics is
set to seven days.
diff --git a/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/MetricsDAO.java b/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/MetricsDAO.java
index 383a15b..fb7b1db 100644
--- a/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/MetricsDAO.java
+++ b/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/MetricsDAO.java
@@ -63,8 +63,14 @@ public class MetricsDAO {
"FROM " + RAW_METRICS_TABLE + " " +
"WHERE schedule_id = ? AND time >= ? AND time < ?";
+ private static final String RAW_METRICS_WITH_METADATA_QUERY =
+ "SELECT schedule_id, time, value, ttl(value), writetime(value) " +
+ "FROM " + RAW_METRICS_TABLE + " " +
+ "WHERE schedule_id = ? AND time >= ? AND time < ?";
+
private static final String INSERT_RAW_METRICS =
- "INSERT INTO raw_metrics (schedule_id, time, value) VALUES (?, ?, ?)";
+ "INSERT INTO raw_metrics (schedule_id, time, value) " +
+ "VALUES (?, ?, ?) USING TTL ? AND TIMESTAMP ?";
private static final String METRICS_INDEX_QUERY =
"SELECT time, schedule_id " +
@@ -75,23 +81,21 @@ public class MetricsDAO {
private static final String UPDATE_METRICS_INDEX =
"INSERT INTO " + METRICS_INDEX_TABLE + " (bucket, time, schedule_id, null_col) VALUES (?, ?, ?, ?)";
- private static interface ConnectionCallback {
- void invoke(Connection connection);
- }
-
private DataSource dataSource;
public MetricsDAO(DataSource dataSource) {
this.dataSource = dataSource;
}
- public Set<MeasurementDataNumeric> insertRawMetrics(Set<MeasurementDataNumeric> dataSet) {
+ public Set<MeasurementDataNumeric> insertRawMetrics(Set<MeasurementDataNumeric> dataSet, int ttl, long timestamp) {
Set<MeasurementDataNumeric> insertedMetrics = new HashSet<MeasurementDataNumeric>();
Connection connection = null;
PreparedStatement statement = null;
try {
+ String sql = "INSERT INTO raw_metrics (schedule_id, time, value) VALUES (?, ?, ?) " +
+ "USING TTL " + ttl + " AND TIMESTAMP " + timestamp;
connection = dataSource.getConnection();
- statement = connection.prepareStatement(INSERT_RAW_METRICS);
+ statement = connection.prepareStatement(sql);
for (MeasurementDataNumeric data : dataSet) {
statement.setInt(1, data.getScheduleId());
@@ -177,6 +181,40 @@ public class MetricsDAO {
}
}
+ public List<RawNumericMetric> findRawMetrics(int scheduleId, DateTime startTime, DateTime endTime,
+ boolean includeMetadata) {
+
+ if (!includeMetadata) {
+ return findRawMetrics(scheduleId, startTime, endTime);
+ }
+
+ Connection connection = null;
+ PreparedStatement statement = null;
+ ResultSet resultSet = null;
+ try {
+ connection = dataSource.getConnection();
+ statement = connection.prepareStatement(RAW_METRICS_WITH_METADATA_QUERY);
+ statement.setInt(1, scheduleId);
+ statement.setDate(2, new java.sql.Date(startTime.getMillis()));
+ statement.setDate(3, new java.sql.Date(endTime.getMillis()));
+
+ resultSet = statement.executeQuery();
+ List<RawNumericMetric> metrics = new ArrayList<RawNumericMetric>();
+ ResultSetMapper<RawNumericMetric> resultSetMapper = new RawNumericMetricMapper(true);
+
+ while (resultSet.next()) {
+ metrics.add(resultSetMapper.map(resultSet));
+ }
+ return metrics;
+ } catch (SQLException e) {
+ throw new CQLException(e);
+ } finally {
+ JDBCUtil.safeClose(resultSet);
+ JDBCUtil.safeClose(statement);
+ JDBCUtil.safeClose(connection);
+ }
+ }
+
public List<AggregatedNumericMetric> findAggregateMetrics(String bucket, int scheduleId) {
Connection connection = null;
Statement statement = null;
diff --git a/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/MetricsServer.java b/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/MetricsServer.java
index 96d8903..63504f3 100644
--- a/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/MetricsServer.java
+++ b/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/MetricsServer.java
@@ -47,6 +47,7 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.joda.time.DateTime;
import org.joda.time.DateTimeComparator;
+import org.joda.time.Days;
import org.joda.time.Minutes;
import org.rhq.core.domain.auth.Subject;
@@ -76,6 +77,8 @@ public class MetricsServer {
private static final int DEFAULT_PAGE_SIZE = 200;
+ public static int RAW_TTL = Days.days(7).toStandardSeconds().getSeconds();
+
private final Log log = LogFactory.getLog(MetricsServer.class);
private Cluster cluster;
@@ -274,7 +277,8 @@ public class MetricsServer {
public void addNumericData(Set<MeasurementDataNumeric> dataSet) {
MetricsDAO dao = new MetricsDAO(cassandraDS);
- Set<MeasurementDataNumeric> updates = dao.insertRawMetrics(dataSet);
+ long timestamp = System.currentTimeMillis();
+ Set<MeasurementDataNumeric> updates = dao.insertRawMetrics(dataSet, RAW_TTL, timestamp);
updateMetricsIndex(updates);
}
diff --git a/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/RawNumericMetric.java b/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/RawNumericMetric.java
index 7d3142e..d8546aa 100644
--- a/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/RawNumericMetric.java
+++ b/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/RawNumericMetric.java
@@ -47,6 +47,13 @@ public class RawNumericMetric {
this.timestamp = timestamp;
}
+ public RawNumericMetric(int scheduleId, long timestamp, double value, ColumnMetadata metadata) {
+ this.scheduleId = scheduleId;
+ this.value = value;
+ this.timestamp = timestamp;
+ columnMetadata = metadata;
+ }
+
public int getScheduleId() {
return scheduleId;
}
diff --git a/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/RawNumericMetricMapper.java b/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/RawNumericMetricMapper.java
index cb81503..2d88075 100644
--- a/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/RawNumericMetricMapper.java
+++ b/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/RawNumericMetricMapper.java
@@ -33,8 +33,37 @@ import java.sql.SQLException;
*/
public class RawNumericMetricMapper implements ResultSetMapper<RawNumericMetric> {
+ private ResultSetMapper<RawNumericMetric> mapper;
+
+ public RawNumericMetricMapper() {
+ this(false);
+ }
+
+ public RawNumericMetricMapper(boolean metaDataIncluded) {
+ if (metaDataIncluded) {
+ mapper = new ResultSetMapper<RawNumericMetric>() {
+ @Override
+ public RawNumericMetric map(ResultSet resultSet) throws SQLException {
+ RawNumericMetric rawMetric = new RawNumericMetric(resultSet.getInt(1),
+ resultSet.getDate(2).getTime(), resultSet.getDouble(3));
+ ColumnMetadata metadata = new ColumnMetadata(resultSet.getInt(4), resultSet.getLong(5));
+ rawMetric.setColumnMetadata(metadata);
+ return rawMetric;
+ }
+ };
+ } else {
+ mapper = new ResultSetMapper<RawNumericMetric>() {
+ @Override
+ public RawNumericMetric map(ResultSet resultSet) throws SQLException {
+ return new RawNumericMetric(resultSet.getInt(1), resultSet.getDate(2).getTime(),
+ resultSet.getDouble(3));
+ }
+ };
+ }
+ }
+
@Override
public RawNumericMetric map(ResultSet resultSet) throws SQLException {
- return new RawNumericMetric(resultSet.getInt(1), resultSet.getDate(2).getTime(), resultSet.getDouble(3));
+ return mapper.map(resultSet);
}
}
diff --git a/modules/enterprise/server/server-metrics/src/test/java/org/rhq/server/metrics/MetricsDAOTest.java b/modules/enterprise/server/server-metrics/src/test/java/org/rhq/server/metrics/MetricsDAOTest.java
index 20f6ecc..2e22d0e 100644
--- a/modules/enterprise/server/server-metrics/src/test/java/org/rhq/server/metrics/MetricsDAOTest.java
+++ b/modules/enterprise/server/server-metrics/src/test/java/org/rhq/server/metrics/MetricsDAOTest.java
@@ -41,12 +41,11 @@ import java.util.Map;
import java.util.Set;
import org.joda.time.DateTime;
+import org.joda.time.Hours;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
-import org.rhq.core.domain.measurement.DataType;
import org.rhq.core.domain.measurement.MeasurementDataNumeric;
-import org.rhq.core.domain.measurement.MeasurementScheduleRequest;
/**
* @author John Sanda
@@ -77,31 +76,39 @@ public class MetricsDAOTest extends CassandraIntegrationTest {
DateTime twoMinutesAgo = currentTime.minusMinutes(2);
DateTime oneMinuteAgo = currentTime.minusMinutes(1);
- String scheduleName = getClass().getName() + "_SCHEDULE";
- long interval = MINUTE * 10;
- boolean enabled = true;
- DataType dataType = DataType.MEASUREMENT;
- MeasurementScheduleRequest request = new MeasurementScheduleRequest(scheduleId, scheduleName, interval,
- enabled, dataType);
-
Set<MeasurementDataNumeric> data = new HashSet<MeasurementDataNumeric>();
- data.add(new MeasurementDataNumeric(threeMinutesAgo.getMillis(), request, 3.2));
- data.add(new MeasurementDataNumeric(twoMinutesAgo.getMillis(), request, 3.9));
- data.add(new MeasurementDataNumeric(oneMinuteAgo.getMillis(), request, 2.6));
+ data.add(new MeasurementDataNumeric(threeMinutesAgo.getMillis(), scheduleId, 3.2));
+ data.add(new MeasurementDataNumeric(twoMinutesAgo.getMillis(), scheduleId, 3.9));
+ data.add(new MeasurementDataNumeric(oneMinuteAgo.getMillis(), scheduleId, 2.6));
MetricsDAO dao = new MetricsDAO(dataSource);
- Set<MeasurementDataNumeric> actualUpdates = dao.insertRawMetrics(data);
+ int ttl = Hours.ONE.toStandardSeconds().getSeconds();
+ long timestamp = System.currentTimeMillis();
+ Set<MeasurementDataNumeric> actualUpdates = dao.insertRawMetrics(data, ttl, timestamp);
assertEquals(actualUpdates, data, "The updates do not match expected value.");
- List<RawNumericMetric> actualMetrics = dao.findRawMetrics(scheduleId, currentHour, currentHour.plusHours(1));
+ List<RawNumericMetric> actualMetrics = dao.findRawMetrics(scheduleId, currentHour, currentHour.plusHours(1));
List<RawNumericMetric> expectedMetrics = asList(
new RawNumericMetric(scheduleId, threeMinutesAgo.getMillis(), 3.2),
new RawNumericMetric(scheduleId, twoMinutesAgo.getMillis(), 3.9),
new RawNumericMetric(scheduleId, oneMinuteAgo.getMillis(), 2.6)
);
-
assertEquals(actualMetrics, expectedMetrics, "Failed to find raw metrics");
+
+ // Now verify that the column meta data was set. We do this separately in order to
+ // exercise both versions of the findRawMetrics method. In production code (so far),
+ // we have no need to retrieve meta data when retrieving raw metrics, but we need
+ // to verify that the meta data is in fact set.
+ List<RawNumericMetric> actualMetricsWithMetadata = dao.findRawMetrics(scheduleId, currentHour,
+ currentHour.plusHours(1), true) ;
+ List<RawNumericMetric> expectedMetricsWithMetadata = asList(
+ new RawNumericMetric(scheduleId, threeMinutesAgo.getMillis(), 3.2, new ColumnMetadata(ttl, timestamp)),
+ new RawNumericMetric(scheduleId, twoMinutesAgo.getMillis(), 3.9, new ColumnMetadata(ttl, timestamp)),
+ new RawNumericMetric(scheduleId, oneMinuteAgo.getMillis(), 2.6, new ColumnMetadata(ttl, timestamp))
+ );
+ assertEquals(actualMetricsWithMetadata, expectedMetricsWithMetadata, "Column meta data does not match " +
+ "expected values");
}
@Test
diff --git a/modules/enterprise/server/server-metrics/src/test/java/org/rhq/server/metrics/MetricsServerTest.java b/modules/enterprise/server/server-metrics/src/test/java/org/rhq/server/metrics/MetricsServerTest.java
index 60d086f..149a16d 100644
--- a/modules/enterprise/server/server-metrics/src/test/java/org/rhq/server/metrics/MetricsServerTest.java
+++ b/modules/enterprise/server/server-metrics/src/test/java/org/rhq/server/metrics/MetricsServerTest.java
@@ -36,10 +36,12 @@ import static org.rhq.server.metrics.MetricsDAO.ONE_HOUR_METRICS_TABLE;
import static org.rhq.server.metrics.MetricsDAO.RAW_METRICS_TABLE;
import static org.rhq.server.metrics.MetricsDAO.SIX_HOUR_METRICS_TABLE;
import static org.rhq.server.metrics.MetricsDAO.TWENTY_FOUR_HOUR_METRICS_TABLE;
+import static org.rhq.server.metrics.MetricsServer.RAW_TTL;
import static org.rhq.server.metrics.MetricsServer.divide;
import static org.rhq.test.AssertUtils.assertCollectionMatchesNoOrder;
import static org.rhq.test.AssertUtils.assertPropertiesMatch;
import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
import java.sql.ResultSet;
import java.sql.SQLException;
@@ -110,6 +112,8 @@ public class MetricsServerTest extends CassandraIntegrationTest {
private Keyspace keyspace;
+ private MetricsDAO dao;
+
private static class MetricsServerStub extends MetricsServer {
private DateTime currentHour;
@@ -142,6 +146,9 @@ public class MetricsServerTest extends CassandraIntegrationTest {
metricsServer.setTraitsCF(TRAITS_CF);
metricsServer.setResourceTraitsCF(RESOURCE_TRAITS_CF);
metricsServer.setCassandraDS(dataSource);
+
+ dao = new MetricsDAO(dataSource);
+
purgeDB();
}
@@ -172,31 +179,23 @@ public class MetricsServerTest extends CassandraIntegrationTest {
DateTime twoMinutesAgo = currentTime.minusMinutes(2);
DateTime oneMinuteAgo = currentTime.minusMinutes(1);
- String scheduleName = getClass().getName() + "_SCHEDULE";
- long interval = MINUTE * 10;
- boolean enabled = true;
- DataType dataType = DataType.MEASUREMENT;
- MeasurementScheduleRequest request = new MeasurementScheduleRequest(scheduleId, scheduleName, interval,
- enabled, dataType);
-
Set<MeasurementDataNumeric> data = new HashSet<MeasurementDataNumeric>();
- data.add(new MeasurementDataNumeric(threeMinutesAgo.getMillis(), request, 3.2));
- data.add(new MeasurementDataNumeric(twoMinutesAgo.getMillis(), request, 3.9));
- data.add(new MeasurementDataNumeric(oneMinuteAgo.getMillis(), request, 2.6));
+ data.add(new MeasurementDataNumeric(threeMinutesAgo.getMillis(), scheduleId, 3.2));
+ data.add(new MeasurementDataNumeric(twoMinutesAgo.getMillis(), scheduleId, 3.9));
+ data.add(new MeasurementDataNumeric(oneMinuteAgo.getMillis(), scheduleId, 2.6));
+ long timestamp = System.currentTimeMillis();
metricsServer.addNumericData(data);
- Statement statement = connection.createStatement();
- ResultSet resultSet = statement.executeQuery("SELECT * FROM raw_metrics WHERE schedule_id = " + scheduleId);
+ List<RawNumericMetric> actual = dao.findRawMetrics(scheduleId, hour0.plusHours(4), hour0.plusHours(5));
+ List<RawNumericMetric> expected = asList(
+ new RawNumericMetric(scheduleId, threeMinutesAgo.getMillis(), 3.2),
+ new RawNumericMetric(scheduleId, twoMinutesAgo.getMillis(), 3.9),
+ new RawNumericMetric(scheduleId, oneMinuteAgo.getMillis(), 2.6)
+ );
- Set<MeasurementDataNumeric> actual = new HashSet<MeasurementDataNumeric>();
- while (resultSet.next()) {
- actual.add(new MeasurementDataNumeric(resultSet.getDate(2).getTime(), resultSet.getInt(1),
- resultSet.getDouble(3)));
- }
- resultSet.close();
-
- assertCollectionMatchesNoOrder("Failed to retrieve raw metric data", data, actual, "name");
+ assertEquals(actual, expected, "Failed to retrieve raw metric data");
+ assertColumnMetadataEquals(scheduleId, hour0.plusHours(4), hour0.plusHours(5), RAW_TTL, timestamp);
List<MetricsIndexEntry> expectedIndex = asList(new MetricsIndexEntry(ONE_HOUR_METRIC_DATA_CF,
hour0.plusHours(4), scheduleId));
@@ -292,8 +291,8 @@ public class MetricsServerTest extends CassandraIntegrationTest {
rawMetrics.add(new MeasurementDataNumeric(secondMetricTime.getMillis(), scheduleId, secondValue));
rawMetrics.add(new MeasurementDataNumeric(thirdMetricTime.getMillis(), scheduleId, thirdValue));
- MetricsDAO dao = new MetricsDAO(dataSource);
- Set<MeasurementDataNumeric> insertedRawMetrics = dao.insertRawMetrics(rawMetrics);
+ long timestamp = System.currentTimeMillis();
+ Set<MeasurementDataNumeric> insertedRawMetrics = dao.insertRawMetrics(rawMetrics, RAW_TTL, timestamp);
metricsServer.updateMetricsIndex(insertedRawMetrics);
// insert raw data to be aggregated
@@ -705,6 +704,17 @@ public class MetricsServerTest extends CassandraIntegrationTest {
return composite;
}
+ private void assertColumnMetadataEquals(int scheduleId, DateTime startTime, DateTime endTime, Integer ttl,
+ long timestamp) {
+ List<RawNumericMetric> metrics = dao.findRawMetrics(scheduleId, startTime, endTime, true);
+ for (RawNumericMetric metric : metrics) {
+ assertEquals(metric.getColumnMetadata().getTtl(), ttl, "The TTL does not match the expected value for " +
+ metric);
+ assertTrue(metric.getColumnMetadata().getWriteTime() >= timestamp, "The column timestamp for " + metric +
+ " should be >= " + timestamp + " but it is " + metric.getColumnMetadata().getWriteTime());
+ }
+ }
+
private void assert1HourMetricsQueueEquals(List<HColumn<Composite, Integer>> expected) {
assertMetricsQueueEquals(ONE_HOUR_METRIC_DATA_CF, expected);
}
@@ -812,9 +822,7 @@ public class MetricsServerTest extends CassandraIntegrationTest {
}
private void assertMetricDataEquals(String columnFamily, int scheduleId, List<AggregatedNumericMetric> expected) {
- MetricsDAO dao = new MetricsDAO(dataSource);
List<AggregatedNumericMetric> actual = dao.findAggregateMetrics(columnFamily, scheduleId);
-
assertCollectionMatchesNoOrder(expected, actual, "Metric data for schedule id " + scheduleId +
" in table " + columnFamily + " does not match expected values");
}
@@ -853,9 +861,7 @@ public class MetricsServerTest extends CassandraIntegrationTest {
// }
//
// assertEquals(actual.size(), 0, prefix + " Expected the row to be empty.");
- MetricsDAO dao = new MetricsDAO(dataSource);
List<AggregatedNumericMetric> metrics = dao.findAggregateMetrics(columnFamily, scheduleId);
-
assertEquals(metrics.size(), 0, "Expected " + columnFamily + " to be empty for schedule id " + scheduleId +
" but found " + metrics);
}
@@ -899,7 +905,6 @@ public class MetricsServerTest extends CassandraIntegrationTest {
// assertEquals(actual.size(), 0, "Expected the " + queueName + " queue to be empty for schedule id " +
// scheduleId);
- MetricsDAO dao = new MetricsDAO(dataSource);
List<MetricsIndexEntry> index = dao.findMetricsIndexEntries(table);
assertEquals(index.size(), 0, "Expected metrics index for " + table + " to be empty but found " + index);
}
11 years, 6 months
[rhq] Branch 'rhq-on-as7' - modules/enterprise
by Jay Shaughnessy
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/alert/test/DeleteAlertsTest.java | 10 -
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/configuration/DynamicConfigurationPropertyBeanTest.java | 5
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/content/test/DistributionManagerBeanTest.java | 12 -
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/core/plugin/DatabaseAndFilePluginDeploymentTest.java | 38 ++--
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/db/DbSetupTest.java | 8 -
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/db/DbUpgradeTest.java | 13 -
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/discovery/DiscoveryBossBeanTest.java | 36 ----
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/drift/DriftManagerBeanTest.java | 67 +-------
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java | 78 ++++------
9 files changed, 97 insertions(+), 170 deletions(-)
New commits:
commit a0b5a51ac5f176e55e34171af424898f3d369137
Author: Jay Shaughnessy <jshaughn(a)jshaughn.csb>
Date: Tue Nov 6 21:36:26 2012 -0500
More test classes working
- fixed bug in prepareForTestAgents
- simplified other prepare/unprepare methods
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/alert/test/DeleteAlertsTest.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/alert/test/DeleteAlertsTest.java
index 487a0ea..0c232b6 100644
--- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/alert/test/DeleteAlertsTest.java
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/alert/test/DeleteAlertsTest.java
@@ -27,8 +27,6 @@ import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.dbunit.dataset.xml.FlatXmlProducer;
import org.dbunit.operation.DatabaseOperation;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.xml.sax.InputSource;
@@ -50,8 +48,8 @@ public class DeleteAlertsTest extends AbstractEJB3Test {
private Subject superuser;
private Resource newResource;
- @BeforeMethod
- public void beforeMethod() throws Exception {
+ @Override
+ protected void beforeMethod() throws Exception {
alertManager = LookupUtil.getAlertManager();
superuser = LookupUtil.getSubjectManager().getOverlord();
@@ -70,8 +68,8 @@ public class DeleteAlertsTest extends AbstractEJB3Test {
newResource = getEntityManager().find(Resource.class, 1);
}
- @AfterMethod(alwaysRun = true)
- public void afterMethod() throws Exception {
+ @Override
+ protected void afterMethod() throws Exception {
if ("true".equals(System.getProperty("clean.db"))) {
Connection connection = null;
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/configuration/DynamicConfigurationPropertyBeanTest.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/configuration/DynamicConfigurationPropertyBeanTest.java
index dba76ed..1c52833 100644
--- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/configuration/DynamicConfigurationPropertyBeanTest.java
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/configuration/DynamicConfigurationPropertyBeanTest.java
@@ -31,7 +31,6 @@ import javax.transaction.Status;
import javax.transaction.SystemException;
import javax.transaction.TransactionManager;
-import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.rhq.core.domain.authz.Role;
@@ -51,8 +50,8 @@ public class DynamicConfigurationPropertyBeanTest extends AbstractEJB3Test {
private DynamicConfigurationPropertyLocal bean;
- @BeforeMethod
- public void setUp() {
+ @Override
+ protected void beforeMethod() {
bean = LookupUtil.getDynamicConfigurationProperty();
}
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/content/test/DistributionManagerBeanTest.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/content/test/DistributionManagerBeanTest.java
index 037c071..2b2ee87 100644
--- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/content/test/DistributionManagerBeanTest.java
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/content/test/DistributionManagerBeanTest.java
@@ -2,12 +2,9 @@ package org.rhq.enterprise.server.content.test;
import java.util.List;
-import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.transaction.TransactionManager;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.rhq.core.domain.auth.Subject;
@@ -27,8 +24,8 @@ public class DistributionManagerBeanTest extends AbstractEJB3Test {
private DistributionType distType;
private Subject overlord;
- @BeforeMethod
- public void setupBeforeMethod() throws Exception {
+ @Override
+ protected void beforeMethod() throws Exception {
TransactionManager tx = getTransactionManager();
tx.begin();
@@ -38,8 +35,8 @@ public class DistributionManagerBeanTest extends AbstractEJB3Test {
overlord = LookupUtil.getSubjectManager().getOverlord();
}
- @AfterMethod
- public void tearDownAfterMethod() throws Exception {
+ @Override
+ protected void afterMethod() throws Exception {
TransactionManager tx = getTransactionManager();
if (tx != null) {
tx.rollback();
@@ -73,7 +70,6 @@ public class DistributionManagerBeanTest extends AbstractEJB3Test {
Distribution distro = distManager.getDistributionByLabel(kslabel);
DistributionFile distfile = new DistributionFile(distro, "vmlinux", "d41d8cd98f00b204e9800998ecf8427e");
- EntityManager em = getEntityManager();
em.persist(distfile);
Query query = em.createNamedQuery(DistributionFile.SELECT_BY_DIST_ID);
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/core/plugin/DatabaseAndFilePluginDeploymentTest.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/core/plugin/DatabaseAndFilePluginDeploymentTest.java
index 4a6a241..90b5cdc 100644
--- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/core/plugin/DatabaseAndFilePluginDeploymentTest.java
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/core/plugin/DatabaseAndFilePluginDeploymentTest.java
@@ -30,15 +30,10 @@ import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
-import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.Query;
import javax.transaction.TransactionManager;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.rhq.core.clientapi.descriptor.AgentPluginDescriptorUtil;
@@ -53,7 +48,8 @@ import org.rhq.enterprise.server.util.LookupUtil;
//make sure we run this after the plugins.metadata tests are done so that
//the db contents don't interfere
-@Test(dependsOnGroups = "plugin.metadata")
+@Test
+//(dependsOnGroups = "plugin.metadata")
public class DatabaseAndFilePluginDeploymentTest extends AbstractEJB3Test {
private static final String PLUGIN_NAME = "DeployTest"; // as defined in our test descriptors
@@ -110,7 +106,14 @@ public class DatabaseAndFilePluginDeploymentTest extends AbstractEJB3Test {
// | 1.0-feb-2 | | | | one of the files gets deleted
// --------------------------------------------------------------------------
- @BeforeClass
+ // README
+ // Arquillian (1.0.2) does not honor Testng's lifecycle, Before/AfterClass are invoked on
+ // every test. Since beforeClass sets instance variables, we need to now call it for
+ // every test, so we call it from beforeMethod(). We use a stand-in test to simulate AfterClass,
+ // using priorities to make it run last. Testng (I believe) applies priority after dependencies, so it
+ // is important that afterClassStandIn() have a dependency such that it runs in the last test-set.
+
+ //@BeforeClass
public void beforeClass() throws Exception {
Calendar cal = Calendar.getInstance();
cal.set(2009, Calendar.FEBRUARY, 1, 1, 0, 0);
@@ -161,8 +164,9 @@ public class DatabaseAndFilePluginDeploymentTest extends AbstractEJB3Test {
return;
}
- @AfterClass(alwaysRun = true)
- public void afterClass() throws Exception {
+ //@AfterClass(alwaysRun = true)
+ @Test(priority = 10, alwaysRun = true)
+ public void afterClassStandIn() throws Exception {
for (Map.Entry<String, File> entry : testPluginFiles.entrySet()) {
File doomed = entry.getValue();
doomed.delete();
@@ -177,8 +181,10 @@ public class DatabaseAndFilePluginDeploymentTest extends AbstractEJB3Test {
return;
}
- @BeforeMethod
- public void beforeMethod() throws Exception {
+ @Override
+ protected void beforeMethod() throws Exception {
+ beforeClass();
+
afterMethod(); // we clean up before and after, just to be sure we're clean
File deployDir = new File(DEPLOY_LOCATION);
@@ -207,15 +213,14 @@ public class DatabaseAndFilePluginDeploymentTest extends AbstractEJB3Test {
}
- @AfterMethod(alwaysRun = true)
+ @Override
@SuppressWarnings("unchecked")
- public void afterMethod() throws Exception {
+ protected void afterMethod() throws Exception {
emptyDirectory(new File(DEPLOY_LOCATION));
TransactionManager tm = getTransactionManager();
tm.begin();
- EntityManager em = getEntityManager();
try {
Query q = em.createNamedQuery(Plugin.QUERY_FIND_BY_NAME);
q.setParameter("name", PLUGIN_NAME);
@@ -226,7 +231,6 @@ public class DatabaseAndFilePluginDeploymentTest extends AbstractEJB3Test {
} catch (NoResultException ignore) {
} finally {
tm.commit();
- em.close();
}
return;
@@ -473,14 +477,12 @@ public class DatabaseAndFilePluginDeploymentTest extends AbstractEJB3Test {
TransactionManager tm = getTransactionManager();
tm.begin();
- EntityManager em = getEntityManager();
try {
Query q = em.createNamedQuery(Plugin.QUERY_FIND_BY_NAME);
q.setParameter("name", PLUGIN_NAME);
dbPlugin = (Plugin) q.getSingleResult();
} finally {
tm.rollback();
- em.close();
}
assertSamePlugin(plugin, dbPlugin);
@@ -547,7 +549,6 @@ public class DatabaseAndFilePluginDeploymentTest extends AbstractEJB3Test {
TransactionManager tm = getTransactionManager();
tm.begin();
- EntityManager em = getEntityManager();
try {
em.persist(pluginPojo);
} catch (Exception e) {
@@ -555,7 +556,6 @@ public class DatabaseAndFilePluginDeploymentTest extends AbstractEJB3Test {
throw e;
} finally {
tm.commit();
- em.close();
}
return plugin; // do not return the persisted pojo, let GC collect the larger pojo with the file content
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/db/DbSetupTest.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/db/DbSetupTest.java
index c21bb72..557f03c 100644
--- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/db/DbSetupTest.java
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/db/DbSetupTest.java
@@ -20,6 +20,8 @@ package org.rhq.enterprise.server.db;
import java.util.Set;
+import org.testng.annotations.Test;
+
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.authz.Permission;
import org.rhq.core.domain.authz.Role;
@@ -28,8 +30,6 @@ import org.rhq.enterprise.server.authz.RoleManagerLocal;
import org.rhq.enterprise.server.test.AbstractEJB3Test;
import org.rhq.enterprise.server.util.DbSetupUtility;
import org.rhq.enterprise.server.util.LookupUtil;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
/**
* Test that dbsetup initializes the data in the RHQ schema as intended (e.g. test that the Superuser and All Resources
@@ -40,8 +40,8 @@ import org.testng.annotations.Test;
@Test(groups = "db", singleThreaded = true)
public class DbSetupTest extends AbstractEJB3Test {
- @BeforeClass(groups = "db")
- public void setUp() throws Exception {
+ @Override
+ protected void beforeMethod() throws Exception {
// Recreate a fresh JON DB with the latest schema.
DbSetupUtility.dbreset();
DbSetupUtility.dbsetup();
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/db/DbUpgradeTest.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/db/DbUpgradeTest.java
index 8883419..a1bfc48 100644
--- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/db/DbUpgradeTest.java
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/db/DbUpgradeTest.java
@@ -21,6 +21,8 @@ package org.rhq.enterprise.server.db;
import java.util.Set;
import java.util.UUID;
+import org.testng.annotations.Test;
+
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.authz.Permission;
import org.rhq.core.domain.authz.Role;
@@ -29,9 +31,6 @@ import org.rhq.enterprise.server.authz.RoleManagerLocal;
import org.rhq.enterprise.server.test.AbstractEJB3Test;
import org.rhq.enterprise.server.util.DbSetupUtility;
import org.rhq.enterprise.server.util.LookupUtil;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
/**
* Test that various dbupgrade schema versions update the data model as intended.
@@ -41,16 +40,16 @@ import org.testng.annotations.Test;
@Test(groups = "db", singleThreaded = true)
public class DbUpgradeTest extends AbstractEJB3Test {
- @BeforeClass(groups = "db")
- public void setUp() throws Exception {
+ @Override
+ protected void beforeMethod() throws Exception {
// Recreate a fresh JON DB with the JON 2.3.1 schema, then upgrade it to the JON 3.0.0 schema.
DbSetupUtility.dbreset();
DbSetupUtility.dbsetup("2.3.1");
DbSetupUtility.dbupgrade(DbSetupUtility.JON300_SCHEMA_VERSION);
}
- @AfterClass(groups = "db")
- public void tearDown() throws Exception {
+ @Override
+ protected void afterMethod() throws Exception {
// Upgrade to the latest schema version so the DB is left in a state usable by other tests.
DbSetupUtility.dbupgrade("LATEST");
}
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/discovery/DiscoveryBossBeanTest.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/discovery/DiscoveryBossBeanTest.java
index d4d9cbf..e12dbb0 100644
--- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/discovery/DiscoveryBossBeanTest.java
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/discovery/DiscoveryBossBeanTest.java
@@ -33,8 +33,6 @@ import java.util.UUID;
import javax.ejb.EJBException;
import javax.management.MBeanServer;
-import javax.management.MBeanServerFactory;
-import javax.persistence.EntityManager;
import javax.persistence.Query;
import org.dbunit.database.DatabaseConfig;
@@ -51,14 +49,9 @@ import org.dbunit.operation.DatabaseOperation;
import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.xml.sax.InputSource;
-import org.jboss.mx.util.MBeanServerLocator;
-
import org.rhq.core.clientapi.agent.discovery.DiscoveryAgentService;
import org.rhq.core.clientapi.server.discovery.InventoryReport;
import org.rhq.core.domain.configuration.Configuration;
@@ -68,8 +61,6 @@ import org.rhq.core.domain.resource.Agent;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.enterprise.server.auth.SubjectManagerLocal;
-import org.rhq.enterprise.server.core.comm.ServerCommunicationsService;
-import org.rhq.enterprise.server.core.comm.ServerCommunicationsServiceMBean;
import org.rhq.enterprise.server.resource.ResourceManagerLocal;
import org.rhq.enterprise.server.test.AbstractEJB3Test;
import org.rhq.enterprise.server.test.TestServerCommunicationsService;
@@ -101,19 +92,11 @@ public class DiscoveryBossBeanTest extends AbstractEJB3Test {
private TestServerCommunicationsService agentServiceContainer;
- @BeforeClass
- public void beforeClass() throws Exception {
+ @Override
+ protected void beforeMethod() throws Exception {
discoveryBoss = LookupUtil.getDiscoveryBoss();
subjectManager = LookupUtil.getSubjectManager();
resourceManager = LookupUtil.getResourceManager();
- }
-
- @BeforeMethod
- public void setupTestData() throws Exception {
- dummyJBossMBeanServer = MBeanServerFactory.createMBeanServer("jboss");
- MBeanServerLocator.setJBoss(dummyJBossMBeanServer);
- dummyJBossMBeanServer.registerMBean(new ServerCommunicationsService(),
- ServerCommunicationsServiceMBean.OBJECT_NAME);
initDB();
@@ -140,16 +123,15 @@ public class DiscoveryBossBeanTest extends AbstractEJB3Test {
Resource parentResource = resourceManager.getResource(subjectManager.getOverlord(), parentResourceId);
resource.setParentResource(parentResource);
Integer ownerSubjectId = (Integer) invocation.getArguments()[3];
- return discoveryBoss.addResource(resource, ownerSubjectId);
+ MergeResourceResponse response = discoveryBoss.addResource(resource, ownerSubjectId);
+ return response;
}
});
}
- @AfterMethod(alwaysRun = true)
+ @Override
public void afterMethod() throws Exception {
try {
- MBeanServerFactory.releaseMBeanServer(dummyJBossMBeanServer);
-
cleanDB();
} finally {
unprepareForTestAgents();
@@ -283,11 +265,9 @@ public class DiscoveryBossBeanTest extends AbstractEJB3Test {
public void cleanDB() throws Exception {
Connection connection = null;
- EntityManager em = null;
try {
getTransactionManager().begin();
- em = getEntityManager();
Query q;
List<?> doomed;
@@ -299,18 +279,12 @@ public class DiscoveryBossBeanTest extends AbstractEJB3Test {
}
em.flush();
getTransactionManager().commit();
- em.close();
- em = null;
} catch (Exception e) {
try {
System.out.println("CANNOT CLEAN UP TEST: Cause: " + e);
getTransactionManager().rollback();
} catch (Exception ignore) {
}
- } finally {
- if (null != em) {
- em.close();
- }
}
try {
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/drift/DriftManagerBeanTest.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/drift/DriftManagerBeanTest.java
index 6b4b356..8389f17 100644
--- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/drift/DriftManagerBeanTest.java
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/drift/DriftManagerBeanTest.java
@@ -19,7 +19,6 @@
package org.rhq.enterprise.server.drift;
import static org.apache.commons.io.FileUtils.deleteDirectory;
-import static org.apache.commons.io.FileUtils.toFile;
import static org.rhq.common.drift.FileEntry.addedFileEntry;
import static org.rhq.common.drift.FileEntry.changedFileEntry;
import static org.rhq.core.domain.drift.DriftChangeSetCategory.COVERAGE;
@@ -29,14 +28,7 @@ import java.io.File;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
-import java.util.Set;
-import javax.persistence.EntityManager;
-
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.rhq.common.drift.ChangeSetWriter;
@@ -46,8 +38,8 @@ import org.rhq.core.clientapi.server.drift.DriftServerService;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.common.EntityContext;
import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.criteria.DriftDefinitionCriteria;
import org.rhq.core.domain.criteria.JPADriftChangeSetCriteria;
-import org.rhq.core.domain.criteria.ResourceCriteria;
import org.rhq.core.domain.drift.Drift;
import org.rhq.core.domain.drift.DriftCategory;
import org.rhq.core.domain.drift.DriftChangeSet;
@@ -88,26 +80,15 @@ public class DriftManagerBeanTest extends AbstractEJB3Test {
MessageDigestGenerator digestGenerator;
- /**
- * Prepares things for the entire test class.
- */
- @BeforeClass
- public void beforeClass() throws Exception {
+ @Override
+ protected void beforeMethod() throws Exception {
digestGenerator = new MessageDigestGenerator(MessageDigestGenerator.SHA_256);
jpaDriftServer = LookupUtil.getJPADriftServer();
driftManager = LookupUtil.getDriftManager();
overlord = LookupUtil.getSubjectManager().getOverlord();
driftServerService = new DriftServerServiceImpl();
- }
-
- @AfterClass(alwaysRun = true)
- public void afterClass() {
- driftServerService = null;
- }
- @BeforeMethod
- public void beforeMethod() throws Exception {
TestServerCommunicationsService agentServiceContainer = prepareForTestAgents();
agentServiceContainer.driftService = new TestDefService();
@@ -118,8 +99,8 @@ public class DriftManagerBeanTest extends AbstractEJB3Test {
newResource = createNewResource();
}
- @AfterMethod(alwaysRun = true)
- public void afterMethod() throws Exception {
+ @Override
+ protected void afterMethod() throws Exception {
try {
deleteNewResource(newResource);
} finally {
@@ -130,7 +111,7 @@ public class DriftManagerBeanTest extends AbstractEJB3Test {
@Test
public void testStoreChangeSet() throws Exception {
- File rootDir = toFile(getClass().getResource("."));
+ File rootDir = new File(System.getProperty("java.io.tmpdir"));
File changeSetsDir = new File(rootDir, "changesets");
deleteDirectory(changeSetsDir);
changeSetsDir.mkdirs();
@@ -217,13 +198,10 @@ public class DriftManagerBeanTest extends AbstractEJB3Test {
driftManager.updateDriftDefinition(overlord, EntityContext.forResource(newResource.getId()), driftDefPojo);
- ResourceManagerLocal resourceManager = LookupUtil.getResourceManager();
- ResourceCriteria c = new ResourceCriteria();
- c.addFilterId(newResource.getId());
- c.fetchDriftDefinitions(true);
- List<Resource> resources = resourceManager.findResourcesByCriteria(overlord, c);
- assertEquals(1, resources.size());
- Set<DriftDefinition> driftDefs = resources.get(0).getDriftDefinitions();
+ DriftDefinitionCriteria c = new DriftDefinitionCriteria();
+ c.addFilterResourceIds(newResource.getId());
+ c.fetchConfiguration(true);
+ List<DriftDefinition> driftDefs = driftManager.findDriftDefinitionsByCriteria(overlord, c);
assertNotNull(driftDefs);
assertEquals(3, driftDefs.size());
DriftDefinition driftDef = null;
@@ -240,9 +218,7 @@ public class DriftManagerBeanTest extends AbstractEJB3Test {
driftDefPojo.setInterval(120L);
driftManager.updateDriftDefinition(overlord, EntityContext.forResource(newResource.getId()), driftDefPojo);
- resources = resourceManager.findResourcesByCriteria(overlord, c);
- assertEquals(1, resources.size());
- driftDefs = resources.get(0).getDriftDefinitions();
+ driftDefs = driftManager.findDriftDefinitionsByCriteria(overlord, c);
assertNotNull(driftDefs);
assertEquals(3, driftDefs.size());
driftDef = null;
@@ -263,9 +239,7 @@ public class DriftManagerBeanTest extends AbstractEJB3Test {
driftManager.updateDriftDefinition(overlord, EntityContext.forResource(newResource.getId()), driftDefPojo);
- resources = resourceManager.findResourcesByCriteria(overlord, c);
- assertEquals(1, resources.size());
- driftDefs = resources.get(0).getDriftDefinitions();
+ driftDefs = driftManager.findDriftDefinitionsByCriteria(overlord, c);
assertNotNull(driftDefs);
assertEquals(4, driftDefs.size());
for (Iterator<DriftDefinition> i = driftDefs.iterator(); i.hasNext();) {
@@ -285,9 +259,7 @@ public class DriftManagerBeanTest extends AbstractEJB3Test {
}
driftManager.deleteDriftDefinition(overlord, EntityContext.forResource(newResource.getId()), "testDriftDef");
- resources = resourceManager.findResourcesByCriteria(overlord, c);
- assertEquals(1, resources.size());
- driftDefs = resources.get(0).getDriftDefinitions();
+ driftDefs = driftManager.findDriftDefinitionsByCriteria(overlord, c);
assertNotNull(driftDefs);
assertEquals(3, driftDefs.size());
for (Iterator<DriftDefinition> i = driftDefs.iterator(); i.hasNext();) {
@@ -303,7 +275,6 @@ public class DriftManagerBeanTest extends AbstractEJB3Test {
private void deleteDriftFiles() throws Exception {
getTransactionManager().begin();
- EntityManager em = getEntityManager();
try {
try {
@@ -321,14 +292,11 @@ public class DriftManagerBeanTest extends AbstractEJB3Test {
em.flush();
getTransactionManager().commit();
} finally {
- em.close();
}
}
private Resource createNewResource() throws Exception {
getTransactionManager().begin();
- EntityManager em = getEntityManager();
-
Resource resource;
try {
@@ -371,7 +339,6 @@ public class DriftManagerBeanTest extends AbstractEJB3Test {
em.flush();
getTransactionManager().commit();
} finally {
- em.close();
}
return resource;
@@ -379,7 +346,6 @@ public class DriftManagerBeanTest extends AbstractEJB3Test {
private void deleteNewResource(Resource resource) throws Exception {
if (null != resource) {
- EntityManager em = null;
try {
ResourceManagerLocal resourceManager = LookupUtil.getResourceManager();
@@ -393,7 +359,6 @@ public class DriftManagerBeanTest extends AbstractEJB3Test {
// now dispose of other hibernate entities
getTransactionManager().begin();
- em = getEntityManager();
ResourceType type = em.find(ResourceType.class, resource.getResourceType().getId());
Agent agent = em.find(Agent.class, resource.getAgent().getId());
@@ -407,14 +372,12 @@ public class DriftManagerBeanTest extends AbstractEJB3Test {
getTransactionManager().commit();
} catch (Exception e) {
try {
- System.out.println("CANNOT CLEAN UP TEST (" + this.getClass().getSimpleName() + ") Cause: " + e);
+ System.out.println("CANNOT CLEAN UP TEST (" + this.getClass().getSimpleName() + ")");
+ e.printStackTrace();
getTransactionManager().rollback();
} catch (Exception ignore) {
}
} finally {
- if (null != em) {
- em.close();
- }
}
}
}
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java
index edd9867..628df29 100644
--- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java
@@ -18,6 +18,7 @@ import java.util.Properties;
import java.util.regex.Pattern;
import javax.management.MBeanServer;
+import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.naming.Context;
import javax.naming.InitialContext;
@@ -128,6 +129,7 @@ public abstract class AbstractEJB3Test extends Arquillian {
testClassesJar.addAsManifestResource(EmptyAsset.INSTANCE, ArchivePaths.create("beans.xml")); // add CDI injection (needed by arquillian injection);
testClassesJar.addAsResource("test-scheduler.properties");
testClassesJar.addAsResource("test-alert-sender-serverplugin.xml");
+ testClassesJar.addAsResource("org/rhq/enterprise/server/discovery/DiscoveryBossBeanTest.xml");
// create test ear by starting with rhq.ear and thinning it
MavenDependencyResolver earResolver = DependencyResolvers.use(MavenDependencyResolver.class);
@@ -551,7 +553,23 @@ public abstract class AbstractEJB3Test extends Arquillian {
public void prepareCustomServerService(Object testServiceMBean, String objectNameStr) {
try {
ObjectName objectName = new ObjectName(objectNameStr);
+ prepareCustomServerService(testServiceMBean, objectName);
+ } catch (MalformedObjectNameException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ /**
+ * If you need to test server plugins, you must first prepare the server plugin service.
+ * After this returns, the caller must explicitly start the PC by using the appropriate API
+ * on the given mbean; this method will only start the service, it will NOT start the master PC.
+ *
+ * @param testServiceMBean the object that will house your test server plugins
+ *
+ * @throws RuntimeException
+ */
+ public void prepareCustomServerService(Object testServiceMBean, ObjectName objectName) {
+ try {
// first, unregister the real service...
MBeanServer mbs = getPlatformMBeanServer();
if (mbs.isRegistered(objectName)) {
@@ -567,7 +585,11 @@ public abstract class AbstractEJB3Test extends Arquillian {
}
public void unprepareCustomServerService(String objectNameStr) throws Exception {
- ObjectName objectName = new ObjectName(objectNameStr);
+ ObjectName objectName = new ObjectName(objectNameStr);
+ unprepareCustomServerService(objectName);
+ }
+
+ public void unprepareCustomServerService(ObjectName objectName) throws Exception {
MBeanServer mbs = getPlatformMBeanServer();
if (mbs.isRegistered(objectName)) {
mbs.unregisterMBean(objectName);
@@ -602,24 +624,16 @@ public abstract class AbstractEJB3Test extends Arquillian {
}
public void unprepareServerPluginService() throws Exception {
- unprepareServerPluginService(false);
- }
-
- public void unprepareServerPluginService(boolean beanOnly) throws Exception {
if (serverPluginService != null) {
serverPluginService.stopMasterPluginContainer();
serverPluginService.stop();
- MBeanServer mbs = getPlatformMBeanServer();
- if (beanOnly) {
- if (mbs.isRegistered(ServerPluginService.OBJECT_NAME)) {
- mbs.unregisterMBean(ServerPluginService.OBJECT_NAME);
- }
-
- } else {
- //MBeanServerFactory.releaseMBeanServer(mbs);
- }
serverPluginService = null;
}
+
+ MBeanServer mbs = getPlatformMBeanServer();
+ if (mbs.isRegistered(ServerPluginService.OBJECT_NAME)) {
+ mbs.unregisterMBean(ServerPluginService.OBJECT_NAME);
+ }
}
public SchedulerService getSchedulerService() {
@@ -655,22 +669,14 @@ public abstract class AbstractEJB3Test extends Arquillian {
}
public void unprepareScheduler() throws Exception {
- unprepareScheduler(false);
- }
-
- public void unprepareScheduler(boolean beanOnly) throws Exception {
if (schedulerService != null) {
schedulerService.stop();
schedulerService = null;
+ }
- MBeanServer mbs = getPlatformMBeanServer();
- if (beanOnly) {
- if (mbs.isRegistered(SchedulerService.SCHEDULER_MBEAN_NAME)) {
- mbs.unregisterMBean(SchedulerService.SCHEDULER_MBEAN_NAME);
- }
- } else {
- //MBeanServerFactory.releaseMBeanServer(mbs);
- }
+ MBeanServer mbs = getPlatformMBeanServer();
+ if (mbs.isRegistered(SchedulerService.SCHEDULER_MBEAN_NAME)) {
+ mbs.unregisterMBean(SchedulerService.SCHEDULER_MBEAN_NAME);
}
}
@@ -713,8 +719,8 @@ public abstract class AbstractEJB3Test extends Arquillian {
}
// Now replace with the test service...
- TestServerCommunicationsService agentService = new TestServerCommunicationsService();
- mbs.registerMBean(customAgentService, ServerCommunicationsServiceMBean.OBJECT_NAME);
+ agentService = (TestServerCommunicationsService) customAgentService;
+ mbs.registerMBean(agentService, ServerCommunicationsServiceMBean.OBJECT_NAME);
return agentService;
} catch (Exception e) {
@@ -728,23 +734,15 @@ public abstract class AbstractEJB3Test extends Arquillian {
* {@link #prepareForTestAgents()}.
*/
public void unprepareForTestAgents() {
- unprepareForTestAgents(false);
- }
-
- public void unprepareForTestAgents(boolean beanOnly) {
try {
if (agentService != null) {
agentService.stop();
agentService = null;
+ }
- MBeanServer mbs = getPlatformMBeanServer();
- if (beanOnly) {
- if (mbs.isRegistered(ServerCommunicationsServiceMBean.OBJECT_NAME)) {
- mbs.unregisterMBean(ServerCommunicationsServiceMBean.OBJECT_NAME);
- }
- } else {
- //MBeanServerFactory.releaseMBeanServer(mbs);
- }
+ MBeanServer mbs = getPlatformMBeanServer();
+ if (mbs.isRegistered(ServerCommunicationsServiceMBean.OBJECT_NAME)) {
+ mbs.unregisterMBean(ServerCommunicationsServiceMBean.OBJECT_NAME);
}
} catch (Exception e) {
throw new RuntimeException(e);
11 years, 6 months
[rhq] Branch 'rhq-on-as7' - 2 commits - modules/enterprise
by Jay Shaughnessy
modules/enterprise/server/itests-2/pom.xml | 1
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/authz/test/AuthorizationManagerBeanTest.java | 5
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java | 10
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBeanTest.java | 17
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/configuration/metadata/ConfigurationMetadataManagerBeanTest.java | 10
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/content/test/ContentManagerBeanTest.java | 17
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/content/test/ContentSourceManagerBeanTest.java | 46 --
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/content/test/ContentUIManagerBeanEligiblePackagesTest.java | 15
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/content/test/ContentUIManagerBeanTest.java | 5
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/core/CoreServerServiceImplTest.java | 93 +++-
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/test/AvailabilityManagerTest.java | 210 ++++------
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/plugin/pc/content/ContentProviderManagerSyncContentProviderTest.java | 10
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/plugin/pc/content/ContentProviderManagerSyncRepoTest.java | 10
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/resource/cluster/ClusterManagerBeanTest.java | 6
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java | 108 ++++-
15 files changed, 330 insertions(+), 233 deletions(-)
New commits:
commit 25f0f6f63f0de4176e8a8eaf0a4d6b61346ef832
Author: Jay Shaughnessy <jshaughn(a)jshaughn.csb>
Date: Tue Nov 6 11:32:25 2012 -0500
More restructured tests now passing
- Add utility in AbstractEJB3Test for persisting objects that
need to be shared between tests. Since testng basically
"new"s the test class on each test.
- Add utility in AbstractEJB3Test for registering
a custom service.
diff --git a/modules/enterprise/server/itests-2/pom.xml b/modules/enterprise/server/itests-2/pom.xml
index e9c7f44..2d988d1 100644
--- a/modules/enterprise/server/itests-2/pom.xml
+++ b/modules/enterprise/server/itests-2/pom.xml
@@ -436,6 +436,7 @@
<!-- FOR RHQ TESTING -->
<system-properties>
<property name="project.version" value="${project.version}"/>
+ <property name="rhq.server.content.filesystem" value="${jboss.unzip.location}/standalone/data/packagebits" />
</system-properties>]]></replacevalue>
</replacefilter>
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/authz/test/AuthorizationManagerBeanTest.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/authz/test/AuthorizationManagerBeanTest.java
index ccd8eec..5c2d60f 100644
--- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/authz/test/AuthorizationManagerBeanTest.java
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/authz/test/AuthorizationManagerBeanTest.java
@@ -26,7 +26,6 @@ import java.util.Set;
import javax.persistence.EntityManager;
-import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.rhq.core.domain.auth.Subject;
@@ -44,9 +43,9 @@ import org.rhq.enterprise.server.util.SessionTestHelper;
public class AuthorizationManagerBeanTest extends AbstractEJB3Test {
private AuthorizationManagerLocal authorizationManager;
- @BeforeMethod
+ @Override
@SuppressWarnings( { "unused" })
- private void init() {
+ protected void beforeMethod() {
try {
authorizationManager = LookupUtil.getAuthorizationManager();
} catch (Throwable t) {
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
index 1621dac..028a713 100644
--- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
@@ -37,8 +37,6 @@ import javax.persistence.Query;
import javax.transaction.TransactionManager;
import org.hibernate.LazyInitializationException;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.rhq.core.domain.auth.Subject;
@@ -114,8 +112,8 @@ public class BundleManagerBeanTest extends AbstractEJB3Test {
private Subject overlord;
TestServerCommunicationsService agentServiceContainer;
- @BeforeMethod
- public void beforeMethod() throws Exception {
+ @Override
+ protected void beforeMethod() throws Exception {
agentServiceContainer = prepareForTestAgents();
agentServiceContainer.bundleService = new TestAgentClient(null, agentServiceContainer);
@@ -130,8 +128,8 @@ public class BundleManagerBeanTest extends AbstractEJB3Test {
cleanupDatabase();
}
- @AfterMethod(alwaysRun = true)
- public void afterMethod() throws Exception {
+ @Override
+ protected void afterMethod() throws Exception {
unprepareForTestAgents();
try {
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBeanTest.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBeanTest.java
index c666e34..d9d2d69 100644
--- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBeanTest.java
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBeanTest.java
@@ -27,9 +27,6 @@ import java.util.Map;
import javax.persistence.EntityManager;
import org.jetbrains.annotations.NotNull;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.rhq.core.clientapi.agent.PluginContainerException;
@@ -86,8 +83,8 @@ public class ConfigurationManagerBeanTest extends AbstractEJB3Test {
/**
* Prepares things for the entire test class.
*/
- @BeforeClass
- public void beforeClass() {
+ //@BeforeClass don't use BeforeClass as Arquillian 1.0.2 invokes it on every test method
+ protected void beforeClass() {
// Make sure page control sorts so the latest config update is last (the default is for the latest to be first).
configUpdatesPageControl = PageControl.getUnlimitedInstance();
// (ips, 04/01/10): Use createdTime, rather than id, to order by, since the id's are not guaranteed to be
@@ -100,8 +97,10 @@ public class ConfigurationManagerBeanTest extends AbstractEJB3Test {
overlord = LookupUtil.getSubjectManager().getOverlord();
}
- @BeforeMethod
- public void beforeMethod() throws Exception {
+ @Override
+ protected void beforeMethod() throws Exception {
+ beforeClass();
+
prepareScheduler();
TestServerCommunicationsService agentServiceContainer = prepareForTestAgents();
@@ -141,8 +140,8 @@ public class ConfigurationManagerBeanTest extends AbstractEJB3Test {
}
}
- @AfterMethod(alwaysRun = true)
- public void afterMethod() throws Exception {
+ @Override
+ protected void afterMethod() throws Exception {
try {
// perform in-band and out-of-band work in quick succession
// only need to delete newResource1, which will delete his child newResource2 as well as the agent
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/configuration/metadata/ConfigurationMetadataManagerBeanTest.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/configuration/metadata/ConfigurationMetadataManagerBeanTest.java
index cdb5359..8c74317 100644
--- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/configuration/metadata/ConfigurationMetadataManagerBeanTest.java
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/configuration/metadata/ConfigurationMetadataManagerBeanTest.java
@@ -33,7 +33,6 @@ import java.util.Map;
import javax.persistence.EntityManager;
import javax.transaction.SystemException;
-import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import org.rhq.core.clientapi.descriptor.plugin.PluginDescriptor;
@@ -70,8 +69,8 @@ public class ConfigurationMetadataManagerBeanTest extends AbstractEJB3Test {
ConfigurationDefinition updatedConfigDef;
- @BeforeClass
- public void setupClass() {
+ //@BeforeClass don't use BeforeClass as Arquillian 1.0.2 invokes it on every test method
+ protected void beforeClass() {
String pluginFileBaseName = "configuration_metadata_manager_bean_test";
String version1 = pluginFileBaseName + "_v1.xml";
String version2 = pluginFileBaseName + "_v2.xml";
@@ -80,6 +79,11 @@ public class ConfigurationMetadataManagerBeanTest extends AbstractEJB3Test {
updatedDescriptor = loadPluginDescriptor(getClass().getResource(version2));
}
+ @Override
+ protected void beforeMethod() {
+ beforeClass();
+ }
+
@Test(enabled = ENABLED)
public void addNewUngroupedSimplePropertyDef() {
initConfigDefs("servers[name='MyServer1']", "test");
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/content/test/ContentManagerBeanTest.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/content/test/ContentManagerBeanTest.java
index e201328..0e31657 100644
--- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/content/test/ContentManagerBeanTest.java
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/content/test/ContentManagerBeanTest.java
@@ -28,9 +28,6 @@ import java.util.Set;
import javax.persistence.EntityManager;
import javax.persistence.Query;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.rhq.core.clientapi.agent.PluginContainerException;
@@ -141,21 +138,23 @@ public class ContentManagerBeanTest extends AbstractEJB3Test {
// Setup --------------------------------------------
- @BeforeClass
- public void setupBeforeClass() throws Exception {
+ //@BeforeClass don't use BeforeClass as Arquillian 1.0.2 invokes it on every test method
+ protected void beforeClass() throws Exception {
contentManager = LookupUtil.getContentManager();
subjectManager = LookupUtil.getSubjectManager();
populateResponseSteps();
}
- @BeforeMethod
- public void setupBeforeMethod() throws Exception {
+ @Override
+ protected void beforeMethod() throws Exception {
+ beforeClass();
+
setupTestEnvironment();
}
- @AfterMethod(alwaysRun = true)
- public void tearDownAfterMethod() throws Exception {
+ @Override
+ protected void afterMethod() throws Exception {
tearDownTestEnvironment();
}
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/content/test/ContentSourceManagerBeanTest.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/content/test/ContentSourceManagerBeanTest.java
index a3a561a..2d34766 100644
--- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/content/test/ContentSourceManagerBeanTest.java
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/content/test/ContentSourceManagerBeanTest.java
@@ -30,10 +30,6 @@ import javax.persistence.EntityManager;
import javax.persistence.Query;
import org.apache.commons.lang.RandomStringUtils;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.rhq.core.domain.auth.Subject;
@@ -61,7 +57,6 @@ import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
import org.rhq.core.util.MessageDigestGenerator;
-import org.rhq.enterprise.server.content.ContentManagerLocal;
import org.rhq.enterprise.server.content.ContentSourceManagerLocal;
import org.rhq.enterprise.server.content.RepoManagerLocal;
import org.rhq.enterprise.server.content.metadata.ContentSourceMetadataManagerLocal;
@@ -77,7 +72,6 @@ public class ContentSourceManagerBeanTest extends AbstractEJB3Test {
private static final boolean TESTS_ENABLED = true;
- private ContentManagerLocal contentManager;
private ContentSourceManagerLocal contentSourceManager;
private ContentSourceMetadataManagerLocal contentSourceMetadataManager;
private RepoManagerLocal repoManager;
@@ -120,18 +114,11 @@ public class ContentSourceManagerBeanTest extends AbstractEJB3Test {
*/
private Architecture architecture1;
- /**
- * Extra architecture used in tests.
- */
- private Architecture architecture2;
-
private ResourceType resourceType1;
private Resource resource1;
- private TestContentServerPluginService pluginService;
- @BeforeClass
- public void setupBeforeClass() throws Exception {
- contentManager = LookupUtil.getContentManager();
+ //@BeforeClass don't use BeforeClass as Arquillian 1.0.2 invokes it on every test method
+ protected void beforeClass() throws Exception {
contentSourceManager = LookupUtil.getContentSourceManager();
contentSourceMetadataManager = LookupUtil.getContentSourceMetadataManager();
repoManager = LookupUtil.getRepoManagerLocal();
@@ -142,28 +129,32 @@ public class ContentSourceManagerBeanTest extends AbstractEJB3Test {
cleanupPreviousTestRuns();
}
- @AfterClass
- public void tearDownAfterClass() throws Exception {
- // This delete is temporary. There are content sources left over from previous runs of this test
- // that need to be deleted and this is the simplest way of clearing everyone's environment without
- // requesting a dbsetup.
- cleanupPreviousTestRuns();
- }
+ // @AfterClass
+ // public void tearDownAfterClass() throws Exception {
+ // // This delete is temporary. There are content sources left over from previous runs of this test
+ // // that need to be deleted and this is the simplest way of clearing everyone's environment without
+ // // requesting a dbsetup.
+ // cleanupPreviousTestRuns();
+ // }
+
+ @Override
+ protected void beforeMethod() throws Exception {
+ beforeClass();
- @BeforeMethod
- public void setupBeforeMethod() throws Exception {
setupTestEnvironment();
overlord = LookupUtil.getSubjectManager().getOverlord();
prepareScheduler();
+ @SuppressWarnings("unused")
TestContentServerPluginService pluginService = new TestContentServerPluginService(this);
- cleanupPreviousTestRuns();
}
- @AfterMethod
- public void tearDownAfterMethod() throws Exception {
+ @Override
+ protected void afterMethod() throws Exception {
tearDownTestEnvironment();
unprepareServerPluginService();
unprepareScheduler();
+
+ cleanupPreviousTestRuns(); // TODO move to @AfterClass shen supported by Arquillian
}
@Test(enabled = TESTS_ENABLED)
@@ -947,7 +938,6 @@ public class ContentSourceManagerBeanTest extends AbstractEJB3Test {
try {
try {
architecture1 = em.find(Architecture.class, 1);
- architecture2 = em.find(Architecture.class, 2);
resourceType1 = new ResourceType("platform-" + System.currentTimeMillis(), "TestPlugin",
ResourceCategory.PLATFORM, null);
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/content/test/ContentUIManagerBeanEligiblePackagesTest.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/content/test/ContentUIManagerBeanEligiblePackagesTest.java
index b382347..c290faf 100644
--- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/content/test/ContentUIManagerBeanEligiblePackagesTest.java
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/content/test/ContentUIManagerBeanEligiblePackagesTest.java
@@ -26,9 +26,6 @@ import javax.persistence.Query;
import org.apache.commons.lang.RandomStringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.rhq.core.domain.auth.Subject;
@@ -98,19 +95,15 @@ public class ContentUIManagerBeanEligiblePackagesTest extends AbstractEJB3Test {
// Setup --------------------------------------------
- @BeforeClass
- public void setupBeforeClass() throws Exception {
+ @Override
+ protected void beforeMethod() throws Exception {
contentUIManager = LookupUtil.getContentUIManager();
subjectManager = LookupUtil.getSubjectManager();
- }
-
- @BeforeMethod
- public void populateDatabase() throws Exception {
setupTestEnvironment();
}
- @AfterMethod
- public void cleanDatabase() throws Exception {
+ @Override
+ protected void afterMethod() throws Exception {
tearDownTestEnvironment();
}
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/content/test/ContentUIManagerBeanTest.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/content/test/ContentUIManagerBeanTest.java
index 54cfb67..5ff5dbb 100644
--- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/content/test/ContentUIManagerBeanTest.java
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/content/test/ContentUIManagerBeanTest.java
@@ -24,7 +24,6 @@ import java.io.FileOutputStream;
import javax.persistence.EntityManager;
-import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import org.rhq.core.domain.content.Architecture;
@@ -57,8 +56,8 @@ public class ContentUIManagerBeanTest extends AbstractEJB3Test {
// Setup --------------------------------------------
- @BeforeClass
- public void setupBeforeClass() throws Exception {
+ @Override
+ protected void beforeMethod() throws Exception {
contentUIManager = LookupUtil.getContentUIManager();
contentManager = LookupUtil.getContentManager();
}
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/core/CoreServerServiceImplTest.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/core/CoreServerServiceImplTest.java
index 04a68c5..645e35c 100644
--- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/core/CoreServerServiceImplTest.java
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/core/CoreServerServiceImplTest.java
@@ -26,12 +26,8 @@ import java.util.Date;
import java.util.List;
import java.util.Properties;
-import javax.management.MBeanServer;
-import javax.management.ObjectName;
import javax.persistence.Query;
-import org.testng.annotations.AfterGroups;
-import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.rhq.core.clientapi.server.core.AgentRegistrationException;
@@ -93,6 +89,7 @@ import org.rhq.enterprise.server.util.LookupUtil;
// J. testAttemptToChangeAgentName
// 1) register agent "newName" but with Z's host/port/token. In effect, this is trying to change the agent's name. (REJECT - you are not allowed to rename agents)
+@SuppressWarnings("unchecked")
@Test(groups = { "core.agent.registration" })
public class CoreServerServiceImplTest extends AbstractEJB3Test {
private static final String TEST_AGENT_NAME_PREFIX = "CoreServerServiceImplTest.Agent";
@@ -100,18 +97,31 @@ public class CoreServerServiceImplTest extends AbstractEJB3Test {
private AgentVersion agentVersion;
private Server server;
private String oldServerNamePropertyValue = null;
- private AgentRegistrationRequest aReq = null;
- private AgentRegistrationResults aResults = null;
- private AgentRegistrationRequest zReq = null;
- private AgentRegistrationResults zResults = null;
private static final int A_PORT = 11111;
private static final String A_HOST = "hostA";
private static final int B_PORT = 22222;
private static final String B_HOST = "hostB";
- @AfterGroups(groups = { "core.agent.registration" })
- public void afterGroup() throws Exception {
+ // README
+ // Arquillian (1.0.2) does not honor Testng's lifecycle, Before/AfterClass are invoked on
+ // every test. We use stand-in tests to simulate BeforeClass and AfterClass, using priorities
+ // to make them run first and last. Testng (I believe) applies priority after dependencies, so it
+ // is important that afterClassStandIn() have a dependency such that it runs in the last test-set.
+
+ @Test(priority = -10)
+ public void beforeClassStandIn() throws Exception {
+ // delete our instance var object files, if they exist
+ deleteObjects("a.obj");
+ deleteObjects("b.obj");
+ }
+
+ @Test(priority = 10, dependsOnMethods = "testNormalAgentRegistration", alwaysRun = true)
+ public void afterClassStandIn() throws Exception {
+ // delete our instance var object files
+ deleteObjects("a.obj");
+ deleteObjects("b.obj");
+
// clean up any agents we might have created
Query q = getEntityManager().createQuery(
"select a from Agent a where name like '" + TEST_AGENT_NAME_PREFIX + "%'");
@@ -121,23 +131,22 @@ public class CoreServerServiceImplTest extends AbstractEJB3Test {
}
}
- @BeforeMethod
- public void prepare() throws Exception {
+ @Override
+ protected void beforeMethod() throws Exception {
// mock the name of our server via the sysprop (in production, this is normally set in rhq-server.properties)
oldServerNamePropertyValue = System.getProperty(RHQ_SERVER_NAME_PROPERTY);
String newServerNamePropertyValue = "CoreServerServiceImplTest.Server";
System.setProperty(RHQ_SERVER_NAME_PROPERTY, newServerNamePropertyValue);
// mock up our core server MBean that provides information about where the jboss home dir is
- MBeanServer mbs = getPlatformMBeanServer();
DummyCoreServer mbean = new DummyCoreServer();
- mbs.registerMBean(mbean, new ObjectName(CoreServerMBean.OBJECT_NAME));
+ prepareCustomServerService(mbean, CoreServerMBean.OBJECT_NAME);
// in order to register, we need to mock out the agent version file used by the server
// to determine the agent version it supports.
agentVersion = new AgentVersion("1.2.3", "12345");
File agentVersionFile = new File(mbean.getJBossServerHomeDir(),
- "deploy/rhq.ear/rhq-downloads/rhq-agent/rhq-server-agent-versions.properties");
+ "deployments/rhq.ear/rhq-downloads/rhq-agent/rhq-server-agent-versions.properties");
agentVersionFile.getParentFile().mkdirs();
agentVersionFile.delete();
Properties agentVersionProps = new Properties();
@@ -158,6 +167,7 @@ public class CoreServerServiceImplTest extends AbstractEJB3Test {
server.setName(newServerNamePropertyValue);
server.setAddress("CoreServerServiceImplTest.localhost");
server.setPort(12345);
+
server.setSecurePort(12346);
server.setOperationMode(OperationMode.NORMAL);
int serverId = LookupUtil.getServerManager().create(server);
@@ -165,15 +175,14 @@ public class CoreServerServiceImplTest extends AbstractEJB3Test {
}
@Override
- public void afterMethod() throws Exception {
+ protected void afterMethod() throws Exception {
// cleanup our test server
LookupUtil.getCloudManager().updateServerMode(new Integer[] { server.getId() }, OperationMode.DOWN);
LookupUtil.getCloudManager().deleteServer(server.getId());
// shutdown our mock mbean server
- MBeanServer mbs = getPlatformMBeanServer();
- mbs.unregisterMBean(new ObjectName(CoreServerMBean.OBJECT_NAME));
+ unprepareCustomServerService(CoreServerMBean.OBJECT_NAME);
unprepareForTestAgents();
@@ -250,8 +259,10 @@ public class CoreServerServiceImplTest extends AbstractEJB3Test {
assert agent.getPort() == 55552;
// remember this agent so our later tests can use it
- zReq = request;
- zResults = results;
+ AgentRegistrationRequest zReq = request;
+ AgentRegistrationResults zResults = results;
+
+ writeObjects("b.obj", zReq, zResults);
// Try to re-register changes to host and/or port but do not send any token.
// Because there is no token, these should fail.
@@ -288,13 +299,17 @@ public class CoreServerServiceImplTest extends AbstractEJB3Test {
@Test(dependsOnMethods = "testChangeAddressPort")
public void testNormalAgentRegistration() throws Exception {
CoreServerServiceImpl service = new CoreServerServiceImpl();
- aReq = createRequest(prefixName("A"), A_HOST, A_PORT, null);
- aResults = service.registerAgent(aReq);
+ AgentRegistrationRequest aReq = createRequest(prefixName("A"), A_HOST, A_PORT, null);
+ AgentRegistrationResults aResults = service.registerAgent(aReq);
assert aResults != null : "got null results";
+
+ writeObjects("a.obj", aReq, aResults);
}
@Test(dependsOnMethods = "testNormalAgentRegistration")
public void testHijackExistingAgentAddressPort() throws Exception {
+ List<Object> objs = readObjects("a.obj", 1);
+ AgentRegistrationRequest aReq = (AgentRegistrationRequest) objs.get(0);
CoreServerServiceImpl service = new CoreServerServiceImpl();
AgentRegistrationRequest request;
request = createRequest(prefixName("B"), aReq.getAddress(), aReq.getPort(), null);
@@ -310,6 +325,10 @@ public class CoreServerServiceImplTest extends AbstractEJB3Test {
public void testHijackExistingAgentName() throws Exception {
CoreServerServiceImpl service = new CoreServerServiceImpl();
AgentRegistrationRequest request;
+
+ List<Object> objs = readObjects("a.obj", 1);
+ AgentRegistrationRequest aReq = (AgentRegistrationRequest) objs.get(0);
+
request = createRequest(aReq.getName(), aReq.getAddress(), B_PORT, null);
try {
service.registerAgent(request);
@@ -337,6 +356,10 @@ public class CoreServerServiceImplTest extends AbstractEJB3Test {
public void testHijackExistingAgentAddressPortWithBogusToken() throws Exception {
CoreServerServiceImpl service = new CoreServerServiceImpl();
AgentRegistrationRequest request;
+
+ List<Object> objs = readObjects("a.obj", 1);
+ AgentRegistrationRequest aReq = (AgentRegistrationRequest) objs.get(0);
+
request = createRequest(prefixName("B"), aReq.getAddress(), aReq.getPort(), "badtoken");
try {
service.registerAgent(request);
@@ -350,6 +373,10 @@ public class CoreServerServiceImplTest extends AbstractEJB3Test {
public void testHijackExistingAgentNameWithBogusToken() throws Exception {
CoreServerServiceImpl service = new CoreServerServiceImpl();
AgentRegistrationRequest request;
+
+ List<Object> objs = readObjects("a.obj", 1);
+ AgentRegistrationRequest aReq = (AgentRegistrationRequest) objs.get(0);
+
request = createRequest(aReq.getName(), aReq.getAddress(), aReq.getPort(), "badtoken");
try {
service.registerAgent(request);
@@ -357,6 +384,7 @@ public class CoreServerServiceImplTest extends AbstractEJB3Test {
} catch (AgentRegistrationException ok) {
debugPrintThrowable(ok);
}
+
request = createRequest(aReq.getName(), aReq.getAddress(), B_PORT, "badtoken");
try {
service.registerAgent(request);
@@ -384,6 +412,15 @@ public class CoreServerServiceImplTest extends AbstractEJB3Test {
public void testHijackExistingAgentNameWithAnotherAgentToken() throws Exception {
CoreServerServiceImpl service = new CoreServerServiceImpl();
AgentRegistrationRequest request;
+
+ List<Object> objs = readObjects("a.obj", 1);
+ AgentRegistrationRequest aReq = (AgentRegistrationRequest) objs.get(0);
+
+ objs = readObjects("b.obj", 2);
+ @SuppressWarnings("unused")
+ AgentRegistrationRequest zReq = (AgentRegistrationRequest) objs.get(0);
+ AgentRegistrationResults zResults = (AgentRegistrationResults) objs.get(1);
+
request = createRequest(aReq.getName(), aReq.getAddress(), aReq.getPort(), zResults.getAgentToken());
try {
service.registerAgent(request);
@@ -418,6 +455,13 @@ public class CoreServerServiceImplTest extends AbstractEJB3Test {
public void testAgentHijackingAnotherAgentAddressPort() throws Exception {
CoreServerServiceImpl service = new CoreServerServiceImpl();
AgentRegistrationRequest request;
+ List<Object> objs = readObjects("a.obj", 2);
+ AgentRegistrationRequest aReq = (AgentRegistrationRequest) objs.get(0);
+ AgentRegistrationResults aResults = (AgentRegistrationResults) objs.get(1);
+
+ objs = readObjects("b.obj", 1);
+ AgentRegistrationRequest zReq = (AgentRegistrationRequest) objs.get(0);
+
request = createRequest(aReq.getName(), zReq.getAddress(), zReq.getPort(), aResults.getAgentToken());
try {
service.registerAgent(request);
@@ -431,6 +475,11 @@ public class CoreServerServiceImplTest extends AbstractEJB3Test {
public void testAttemptToChangeAgentName() throws Exception {
CoreServerServiceImpl service = new CoreServerServiceImpl();
AgentRegistrationRequest request;
+
+ List<Object> objs = readObjects("b.obj", 2);
+ AgentRegistrationRequest zReq = (AgentRegistrationRequest) objs.get(0);
+ AgentRegistrationResults zResults = (AgentRegistrationResults) objs.get(1);
+
request = createRequest(prefixName("newName"), zReq.getAddress(), zReq.getPort(), zResults.getAgentToken());
try {
service.registerAgent(request);
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/test/AvailabilityManagerTest.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/test/AvailabilityManagerTest.java
index 7298914..5ac610e 100644
--- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/test/AvailabilityManagerTest.java
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/test/AvailabilityManagerTest.java
@@ -26,10 +26,8 @@ import java.util.Random;
import javax.persistence.EntityManager;
import javax.persistence.Query;
-import javax.transaction.TransactionManager;
+import javax.transaction.Status;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.rhq.core.domain.auth.Subject;
@@ -49,6 +47,7 @@ import org.rhq.enterprise.server.resource.ResourceAvailabilityManagerLocal;
import org.rhq.enterprise.server.resource.ResourceManagerLocal;
import org.rhq.enterprise.server.test.AbstractEJB3Test;
import org.rhq.enterprise.server.test.TestServerPluginService;
+import org.rhq.enterprise.server.test.TransactionCallbackReturnable;
import org.rhq.enterprise.server.util.LookupUtil;
/**
@@ -80,8 +79,8 @@ public class AvailabilityManagerTest extends AbstractEJB3Test {
private TestServerPluginService testServerPluginService;
- @BeforeMethod
- public void beforeMethod() {
+ @Override
+ protected void beforeMethod() {
try {
prepareScheduler();
@@ -103,8 +102,8 @@ public class AvailabilityManagerTest extends AbstractEJB3Test {
}
}
- @AfterMethod
- public void afterMethod() throws Exception {
+ @Override
+ protected void afterMethod() throws Exception {
try {
if (theResource != null) {
// perform in-band and out-of-band work in quick succession
@@ -155,11 +154,11 @@ public class AvailabilityManagerTest extends AbstractEJB3Test {
Long middle = now - 30000; // 30s ago
Long then = now - 60000; // 60s ago
- EntityManager em = beginTx();
+ beginTx();
try {
setupResource(em);
- commitAndClose(em);
+ commitAndClose();
Availability aThen = new Availability(theResource, then, UP);
aThen.setEndTime(middle);
@@ -183,7 +182,7 @@ public class AvailabilityManagerTest extends AbstractEJB3Test {
persistAvailability(aMiddle);
// UNKNOWN(0) --> UP(-60000) --> DOWN(-30000)
- em = beginTx();
+ beginTx();
Query q = em.createNamedQuery(Availability.FIND_BY_RESOURCE);
q.setParameter("resourceId", theResource.getId());
List<Availability> avails = q.getResultList();
@@ -194,9 +193,8 @@ public class AvailabilityManagerTest extends AbstractEJB3Test {
e.printStackTrace();
throw e;
} finally {
- if (em != null) {
+ if (Status.STATUS_ACTIVE == getTransactionManager().getStatus()) {
getTransactionManager().rollback();
- em.close();
}
}
}
@@ -208,11 +206,11 @@ public class AvailabilityManagerTest extends AbstractEJB3Test {
Long middle = now - 30000; // 30s ago
Long then = now - 60000; // 60s ago
- EntityManager em = beginTx();
+ beginTx();
try {
setupResource(em);
- commitAndClose(em);
+ commitAndClose();
Availability aThen = new Availability(theResource, then, UP);
@@ -229,7 +227,7 @@ public class AvailabilityManagerTest extends AbstractEJB3Test {
persistAvailability(aNow);
// UNKNOWN(0) --> UP(-60000) --> DOWN(-30000) --> UP(NOW) -->
- em = beginTx();
+ beginTx();
int purged = availabilityManager.purgeAvailabilities(now - 29999); // keeps aMiddle and aNow
assert purged == 2 : "Didn't purge 2 --> " + purged;
@@ -264,16 +262,15 @@ public class AvailabilityManagerTest extends AbstractEJB3Test {
e.printStackTrace();
throw e;
} finally {
- if (em != null) {
+ if (Status.STATUS_ACTIVE == getTransactionManager().getStatus()) {
getTransactionManager().rollback();
- em.close();
}
}
}
@Test(enabled = ENABLE_TESTS)
public void testGetAvailabilities() throws Exception {
- EntityManager em = beginTx();
+ beginTx();
try {
List<AvailabilityPoint> availPoints;
@@ -281,8 +278,8 @@ public class AvailabilityManagerTest extends AbstractEJB3Test {
setupResource(em);
// platform: UNKNOWN(0) -->
- commitAndClose(em);
- em = null;
+ commitAndClose();
+
AvailabilityReport report = new AvailabilityReport(false, theAgent.getName());
@@ -420,21 +417,20 @@ public class AvailabilityManagerTest extends AbstractEJB3Test {
e.printStackTrace();
throw e;
} finally {
- if (em != null) {
+ if (Status.STATUS_ACTIVE == getTransactionManager().getStatus()) {
getTransactionManager().rollback();
- em.close();
}
}
}
@Test(enabled = ENABLE_TESTS)
public void testSetAllAgentResourceAvailabilities() throws Exception {
- EntityManager em = beginTx();
+ beginTx();
try {
setupResource(em);
- commitAndClose(em);
- em = null;
+ commitAndClose();
+
// setAllAgentResourceAvails will only operate on those that have at least 1 avail row
Availability avail = new Availability(theResource, UNKNOWN);
@@ -451,27 +447,26 @@ public class AvailabilityManagerTest extends AbstractEJB3Test {
e.printStackTrace();
throw e;
} finally {
- if (em != null) {
+ if (Status.STATUS_ACTIVE == getTransactionManager().getStatus()) {
getTransactionManager().rollback();
- em.close();
}
}
}
@Test(enabled = ENABLE_TESTS)
public void testAgentBackfillNewResource() throws Exception {
- EntityManager em = beginTx();
+ beginTx();
try {
setupResource(em);
- commitAndClose(em);
- em = null;
+ commitAndClose();
+
// have never heard from the new agent yet - we do not backfill anything in this case
LookupUtil.getAgentManager().checkForSuspectAgents();
assert availabilityManager.getCurrentAvailabilityTypeForResource(overlord, theResource.getId()) == UNKNOWN;
- em = beginTx();
+ beginTx();
Resource resource = em.find(Resource.class, theResource.getId());
List<Availability> avails = resource.getAvailability();
assert avails != null;
@@ -480,23 +475,22 @@ public class AvailabilityManagerTest extends AbstractEJB3Test {
e.printStackTrace();
throw e;
} finally {
- if (em != null) {
+ if (Status.STATUS_ACTIVE == getTransactionManager().getStatus()) {
getTransactionManager().rollback();
- em.close();
}
}
}
@Test(enabled = ENABLE_TESTS)
public void testAgentBackfill() throws Exception {
- EntityManager em = beginTx();
+ beginTx();
try {
prepareForTestAgents();
setupResource(em);
- commitAndClose(em);
- em = null;
+ commitAndClose();
+
// add a report that says the resource was up 20 minutes ago
Availability avail = new Availability(theResource, (System.currentTimeMillis() - 12000000), UP);
@@ -508,11 +502,11 @@ public class AvailabilityManagerTest extends AbstractEJB3Test {
assert availabilityManager.getCurrentAvailabilityTypeForResource(overlord, theResource.getId()) == UP;
// let's pretend we haven't heard from the agent in a few minutes
- em = beginTx();
+ beginTx();
Agent agent = em.find(Agent.class, theAgent.getId());
agent.setLastAvailabilityPing(System.currentTimeMillis() - (1000 * 60 * 18)); // 18 mins
- commitAndClose(em);
- em = null;
+ commitAndClose();
+
// the agent should be suspect and will be considered down, the platform resource should be down
// (although children should be UNKNOWN)
@@ -523,12 +517,12 @@ public class AvailabilityManagerTest extends AbstractEJB3Test {
assert curAvail == DOWN : curAvail;
// make sure our resource's new availabilities are consistent (first (UNKNOWN) , second (UP), third (DOWN))
- em = beginTx();
+ beginTx();
Resource resource = em.find(Resource.class, theResource.getId());
List<Availability> allAvails = resource.getAvailability();
assert allAvails.size() == 3;
- commitAndClose(em);
- em = null;
+ commitAndClose();
+
Availability a1 = allAvails.get(0);
Availability a2 = allAvails.get(1);
@@ -550,9 +544,8 @@ public class AvailabilityManagerTest extends AbstractEJB3Test {
} finally {
unprepareForTestAgents();
- if (em != null) {
+ if (Status.STATUS_ACTIVE == getTransactionManager().getStatus()) {
getTransactionManager().rollback();
- em.close();
}
}
}
@@ -560,7 +553,7 @@ public class AvailabilityManagerTest extends AbstractEJB3Test {
@Test(enabled = true)
//ENABLE_TESTS)
public void testAgentBackfillPerformance() throws Exception {
- EntityManager em = beginTx();
+ beginTx();
List<Resource> allResources = new ArrayList<Resource>();
try {
@@ -576,8 +569,8 @@ public class AvailabilityManagerTest extends AbstractEJB3Test {
}
em.flush();
- commitAndClose(em);
- em = null;
+ commitAndClose();
+
for (Resource res : allResources) {
int resId = res.getId();
@@ -602,11 +595,11 @@ public class AvailabilityManagerTest extends AbstractEJB3Test {
}
// let's pretend we haven't heard from the agent in a few minutes
- em = beginTx();
+ beginTx();
Agent agent = em.find(Agent.class, theAgent.getId());
agent.setLastAvailabilityPing(System.currentTimeMillis() - (1000 * 60 * 18)); // 18 mins
- commitAndClose(em);
- em = null;
+ commitAndClose();
+
// the agent should be suspect and will be considered down. the resources have their initial
// UNKNOWN avails. The platform should get a new DOWN Availability row. The rest should remain
@@ -643,11 +636,11 @@ public class AvailabilityManagerTest extends AbstractEJB3Test {
assert availabilityManager.getCurrentAvailabilityTypeForResource(overlord, theResource.getId()) == UP;
// let's again pretend we haven't heard from the agent in a few minutes
- em = beginTx();
+ beginTx();
agent = em.find(Agent.class, theAgent.getId());
agent.setLastAvailabilityPing(System.currentTimeMillis() - (1000 * 60 * 18));
- commitAndClose(em);
- em = null;
+ commitAndClose();
+
// the agent should be suspect and will be considered down
// all of the resources have availabilities now, so another row will be added to them if they are not disabled
@@ -671,12 +664,12 @@ public class AvailabilityManagerTest extends AbstractEJB3Test {
// make sure our resources' new availabilities are consistent
// the first time we backfilled everything was unknown, only the platform was updated.
// later we went UP/DISABLED then DOWN so we'll have 2, 3 or 4 rows)
- em = beginTx();
+ beginTx();
resource = em.find(Resource.class, resource.getId());
List<Availability> allAvails = resource.getAvailability();
assert allAvails.size() == ((expected == DOWN) ? 4 : ((expected == DISABLED) ? 2 : 3)) : allAvails;
- commitAndClose(em);
- em = null;
+ commitAndClose();
+
Availability a0 = allAvails.get(0);
Availability a1 = allAvails.get(1);
@@ -723,28 +716,27 @@ public class AvailabilityManagerTest extends AbstractEJB3Test {
System.out.println("testAgentBackfillPerformance: checking validity of data took "
+ (System.currentTimeMillis() - start) + "ms");
- em = null;
+
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
unprepareForTestAgents();
- if (em != null) {
+ if (Status.STATUS_ACTIVE == getTransactionManager().getStatus()) {
getTransactionManager().rollback();
- em.close();
}
}
}
@Test(enabled = ENABLE_TESTS)
public void testAgentOldReport() throws Exception {
- EntityManager em = beginTx();
+ beginTx();
try {
setupResource(em); // inserts initial UNKNOWN Availability at epoch
- commitAndClose(em);
- em = null;
+ commitAndClose();
+
Availability avail;
long now = System.currentTimeMillis();
@@ -818,21 +810,20 @@ public class AvailabilityManagerTest extends AbstractEJB3Test {
e.printStackTrace();
throw e;
} finally {
- if (em != null) {
+ if (Status.STATUS_ACTIVE == getTransactionManager().getStatus()) {
getTransactionManager().rollback();
- em.close();
}
}
}
@Test(enabled = ENABLE_TESTS)
public void testAgentOldReport2() throws Exception {
- EntityManager em = beginTx();
+ beginTx();
try {
setupResource(em);
- commitAndClose(em);
- em = null;
+ commitAndClose();
+
long now = System.currentTimeMillis();
@@ -878,23 +869,22 @@ public class AvailabilityManagerTest extends AbstractEJB3Test {
e.printStackTrace();
throw e;
} finally {
- if (em != null) {
+ if (Status.STATUS_ACTIVE == getTransactionManager().getStatus()) {
getTransactionManager().rollback();
- em.close();
}
}
}
@Test(enabled = ENABLE_TESTS)
public void testGetAvailabilities2() throws Exception {
- EntityManager em = beginTx();
+ beginTx();
try {
Availability avail;
setupResource(em);
- commitAndClose(em);
- em = null;
+ commitAndClose();
+
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2000);
@@ -961,9 +951,8 @@ public class AvailabilityManagerTest extends AbstractEJB3Test {
e.printStackTrace();
throw e;
} finally {
- if (em != null) {
+ if (Status.STATUS_ACTIVE == getTransactionManager().getStatus()) {
getTransactionManager().rollback();
- em.close();
}
}
}
@@ -975,15 +964,15 @@ public class AvailabilityManagerTest extends AbstractEJB3Test {
*/
@Test(enabled = ENABLE_TESTS)
public void testMergeReport() throws Exception {
- EntityManager em = beginTx();
+ beginTx();
try {
Availability avail;
AvailabilityReport report;
setupResource(em);
- commitAndClose(em);
- em = null;
+ commitAndClose();
+
long allAvailCount = setUpAvailabilities(em);
@@ -1005,7 +994,7 @@ public class AvailabilityManagerTest extends AbstractEJB3Test {
Agent agent = LookupUtil.getAgentManager().getAgentByName(theAgent.getName());
Date lastReport = new Date(agent.getLastAvailabilityReport());
assert lastReport != null;
- assert countAvailabilitiesInDB(null) == allAvailCount;
+ assert countAvailabilitiesInDB().equals(allAvailCount);
avail = availabilityManager.getCurrentAvailabilityForResource(overlord, theResource.getId());
// should have returned availability3
@@ -1027,7 +1016,7 @@ public class AvailabilityManagerTest extends AbstractEJB3Test {
// the agent should have been updated and a new row in availability was added (resource is now DOWN)
agent = LookupUtil.getAgentManager().getAgentByName(theAgent.getName());
assert new Date(agent.getLastAvailabilityReport()).after(lastReport);
- assert countAvailabilitiesInDB(null) == (allAvailCount + 1);
+ assert countAvailabilitiesInDB().equals(allAvailCount + 1);
assert availabilityManager.getCurrentAvailabilityTypeForResource(overlord, theResource.getId()) == DOWN;
Availability queriedAvail = availabilityManager.getCurrentAvailabilityForResource(overlord,
theResource.getId());
@@ -1040,9 +1029,8 @@ public class AvailabilityManagerTest extends AbstractEJB3Test {
e.printStackTrace();
throw e;
} finally {
- if (em != null) {
+ if (Status.STATUS_ACTIVE == getTransactionManager().getStatus()) {
getTransactionManager().rollback();
- em.close();
}
}
}
@@ -1054,15 +1042,15 @@ public class AvailabilityManagerTest extends AbstractEJB3Test {
*/
@Test(enabled = ENABLE_TESTS)
public void testMergeReportWithStaleResource() throws Exception {
- EntityManager em = beginTx();
+ beginTx();
try {
Availability avail;
AvailabilityReport report;
setupResource(em);
- commitAndClose(em);
- em = null;
+ commitAndClose();
+
long allAvailCount = setUpAvailabilities(em);
@@ -1090,7 +1078,7 @@ public class AvailabilityManagerTest extends AbstractEJB3Test {
Agent agent = LookupUtil.getAgentManager().getAgentByName(theAgent.getName());
Date lastReport = new Date(agent.getLastAvailabilityReport());
assert lastReport != null;
- assert countAvailabilitiesInDB(null) == allAvailCount;
+ assert countAvailabilitiesInDB().equals(allAvailCount);
avail = availabilityManager.getCurrentAvailabilityForResource(overlord, theResource.getId());
// should have returned availability3
@@ -1112,7 +1100,7 @@ public class AvailabilityManagerTest extends AbstractEJB3Test {
// the agent should have been updated and a new row in availability was added (resource is now DOWN)
agent = LookupUtil.getAgentManager().getAgentByName(theAgent.getName());
assert new Date(agent.getLastAvailabilityReport()).after(lastReport);
- assert countAvailabilitiesInDB(null) == (allAvailCount + 1);
+ assert countAvailabilitiesInDB().equals(allAvailCount + 1);
assert availabilityManager.getCurrentAvailabilityTypeForResource(overlord, theResource.getId()) == DOWN;
Availability queriedAvail = availabilityManager.getCurrentAvailabilityForResource(overlord,
theResource.getId());
@@ -1125,16 +1113,15 @@ public class AvailabilityManagerTest extends AbstractEJB3Test {
e.printStackTrace();
throw e;
} finally {
- if (em != null) {
+ if (Status.STATUS_ACTIVE == getTransactionManager().getStatus()) {
getTransactionManager().rollback();
- em.close();
}
}
}
@Test(enabled = ENABLE_TESTS)
public void testMergeReportPerformance() throws Exception {
- EntityManager em = beginTx();
+ beginTx();
List<Resource> allResources = new ArrayList<Resource>();
try {
@@ -1148,8 +1135,8 @@ public class AvailabilityManagerTest extends AbstractEJB3Test {
}
em.flush();
- commitAndClose(em);
- em = null;
+ commitAndClose();
+
// add a report that says the resources are now up - the report will add one avail for each resource
// at this point, the resources do not yet have a row in availability - after the merge they will have 1
@@ -1224,27 +1211,23 @@ public class AvailabilityManagerTest extends AbstractEJB3Test {
System.out.println("testMergeReportPerformance: checking validity of data 3 took "
+ (System.currentTimeMillis() - start) + "ms");
- em = null;
+
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
- if (em != null) {
+ if (Status.STATUS_ACTIVE == getTransactionManager().getStatus()) {
getTransactionManager().rollback();
- em.close();
}
}
}
- private EntityManager beginTx() throws Exception {
+ private void beginTx() throws Exception {
getTransactionManager().begin();
- EntityManager em = getEntityManager();
- return em;
}
- private void commitAndClose(EntityManager em) throws Exception {
+ private void commitAndClose() throws Exception {
getTransactionManager().commit();
- em.close();
}
/**
@@ -1281,25 +1264,14 @@ public class AvailabilityManagerTest extends AbstractEJB3Test {
*
* @throws Exception
*/
- private long countAvailabilitiesInDB(EntityManager em) throws Exception {
- TransactionManager tx = null;
-
- if (em == null) {
- tx = getTransactionManager();
- tx.begin();
- em = getEntityManager();
- }
-
- try {
- Query q = em.createQuery("SELECT count(a) FROM Availability a");
- long count = (Long) q.getSingleResult();
- return count;
- } finally {
- if (tx != null) {
- tx.rollback();
- em.close();
+ private Long countAvailabilitiesInDB() throws Exception {
+ return executeInTransaction(new TransactionCallbackReturnable<Long>() {
+ public Long execute() throws Exception {
+ Query q = em.createQuery("SELECT count(a) FROM Availability a");
+ Long count = (Long) q.getSingleResult();
+ return count;
}
- }
+ });
}
/**
@@ -1374,7 +1346,7 @@ public class AvailabilityManagerTest extends AbstractEJB3Test {
cal.set(Calendar.MINUTE, 40);
Date splitEnd = cal.getTime();
- long count = countAvailabilitiesInDB(em);
+ long count = countAvailabilitiesInDB();
availability1 = new Availability(theResource, start.getTime(), UP);
availability1.setEndTime(splitStart.getTime());
@@ -1387,7 +1359,7 @@ public class AvailabilityManagerTest extends AbstractEJB3Test {
availability3 = new Availability(theResource, splitEnd.getTime(), UP);
persistAvailability(availability3);
- long countNow = countAvailabilitiesInDB(em);
+ long countNow = countAvailabilitiesInDB();
assert countNow == (count + 3) : "Did not find three availabilities - instead found: " + countNow;
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/plugin/pc/content/ContentProviderManagerSyncContentProviderTest.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/plugin/pc/content/ContentProviderManagerSyncContentProviderTest.java
index 9599bd1..d66725f 100644
--- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/plugin/pc/content/ContentProviderManagerSyncContentProviderTest.java
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/plugin/pc/content/ContentProviderManagerSyncContentProviderTest.java
@@ -29,8 +29,6 @@ import java.util.Set;
import javax.persistence.EntityManager;
import javax.transaction.TransactionManager;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.rhq.core.domain.auth.Subject;
@@ -75,8 +73,8 @@ public class ContentProviderManagerSyncContentProviderTest extends AbstractEJB3T
private Integer repoId;
private Integer relatedRepoId;
- @BeforeMethod
- public void setupBeforeMethod() throws Exception {
+ @Override
+ protected void beforeMethod() throws Exception {
// Plugin service setup
prepareScheduler();
@@ -126,8 +124,8 @@ public class ContentProviderManagerSyncContentProviderTest extends AbstractEJB3T
tx.commit();
}
- @AfterMethod
- public void tearDownAfterMethod() throws Exception {
+ @Override
+ protected void afterMethod() throws Exception {
try {
// Transactional stuff
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/plugin/pc/content/ContentProviderManagerSyncRepoTest.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/plugin/pc/content/ContentProviderManagerSyncRepoTest.java
index 65154bb..ba26cc2 100644
--- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/plugin/pc/content/ContentProviderManagerSyncRepoTest.java
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/plugin/pc/content/ContentProviderManagerSyncRepoTest.java
@@ -29,8 +29,6 @@ import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.transaction.TransactionManager;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.rhq.core.domain.auth.Subject;
@@ -76,8 +74,8 @@ public class ContentProviderManagerSyncRepoTest extends AbstractEJB3Test {
private List<ContentSource> repoContentSources = new ArrayList<ContentSource>();
private Repo repoToSync;
- @BeforeMethod
- public void setupBeforeMethod() throws Exception {
+ @Override
+ protected void beforeMethod() throws Exception {
// Plugin service setup
prepareScheduler();
@@ -165,8 +163,8 @@ public class ContentProviderManagerSyncRepoTest extends AbstractEJB3Test {
}
}
- @AfterMethod
- public void tearDownAfterMethod() throws Exception {
+ @Override
+ protected void afterMethod() throws Exception {
try {
TransactionManager tx = getTransactionManager();
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/resource/cluster/ClusterManagerBeanTest.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/resource/cluster/ClusterManagerBeanTest.java
index cf5583d..9d0b836 100644
--- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/resource/cluster/ClusterManagerBeanTest.java
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/resource/cluster/ClusterManagerBeanTest.java
@@ -23,7 +23,6 @@ import java.util.List;
import javax.persistence.EntityManager;
-import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.rhq.core.domain.auth.Subject;
@@ -54,9 +53,8 @@ public class ClusterManagerBeanTest extends AbstractEJB3Test {
private ResourceGroupManagerLocal resourceGroupManager;
private ResourceManagerLocal resourceManager;
- @BeforeMethod
- @SuppressWarnings( { "unused" })
- private void init() {
+ @Override
+ protected void beforeMethod() {
clusterManager = LookupUtil.getClusterManager();
resourceGroupManager = LookupUtil.getResourceGroupManager();
resourceManager = LookupUtil.getResourceManager();
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java
index 2b9000f..edd9867 100644
--- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java
@@ -1,17 +1,24 @@
package org.rhq.enterprise.server.test;
import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
import java.lang.management.ManagementFactory;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.SQLException;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
+import java.util.List;
import java.util.Properties;
import java.util.regex.Pattern;
import javax.management.MBeanServer;
+import javax.management.ObjectName;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.persistence.EntityManager;
@@ -288,7 +295,8 @@ public abstract class AbstractEJB3Test extends Arquillian {
} catch (Throwable t) {
// Arquillian is eating these, make sure they show up in some way
- System.out.println("BEFORE METHOD FAILURE, TEST DID NOT RUN!!! " + t.getMessage());
+ System.out.println("BEFORE METHOD FAILURE, TEST DID NOT RUN!!! ");
+ t.printStackTrace();
throw t;
}
}
@@ -540,6 +548,41 @@ public abstract class AbstractEJB3Test extends Arquillian {
*
* @throws RuntimeException
*/
+ public void prepareCustomServerService(Object testServiceMBean, String objectNameStr) {
+ try {
+ ObjectName objectName = new ObjectName(objectNameStr);
+
+ // first, unregister the real service...
+ MBeanServer mbs = getPlatformMBeanServer();
+ if (mbs.isRegistered(objectName)) {
+ mbs.unregisterMBean(objectName);
+ }
+
+ // Now replace with the test service...
+ mbs.registerMBean(testServiceMBean, objectName);
+ return;
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public void unprepareCustomServerService(String objectNameStr) throws Exception {
+ ObjectName objectName = new ObjectName(objectNameStr);
+ MBeanServer mbs = getPlatformMBeanServer();
+ if (mbs.isRegistered(objectName)) {
+ mbs.unregisterMBean(objectName);
+ }
+ }
+
+ /**
+ * If you need to test server plugins, you must first prepare the server plugin service.
+ * After this returns, the caller must explicitly start the PC by using the appropriate API
+ * on the given mbean; this method will only start the service, it will NOT start the master PC.
+ *
+ * @param testServiceMBean the object that will house your test server plugins
+ *
+ * @throws RuntimeException
+ */
public void prepareCustomServerPluginService(ServerPluginService testServiceMBean) {
try {
// first, unregister the real service...
@@ -750,7 +793,6 @@ public abstract class AbstractEJB3Test extends Arquillian {
pluginScannerService = null;
}
-
public MBeanServer getPlatformMBeanServer() {
return ManagementFactory.getPlatformMBeanServer();
}
@@ -770,4 +812,62 @@ public abstract class AbstractEJB3Test extends Arquillian {
return LookupUtil.getDataSource().getConnection();
}
+ /**
+ * A utility for writing out various objects that need to be persisted for use between
+ * tests. Arquillian (1.0.2) basically "new"s the testng test class on each test, so instance
+ * variables can not be used between tests. Instead, the db or this mechanism needs to be used.
+ *
+ * The file will be placed in the standard temp dir. If it already exists it will be replaced.
+ *
+ * @param filename Do not include the directory. The value will be prepended with the class name.
+ * @param objects
+ * @throws Exception
+ */
+ protected void writeObjects(String filename, Object... objects) throws Exception {
+ File file = new File(System.getProperty("java.io.tmpdir"), this.getClass().getName() + "-" + filename);
+ file.delete();
+ ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
+ for (Object o : objects) {
+ oos.writeObject(o);
+ }
+ oos.close();
+ }
+
+ /**
+ * A utility for reading in objects written with {@link #writeObjects(String, Object...). They are
+ * placed in the result List in the same order they were written.
+ *
+ * @param filename The same filename used in the write. Do not include the directory.
+ * The value will be prepended with the class name.
+ * @param numObjects the number of objects to read out. Can be less than total written, not greater.
+ * @throws Exception
+ */
+ protected List<Object> readObjects(String filename, int numObjects) throws Exception {
+ List<Object> result = new ArrayList<Object>();
+ ObjectInputStream ois = null;
+
+ try {
+ File file = new File(System.getProperty("java.io.tmpdir"), this.getClass().getName() + "-" + filename);
+ ois = new ObjectInputStream(new FileInputStream(file));
+ for (int i = 0; i < numObjects; ++i) {
+ result.add(ois.readObject());
+ }
+ } finally {
+ ois.close();
+ }
+
+ return result;
+ }
+
+ /**
+ * A utility for cleaning up files created with {@link #writeObjects(String, Object...).
+ *
+ * @param filename The same filename used in the write. Do not include the directory.
+ * @return true if deleted, false otherwise.
+ */
+ protected boolean deleteObjects(String filename) {
+ File file = new File(System.getProperty("java.io.tmpdir"), this.getClass().getName() + "-" + filename);
+ return file.delete();
+ }
+
}
commit 9c5121eb239a9b91b7c9220e8c9752440e6041ac
Author: Jay Shaughnessy <jshaughn(a)jshaughn.csb>
Date: Mon Nov 5 12:33:36 2012 -0500
make sure @AfterMethod runs always
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java
index b68a517..2b9000f 100644
--- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java
@@ -300,7 +300,7 @@ public abstract class AbstractEJB3Test extends Arquillian {
*
* Instead, override {@link #afterMethod()}.
*/
- @AfterMethod
+ @AfterMethod(alwaysRun = true)
protected void __afterMethod() throws Exception {
if (inContainer()) {
afterMethod();
@@ -327,7 +327,7 @@ public abstract class AbstractEJB3Test extends Arquillian {
}
/**
- * Override Point! Do not implement an @AfterMethod, instead override this method.
+ * Override Point! Do not implement an @AfterMethod, instead override this method. note: alwaysRun=true
*/
protected void afterMethod() throws Exception {
// do nothing if we're not overridden
11 years, 6 months
[rhq] Changes to 'lkrejci/code-coverage-as7-with-arq'
by lkrejci
New branch 'lkrejci/code-coverage-as7-with-arq' available with the following commits:
commit 5127b3edaa3aa84381ffad251010ee26f9d2942c
Author: Lukas Krejci <lkrejci(a)redhat.com>
Date: Tue Nov 6 10:28:14 2012 +0100
Adding preliminary support for code-coverage collection in arquillian tests.
This requires a version arq jacoco extension that has not been released yet,
so the support is currently commented out.
commit a132549393046c4a89efeedf9153ec816c87cf94
Merge: 76cdfe5 7afe389
Author: Lukas Krejci <lkrejci(a)redhat.com>
Date: Wed Oct 31 13:35:14 2012 +0100
Merge branch 'lkrejci/code-coverage' into local/rhq-on-as7-with-jacoco
commit 76cdfe53d6ced37ffff9fadb45407f1b1043bc88
Merge: f6c306d 5eec477
Author: Lukas Krejci <lkrejci(a)redhat.com>
Date: Tue Oct 30 14:18:09 2012 +0100
Merge branch 'lkrejci/code-coverage' into local/rhq-on-as7-with-jacoco
11 years, 6 months
[rhq] Branch 'feature/cassandra-backend' - modules/enterprise
by John Sanda
modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/MetricsServer.java | 25 -
modules/enterprise/server/server-metrics/src/test/java/org/rhq/server/metrics/MetricsServerTest.java | 224 +++++-----
2 files changed, 132 insertions(+), 117 deletions(-)
New commits:
commit 147f9ed7d94edde61603cf5cd830814cc2fe6707
Author: John Sanda <jsanda(a)redhat.com>
Date: Mon Nov 5 14:36:35 2012 -0500
purge one hour metrics index after calculating raw aggregates
After metric data is aggregated or compressed, we need to delete the
corresponding metrics index entries; otherwise, we would wind up needlessly
recalculating those aggregates again. In the current implementation, the whole
row in the index table is deleted. We can safely delete the entire row for two
reasons. 1) When aggregates are calculated for a particular metrics table, the
entire row in the metrics index table is read. We go through the whole index
for the table being compressed. 2) There are no other writers to the index
table; so, we do not have to worry about losing index entries yet to be
processed. In the future, if this aggregation work flow because multi threaded
or multi process then we will need to delete by schedule id and timestmap.
diff --git a/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/MetricsServer.java b/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/MetricsServer.java
index 066079d..96d8903 100644
--- a/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/MetricsServer.java
+++ b/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/MetricsServer.java
@@ -278,7 +278,7 @@ public class MetricsServer {
updateMetricsIndex(updates);
}
- private void updateMetricsIndex(Set<MeasurementDataNumeric> rawMetrics) {
+ void updateMetricsIndex(Set<MeasurementDataNumeric> rawMetrics) {
MetricsDAO dao = new MetricsDAO(cassandraDS);
Map<Integer, DateTime> updates = new TreeMap<Integer, DateTime>();
for (MeasurementDataNumeric rawMetric : rawMetrics) {
@@ -290,14 +290,20 @@ public class MetricsServer {
public void calculateAggregates() {
MetricsDAO dao = new MetricsDAO(cassandraDS);
+ // We first query the metrics index table to determine which schedules have data to
+ // be aggregated. Then we retrieve the metric data and aggregate or compress the
+ // data, writing the compressed values into the next wider (i.e., longer life span
+ // for data) bucket/table. At this point we remove the index entries for the data
+ // that has already been processed. We currently purge the entire row in the index
+ // table. We can safely do this entire work flow is single threaded. It might make
+ // sense to perform the deletes in a more granular fashion to avoid concurrency
+ // issues in the future. The last step in the work flow is to update the metrics
+ // index for the newly persisted aggregates.
+
List<AggregatedNumericMetric> updatedSchedules = aggregateRawData();
+ dao.deleteMetricsIndexEntries(ONE_HOUR_METRICS_TABLE);
updateMetricsIndex(SIX_HOUR_METRICS_TABLE, updatedSchedules, Minutes.minutes(60 * 6));
-// for (Integer scheduleId : updatedSchedules.keySet()) {
-// DateTime dateTime = updatedSchedules.get(scheduleId);
-// updatedSchedules.put(scheduleId, dateTimeService.getTimeSlice(dateTime, Minutes.minutes(60 * 6)));
-// }
-// dao.updateMetricsIndex(SIX_HOUR_METRICS_TABLE, updatedSchedules);
-//
+
// updatedSchedules = calculateAggregates(oneHourMetricsDataCF, sixHourMetricsDataCF, Minutes.minutes(60 * 6),
// Hours.hours(24).toStandardMinutes(), DateTimeService.ONE_MONTH);
updatedSchedules = calculateAggregates(oneHourMetricsDataCF, sixHourMetricsDataCF, Minutes.minutes(60),
@@ -384,7 +390,6 @@ public class MetricsServer {
double max = min;
double sum = 0;
int count = 0;
- double value;
for (AggregatedNumericMetric metric : metrics) {
if (count == 0) {
@@ -405,10 +410,6 @@ public class MetricsServer {
}
List<AggregatedNumericMetric> updatedSchedules = dao.insertAggregates(toColumnFamily, toMetrics);
-// for (Integer scheduleId : updatedSchedules.keySet()) {
-// DateTime dateTime = updatedSchedules.get(scheduleId);
-// updatedSchedules.put(scheduleId, dateTimeService.getTimeSlice(dateTime, nextInterval));
-// }
return updatedSchedules;
// SliceQuery<String, Composite, Integer> queueQuery = HFactory.createSliceQuery(keyspace, StringSerializer.get(),
diff --git a/modules/enterprise/server/server-metrics/src/test/java/org/rhq/server/metrics/MetricsServerTest.java b/modules/enterprise/server/server-metrics/src/test/java/org/rhq/server/metrics/MetricsServerTest.java
index f9e4ec6..60d086f 100644
--- a/modules/enterprise/server/server-metrics/src/test/java/org/rhq/server/metrics/MetricsServerTest.java
+++ b/modules/enterprise/server/server-metrics/src/test/java/org/rhq/server/metrics/MetricsServerTest.java
@@ -31,8 +31,11 @@ import static org.rhq.server.metrics.DateTimeService.ONE_MONTH;
import static org.rhq.server.metrics.DateTimeService.ONE_YEAR;
import static org.rhq.server.metrics.DateTimeService.SEVEN_DAYS;
import static org.rhq.server.metrics.DateTimeService.TWO_WEEKS;
+import static org.rhq.server.metrics.MetricsDAO.METRICS_INDEX_TABLE;
import static org.rhq.server.metrics.MetricsDAO.ONE_HOUR_METRICS_TABLE;
+import static org.rhq.server.metrics.MetricsDAO.RAW_METRICS_TABLE;
import static org.rhq.server.metrics.MetricsDAO.SIX_HOUR_METRICS_TABLE;
+import static org.rhq.server.metrics.MetricsDAO.TWENTY_FOUR_HOUR_METRICS_TABLE;
import static org.rhq.server.metrics.MetricsServer.divide;
import static org.rhq.test.AssertUtils.assertCollectionMatchesNoOrder;
import static org.rhq.test.AssertUtils.assertPropertiesMatch;
@@ -48,12 +51,8 @@ import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.joda.time.Chronology;
import org.joda.time.DateTime;
-import org.joda.time.DateTimeField;
-import org.joda.time.DateTimeFieldType;
-import org.joda.time.chrono.GregorianChronology;
-import org.joda.time.field.DividedDateTimeField;
+import org.joda.time.Minutes;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;
@@ -155,9 +154,10 @@ public class MetricsServerTest extends CassandraIntegrationTest {
// deleteAllRows(TRAITS_CF, IntegerSerializer.get());
// deleteAllRows(RESOURCE_TRAITS_CF, IntegerSerializer.get());
Statement statement = connection.createStatement();
- statement.executeUpdate("TRUNCATE " + RAW_METRIC_DATA_CF);
- statement.executeUpdate("TRUNCATE " + ONE_HOUR_METRIC_DATA_CF);
- statement.executeUpdate("TRUNCATE " + METRICS_INDEX);
+ statement.executeUpdate("TRUNCATE " + RAW_METRICS_TABLE);
+ statement.executeUpdate("TRUNCATE " + ONE_HOUR_METRICS_TABLE);
+ statement.executeUpdate("TRUNCATE " + SIX_HOUR_METRICS_TABLE);
+ statement.executeUpdate("TRUNCATE " + METRICS_INDEX_TABLE);
statement.close();
}
@@ -200,8 +200,8 @@ public class MetricsServerTest extends CassandraIntegrationTest {
List<MetricsIndexEntry> expectedIndex = asList(new MetricsIndexEntry(ONE_HOUR_METRIC_DATA_CF,
hour0.plusHours(4), scheduleId));
- assertMetricsQueueEquals(ONE_HOUR_METRIC_DATA_CF, expectedIndex, "Failed to update index for " +
- ONE_HOUR_METRIC_DATA_CF);
+ assertMetricsIndexEquals(ONE_HOUR_METRIC_DATA_CF, expectedIndex, "Failed to update index for " +
+ ONE_HOUR_METRIC_DATA_CF);
}
@Test//(enabled = ENABLED)
@@ -267,13 +267,14 @@ public class MetricsServerTest extends CassandraIntegrationTest {
// verify that 6 hour metric data is updated
assertMetricDataEquals(SIX_HOUR_METRICS_TABLE, scheduleId, asList(new AggregatedNumericMetric(scheduleId,
divide((3.9 + 3.2 + 2.6), 3), 2.6, 3.9, hour0.getMillis())));
+
+ // TODO verify that 24 hour data is *not* updated
}
- @Test(enabled = ENABLED)
+ @Test//(enabled = ENABLED)
public void aggregateRawDataDuring9thHour() {
int scheduleId = 123;
- DateTime now = new DateTime();
DateTime hour0 = hour0();
DateTime hour9 = hour0.plusHours(9);
DateTime hour8 = hour9.minusHours(1);
@@ -286,57 +287,62 @@ public class MetricsServerTest extends CassandraIntegrationTest {
double secondValue = 2.2;
double thirdValue = 3.3;
- // insert raw data to be aggregated
- Mutator<Integer> rawMetricsMutator = HFactory.createMutator(keyspace, IntegerSerializer.get());
- rawMetricsMutator.addInsertion(scheduleId, RAW_METRIC_DATA_CF, createRawDataColumn(firstMetricTime,
- firstValue));
- rawMetricsMutator.addInsertion(scheduleId, RAW_METRIC_DATA_CF,
- createRawDataColumn(secondMetricTime, secondValue));
- rawMetricsMutator.addInsertion(scheduleId, RAW_METRIC_DATA_CF, createRawDataColumn(thirdMetricTime,
- thirdValue));
+ Set<MeasurementDataNumeric> rawMetrics = new HashSet<MeasurementDataNumeric>();
+ rawMetrics.add(new MeasurementDataNumeric(firstMetricTime.getMillis(), scheduleId, firstValue));
+ rawMetrics.add(new MeasurementDataNumeric(secondMetricTime.getMillis(), scheduleId, secondValue));
+ rawMetrics.add(new MeasurementDataNumeric(thirdMetricTime.getMillis(), scheduleId, thirdValue));
- rawMetricsMutator.execute();
+ MetricsDAO dao = new MetricsDAO(dataSource);
+ Set<MeasurementDataNumeric> insertedRawMetrics = dao.insertRawMetrics(rawMetrics);
+ metricsServer.updateMetricsIndex(insertedRawMetrics);
- // update the one hour queue
- Mutator<String> queueMutator = HFactory.createMutator(keyspace, StringSerializer.get());
- Composite key = createQueueColumnName(hour8, scheduleId);
- HColumn<Composite, Integer> oneHourQueueColumn = HFactory.createColumn(key, 0, CompositeSerializer.get(),
- IntegerSerializer.get());
- queueMutator.addInsertion(ONE_HOUR_METRIC_DATA_CF, METRICS_INDEX, oneHourQueueColumn);
+ // insert raw data to be aggregated
+// Mutator<Integer> rawMetricsMutator = HFactory.createMutator(keyspace, IntegerSerializer.get());
+// rawMetricsMutator.addInsertion(scheduleId, RAW_METRIC_DATA_CF, createRawDataColumn(firstMetricTime,
+// firstValue));
+// rawMetricsMutator.addInsertion(scheduleId, RAW_METRIC_DATA_CF,
+// createRawDataColumn(secondMetricTime, secondValue));
+// rawMetricsMutator.addInsertion(scheduleId, RAW_METRIC_DATA_CF, createRawDataColumn(thirdMetricTime,
+// thirdValue));
+//
+// rawMetricsMutator.execute();
- queueMutator.execute();
+ // update the one hour queue
+// Mutator<String> queueMutator = HFactory.createMutator(keyspace, StringSerializer.get());
+// Composite key = createQueueColumnName(hour8, scheduleId);
+// HColumn<Composite, Integer> oneHourQueueColumn = HFactory.createColumn(key, 0, CompositeSerializer.get(),
+// IntegerSerializer.get());
+// queueMutator.addInsertion(ONE_HOUR_METRIC_DATA_CF, METRICS_INDEX, oneHourQueueColumn);
+//
+// queueMutator.execute();
metricsServer.setCurrentHour(hour9);
metricsServer.calculateAggregates();
// verify that the 1 hour aggregates are calculated
-
- assert1HourDataEquals(scheduleId, asList(
- create1HourColumn(hour8, AggregateType.MAX, thirdValue),
- create1HourColumn(hour8, AggregateType.MIN, firstValue),
- create1HourColumn(hour8, AggregateType.AVG, (firstValue + secondValue + thirdValue) / 3)
+ assertMetricDataEquals(ONE_HOUR_METRICS_TABLE, scheduleId, asList(
+ new AggregatedNumericMetric(scheduleId, divide((1.1 + 2.2 + 3.3), 3), firstValue, thirdValue,
+ hour8.getMillis())
));
- Chronology chronology = GregorianChronology.getInstance();
- DateTimeField hourField = chronology.hourOfDay();
- DividedDateTimeField dividedField = new DividedDateTimeField(hourField, DateTimeFieldType.clockhourOfDay(), 6);
- long timestamp = dividedField.roundFloor(hour9.getMillis());
- DateTime sixHourSlice = new DateTime(timestamp);
+ // verify that the 6 hour index is updated
+ DateTimeService dateTimeService = new DateTimeService();
+ List<MetricsIndexEntry> expected6HourIndex = asList(new MetricsIndexEntry(SIX_HOUR_METRICS_TABLE,
+ dateTimeService.getTimeSlice(hour9, Minutes.minutes(60 * 6)), scheduleId));
- // verify that the 6 hour queue is updated
- assert6HourMetricsQueueEquals(asList(HFactory.createColumn(createQueueColumnName(sixHourSlice, scheduleId), 0,
- CompositeSerializer.get(), IntegerSerializer.get())));
+ assertMetricsIndexEquals(SIX_HOUR_METRICS_TABLE, expected6HourIndex, "Failed to update index for " +
+ SIX_HOUR_METRICS_TABLE);
// The 6 hour data should not get aggregated since the current 6 hour time slice
// has not passed yet. More specifically, the aggregation job is running at 09:00
// which means that the current 6 hour slice is from 06:00 to 12:00.
assert6HourDataEmpty(scheduleId);
- // verify that the 24 hour queue is empty
- assert24HourMetricsQueueEmpty(scheduleId);
+ // verify that the 24 hour index is empty
+ assert24HourMetricsIndexEmpty(scheduleId);
// verify that the 1 hour queue has been purged
- assert1HourMetricsQueueEmpty(scheduleId);
+ assert1HourMetricsIndexEmpty(scheduleId);
}
@Test(enabled = ENABLED)
@@ -398,7 +404,7 @@ public class MetricsServerTest extends CassandraIntegrationTest {
));
// verify that the 6 hour queue has been updated
- assert6HourMetricsQueueEmpty(scheduleId);
+ assert6HourMetricsIndexEmpty(scheduleId);
// verify that the 24 hour queue is updated
assert24HourMetricsQueueEquals(asList(HFactory.createColumn(createQueueColumnName(hour0, scheduleId), 0,
@@ -465,7 +471,7 @@ public class MetricsServerTest extends CassandraIntegrationTest {
));
// verify that the 24 hour queue is updated
- assert24HourMetricsQueueEmpty(scheduleId);
+ assert24HourMetricsIndexEmpty(scheduleId);
}
@Test(enabled = ENABLED)
@@ -736,7 +742,7 @@ public class MetricsServerTest extends CassandraIntegrationTest {
}
}
- private void assertMetricsQueueEquals(String columnFamily, List<MetricsIndexEntry> expected, String msg) {
+ private void assertMetricsIndexEquals(String columnFamily, List<MetricsIndexEntry> expected, String msg) {
Statement statement = null;
ResultSet resultSet = null;
try {
@@ -814,7 +820,7 @@ public class MetricsServerTest extends CassandraIntegrationTest {
}
private void assert6HourDataEmpty(int scheduleId) {
- assertMetricDataEmpty(scheduleId, SIX_HOUR_METRIC_DATA_CF);
+ assertMetricDataEmpty(scheduleId, SIX_HOUR_METRICS_TABLE);
}
private void assert24HourDataEmpty(int scheduleId) {
@@ -822,72 +828,80 @@ public class MetricsServerTest extends CassandraIntegrationTest {
}
private void assertMetricDataEmpty(int scheduleId, String columnFamily) {
- SliceQuery<Integer, Composite, Double> query = HFactory.createSliceQuery(keyspace, IntegerSerializer.get(),
- CompositeSerializer.get(), DoubleSerializer.get());
- query.setColumnFamily(columnFamily);
- query.setKey(scheduleId);
-
- ColumnSliceIterator<Integer, Composite, Double> iterator = new ColumnSliceIterator<Integer, Composite, Double>(
- query, (Composite) null, (Composite) null, false);
-
- List<HColumn<Composite, Double>> actual = new ArrayList<HColumn<Composite, Double>>();
- while (iterator.hasNext()) {
- actual.add(iterator.next());
- }
-
- String prefix;
- if (columnFamily.equals(ONE_HOUR_METRIC_DATA_CF)) {
- prefix = "The one hour data for schedule id " + scheduleId + " is wrong.";
- } else if (columnFamily.equals(SIX_HOUR_METRIC_DATA_CF)) {
- prefix = "The six hour data for schedule id " + scheduleId + " is wrong.";
- } else if (columnFamily.equals(TWENTY_FOUR_HOUR_METRIC_DATA_CF)) {
- prefix = "The twenty-four hour data for schedule id " + scheduleId + " is wrong.";
- } else {
- throw new IllegalArgumentException(columnFamily + " is not a recognized column family");
- }
+// SliceQuery<Integer, Composite, Double> query = HFactory.createSliceQuery(keyspace, IntegerSerializer.get(),
+// CompositeSerializer.get(), DoubleSerializer.get());
+// query.setColumnFamily(columnFamily);
+// query.setKey(scheduleId);
+//
+// ColumnSliceIterator<Integer, Composite, Double> iterator = new ColumnSliceIterator<Integer, Composite, Double>(
+// query, (Composite) null, (Composite) null, false);
+//
+// List<HColumn<Composite, Double>> actual = new ArrayList<HColumn<Composite, Double>>();
+// while (iterator.hasNext()) {
+// actual.add(iterator.next());
+// }
+//
+// String prefix;
+// if (columnFamily.equals(ONE_HOUR_METRIC_DATA_CF)) {
+// prefix = "The one hour data for schedule id " + scheduleId + " is wrong.";
+// } else if (columnFamily.equals(SIX_HOUR_METRIC_DATA_CF)) {
+// prefix = "The six hour data for schedule id " + scheduleId + " is wrong.";
+// } else if (columnFamily.equals(TWENTY_FOUR_HOUR_METRIC_DATA_CF)) {
+// prefix = "The twenty-four hour data for schedule id " + scheduleId + " is wrong.";
+// } else {
+// throw new IllegalArgumentException(columnFamily + " is not a recognized column family");
+// }
+//
+// assertEquals(actual.size(), 0, prefix + " Expected the row to be empty.");
+ MetricsDAO dao = new MetricsDAO(dataSource);
+ List<AggregatedNumericMetric> metrics = dao.findAggregateMetrics(columnFamily, scheduleId);
- assertEquals(actual.size(), 0, prefix + " Expected the row to be empty.");
+ assertEquals(metrics.size(), 0, "Expected " + columnFamily + " to be empty for schedule id " + scheduleId +
+ " but found " + metrics);
}
- private void assert1HourMetricsQueueEmpty(int scheduleId) {
- assertMetricsQueueEmpty(scheduleId, ONE_HOUR_METRIC_DATA_CF);
+ private void assert1HourMetricsIndexEmpty(int scheduleId) {
+ assertMetricsIndexEmpty(scheduleId, ONE_HOUR_METRICS_TABLE);
}
- private void assert6HourMetricsQueueEmpty(int scheduleId) {
- assertMetricsQueueEmpty(scheduleId, SIX_HOUR_METRIC_DATA_CF);
+ private void assert6HourMetricsIndexEmpty(int scheduleId) {
+ assertMetricsIndexEmpty(scheduleId, SIX_HOUR_METRICS_TABLE);
}
- private void assert24HourMetricsQueueEmpty(int scheduleId) {
- assertMetricsQueueEmpty(scheduleId, TWENTY_FOUR_HOUR_METRIC_DATA_CF);
+ private void assert24HourMetricsIndexEmpty(int scheduleId) {
+ assertMetricsIndexEmpty(scheduleId, TWENTY_FOUR_HOUR_METRICS_TABLE);
}
- private void assertMetricsQueueEmpty(int scheduleId, String columnFamily) {
- SliceQuery<String,Composite, Integer> sliceQuery = HFactory.createSliceQuery(keyspace, StringSerializer.get(),
- new CompositeSerializer().get(), IntegerSerializer.get());
- sliceQuery.setColumnFamily(METRICS_INDEX);
- sliceQuery.setKey(columnFamily);
-
- ColumnSliceIterator<String, Composite, Integer> iterator = new ColumnSliceIterator<String, Composite, Integer>(
- sliceQuery, (Composite) null, (Composite) null, false);
-
- List<HColumn<Composite, Integer>> actual = new ArrayList<HColumn<Composite, Integer>>();
- while (iterator.hasNext()) {
- actual.add(iterator.next());
- }
-
- String queueName;
- if (columnFamily.equals(ONE_HOUR_METRIC_DATA_CF)) {
- queueName = "1 hour";
- } else if (columnFamily.equals(SIX_HOUR_METRIC_DATA_CF)) {
- queueName = "6 hour";
- } else if (columnFamily.equals(TWENTY_FOUR_HOUR_METRIC_DATA_CF)) {
- queueName = "24 hour";
- } else {
- throw new IllegalArgumentException(columnFamily + " is not a recognized metric data column family.");
- }
-
- assertEquals(actual.size(), 0, "Expected the " + queueName + " queue to be empty for schedule id " +
- scheduleId);
+ private void assertMetricsIndexEmpty(int scheduleId, String table) {
+// SliceQuery<String,Composite, Integer> sliceQuery = HFactory.createSliceQuery(keyspace, StringSerializer.get(),
+// new CompositeSerializer().get(), IntegerSerializer.get());
+// sliceQuery.setColumnFamily(METRICS_INDEX);
+// sliceQuery.setKey(columnFamily);
+//
+// ColumnSliceIterator<String, Composite, Integer> iterator = new ColumnSliceIterator<String, Composite, Integer>(
+// sliceQuery, (Composite) null, (Composite) null, false);
+//
+// List<HColumn<Composite, Integer>> actual = new ArrayList<HColumn<Composite, Integer>>();
+// while (iterator.hasNext()) {
+// actual.add(iterator.next());
+// }
+//
+// String queueName;
+// if (columnFamily.equals(ONE_HOUR_METRIC_DATA_CF)) {
+// queueName = "1 hour";
+// } else if (columnFamily.equals(SIX_HOUR_METRIC_DATA_CF)) {
+// queueName = "6 hour";
+// } else if (columnFamily.equals(TWENTY_FOUR_HOUR_METRIC_DATA_CF)) {
+// queueName = "24 hour";
+// } else {
+// throw new IllegalArgumentException(columnFamily + " is not a recognized metric data column family.");
+// }
+
+// assertEquals(actual.size(), 0, "Expected the " + queueName + " queue to be empty for schedule id " +
+// scheduleId);
+ MetricsDAO dao = new MetricsDAO(dataSource);
+ List<MetricsIndexEntry> index = dao.findMetricsIndexEntries(table);
+ assertEquals(index.size(), 0, "Expected metrics index for " + table + " to be empty but found " + index);
}
private Integer getScheduleId(Composite composite) {
11 years, 6 months
[rhq] Branch 'feature/cassandra-backend' - modules/enterprise
by John Sanda
modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/MetricsDAO.java | 17 ++++++
modules/enterprise/server/server-metrics/src/test/java/org/rhq/server/metrics/MetricsDAOTest.java | 26 ++++++++--
2 files changed, 38 insertions(+), 5 deletions(-)
New commits:
commit 4920968143210c10c47a0098ec359757097fdb82
Author: John Sanda <jsanda(a)redhat.com>
Date: Mon Nov 5 14:16:13 2012 -0500
adding method to purge index for metrics table
diff --git a/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/MetricsDAO.java b/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/MetricsDAO.java
index a398fe4..383a15b 100644
--- a/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/MetricsDAO.java
+++ b/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/MetricsDAO.java
@@ -299,4 +299,21 @@ public class MetricsDAO {
}
}
+ public void deleteMetricsIndexEntries(String table) {
+ Connection connection = null;
+ Statement statement = null;
+ try {
+ connection = dataSource.getConnection();
+ statement = connection.createStatement();
+
+ String sql = "DELETE FROM " + METRICS_INDEX_TABLE + " WHERE bucket = '" + table + "'";
+ statement.executeUpdate(sql);
+ } catch (SQLException e) {
+ throw new CQLException(e);
+ } finally {
+ JDBCUtil.safeClose(statement);
+ JDBCUtil.safeClose(connection);
+ }
+ }
+
}
diff --git a/modules/enterprise/server/server-metrics/src/test/java/org/rhq/server/metrics/MetricsDAOTest.java b/modules/enterprise/server/server-metrics/src/test/java/org/rhq/server/metrics/MetricsDAOTest.java
index 3074e64..20f6ecc 100644
--- a/modules/enterprise/server/server-metrics/src/test/java/org/rhq/server/metrics/MetricsDAOTest.java
+++ b/modules/enterprise/server/server-metrics/src/test/java/org/rhq/server/metrics/MetricsDAOTest.java
@@ -26,7 +26,6 @@
package org.rhq.server.metrics;
import static java.util.Arrays.asList;
-import static org.joda.time.DateTime.now;
import static org.rhq.server.metrics.MetricsDAO.METRICS_INDEX_TABLE;
import static org.rhq.server.metrics.MetricsDAO.ONE_HOUR_METRICS_TABLE;
import static org.rhq.server.metrics.MetricsDAO.RAW_METRICS_TABLE;
@@ -71,7 +70,7 @@ public class MetricsDAOTest extends CassandraIntegrationTest {
public void insertAndFindRawMetrics() {
int scheduleId = 123;
- DateTime hour0 = now().hourOfDay().roundFloorCopy().minusHours(now().hourOfDay().get());
+ DateTime hour0 = hour0();
DateTime currentTime = hour0.plusHours(4).plusMinutes(44);
DateTime currentHour = currentTime.hourOfDay().roundFloorCopy();
DateTime threeMinutesAgo = currentTime.minusMinutes(3);
@@ -108,7 +107,7 @@ public class MetricsDAOTest extends CassandraIntegrationTest {
@Test
public void insertAndFindAllOneHourMetrics() {
int scheduleId = 123;
- DateTime hour0 = now().hourOfDay().roundFloorCopy().minusHours(now().hourOfDay().get());
+ DateTime hour0 = hour0();
MetricsDAO dao = new MetricsDAO(dataSource);
List<AggregatedNumericMetric> metrics = asList(
@@ -133,7 +132,7 @@ public class MetricsDAOTest extends CassandraIntegrationTest {
@Test
public void findRangeOfOneHourMetrics() {
int scheduledId = 123;
- DateTime hour0 = now().hourOfDay().roundFloorCopy().minusHours(now().hourOfDay().get());
+ DateTime hour0 = hour0();
MetricsDAO dao = new MetricsDAO(dataSource);
dao.insertAggregates(ONE_HOUR_METRICS_TABLE, asList(
@@ -159,7 +158,7 @@ public class MetricsDAOTest extends CassandraIntegrationTest {
@Test
public void updateAndFindOneHourIndexEntries() {
- DateTime hour0 = now().hourOfDay().roundFloorCopy().minusHours(now().hourOfDay().get());
+ DateTime hour0 = hour0();
Map<Integer, DateTime> updates = new HashMap<Integer, DateTime>();
updates.put(100, hour0);
@@ -174,4 +173,21 @@ public class MetricsDAOTest extends CassandraIntegrationTest {
assertCollectionMatchesNoOrder(expected, actual, "Failed to update or retrieve metrics index entries");
}
+ @Test
+ public void purge1HourMetricsIndex() {
+ Map<Integer, DateTime> updates = new HashMap<Integer, DateTime>();
+ updates.put(100, hour0());
+ updates.put(101, hour0());
+ updates.put(100, hour0().plusHours(1));
+ updates.put(101, hour0().plusHours(1));
+
+ MetricsDAO dao = new MetricsDAO(dataSource);
+ dao.updateMetricsIndex(ONE_HOUR_METRICS_TABLE, updates);
+ dao.deleteMetricsIndexEntries(ONE_HOUR_METRICS_TABLE);
+
+ List<MetricsIndexEntry> index = dao.findMetricsIndexEntries(ONE_HOUR_METRICS_TABLE);
+ assertEquals(index.size(), 0, "Expected index for " + ONE_HOUR_METRICS_TABLE + " to be empty but found " +
+ index);
+ }
+
}
11 years, 6 months
[rhq] Branch 'feature/cassandra-backend' - modules/common modules/enterprise
by John Sanda
modules/common/cassandra-common/src/main/cassandra/cql/dbsetup.cql | 8 ++++++++
modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/MetricsDAO.java | 2 ++
2 files changed, 10 insertions(+)
New commits:
commit 1e0bdb7c60f440dca3bee9c9b464097081e623a0
Author: John Sanda <jsanda(a)redhat.com>
Date: Mon Nov 5 13:52:35 2012 -0500
adding 24 hour metrics table back into schema
diff --git a/modules/common/cassandra-common/src/main/cassandra/cql/dbsetup.cql b/modules/common/cassandra-common/src/main/cassandra/cql/dbsetup.cql
index 287f882..189b35b 100644
--- a/modules/common/cassandra-common/src/main/cassandra/cql/dbsetup.cql
+++ b/modules/common/cassandra-common/src/main/cassandra/cql/dbsetup.cql
@@ -25,6 +25,14 @@ CREATE TABLE six_hour_metrics (
PRIMARY KEY (schedule_id, time, type)
);
+CREATE TABLE twenty_four_hour_metrics (
+ schedule_id int,
+ time timestamp,
+ type int,
+ value double,
+ PRIMARY KEY (schedule_id, time, type)
+);
+
CREATE TABLE metrics_index (
bucket varchar,
time timestamp,
diff --git a/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/MetricsDAO.java b/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/MetricsDAO.java
index 3dd19e8..a398fe4 100644
--- a/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/MetricsDAO.java
+++ b/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/MetricsDAO.java
@@ -56,6 +56,8 @@ public class MetricsDAO {
public static final String SIX_HOUR_METRICS_TABLE = "six_hour_metrics";
+ public static final String TWENTY_FOUR_HOUR_METRICS_TABLE = "twenty_four_hour_metrics";
+
private static final String RAW_METRICS_QUERY =
"SELECT schedule_id, time, value " +
"FROM " + RAW_METRICS_TABLE + " " +
11 years, 6 months
[rhq] Branch 'feature/cassandra-backend' - modules/common
by John Sanda
modules/common/cassandra-common-itests/src/main/java/org/rhq/cassandra/CassandraClusterManager.java | 5 ----
modules/common/cassandra-common/src/main/java/org/rhq/cassandra/BootstrapDeployer.java | 12 +++++++++-
2 files changed, 12 insertions(+), 5 deletions(-)
New commits:
commit 90c94adc0ae6c2ec10d4153603df4aa01b4e0e8b
Author: John Sanda <jsanda(a)redhat.com>
Date: Mon Nov 5 11:46:40 2012 -0500
CassandraClusterManager should not automatically purge cluster directory
CassandraClusterManager was purging the cluster deployment directory prior to
running BootstrapDeployer which means the cluster would always get deployed
or redeployed. This would be problematic if nodes are still running. In a
future commit, I may add an attribute to @DeployCluster that will trigger
purging the cluster directory. Prior to purging though, we need to make sure
all nodes are shut down.
diff --git a/modules/common/cassandra-common-itests/src/main/java/org/rhq/cassandra/CassandraClusterManager.java b/modules/common/cassandra-common-itests/src/main/java/org/rhq/cassandra/CassandraClusterManager.java
index 8702b51..f156dbd 100644
--- a/modules/common/cassandra-common-itests/src/main/java/org/rhq/cassandra/CassandraClusterManager.java
+++ b/modules/common/cassandra-common-itests/src/main/java/org/rhq/cassandra/CassandraClusterManager.java
@@ -37,7 +37,6 @@ import org.testng.IInvokedMethod;
import org.testng.IInvokedMethodListener;
import org.testng.ITestResult;
-import org.rhq.core.util.file.FileUtil;
import org.rhq.core.util.stream.StreamUtil;
/**
@@ -79,10 +78,7 @@ public class CassandraClusterManager implements IInvokedMethodListener {
File basedir = new File("target");
File clusterDir = new File(basedir, "cassandra");
- FileUtil.purge(clusterDir, false);
-
int numNodes = annotation.numNodes();
-
DeploymentOptions deploymentOptions = new DeploymentOptions();
deploymentOptions.setClusterDir(clusterDir.getAbsolutePath());
deploymentOptions.setNumNodes(numNodes);
@@ -94,6 +90,7 @@ public class CassandraClusterManager implements IInvokedMethodListener {
BootstrapDeployer deployer = new BootstrapDeployer();
deployer.setDeploymentOptions(deploymentOptions);
+
deployer.deploy();
}
diff --git a/modules/common/cassandra-common/src/main/java/org/rhq/cassandra/BootstrapDeployer.java b/modules/common/cassandra-common/src/main/java/org/rhq/cassandra/BootstrapDeployer.java
index afb157e..c4ea13c 100644
--- a/modules/common/cassandra-common/src/main/java/org/rhq/cassandra/BootstrapDeployer.java
+++ b/modules/common/cassandra-common/src/main/java/org/rhq/cassandra/BootstrapDeployer.java
@@ -78,7 +78,7 @@ public class BootstrapDeployer {
File clusterDir = new File(deploymentOptions.getClusterDir());
File installedMarker = new File(clusterDir, ".installed");
- if (installedMarker.exists()) {
+ if (isClusterInstalled()) {
return;
}
@@ -144,6 +144,16 @@ public class BootstrapDeployer {
}
}
+ private boolean isClusterInstalled() {
+ File clusterDir = new File(deploymentOptions.getClusterDir());
+ File installedMarker = new File(clusterDir, ".installed");
+
+ if (installedMarker.exists()) {
+ return true;
+ }
+ return false;
+ }
+
private void doLocalDeploy(Properties deployProps, File bundleDir) throws CassandraException {
AntLauncher launcher = new AntLauncher();
try {
11 years, 6 months
[rhq] Branch 'feature/cassandra-backend' - modules/common modules/enterprise
by John Sanda
modules/common/cassandra-common-itests/src/main/java/org/rhq/cassandra/CassandraClusterManager.java | 6 +++-
modules/enterprise/server/server-metrics/pom.xml | 14 ++++++++++
2 files changed, 19 insertions(+), 1 deletion(-)
New commits:
commit 5829edd2a5d43719fdde1f8b0aaee6b92ab4a735
Author: John Sanda <jsanda(a)redhat.com>
Date: Mon Nov 5 11:07:13 2012 -0500
adding option to skip cluster shutdown during test runs
The @ShutdownCluster annotation causes each node in the cluster to be shut
down. This type of clean up is particularly useful in a continuous integration
environment. But in a dev environment when running tests repeatedly prior to a
commit for example, it gets to be cumbersome to redeploy/restart the cluster
for each test run.
CassandraClusterManager now checks a system property named
rhq.cassandra.cluster.skip-shutdown to decide whether or not cluster shut down
should be initiated when the @ShutdownCluster annotation is present.
The server-metrics build has been updated to pass in the system property when
running tests from the command line. You can easily disable shut down as
follows,
mvn test -Dtest=MetricsDAOTest -DskipClusterShutdown=true
If there are multiple test/configuration methods with the @ShutdownCluster
annotation, then -DskipClusterShutdown=true will affect all of them.
diff --git a/modules/common/cassandra-common-itests/src/main/java/org/rhq/cassandra/CassandraClusterManager.java b/modules/common/cassandra-common-itests/src/main/java/org/rhq/cassandra/CassandraClusterManager.java
index 0fa49b8..8702b51 100644
--- a/modules/common/cassandra-common-itests/src/main/java/org/rhq/cassandra/CassandraClusterManager.java
+++ b/modules/common/cassandra-common-itests/src/main/java/org/rhq/cassandra/CassandraClusterManager.java
@@ -64,7 +64,11 @@ public class CassandraClusterManager implements IInvokedMethodListener {
Method method = invokedMethod.getTestMethod().getConstructorOrMethod().getMethod();
if (method.isAnnotationPresent(ShutdownCluster.class)) {
try {
- shutdownCluster();
+ Boolean skipShutdown = Boolean.valueOf(
+ System.getProperty("rhq.cassandra.cluster.skip-shutdown", "false"));
+ if (!skipShutdown) {
+ shutdownCluster();
+ }
} catch (Exception e) {
log.warn("An error occurred while shutting down the cluster", e);
}
diff --git a/modules/enterprise/server/server-metrics/pom.xml b/modules/enterprise/server/server-metrics/pom.xml
index f10b468..0494f81 100644
--- a/modules/enterprise/server/server-metrics/pom.xml
+++ b/modules/enterprise/server/server-metrics/pom.xml
@@ -40,6 +40,7 @@
<properties>
<cassandra.version>1.1.5</cassandra.version>
+ <skipClusterShutdown>false</skipClusterShutdown>
</properties>
<dependencies>
@@ -127,4 +128,17 @@
<version>1.7.1</version>
</dependency>
</dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <configuration>
+ <systemPropertyVariables>
+ <rhq.cassandra.cluster.skip-shutdown>${skipClusterShutdown}</rhq.cassandra.cluster.skip-shutdown>
+ </systemPropertyVariables>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
</project>
11 years, 6 months
[rhq] Branch 'rhq-on-as7' - 2 commits - modules/core modules/enterprise
by Jay Shaughnessy
modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftDefinition.java | 18
modules/core/domain/src/main/java/org/rhq/core/domain/drift/JPADrift.java | 10
modules/enterprise/server/itests-2/pom.xml | 39
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/TestServerPluginService.java | 148 +
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/TestServerPluginServiceMBean.java | 31
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/alert/AlertDefinitionWithComplexNotificationsTest.java | 1433 ++++++++++
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/alert/TestAlertSender.java | 107
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/alert/TestAlertSenderPluginService.java | 67
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/content/test/AdvisoryManagerBeanTest.java | 10
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/drift/AbstractDriftServerTest.java | 264 +
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/drift/DriftServerPluginService.java | 63
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/drift/DriftTemplateManagerBeanTest.java | 653 ++++
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/drift/InitDB.java | 32
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/drift/JPADriftServerBeanTest.java | 308 ++
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/drift/ManageDriftDefinitionsTest.java | 338 ++
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/drift/ManageSnapshotsTest.java | 275 +
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/test/AbstractMeasurementScheduleManagerTest.java | 15
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/test/MeasurementScheduleManagerTest.java | 12
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java | 163 -
modules/enterprise/server/itests-2/src/test/resources/test-alert-sender-serverplugin.xml | 23
modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/TestServerPluginService.java | 148 -
modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/TestServerPluginServiceMBean.java | 31
modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/alert/AlertDefinitionWithComplexNotificationsTest.java | 712 ----
modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/alert/TestAlertSender.java | 107
modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/alert/TestAlertSenderPluginService.java | 67
modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/AbstractDriftServerTest.java | 238 -
modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/DriftServerPluginService.java | 63
modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/DriftTemplateManagerBeanTest.java | 614 ----
modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/InitDB.java | 32
modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/JPADriftServerBeanTest.java | 311 --
modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/ManageDriftDefinitionsTest.java | 326 --
modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/ManageSnapshotsTest.java | 276 -
32 files changed, 3913 insertions(+), 3021 deletions(-)
New commits:
commit 7ae9ffe028baf2cf98b6c49cd7920a41c5751231
Author: Jay Shaughnessy <jshaughn(a)jshaughn.csb>
Date: Mon Nov 5 10:46:23 2012 -0500
- Migrate drift tests and AlertSender tests from server/itests to
server/itests-2. This merges them with the other former server
jar unit tests that are now arquillian based integration tests.
And consolidates itests based on AbstractEJB3Test.
- Convert AlertSender test structure to one big test to get
around the current @BeforeClass and shared instance var issues
with Arquillian and the testng lifdecycle.
- Add SystemProperties section to standalone.xml, making
project.version property available to test code.
- Add support for prepareTestAgents in the new infra
- add support for BeforeMethod overrides offering up the Method param
-
diff --git a/modules/enterprise/server/itests-2/pom.xml b/modules/enterprise/server/itests-2/pom.xml
index c2fa2b1..e9c7f44 100644
--- a/modules/enterprise/server/itests-2/pom.xml
+++ b/modules/enterprise/server/itests-2/pom.xml
@@ -121,6 +121,13 @@
<dependency>
<groupId>${project.groupId}</groupId>
+ <artifactId>rhq-serverplugin-drift</artifactId>
+ <version>${project.version}</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>${project.groupId}</groupId>
<artifactId>rhq-core-client-api</artifactId>
<version>${project.version}</version>
<type>test-jar</type>
@@ -400,7 +407,7 @@
</executions>
</plugin>
-->
-
+
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
@@ -409,7 +416,7 @@
<id>prepare AS container</id>
<phase>process-test-resources</phase>
<configuration>
- <target>
+ <target>
<echo>Unzipping JBossAS ${jboss.version} found at ${jboss.zip}</echo>
<unzip
src="${jboss.zip}"
@@ -420,7 +427,18 @@
location="${jboss.unzip.location}/standalone/configuration/standalone.xml" />
<echo>Will now add test configuration to JBossAS config file: ${jboss.conf}</echo>
<replace file="${jboss.conf}">
-
+
+ <replacefilter>
+ <replacetoken></extensions></replacetoken>
+ <replacevalue><![CDATA[
+ </extensions>
+
+ <!-- FOR RHQ TESTING -->
+ <system-properties>
+ <property name="project.version" value="${project.version}"/>
+ </system-properties>]]></replacevalue>
+ </replacefilter>
+
<replacefilter>
<replacetoken></security-domains></replacetoken>
<replacevalue><![CDATA[
@@ -433,9 +451,9 @@
</login-module>
</authentication>
</security-domain>
- </security-domains>]]></replacevalue>
+ </security-domains>]]></replacevalue>
</replacefilter>
-
+
<replacefilter>
<replacetoken></session-bean></replacetoken>
<replacevalue><![CDATA[
@@ -454,7 +472,7 @@
<extension module="org.jboss.as.messaging"/>
<extension module="org.jboss.as.naming"/>]]></replacevalue>
</replacefilter>
-
+
<replacefilter>
<replacetoken><socket-binding name="https" port="8443"/></replacetoken>
<replacevalue><![CDATA[
@@ -463,7 +481,7 @@
<socket-binding name="messaging" port="${rhq.server.socket.binding.port.messaging:4445}"/>
<socket-binding name="messaging-throughput" port="${rhq.server.socket.binding.port.messaging-throughput:4455}"/>]]></replacevalue>
</replacefilter>
-
+
<replacefilter>
<replacetoken><subsystem xmlns="urn:jboss:domain:naming:1.1"/></replacetoken>
<replacevalue><![CDATA[
@@ -629,8 +647,8 @@
<prepared-statement-cache-size>75</prepared-statement-cache-size>
</statement>
</xa-datasource>]]></replacevalue>
- </replacefilter>
-
+ </replacefilter>
+
<replacefilter>
<replacetoken></drivers></replacetoken>
<replacevalue><![CDATA[
@@ -705,7 +723,7 @@
</executions>
</plugin>
-
+
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
@@ -725,6 +743,7 @@
<hibernate.dialect>${rhq.test.ds.hibernate-dialect}</hibernate.dialect>
<clean.db>${clean.db}</clean.db>
<log4j.configDebug>false</log4j.configDebug>
+ <project.version>${project.version}</project.version>
</systemPropertyVariables>
<additionalClasspathElements>
<!-- The below is required for tests to run against Oracle. -->
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/TestServerPluginService.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/TestServerPluginService.java
new file mode 100644
index 0000000..be9b752
--- /dev/null
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/TestServerPluginService.java
@@ -0,0 +1,148 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2012 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+package org.rhq.enterprise.server;
+
+import java.io.File;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
+import org.rhq.core.domain.plugin.PluginKey;
+import org.rhq.core.domain.plugin.PluginStatusType;
+import org.rhq.core.domain.plugin.ServerPlugin;
+import org.rhq.core.util.MessageDigestGenerator;
+import org.rhq.enterprise.server.plugin.pc.AbstractTypeServerPluginContainer;
+import org.rhq.enterprise.server.plugin.pc.MasterServerPluginContainer;
+import org.rhq.enterprise.server.plugin.pc.MasterServerPluginContainerConfiguration;
+import org.rhq.enterprise.server.plugin.pc.ServerPluginEnvironment;
+import org.rhq.enterprise.server.plugin.pc.ServerPluginService;
+import org.rhq.enterprise.server.plugin.pc.ServerPluginType;
+import org.rhq.enterprise.server.xmlschema.ServerPluginDescriptorMetadataParser;
+import org.rhq.enterprise.server.xmlschema.ServerPluginDescriptorUtil;
+import org.rhq.enterprise.server.xmlschema.generated.serverplugin.ServerPluginDescriptorType;
+
+/**
+ *
+ *
+ * @author Lukas Krejci
+ */
+public abstract class TestServerPluginService extends ServerPluginService implements TestServerPluginServiceMBean {
+ public TestMasterServerPluginContainer master;
+ public MasterServerPluginContainerConfiguration masterConfig;
+
+ protected TestServerPluginService() {
+ // build the config at constructor time so tests have it even before the PC is initialized
+ File dir = new File(System.getProperty("java.io.tmpdir"), "test-server-plugins");
+ this.masterConfig = new MasterServerPluginContainerConfiguration(dir, dir, dir, null);
+ }
+
+ @Override
+ public MasterServerPluginContainer createMasterPluginContainer() {
+ this.master = new TestMasterServerPluginContainer();
+ this.master.initialize(this.masterConfig);
+ return this.master;
+ }
+
+ protected abstract List<AbstractTypeServerPluginContainer> createPluginContainers(MasterServerPluginContainer master);
+
+ public static ServerPlugin getPlugin(ServerPluginEnvironment env) {
+ return getPlugin(env.getPluginUrl(), env.getPluginDescriptor());
+ }
+
+ public static ServerPlugin getPlugin(URL pluginUrl, ServerPluginDescriptorType pluginDescriptor) {
+ try {
+ Configuration pluginConfig = null;
+ Configuration scheduledJobsConfig = null;
+ ConfigurationDefinition configDef;
+
+ configDef = ServerPluginDescriptorMetadataParser.getPluginConfigurationDefinition(pluginDescriptor);
+ if (configDef != null) {
+ pluginConfig = configDef.getDefaultTemplate().createConfiguration();
+ }
+
+ configDef = ServerPluginDescriptorMetadataParser.getScheduledJobsDefinition(pluginDescriptor);
+ if (configDef != null) {
+ scheduledJobsConfig = configDef.getDefaultTemplate().createConfiguration();
+ }
+
+ File pluginFile = new File(pluginUrl.toURI());
+ PluginKey pluginKey = PluginKey.createServerPluginKey(new ServerPluginType(pluginDescriptor).stringify(), pluginDescriptor.getName());
+ ServerPlugin plugin =
+ new ServerPlugin(0, pluginKey.getPluginName(), pluginFile.getName(),
+ pluginDescriptor.getDisplayName(), true, PluginStatusType.INSTALLED,
+ pluginDescriptor.getDescription(), "", MessageDigestGenerator.getDigestString(pluginFile),
+ pluginDescriptor.getVersion(), pluginDescriptor.getVersion(), pluginConfig,
+ scheduledJobsConfig, new ServerPluginType(pluginDescriptor).stringify(),
+ System.currentTimeMillis(), System.currentTimeMillis());
+ return plugin;
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public static ServerPlugin getPlugin(URL pluginUrl) throws Exception {
+ ServerPluginDescriptorType type = ServerPluginDescriptorUtil.loadPluginDescriptorFromUrl(pluginUrl);
+
+ return getPlugin(pluginUrl, type);
+ }
+
+ protected Map<URL, ? extends ServerPluginDescriptorType> preloadAllPlugins() throws Exception {
+ return null;
+ }
+
+ private class TestMasterServerPluginContainer extends MasterServerPluginContainer {
+
+ @Override
+ protected ClassLoader createRootServerPluginClassLoader() {
+ return getClass().getClassLoader();
+ }
+
+ @Override
+ protected Map<URL, ? extends ServerPluginDescriptorType> preloadAllPlugins() throws Exception {
+ Map<URL, ? extends ServerPluginDescriptorType> plugins = TestServerPluginService.this.preloadAllPlugins();
+ if (plugins != null) {
+ return plugins;
+ }
+
+ // if our test never setup any plugins, ignore it and just return an empty map
+ File pluginDir = getConfiguration().getPluginDirectory();
+ if (pluginDir == null || pluginDir.listFiles() == null || pluginDir.listFiles().length == 0) {
+ return new HashMap<URL, ServerPluginDescriptorType>();
+ } else {
+ return super.preloadAllPlugins();
+ }
+ }
+
+ @Override
+ protected List<PluginKey> getDisabledPluginKeys() {
+ // in the real world, the db is checked for enable flag, here we say all plugins are enabled
+ return new ArrayList<PluginKey>();
+ }
+
+ @Override
+ protected List<AbstractTypeServerPluginContainer> createPluginContainers() {
+ return TestServerPluginService.this.createPluginContainers(this);
+ }
+ }
+}
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/TestServerPluginServiceMBean.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/TestServerPluginServiceMBean.java
new file mode 100644
index 0000000..5c478a9
--- /dev/null
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/TestServerPluginServiceMBean.java
@@ -0,0 +1,31 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2012 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+package org.rhq.enterprise.server;
+
+import org.rhq.enterprise.server.plugin.pc.ServerPluginServiceMBean;
+
+/**
+ *
+ *
+ * @author Lukas Krejci
+ */
+public interface TestServerPluginServiceMBean extends ServerPluginServiceMBean {
+
+}
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/alert/AlertDefinitionWithComplexNotificationsTest.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/alert/AlertDefinitionWithComplexNotificationsTest.java
new file mode 100644
index 0000000..f29e224
--- /dev/null
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/alert/AlertDefinitionWithComplexNotificationsTest.java
@@ -0,0 +1,1433 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2012 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+package org.rhq.enterprise.server.alert;
+
+import java.io.File;
+import java.net.URL;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+
+import javax.persistence.EntityManager;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.testng.annotations.Test;
+
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.exporter.ZipExporter;
+import org.jboss.shrinkwrap.api.spec.JavaArchive;
+
+import org.rhq.core.domain.alert.AlertDampening;
+import org.rhq.core.domain.alert.AlertDefinition;
+import org.rhq.core.domain.alert.AlertPriority;
+import org.rhq.core.domain.alert.BooleanExpression;
+import org.rhq.core.domain.alert.notification.AlertNotification;
+import org.rhq.core.domain.auth.Subject;
+import org.rhq.core.domain.authz.Permission;
+import org.rhq.core.domain.authz.Role;
+import org.rhq.core.domain.cloud.Server;
+import org.rhq.core.domain.cloud.Server.OperationMode;
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.PropertySimple;
+import org.rhq.core.domain.criteria.AlertDefinitionCriteria;
+import org.rhq.core.domain.criteria.ResourceCriteria;
+import org.rhq.core.domain.plugin.ServerPlugin;
+import org.rhq.core.domain.resource.Agent;
+import org.rhq.core.domain.resource.InventoryStatus;
+import org.rhq.core.domain.resource.Resource;
+import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.core.domain.resource.group.ResourceGroup;
+import org.rhq.core.domain.shared.ResourceBuilder;
+import org.rhq.core.domain.shared.ResourceTypeBuilder;
+import org.rhq.enterprise.server.TestServerPluginService;
+import org.rhq.enterprise.server.auth.SessionManager;
+import org.rhq.enterprise.server.test.AbstractEJB3Test;
+import org.rhq.enterprise.server.test.TestServerCommunicationsService;
+import org.rhq.enterprise.server.test.TransactionCallback;
+import org.rhq.enterprise.server.util.LookupUtil;
+import org.rhq.enterprise.server.util.ResourceTreeHelper;
+
+/**
+ * !!! README
+ * !!! The original version of this class is nicely written and is maintained at the bottom of this file in comments.
+ * !!! The issue is that Arquillian (1.0.2) does not honor the testNg lifecycle, on which the original
+ * !!! implementation heavily relies (i.e. Before/AfterClass and instance variables that span all tests).
+ * !!! The work needed to get it to work in a similar fashion was large, and Arquillian 2 promises to perhaps
+ * !!! honor the testNg lifecycle. So, for now, I've basically condensed this into one large test to
+ * !!! get it running. Sorry Lukas :(
+ *
+ *
+ * @author Lukas Krejci
+ */
+@Test(groups = "alert")
+public class AlertDefinitionWithComplexNotificationsTest extends AbstractEJB3Test {
+
+ private static final Log LOG = LogFactory.getLog(AlertDefinitionWithComplexNotificationsTest.class);
+
+ private enum ParentType {
+ GROUP, TEMPLATE
+ }
+
+ private String universalName;
+
+ private Server server;
+ private Agent agent;
+ private Subject subject;
+ private Role role;
+ private ResourceType resourceType;
+ private ResourceGroup resourceGroup;
+ private Set<Resource> resources;
+ private AlertDefinition templateAlertDefinition;
+ private AlertDefinition groupAlertDefinition;
+ private AlertDefinition resourceAlertDefinition;
+ private ServerPlugin serverPlugin;
+ private Set<Object> junk = new LinkedHashSet<Object>();
+
+ private int resourceLevelAlertDefinitionId;
+ private int groupLevelAlertDefinitionId;
+ private int templateLevelAlertDefinitionId;
+ private Resource copyTestsResource;
+
+ private TestAlertSenderPluginService alertSenderService;
+ private TestServerCommunicationsService agentService;
+
+ @Test
+ public void singleMergedTest() throws Exception {
+ try {
+ prepareDB();
+ containerSetup();
+ login();
+
+ System.out.println("Running test: testNotificationsCopiedOnAlertTemplateApplication");
+ testNotificationsCopiedOnAlertTemplateApplication();
+
+ System.out.println("Running test: testNotificationsCopiedOnGroupMemberAddition");
+ testNotificationsCopiedOnGroupMemberAddition();
+
+ System.out.println("Running test: testCorrectSubjectPassedOnResourceLevelAlertDefinitionCreation");
+ testCorrectSubjectPassedOnResourceLevelAlertDefinitionCreation();
+
+ System.out.println("Running test: testCorrectSubjectPassedOnGroupLevelAlertDefinitionCreation");
+ testCorrectSubjectPassedOnGroupLevelAlertDefinitionCreation();
+
+ System.out.println("Running test: testCorrectSubjectPassedOnTemplateLevelAlertDefinitionCreation");
+ testCorrectSubjectPassedOnTemplateLevelAlertDefinitionCreation();
+
+ System.out.println("Running test: testNoValidationWhenNoNotificationUpdateOnResourceLevel");
+ testNoValidationWhenNoNotificationUpdateOnResourceLevel();
+
+ System.out.println("Running test: testNoValidationWhenNoNotificationUpdateOnGroupLevel");
+ testNoValidationWhenNoNotificationUpdateOnGroupLevel();
+
+ System.out.println("Running test: testNoValidationWhenNoNotificationUpdateOnTemplateLevel");
+ testNoValidationWhenNoNotificationUpdateOnTemplateLevel();
+
+ System.out.println("Running test: testCorrectSubjectPassedOnResourceLevelAlertDefinitionUpdate");
+ testCorrectSubjectPassedOnResourceLevelAlertDefinitionUpdate();
+
+ System.out.println("Running test: testCorrectSubjectPassedOnGroupLevelAlertDefinitionUpdate");
+ testCorrectSubjectPassedOnGroupLevelAlertDefinitionUpdate();
+
+ System.out.println("Running test: testCorrectSubjectPassedOnTemplateLevelAlertDefinitionUpdate");
+ testCorrectSubjectPassedOnTemplateLevelAlertDefinitionUpdate();
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw e;
+
+ } finally {
+ containerTearDown();
+ logout();
+ cleanDB();
+ }
+ }
+
+ //@BeforeClass
+ private void prepareDB() {
+ executeInTransaction(false, new TransactionCallback() {
+ @Override
+ public void execute() throws Exception {
+ EntityManager em = getEntityManager();
+
+ universalName = getClass().getName();
+
+ agent = new Agent("localhost", "localhost", 0, "foo", "bar");
+
+ server = new Server();
+ server.setAddress("localhost");
+ server.setName("localhost");
+ server.setOperationMode(OperationMode.NORMAL);
+
+ server.setAgents(Collections.singletonList(agent));
+
+ role = new Role(universalName);
+ role.addPermission(Permission.MANAGE_INVENTORY);
+ role.addPermission(Permission.MANAGE_SETTINGS);
+
+ subject = new Subject(universalName, true, false);
+ subject.addRole(role);
+
+ resourceType = new ResourceTypeBuilder().createPlatformResourceType().withId(0).withName(universalName)
+ .withPlugin(universalName).build();
+
+ resourceGroup = new ResourceGroup(universalName, resourceType);
+
+ resources = new LinkedHashSet<Resource>();
+ for (int i = 0; i < 10; ++i) {
+ Resource res = createResourceForTest(universalName + i);
+
+ resources.add(res);
+
+ resourceGroup.addExplicitResource(res);
+ }
+
+ templateAlertDefinition = createDefinitionForTest(universalName + " template", true);
+ templateAlertDefinition.setResourceType(resourceType);
+
+ groupAlertDefinition = createDefinitionForTest(universalName + " group", true);
+ groupAlertDefinition.setResourceGroup(resourceGroup);
+
+ resourceAlertDefinition = createDefinitionForTest(universalName + " resource", true);
+ resourceAlertDefinition.setResource(resources.iterator().next());
+
+ em.persist(agent);
+ em.persist(server);
+ em.persist(role);
+ em.persist(subject);
+ em.persist(resourceType);
+ em.persist(resourceGroup);
+ for (Resource r : resources) {
+ em.persist(r);
+ }
+ em.persist(templateAlertDefinition);
+ em.persist(groupAlertDefinition);
+ em.persist(resourceAlertDefinition);
+
+ //only need this for a short time now, so that we can precreate the plugin structure
+ alertSenderService = new TestAlertSenderPluginService();
+ prepareCustomServerPluginService(alertSenderService);
+ alertSenderService.masterConfig.getPluginDirectory().mkdirs();
+ unprepareServerPluginService();
+
+ JavaArchive archive = ShrinkWrap.create(JavaArchive.class);
+ //archive.addClass(TestAlertSender.class);
+ URL res = this.getClass().getClassLoader().getResource("test-alert-sender-serverplugin.xml");
+ archive.addAsResource(res, "META-INF/rhq-serverplugin.xml");
+
+ File pluginFile = new File(alertSenderService.masterConfig.getPluginDirectory(), "test-aler-plugin.jar");
+
+ archive.as(ZipExporter.class).exportTo(pluginFile, true);
+
+ //the alert sender plugin manager needs the plugins in the database...
+ serverPlugin = TestServerPluginService.getPlugin(pluginFile.toURI().toURL());
+ em.persist(serverPlugin);
+ }
+ });
+ }
+
+ //@BeforeMethod
+ private void containerSetup() {
+ alertSenderService = new TestAlertSenderPluginService();
+ prepareCustomServerPluginService(alertSenderService);
+ alertSenderService.masterConfig.getPluginDirectory().mkdirs();
+
+ alertSenderService.startMasterPluginContainer();
+
+ agentService = prepareForTestAgents();
+ }
+
+ //@AfterMethod
+ private void containerTearDown() throws Exception {
+ unprepareServerPluginService();
+ unprepareForTestAgents();
+ }
+
+ //@AfterClass(alwaysRun = true)
+ private void cleanDB() throws Exception {
+ for (Object o : junk) {
+ removeNoExceptions(o);
+ }
+
+ removeNoExceptions(resourceAlertDefinition);
+ removeNoExceptions(groupAlertDefinition);
+ removeNoExceptions(templateAlertDefinition);
+ removeNoExceptions(resourceGroup);
+ for (Resource r : resources) {
+ r.removeExplicitGroup(resourceGroup);
+ r.getAlertDefinitions().clear();
+ removeNoExceptions(r);
+ }
+ removeNoExceptions(resourceType);
+ removeNoExceptions(subject);
+ removeNoExceptions(role);
+ removeNoExceptions(server);
+ removeNoExceptions(agent);
+
+ removeNoExceptions(serverPlugin);
+ }
+
+ //@BeforeMethod
+ private void login() throws Exception {
+ //the embedded server cannot do a full-blown login
+ //so we hack our way in
+ subject = SessionManager.getInstance().put(subject);
+ }
+
+ //@AfterMethod(alwaysRun = true)
+ private void logout() throws Exception {
+ SessionManager.getInstance().invalidate(subject.getSessionId());
+ }
+
+ private Resource getCopyTestsResource() throws Exception {
+ if (copyTestsResource == null) {
+ final String keyAndName = universalName + "-copyTests";
+
+ LookupUtil.getResourceManager()
+ .createResource(subject, createResourceForTest(keyAndName), Resource.ROOT_ID);
+
+ //ok, now the new resource should contain the alert definition defined by the template
+ ResourceCriteria crit = new ResourceCriteria();
+ crit.addFilterResourceKey(keyAndName);
+ crit.fetchExplicitGroups(true); //so that cleanup works
+ crit.fetchAlertDefinitions(true); //so that cleanup works
+
+ List<Resource> foundResources = LookupUtil.getResourceManager().findResourcesByCriteria(subject, crit);
+
+ assertEquals("A new resource should have been created", 1, foundResources.size());
+
+ Resource res = foundResources.get(0);
+ resources.add(res);
+
+ copyTestsResource = res;
+ }
+
+ return copyTestsResource;
+ }
+
+ private void testNotificationsCopiedOnAlertTemplateApplication() throws Exception {
+ TestAlertSender.setExpectedSubject(null);
+ TestAlertSender.resetValidateMethodCallCount();
+
+ Resource res = getCopyTestsResource();
+
+ //apply the template manually - this is done in server-agent back-and-forth that we
+ //don't test here and which is complex to mock out.
+ //this method has to be called using the overlord subject
+ LookupUtil.getAlertTemplateManager().updateAlertDefinitionsForResource(
+ LookupUtil.getSubjectManager().getOverlord(), res.getId());
+
+ assertEquals("No validation should occur on the copied notifications", 0,
+ TestAlertSender.getValidateMethodCallCount());
+
+ AlertDefinitionManagerLocal adm = LookupUtil.getAlertDefinitionManager();
+ AlertDefinitionCriteria adCrit = new AlertDefinitionCriteria();
+ adCrit.addFilterResourceIds(res.getId());
+ adCrit.fetchAlertNotifications(true);
+
+ List<AlertDefinition> foundAlertDefs = adm.findAlertDefinitionsByCriteria(subject, adCrit);
+ junk.addAll(foundAlertDefs);
+
+ assertEquals("The new resource should have an alert definition obtained from the template.", 1,
+ foundAlertDefs.size());
+
+ AlertDefinition defWithNotifications = foundAlertDefs.get(0);
+
+ testSingleDependentAlertDefinition(defWithNotifications, ParentType.TEMPLATE,
+ defWithNotifications.getParentId());
+ }
+
+ //@Test(dependsOnMethods = "testNotificationsCopiedOnAlertTemplateApplication")
+ private void testNotificationsCopiedOnGroupMemberAddition() throws Exception {
+ TestAlertSender.setExpectedSubject(null);
+ TestAlertSender.resetValidateMethodCallCount();
+
+ Resource res = getCopyTestsResource();
+
+ LookupUtil.getResourceGroupManager().addResourcesToGroup(subject, resourceGroup.getId(),
+ new int[] { res.getId() });
+
+ assertEquals("No validation should occur on the copied notifications", 0,
+ TestAlertSender.getValidateMethodCallCount());
+
+ AlertDefinitionManagerLocal adm = LookupUtil.getAlertDefinitionManager();
+ AlertDefinitionCriteria adCrit = new AlertDefinitionCriteria();
+ adCrit.addFilterResourceIds(res.getId());
+ adCrit.fetchAlertNotifications(true);
+
+ List<AlertDefinition> foundAlertDefs = adm.findAlertDefinitionsByCriteria(subject, adCrit);
+ junk.addAll(foundAlertDefs);
+
+ //1 from the group, 1 from the template
+ assertEquals("The new resource should have an alert definition obtained from the group.", 2,
+ foundAlertDefs.size());
+
+ AlertDefinition groupOriginatingDef = null;
+ for (AlertDefinition d : foundAlertDefs) {
+ if ((universalName + " group").equals(d.getName())) {
+ groupOriginatingDef = d;
+ break;
+ }
+ }
+
+ assertNotNull("The alert definition originating from the group not present on the resource.",
+ groupOriginatingDef);
+
+ testSingleDependentAlertDefinition(groupOriginatingDef, ParentType.GROUP, groupOriginatingDef
+ .getGroupAlertDefinition().getId());
+ }
+
+ private void testCorrectSubjectPassedOnResourceLevelAlertDefinitionCreation() throws Exception {
+ TestAlertSender.setExpectedSubject(subject);
+
+ AlertDefinitionManagerLocal adm = LookupUtil.getAlertDefinitionManager();
+
+ Resource res = resources.iterator().next();
+
+ AlertDefinition def = createDefinitionForTest("testCorrectSubjectPassedOnResourceLevelAlertDefinitionCreation",
+ false);
+ def.setResource(resources.iterator().next());
+
+ int id = adm.createAlertDefinition(subject, def, res.getId(), true);
+ def.setId(id);
+
+ resourceLevelAlertDefinitionId = id;
+
+ junk.add(def);
+
+ testMainAlertDefinition(id);
+ }
+
+ //@Test(dependsOnMethods = { "testNotificationsCopiedOnAlertTemplateApplication",
+ // "testNotificationsCopiedOnGroupMemberAddition" })
+ private void testCorrectSubjectPassedOnGroupLevelAlertDefinitionCreation() throws Exception {
+ TestAlertSender.setExpectedSubject(subject);
+
+ GroupAlertDefinitionManagerLocal gadm = LookupUtil.getGroupAlertDefinitionManager();
+
+ AlertDefinition def = createDefinitionForTest("testCorrectSubjectPassedOnGroupLevelAlertDefinitionCreation",
+ false);
+ def.setResourceGroup(resourceGroup);
+
+ int id = gadm.createGroupAlertDefinitions(subject, def, resourceGroup.getId());
+ def.setId(id);
+
+ groupLevelAlertDefinitionId = id;
+
+ junk.add(def);
+
+ testMainAlertDefinition(id);
+ List<AlertDefinition> deps = testDependentAlertDefinitions(id, ParentType.GROUP);
+
+ junk.addAll(deps);
+ }
+
+ //@Test(dependsOnMethods = { "testNotificationsCopiedOnAlertTemplateApplication",
+ // "testNotificationsCopiedOnGroupMemberAddition" })
+ private void testCorrectSubjectPassedOnTemplateLevelAlertDefinitionCreation() throws Exception {
+ TestAlertSender.setExpectedSubject(subject);
+
+ AlertTemplateManagerLocal atm = LookupUtil.getAlertTemplateManager();
+
+ AlertDefinition def = createDefinitionForTest("testCorrectSubjectPassedOnTemplateLevelAlertDefinitionCreation",
+ false);
+ def.setResourceGroup(resourceGroup);
+
+ int id = atm.createAlertTemplate(subject, def, resourceType.getId());
+ def.setId(id);
+
+ templateLevelAlertDefinitionId = id;
+
+ junk.add(def);
+
+ testMainAlertDefinition(id);
+ List<AlertDefinition> deps = testDependentAlertDefinitions(id, ParentType.TEMPLATE);
+
+ junk.addAll(deps);
+ }
+
+ //@Test(dependsOnMethods = "testCorrectSubjectPassedOnResourceLevelAlertDefinitionCreation")
+ private void testNoValidationWhenNoNotificationUpdateOnResourceLevel() throws Exception {
+ TestAlertSender.setExpectedSubject(subject);
+ TestAlertSender.resetValidateMethodCallCount();
+
+ AlertDefinitionManagerLocal adm = LookupUtil.getAlertDefinitionManager();
+
+ AlertDefinitionCriteria crit = new AlertDefinitionCriteria();
+ crit.addFilterId(resourceLevelAlertDefinitionId);
+ crit.fetchAlertNotifications(true);
+ crit.fetchConditions(true);
+
+ List<AlertDefinition> foundDefs = adm.findAlertDefinitionsByCriteria(subject, crit);
+
+ assertEquals("Failed to find the previously created resource level alert definition.", 1, foundDefs.size());
+
+ AlertDefinition foundDef = foundDefs.get(0);
+
+ foundDef.setEnabled(true);
+
+ adm.updateAlertDefinition(subject, resourceLevelAlertDefinitionId, foundDef, false);
+
+ assertEquals("The notification validation method shouldn't have been called", 0,
+ TestAlertSender.getValidateMethodCallCount());
+ }
+
+ //@Test(dependsOnMethods = "testCorrectSubjectPassedOnGroupLevelAlertDefinitionCreation")
+ private void testNoValidationWhenNoNotificationUpdateOnGroupLevel() throws Exception {
+ TestAlertSender.setExpectedSubject(subject);
+ TestAlertSender.resetValidateMethodCallCount();
+
+ AlertDefinitionManagerLocal adm = LookupUtil.getAlertDefinitionManager();
+
+ AlertDefinitionCriteria crit = new AlertDefinitionCriteria();
+ crit.addFilterId(groupLevelAlertDefinitionId);
+ crit.fetchAlertNotifications(true);
+ crit.fetchConditions(true);
+
+ List<AlertDefinition> foundDefs = adm.findAlertDefinitionsByCriteria(subject, crit);
+
+ assertEquals("Failed to find the previously created group level alert definition.", 1, foundDefs.size());
+
+ AlertDefinition foundDef = foundDefs.get(0);
+
+ foundDef.setEnabled(true);
+
+ GroupAlertDefinitionManagerLocal gadm = LookupUtil.getGroupAlertDefinitionManager();
+ gadm.updateGroupAlertDefinitions(subject, foundDef, true);
+
+ assertEquals("The notification validation method shouldn't have been called", 0,
+ TestAlertSender.getValidateMethodCallCount());
+ }
+
+ //@Test(dependsOnMethods = "testCorrectSubjectPassedOnTemplateLevelAlertDefinitionCreation")
+ private void testNoValidationWhenNoNotificationUpdateOnTemplateLevel() throws Exception {
+ TestAlertSender.setExpectedSubject(subject);
+ TestAlertSender.resetValidateMethodCallCount();
+
+ AlertDefinitionManagerLocal adm = LookupUtil.getAlertDefinitionManager();
+
+ AlertDefinitionCriteria crit = new AlertDefinitionCriteria();
+ crit.addFilterId(templateLevelAlertDefinitionId);
+ crit.fetchAlertNotifications(true);
+ crit.fetchConditions(true);
+
+ List<AlertDefinition> foundDefs = adm.findAlertDefinitionsByCriteria(subject, crit);
+
+ assertEquals("Failed to find the previously created resource level alert definition.", 1, foundDefs.size());
+
+ AlertDefinition foundDef = foundDefs.get(0);
+
+ foundDef.setEnabled(true);
+
+ AlertTemplateManagerLocal atm = LookupUtil.getAlertTemplateManager();
+
+ atm.updateAlertTemplate(subject, foundDef, true);
+
+ assertEquals("The notification validation method shouldn't have been called", 0,
+ TestAlertSender.getValidateMethodCallCount());
+ }
+
+ //@Test(dependsOnMethods = "testNoValidationWhenNoNotificationUpdateOnResourceLevel")
+ private void testCorrectSubjectPassedOnResourceLevelAlertDefinitionUpdate() throws Exception {
+ TestAlertSender.setExpectedSubject(subject);
+ TestAlertSender.resetValidateMethodCallCount();
+
+ AlertDefinitionManagerLocal adm = LookupUtil.getAlertDefinitionManager();
+
+ AlertDefinitionCriteria crit = new AlertDefinitionCriteria();
+ crit.addFilterId(resourceLevelAlertDefinitionId);
+ crit.fetchAlertNotifications(true);
+ crit.fetchConditions(true);
+
+ List<AlertDefinition> foundDefs = adm.findAlertDefinitionsByCriteria(subject, crit);
+
+ assertEquals("Failed to find the previously created resource level alert definition.", 1, foundDefs.size());
+
+ AlertDefinition foundDef = foundDefs.get(0);
+
+ AlertNotification newNotif = createAlertNotificationForTest(foundDef, false);
+ //just add some dummy config property so that the 2 notifs are distinguishable from each other
+ //and are saved separately
+ newNotif.getConfiguration().put(new PropertySimple("foo-resource", "bar"));
+
+ adm.updateAlertDefinition(subject, resourceLevelAlertDefinitionId, foundDef, false);
+
+ assertEquals("Validation should have been called for a new notification during alert def update", 1,
+ TestAlertSender.getValidateMethodCallCount());
+ }
+
+ //@Test(dependsOnMethods = "testCorrectSubjectPassedOnGroupLevelAlertDefinitionCreation")
+ private void testCorrectSubjectPassedOnGroupLevelAlertDefinitionUpdate() throws Exception {
+ TestAlertSender.setExpectedSubject(subject);
+ TestAlertSender.resetValidateMethodCallCount();
+
+ AlertDefinitionManagerLocal adm = LookupUtil.getAlertDefinitionManager();
+
+ AlertDefinitionCriteria crit = new AlertDefinitionCriteria();
+ crit.addFilterId(groupLevelAlertDefinitionId);
+ crit.fetchAlertNotifications(true);
+ crit.fetchConditions(true);
+
+ List<AlertDefinition> foundDefs = adm.findAlertDefinitionsByCriteria(subject, crit);
+
+ assertEquals("Failed to find the previously created group level alert definition.", 1, foundDefs.size());
+
+ AlertDefinition foundDef = foundDefs.get(0);
+
+ AlertNotification newNotif = createAlertNotificationForTest(foundDef, false);
+ //just add some dummy config property so that the 2 notifs are distinguishable from each other
+ //and are saved separately
+ newNotif.getConfiguration().put(new PropertySimple("foo-group", "bar"));
+
+ GroupAlertDefinitionManagerLocal gadm = LookupUtil.getGroupAlertDefinitionManager();
+ gadm.updateGroupAlertDefinitions(subject, foundDef, true);
+
+ //notice that the validation should be called just once, even though in effect we're creating 11 notifs
+ //1 for group and 10 for its members.
+ assertEquals("Validation should have been called for a new notification during alert def update", 1,
+ TestAlertSender.getValidateMethodCallCount());
+ }
+
+ //@Test(dependsOnMethods = "testCorrectSubjectPassedOnTemplateLevelAlertDefinitionCreation")
+ private void testCorrectSubjectPassedOnTemplateLevelAlertDefinitionUpdate() throws Exception {
+ TestAlertSender.setExpectedSubject(subject);
+ TestAlertSender.resetValidateMethodCallCount();
+
+ AlertDefinitionManagerLocal adm = LookupUtil.getAlertDefinitionManager();
+
+ AlertDefinitionCriteria crit = new AlertDefinitionCriteria();
+ crit.addFilterId(templateLevelAlertDefinitionId);
+ crit.fetchAlertNotifications(true);
+ crit.fetchConditions(true);
+
+ List<AlertDefinition> foundDefs = adm.findAlertDefinitionsByCriteria(subject, crit);
+
+ assertEquals("Failed to find the previously created template level alert definition.", 1, foundDefs.size());
+
+ AlertDefinition foundDef = foundDefs.get(0);
+
+ AlertNotification newNotif = createAlertNotificationForTest(foundDef, false);
+ //just add some dummy config property so that the 2 notifs are distinguishable from each other
+ //and are saved separately
+ newNotif.getConfiguration().put(new PropertySimple("foo-template", "bar"));
+
+ AlertTemplateManagerLocal atm = LookupUtil.getAlertTemplateManager();
+ atm.updateAlertTemplate(subject, foundDef, true);
+
+ //notice that the validation should be called just once, even though in effect we're creating 11 notifs
+ //1 for template and 10 for its members.
+ assertEquals("Validation should have been called for a new notification during alert def update", 1,
+ TestAlertSender.getValidateMethodCallCount());
+ }
+
+ private void removeNoExceptions(final Object o) {
+ try {
+ executeInTransaction(new TransactionCallback() {
+ public void execute() {
+ EntityManager em = getEntityManager();
+ Object o2 = em.merge(o);
+
+ if (o2 instanceof Resource) {
+ ResourceTreeHelper.deleteResource(em, (Resource) o2);
+ } else {
+ em.remove(o2);
+ }
+ }
+ });
+ } catch (Exception e) {
+ LOG.error("Failed to DELETE an object from database: " + o, e);
+ }
+ }
+
+ private AlertDefinition createDefinition(String name) {
+ AlertDefinition ret = new AlertDefinition();
+ ret.setName(name);
+ ret.setPriority(AlertPriority.MEDIUM);
+ ret.setAlertDampening(new AlertDampening(AlertDampening.Category.NONE));
+ ret.setConditionExpression(BooleanExpression.ANY);
+ ret.setRecoveryId(0);
+
+ return ret;
+ }
+
+ private AlertDefinition createDefinitionForTest(String name, boolean precanned) {
+ AlertDefinition def = createDefinition(name);
+ createAlertNotificationForTest(def, precanned);
+
+ return def;
+ }
+
+ private AlertNotification createAlertNotificationForTest(AlertDefinition alertDefinition, boolean precanned) {
+ AlertNotification notif = new AlertNotification("Test Alert Sender");
+
+ Configuration alertConfig = new Configuration();
+
+ if (precanned) {
+ alertConfig.put(new PropertySimple(TestAlertSender.PERSISTENT_PROPERTY_NAME,
+ TestAlertSender.PERSISTEN_PROPERTY_EXPECTED_VALUE));
+ } else {
+ alertConfig.put(new PropertySimple(TestAlertSender.PERSISTENT_PROPERTY_NAME, "persistent"));
+ alertConfig.put(new PropertySimple(TestAlertSender.EPHEMERAL_PROPERTY_NAME, "ephemeral"));
+ }
+
+ Configuration extraConfig = new Configuration();
+
+ if (precanned) {
+ extraConfig.put(new PropertySimple(TestAlertSender.PERSISTENT_PROPERTY_NAME,
+ TestAlertSender.PERSISTEN_PROPERTY_EXPECTED_VALUE));
+ } else {
+ extraConfig.put(new PropertySimple(TestAlertSender.PERSISTENT_PROPERTY_NAME, "persistent"));
+ extraConfig.put(new PropertySimple(TestAlertSender.EPHEMERAL_PROPERTY_NAME, "ephemeral"));
+ }
+
+ notif.setConfiguration(alertConfig);
+ notif.setExtraConfiguration(extraConfig);
+
+ alertDefinition.addAlertNotification(notif);
+ notif.setAlertDefinition(alertDefinition);
+
+ return notif;
+ }
+
+ private void testMainAlertDefinition(int id) {
+ AlertDefinitionCriteria crit = new AlertDefinitionCriteria();
+ crit.addFilterId(id);
+ crit.fetchAlertNotifications(true);
+
+ List<AlertDefinition> checkList = LookupUtil.getAlertDefinitionManager().findAlertDefinitionsByCriteria(
+ subject, crit);
+
+ assertNotNull("Failed to retrieve the save alert definition", checkList);
+ assertEquals("The alert definition should have been saved.", 1, checkList.size());
+
+ AlertDefinition check = checkList.get(0);
+
+ assertEquals("There should be exactly 1 notification on the definition", 1, check.getAlertNotifications()
+ .size());
+
+ Configuration config = check.getAlertNotifications().get(0).getConfiguration();
+ assertEquals("Unexpected persistent value in notif config", TestAlertSender.PERSISTEN_PROPERTY_EXPECTED_VALUE,
+ config.getSimpleValue(TestAlertSender.PERSISTENT_PROPERTY_NAME, null));
+ assertNull("Ephemeral property seems to have been saved",
+ config.getSimpleValue(TestAlertSender.EPHEMERAL_PROPERTY_NAME, null));
+ }
+
+ private List<AlertDefinition> testDependentAlertDefinitions(int expectedParentId, ParentType parentType) {
+ AlertDefinitionCriteria crit = new AlertDefinitionCriteria();
+
+ Set<Integer> resourceIds = new HashSet<Integer>(resources.size());
+ for (Resource r : resources) {
+ resourceIds.add(r.getId());
+ }
+
+ if (parentType == ParentType.TEMPLATE) {
+ crit.addFilterAlertTemplateParentId(expectedParentId);
+ } else if (parentType == ParentType.GROUP) {
+ crit.addFilterGroupAlertDefinitionId(expectedParentId);
+ }
+
+ crit.fetchAlertNotifications(true);
+
+ List<AlertDefinition> checkList = LookupUtil.getAlertDefinitionManager().findAlertDefinitionsByCriteria(
+ subject, crit);
+
+ assertNotNull("Failed to retrieve the save alert definition", checkList);
+ assertEquals("The dependent alert definitions should have been saved.", resources.size(), checkList.size());
+
+ for (AlertDefinition check : checkList) {
+ testSingleDependentAlertDefinition(check, parentType, expectedParentId);
+ }
+
+ return checkList;
+ }
+
+ private void testSingleDependentAlertDefinition(AlertDefinition alertDef, ParentType parentType,
+ int expectedParentId) {
+ assertEquals("There should be exactly 1 notification on the definition " + alertDef, 1, alertDef
+ .getAlertNotifications().size());
+
+ Configuration config = alertDef.getAlertNotifications().get(0).getConfiguration();
+ assertEquals("Unexpected persistent value in notif config " + alertDef,
+ TestAlertSender.PERSISTEN_PROPERTY_EXPECTED_VALUE,
+ config.getSimpleValue(TestAlertSender.PERSISTENT_PROPERTY_NAME, null));
+ assertNull("Ephemeral property seems to have been saved " + alertDef,
+ config.getSimpleValue(TestAlertSender.EPHEMERAL_PROPERTY_NAME, null));
+
+ if (parentType == ParentType.GROUP) {
+ assertEquals("The group parent id has unexpected value", expectedParentId, alertDef
+ .getGroupAlertDefinition().getId());
+ } else if (parentType == ParentType.TEMPLATE) {
+ assertEquals("The parent id has unexpected value", Integer.valueOf(expectedParentId),
+ alertDef.getParentId());
+ }
+ }
+
+ private Resource createResourceForTest(String resourceKey) {
+ Resource res = new ResourceBuilder().createPlatform().withRandomUuid().withResourceKey(resourceKey)
+ .withResourceType(resourceType).withName(resourceKey).withInventoryStatus(InventoryStatus.COMMITTED)
+ .build();
+ res.setAgent(agent);
+
+ return res;
+ }
+}
+
+///**
+// *
+// *
+// * @author Lukas Krejci
+// */
+//@Test(groups = "alert")
+//public class AlertDefinitionWithComplexNotificationsTest extends AbstractEJB3Test {
+//
+// private static final Log LOG = LogFactory.getLog(AlertDefinitionWithComplexNotificationsTest.class);
+//
+// private enum ParentType {
+// GROUP, TEMPLATE
+// }
+//
+// private String universalName;
+//
+// private Server server;
+// private Agent agent;
+// private Subject subject;
+// private Role role;
+// private ResourceType resourceType;
+// private ResourceGroup resourceGroup;
+// private Set<Resource> resources;
+// private AlertDefinition templateAlertDefinition;
+// private AlertDefinition groupAlertDefinition;
+// private AlertDefinition resourceAlertDefinition;
+// private ServerPlugin serverPlugin;
+// private Set<Object> junk = new LinkedHashSet<Object>();
+//
+// private int resourceLevelAlertDefinitionId;
+// private int groupLevelAlertDefinitionId;
+// private int templateLevelAlertDefinitionId;
+// private Resource copyTestsResource;
+//
+// private TestAlertSenderPluginService alertSenderService;
+// private TestServerCommunicationsService agentService;
+//
+// @BeforeClass
+// public void prepareDB() {
+// executeInTransaction(new TransactionCallback() {
+// @Override
+// public void execute() throws Exception {
+// EntityManager em = getEntityManager();
+//
+// universalName = getClass().getName();
+//
+// agent = new Agent("localhost", "localhost", 0, "foo", "bar");
+//
+// server = new Server();
+// server.setAddress("localhost");
+// server.setName("localhost");
+// server.setOperationMode(OperationMode.NORMAL);
+//
+// server.setAgents(Collections.singletonList(agent));
+//
+// role = new Role(universalName);
+// role.addPermission(Permission.MANAGE_INVENTORY);
+// role.addPermission(Permission.MANAGE_SETTINGS);
+//
+// subject = new Subject(universalName, true, false);
+// subject.addRole(role);
+//
+// resourceType =
+// new ResourceTypeBuilder().createPlatformResourceType().withId(0).withName(universalName)
+// .withPlugin(universalName).build();
+//
+// resourceGroup = new ResourceGroup(universalName, resourceType);
+//
+// resources = new LinkedHashSet<Resource>();
+// for (int i = 0; i < 10; ++i) {
+// Resource res = createResourceForTest(universalName + i);
+//
+// resources.add(res);
+//
+// resourceGroup.addExplicitResource(res);
+// }
+//
+// templateAlertDefinition = createDefinitionForTest(universalName + " template", true);
+// templateAlertDefinition.setResourceType(resourceType);
+//
+// groupAlertDefinition = createDefinitionForTest(universalName + " group", true);
+// groupAlertDefinition.setResourceGroup(resourceGroup);
+//
+// resourceAlertDefinition = createDefinitionForTest(universalName + " resource", true);
+// resourceAlertDefinition.setResource(resources.iterator().next());
+//
+// em.persist(agent);
+// em.persist(server);
+// em.persist(role);
+// em.persist(subject);
+// em.persist(resourceType);
+// em.persist(resourceGroup);
+// for (Resource r : resources) {
+// em.persist(r);
+// }
+// em.persist(templateAlertDefinition);
+// em.persist(groupAlertDefinition);
+// em.persist(resourceAlertDefinition);
+//
+// //only need this for a short time now, so that we can precreate the plugin structure
+// alertSenderService = new TestAlertSenderPluginService();
+// prepareCustomServerPluginService(alertSenderService);
+// alertSenderService.masterConfig.getPluginDirectory().mkdirs();
+// unprepareServerPluginService();
+//
+// JavaArchive archive =
+// ShrinkWrap.create(JavaArchive.class).addClass(TestAlertSender.class)
+// .addAsResource("test-alert-sender-serverplugin.xml", "META-INF/rhq-serverplugin.xml");
+//
+// File pluginFile =
+// new File(alertSenderService.masterConfig.getPluginDirectory(), "test-aler-plugin.jar");
+//
+// archive.as(ZipExporter.class).exportTo(pluginFile, true);
+//
+// //the alert sender plugin manager needs the plugins in the database...
+// serverPlugin = TestServerPluginService.getPlugin(pluginFile.toURI().toURL());
+// em.persist(serverPlugin);
+// }
+// });
+// }
+//
+// @BeforeMethod
+// public void containerSetup() {
+// alertSenderService = new TestAlertSenderPluginService();
+// prepareCustomServerPluginService(alertSenderService);
+// alertSenderService.masterConfig.getPluginDirectory().mkdirs();
+//
+// alertSenderService.startMasterPluginContainer();
+//
+// agentService = prepareForTestAgents();
+// }
+//
+// @AfterMethod
+// public void containerTearDown() throws Exception {
+// unprepareServerPluginService();
+// unprepareForTestAgents();
+// }
+//
+// @AfterClass(alwaysRun = true)
+// public void cleanDB() throws Exception {
+// for (Object o : junk) {
+// removeNoExceptions(o);
+// }
+//
+// removeNoExceptions(resourceAlertDefinition);
+// removeNoExceptions(groupAlertDefinition);
+// removeNoExceptions(templateAlertDefinition);
+// removeNoExceptions(resourceGroup);
+// for (Resource r : resources) {
+// r.removeExplicitGroup(resourceGroup);
+// r.getAlertDefinitions().clear();
+// removeNoExceptions(r);
+// }
+// removeNoExceptions(resourceType);
+// removeNoExceptions(subject);
+// removeNoExceptions(role);
+// removeNoExceptions(server);
+// removeNoExceptions(agent);
+//
+// removeNoExceptions(serverPlugin);
+// }
+//
+// @BeforeMethod
+// public void login() throws Exception {
+// //the embedded server cannot do a full-blown login
+// //so we hack our way in
+// subject = SessionManager.getInstance().put(subject);
+// }
+//
+// @AfterMethod(alwaysRun = true)
+// public void logout() throws Exception {
+// SessionManager.getInstance().invalidate(subject.getSessionId());
+// }
+//
+// private Resource getCopyTestsResource() throws Exception {
+// if (copyTestsResource == null) {
+// final String keyAndName = universalName + "-copyTests";
+//
+// LookupUtil.getResourceManager().createResource(subject, createResourceForTest(keyAndName), Resource.ROOT_ID);
+//
+// //ok, now the new resource should contain the alert definition defined by the template
+// ResourceCriteria crit = new ResourceCriteria();
+// crit.addFilterResourceKey(keyAndName);
+// crit.fetchExplicitGroups(true); //so that cleanup works
+// crit.fetchAlertDefinitions(true); //so that cleanup works
+//
+// List<Resource> foundResources = LookupUtil.getResourceManager().findResourcesByCriteria(subject, crit);
+//
+// assertEquals("A new resource should have been created", 1, foundResources.size());
+//
+// Resource res = foundResources.get(0);
+// resources.add(res);
+//
+// copyTestsResource = res;
+// }
+//
+// return copyTestsResource;
+// }
+//
+// public void testNotificationsCopiedOnAlertTemplateApplication() throws Exception {
+// TestAlertSender.setExpectedSubject(null);
+// TestAlertSender.resetValidateMethodCallCount();
+//
+// Resource res = getCopyTestsResource();
+//
+// //apply the template manually - this is done in server-agent back-and-forth that we
+// //don't test here and which is complex to mock out.
+// //this method has to be called using the overlord subject
+// LookupUtil.getAlertTemplateManager().updateAlertDefinitionsForResource(LookupUtil.getSubjectManager().getOverlord(), res.getId());
+//
+// assertEquals("No validation should occur on the copied notifications", 0, TestAlertSender.getValidateMethodCallCount());
+//
+// AlertDefinitionManagerLocal adm = LookupUtil.getAlertDefinitionManager();
+// AlertDefinitionCriteria adCrit = new AlertDefinitionCriteria();
+// adCrit.addFilterResourceIds(res.getId());
+// adCrit.fetchAlertNotifications(true);
+//
+// List<AlertDefinition> foundAlertDefs = adm.findAlertDefinitionsByCriteria(subject, adCrit);
+// junk.addAll(foundAlertDefs);
+//
+// assertEquals("The new resource should have an alert definition obtained from the template.", 1, foundAlertDefs.size());
+//
+// AlertDefinition defWithNotifications = foundAlertDefs.get(0);
+//
+// testSingleDependentAlertDefinition(defWithNotifications, ParentType.TEMPLATE, defWithNotifications.getParentId());
+// }
+//
+// @Test(dependsOnMethods = "testNotificationsCopiedOnAlertTemplateApplication")
+// public void testNotificationsCopiedOnGroupMemberAddition() throws Exception {
+// TestAlertSender.setExpectedSubject(null);
+// TestAlertSender.resetValidateMethodCallCount();
+//
+// Resource res = getCopyTestsResource();
+//
+// LookupUtil.getResourceGroupManager().addResourcesToGroup(subject, resourceGroup.getId(), new int[] { res.getId() });
+//
+// assertEquals("No validation should occur on the copied notifications", 0, TestAlertSender.getValidateMethodCallCount());
+//
+// AlertDefinitionManagerLocal adm = LookupUtil.getAlertDefinitionManager();
+// AlertDefinitionCriteria adCrit = new AlertDefinitionCriteria();
+// adCrit.addFilterResourceIds(res.getId());
+// adCrit.fetchAlertNotifications(true);
+//
+// List<AlertDefinition> foundAlertDefs = adm.findAlertDefinitionsByCriteria(subject, adCrit);
+// junk.addAll(foundAlertDefs);
+//
+// //1 from the group, 1 from the template
+// assertEquals("The new resource should have an alert definition obtained from the group.", 2, foundAlertDefs.size());
+//
+// AlertDefinition groupOriginatingDef = null;
+// for(AlertDefinition d : foundAlertDefs) {
+// if ((universalName + " group").equals(d.getName())) {
+// groupOriginatingDef = d;
+// break;
+// }
+// }
+//
+// assertNotNull("The alert definition originating from the group not present on the resource.", groupOriginatingDef);
+//
+// testSingleDependentAlertDefinition(groupOriginatingDef, ParentType.GROUP, groupOriginatingDef.getGroupAlertDefinition().getId());
+// }
+//
+// public void testCorrectSubjectPassedOnResourceLevelAlertDefinitionCreation() throws Exception {
+// TestAlertSender.setExpectedSubject(subject);
+//
+// AlertDefinitionManagerLocal adm = LookupUtil.getAlertDefinitionManager();
+//
+// Resource res = resources.iterator().next();
+//
+// AlertDefinition def = createDefinitionForTest("testCorrectSubjectPassedOnResourceLevelAlertDefinitionCreation", false);
+// def.setResource(resources.iterator().next());
+//
+// int id = adm.createAlertDefinition(subject, def, res.getId(), true);
+// def.setId(id);
+//
+// resourceLevelAlertDefinitionId = id;
+//
+// junk.add(def);
+//
+// testMainAlertDefinition(id);
+// }
+//
+// @Test(dependsOnMethods = { "testNotificationsCopiedOnAlertTemplateApplication", "testNotificationsCopiedOnGroupMemberAddition" })
+// public void testCorrectSubjectPassedOnGroupLevelAlertDefinitionCreation() throws Exception {
+// TestAlertSender.setExpectedSubject(subject);
+//
+// GroupAlertDefinitionManagerLocal gadm = LookupUtil.getGroupAlertDefinitionManager();
+//
+// AlertDefinition def = createDefinitionForTest("testCorrectSubjectPassedOnGroupLevelAlertDefinitionCreation", false);
+// def.setResourceGroup(resourceGroup);
+//
+// int id = gadm.createGroupAlertDefinitions(subject, def, resourceGroup.getId());
+// def.setId(id);
+//
+// groupLevelAlertDefinitionId = id;
+//
+// junk.add(def);
+//
+// testMainAlertDefinition(id);
+// List<AlertDefinition> deps = testDependentAlertDefinitions(id, ParentType.GROUP);
+//
+// junk.addAll(deps);
+// }
+//
+// @Test(dependsOnMethods = { "testNotificationsCopiedOnAlertTemplateApplication", "testNotificationsCopiedOnGroupMemberAddition" })
+// public void testCorrectSubjectPassedOnTemplateLevelAlertDefinitionCreation() throws Exception {
+// TestAlertSender.setExpectedSubject(subject);
+//
+// AlertTemplateManagerLocal atm = LookupUtil.getAlertTemplateManager();
+//
+// AlertDefinition def = createDefinitionForTest("testCorrectSubjectPassedOnTemplateLevelAlertDefinitionCreation", false);
+// def.setResourceGroup(resourceGroup);
+//
+// int id = atm.createAlertTemplate(subject, def, resourceType.getId());
+// def.setId(id);
+//
+// templateLevelAlertDefinitionId = id;
+//
+// junk.add(def);
+//
+// testMainAlertDefinition(id);
+// List<AlertDefinition> deps = testDependentAlertDefinitions(id, ParentType.TEMPLATE);
+//
+// junk.addAll(deps);
+// }
+//
+// @Test(dependsOnMethods = "testCorrectSubjectPassedOnResourceLevelAlertDefinitionCreation")
+// public void testNoValidationWhenNoNotificationUpdateOnResourceLevel() throws Exception {
+// TestAlertSender.setExpectedSubject(subject);
+// TestAlertSender.resetValidateMethodCallCount();
+//
+// AlertDefinitionManagerLocal adm = LookupUtil.getAlertDefinitionManager();
+//
+// AlertDefinitionCriteria crit = new AlertDefinitionCriteria();
+// crit.addFilterId(resourceLevelAlertDefinitionId);
+// crit.fetchAlertNotifications(true);
+// crit.fetchConditions(true);
+//
+// List<AlertDefinition> foundDefs = adm.findAlertDefinitionsByCriteria(subject, crit);
+//
+// assertEquals("Failed to find the previously created resource level alert definition.", 1, foundDefs.size());
+//
+// AlertDefinition foundDef = foundDefs.get(0);
+//
+// foundDef.setEnabled(true);
+//
+// adm.updateAlertDefinition(subject, resourceLevelAlertDefinitionId, foundDef, false);
+//
+// assertEquals("The notification validation method shouldn't have been called", 0, TestAlertSender.getValidateMethodCallCount());
+// }
+//
+// @Test(dependsOnMethods = "testCorrectSubjectPassedOnGroupLevelAlertDefinitionCreation")
+// public void testNoValidationWhenNoNotificationUpdateOnGroupLevel() throws Exception {
+// TestAlertSender.setExpectedSubject(subject);
+// TestAlertSender.resetValidateMethodCallCount();
+//
+// AlertDefinitionManagerLocal adm = LookupUtil.getAlertDefinitionManager();
+//
+// AlertDefinitionCriteria crit = new AlertDefinitionCriteria();
+// crit.addFilterId(groupLevelAlertDefinitionId);
+// crit.fetchAlertNotifications(true);
+// crit.fetchConditions(true);
+//
+// List<AlertDefinition> foundDefs = adm.findAlertDefinitionsByCriteria(subject, crit);
+//
+// assertEquals("Failed to find the previously created group level alert definition.", 1, foundDefs.size());
+//
+// AlertDefinition foundDef = foundDefs.get(0);
+//
+// foundDef.setEnabled(true);
+//
+// GroupAlertDefinitionManagerLocal gadm = LookupUtil.getGroupAlertDefinitionManager();
+// gadm.updateGroupAlertDefinitions(subject, foundDef, true);
+//
+// assertEquals("The notification validation method shouldn't have been called", 0, TestAlertSender.getValidateMethodCallCount());
+// }
+//
+// @Test(dependsOnMethods = "testCorrectSubjectPassedOnTemplateLevelAlertDefinitionCreation")
+// public void testNoValidationWhenNoNotificationUpdateOnTemplateLevel() throws Exception {
+// TestAlertSender.setExpectedSubject(subject);
+// TestAlertSender.resetValidateMethodCallCount();
+//
+// AlertDefinitionManagerLocal adm = LookupUtil.getAlertDefinitionManager();
+//
+// AlertDefinitionCriteria crit = new AlertDefinitionCriteria();
+// crit.addFilterId(templateLevelAlertDefinitionId);
+// crit.fetchAlertNotifications(true);
+// crit.fetchConditions(true);
+//
+// List<AlertDefinition> foundDefs = adm.findAlertDefinitionsByCriteria(subject, crit);
+//
+// assertEquals("Failed to find the previously created resource level alert definition.", 1, foundDefs.size());
+//
+// AlertDefinition foundDef = foundDefs.get(0);
+//
+// foundDef.setEnabled(true);
+//
+// AlertTemplateManagerLocal atm = LookupUtil.getAlertTemplateManager();
+//
+// atm.updateAlertTemplate(subject, foundDef, true);
+//
+// assertEquals("The notification validation method shouldn't have been called", 0, TestAlertSender.getValidateMethodCallCount());
+// }
+//
+// @Test(dependsOnMethods = "testNoValidationWhenNoNotificationUpdateOnResourceLevel")
+// public void testCorrectSubjectPassedOnResourceLevelAlertDefinitionUpdate() throws Exception {
+// TestAlertSender.setExpectedSubject(subject);
+// TestAlertSender.resetValidateMethodCallCount();
+//
+// AlertDefinitionManagerLocal adm = LookupUtil.getAlertDefinitionManager();
+//
+// AlertDefinitionCriteria crit = new AlertDefinitionCriteria();
+// crit.addFilterId(resourceLevelAlertDefinitionId);
+// crit.fetchAlertNotifications(true);
+// crit.fetchConditions(true);
+//
+// List<AlertDefinition> foundDefs = adm.findAlertDefinitionsByCriteria(subject, crit);
+//
+// assertEquals("Failed to find the previously created resource level alert definition.", 1, foundDefs.size());
+//
+// AlertDefinition foundDef = foundDefs.get(0);
+//
+// AlertNotification newNotif = createAlertNotificationForTest(foundDef, false);
+// //just add some dummy config property so that the 2 notifs are distinguishable from each other
+// //and are saved separately
+// newNotif.getConfiguration().put(new PropertySimple("foo-resource", "bar"));
+//
+// adm.updateAlertDefinition(subject, resourceLevelAlertDefinitionId, foundDef, false);
+//
+// assertEquals("Validation should have been called for a new notification during alert def update", 1, TestAlertSender.getValidateMethodCallCount());
+// }
+//
+// @Test(dependsOnMethods = "testCorrectSubjectPassedOnGroupLevelAlertDefinitionCreation")
+// public void testCorrectSubjectPassedOnGroupLevelAlertDefinitionUpdate() throws Exception {
+// TestAlertSender.setExpectedSubject(subject);
+// TestAlertSender.resetValidateMethodCallCount();
+//
+// AlertDefinitionManagerLocal adm = LookupUtil.getAlertDefinitionManager();
+//
+// AlertDefinitionCriteria crit = new AlertDefinitionCriteria();
+// crit.addFilterId(groupLevelAlertDefinitionId);
+// crit.fetchAlertNotifications(true);
+// crit.fetchConditions(true);
+//
+// List<AlertDefinition> foundDefs = adm.findAlertDefinitionsByCriteria(subject, crit);
+//
+// assertEquals("Failed to find the previously created group level alert definition.", 1, foundDefs.size());
+//
+// AlertDefinition foundDef = foundDefs.get(0);
+//
+// AlertNotification newNotif = createAlertNotificationForTest(foundDef, false);
+// //just add some dummy config property so that the 2 notifs are distinguishable from each other
+// //and are saved separately
+// newNotif.getConfiguration().put(new PropertySimple("foo-group", "bar"));
+//
+// GroupAlertDefinitionManagerLocal gadm = LookupUtil.getGroupAlertDefinitionManager();
+// gadm.updateGroupAlertDefinitions(subject, foundDef, true);
+//
+// //notice that the validation should be called just once, even though in effect we're creating 11 notifs
+// //1 for group and 10 for its members.
+// assertEquals("Validation should have been called for a new notification during alert def update", 1, TestAlertSender.getValidateMethodCallCount());
+// }
+//
+// @Test(dependsOnMethods = "testCorrectSubjectPassedOnTemplateLevelAlertDefinitionCreation")
+// public void testCorrectSubjectPassedOnTemplateLevelAlertDefinitionUpdate() throws Exception {
+// TestAlertSender.setExpectedSubject(subject);
+// TestAlertSender.resetValidateMethodCallCount();
+//
+// AlertDefinitionManagerLocal adm = LookupUtil.getAlertDefinitionManager();
+//
+// AlertDefinitionCriteria crit = new AlertDefinitionCriteria();
+// crit.addFilterId(templateLevelAlertDefinitionId);
+// crit.fetchAlertNotifications(true);
+// crit.fetchConditions(true);
+//
+// List<AlertDefinition> foundDefs = adm.findAlertDefinitionsByCriteria(subject, crit);
+//
+// assertEquals("Failed to find the previously created template level alert definition.", 1, foundDefs.size());
+//
+// AlertDefinition foundDef = foundDefs.get(0);
+//
+// AlertNotification newNotif = createAlertNotificationForTest(foundDef, false);
+// //just add some dummy config property so that the 2 notifs are distinguishable from each other
+// //and are saved separately
+// newNotif.getConfiguration().put(new PropertySimple("foo-template", "bar"));
+//
+// AlertTemplateManagerLocal atm = LookupUtil.getAlertTemplateManager();
+// atm.updateAlertTemplate(subject, foundDef, true);
+//
+// //notice that the validation should be called just once, even though in effect we're creating 11 notifs
+// //1 for template and 10 for its members.
+// assertEquals("Validation should have been called for a new notification during alert def update", 1, TestAlertSender.getValidateMethodCallCount());
+// }
+//
+// private void removeNoExceptions(final Object o) {
+// try {
+// executeInTransaction(new TransactionCallback() {
+// public void execute() {
+// EntityManager em = getEntityManager();
+// Object o2 = em.merge(o);
+//
+// if (o2 instanceof Resource) {
+// ResourceTreeHelper.deleteResource(em, (Resource) o2);
+// } else {
+// em.remove(o2);
+// }
+// }
+// });
+// } catch (Exception e) {
+// LOG.error("Failed to DELETE an object from database: " + o, e);
+// }
+// }
+//
+// private AlertDefinition createDefinition(String name) {
+// AlertDefinition ret = new AlertDefinition();
+// ret.setName(name);
+// ret.setPriority(AlertPriority.MEDIUM);
+// ret.setAlertDampening(new AlertDampening(AlertDampening.Category.NONE));
+// ret.setConditionExpression(BooleanExpression.ANY);
+// ret.setRecoveryId(0);
+//
+// return ret;
+// }
+//
+// private AlertDefinition createDefinitionForTest(String name, boolean precanned) {
+// AlertDefinition def = createDefinition(name);
+// createAlertNotificationForTest(def, precanned);
+//
+// return def;
+// }
+//
+// private AlertNotification createAlertNotificationForTest(AlertDefinition alertDefinition, boolean precanned) {
+// AlertNotification notif = new AlertNotification("Test Alert Sender");
+//
+// Configuration alertConfig = new Configuration();
+//
+// if (precanned) {
+// alertConfig.put(new PropertySimple(TestAlertSender.PERSISTENT_PROPERTY_NAME, TestAlertSender.PERSISTEN_PROPERTY_EXPECTED_VALUE));
+// } else {
+// alertConfig.put(new PropertySimple(TestAlertSender.PERSISTENT_PROPERTY_NAME, "persistent"));
+// alertConfig.put(new PropertySimple(TestAlertSender.EPHEMERAL_PROPERTY_NAME, "ephemeral"));
+// }
+//
+// Configuration extraConfig = new Configuration();
+//
+// if (precanned) {
+// extraConfig.put(new PropertySimple(TestAlertSender.PERSISTENT_PROPERTY_NAME, TestAlertSender.PERSISTEN_PROPERTY_EXPECTED_VALUE));
+// } else {
+// extraConfig.put(new PropertySimple(TestAlertSender.PERSISTENT_PROPERTY_NAME, "persistent"));
+// extraConfig.put(new PropertySimple(TestAlertSender.EPHEMERAL_PROPERTY_NAME, "ephemeral"));
+// }
+//
+// notif.setConfiguration(alertConfig);
+// notif.setExtraConfiguration(extraConfig);
+//
+// alertDefinition.addAlertNotification(notif);
+// notif.setAlertDefinition(alertDefinition);
+//
+// return notif;
+// }
+//
+// private void testMainAlertDefinition(int id) {
+// AlertDefinitionCriteria crit = new AlertDefinitionCriteria();
+// crit.addFilterId(id);
+// crit.fetchAlertNotifications(true);
+//
+// List<AlertDefinition> checkList =
+// LookupUtil.getAlertDefinitionManager().findAlertDefinitionsByCriteria(subject, crit);
+//
+// assertNotNull("Failed to retrieve the save alert definition", checkList);
+// assertEquals("The alert definition should have been saved.", 1, checkList.size());
+//
+// AlertDefinition check = checkList.get(0);
+//
+// assertEquals("There should be exactly 1 notification on the definition", 1, check.getAlertNotifications()
+// .size());
+//
+// Configuration config = check.getAlertNotifications().get(0).getConfiguration();
+// assertEquals("Unexpected persistent value in notif config", TestAlertSender.PERSISTEN_PROPERTY_EXPECTED_VALUE,
+// config.getSimpleValue(TestAlertSender.PERSISTENT_PROPERTY_NAME, null));
+// assertNull("Ephemeral property seems to have been saved",
+// config.getSimpleValue(TestAlertSender.EPHEMERAL_PROPERTY_NAME, null));
+// }
+//
+// private List<AlertDefinition> testDependentAlertDefinitions(int expectedParentId, ParentType parentType) {
+// AlertDefinitionCriteria crit = new AlertDefinitionCriteria();
+//
+// Set<Integer> resourceIds = new HashSet<Integer>(resources.size());
+// for (Resource r : resources) {
+// resourceIds.add(r.getId());
+// }
+//
+// if (parentType == ParentType.TEMPLATE) {
+// crit.addFilterAlertTemplateParentId(expectedParentId);
+// } else if (parentType == ParentType.GROUP) {
+// crit.addFilterGroupAlertDefinitionId(expectedParentId);
+// }
+//
+// crit.fetchAlertNotifications(true);
+//
+// List<AlertDefinition> checkList =
+// LookupUtil.getAlertDefinitionManager().findAlertDefinitionsByCriteria(subject, crit);
+//
+// assertNotNull("Failed to retrieve the save alert definition", checkList);
+// assertEquals("The dependent alert definitions should have been saved.", resources.size(), checkList.size());
+//
+// for (AlertDefinition check : checkList) {
+// testSingleDependentAlertDefinition(check, parentType, expectedParentId);
+// }
+//
+// return checkList;
+// }
+//
+// private void testSingleDependentAlertDefinition(AlertDefinition alertDef, ParentType parentType, int expectedParentId) {
+// assertEquals("There should be exactly 1 notification on the definition " + alertDef, 1, alertDef
+// .getAlertNotifications().size());
+//
+// Configuration config = alertDef.getAlertNotifications().get(0).getConfiguration();
+// assertEquals("Unexpected persistent value in notif config " + alertDef,
+// TestAlertSender.PERSISTEN_PROPERTY_EXPECTED_VALUE,
+// config.getSimpleValue(TestAlertSender.PERSISTENT_PROPERTY_NAME, null));
+// assertNull("Ephemeral property seems to have been saved " + alertDef,
+// config.getSimpleValue(TestAlertSender.EPHEMERAL_PROPERTY_NAME, null));
+//
+// if (parentType == ParentType.GROUP) {
+// assertEquals("The group parent id has unexpected value", expectedParentId, alertDef.getGroupAlertDefinition().getId());
+// } else if (parentType == ParentType.TEMPLATE) {
+// assertEquals("The parent id has unexpected value", Integer.valueOf(expectedParentId), alertDef.getParentId());
+// }
+// }
+//
+// private Resource createResourceForTest(String resourceKey) {
+// Resource res = new ResourceBuilder().createPlatform().withRandomUuid().withResourceKey(resourceKey)
+// .withResourceType(resourceType).withName(resourceKey)
+// .withInventoryStatus(InventoryStatus.COMMITTED).build();
+// res.setAgent(agent);
+//
+// return res;
+// }
+//}
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/alert/TestAlertSender.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/alert/TestAlertSender.java
new file mode 100644
index 0000000..900d74c
--- /dev/null
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/alert/TestAlertSender.java
@@ -0,0 +1,107 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2012 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+package org.rhq.enterprise.server.alert;
+
+import org.testng.Assert;
+
+import org.rhq.core.domain.alert.Alert;
+import org.rhq.core.domain.alert.notification.SenderResult;
+import org.rhq.core.domain.auth.Subject;
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.PropertySimple;
+import org.rhq.enterprise.server.plugin.pc.ServerPluginComponent;
+import org.rhq.enterprise.server.plugin.pc.alert.AlertSender;
+import org.rhq.enterprise.server.plugin.pc.alert.AlertSenderValidationResults;
+
+/**
+ *
+ *
+ * @author Lukas Krejci
+ */
+public class TestAlertSender extends AlertSender<ServerPluginComponent> {
+
+ public static final String NAME = "Test Alert Sender";
+
+ public static final String PERSISTENT_PROPERTY_NAME = "persistent";
+ public static final String PERSISTEN_PROPERTY_EXPECTED_VALUE = "persistentephemeral";
+ public static final String EPHEMERAL_PROPERTY_NAME = "ephemeral";
+
+ private static Subject EXPECTED_SUBJECT;
+ private static volatile int VALIDATE_METHOD_CALL_COUNT;
+ private static Runnable VALIDATION_CHECKER;
+
+ public static void setExpectedSubject(Subject subject) {
+ EXPECTED_SUBJECT = subject;
+ }
+
+ public static void setValidationChecker(Runnable validationChecker) {
+ VALIDATION_CHECKER = validationChecker;
+ }
+
+ public static int getValidateMethodCallCount() {
+ return VALIDATE_METHOD_CALL_COUNT;
+ }
+
+ public static void resetValidateMethodCallCount() {
+ VALIDATE_METHOD_CALL_COUNT = 0;
+ }
+
+ @Override
+ public SenderResult send(Alert alert) {
+ SenderResult ret = new SenderResult();
+ ret.addSuccessMessage("kachny");
+
+ return ret;
+ }
+
+ @Override
+ public AlertSenderValidationResults validateAndFinalizeConfiguration(Subject subject) {
+ ++VALIDATE_METHOD_CALL_COUNT;
+
+ if (EXPECTED_SUBJECT != null && !subject.equals(EXPECTED_SUBJECT)) {
+ throw new AssertionError("Unexpected subject. Expected " + EXPECTED_SUBJECT + " but was " + subject);
+ }
+
+ if (VALIDATION_CHECKER != null) {
+ VALIDATION_CHECKER.run();
+ }
+
+ if (alertParameters.getSimple(EPHEMERAL_PROPERTY_NAME) == null) {
+ Assert.fail("Ephemeral property not present in alert parameters during validation. This should never happen.");
+ }
+
+ if (extraParameters.getSimple(EPHEMERAL_PROPERTY_NAME) == null) {
+ Assert.fail("Ephemeral property not present in extra parameters during validation. This should never happen.");
+ }
+
+ updateConfig(alertParameters);
+ updateConfig(extraParameters);
+
+ return new AlertSenderValidationResults(alertParameters, extraParameters);
+ }
+
+ private void updateConfig(Configuration configuration) {
+ String persistentValue = configuration.getSimpleValue(PERSISTENT_PROPERTY_NAME, "");
+ String ephemeralValue = configuration.getSimpleValue(EPHEMERAL_PROPERTY_NAME, "");
+
+ configuration.put(new PropertySimple(PERSISTENT_PROPERTY_NAME, persistentValue + ephemeralValue));
+ configuration.remove(EPHEMERAL_PROPERTY_NAME);
+ }
+}
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/alert/TestAlertSenderPluginService.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/alert/TestAlertSenderPluginService.java
new file mode 100644
index 0000000..9aae985
--- /dev/null
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/alert/TestAlertSenderPluginService.java
@@ -0,0 +1,67 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2012 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+package org.rhq.enterprise.server.alert;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.rhq.core.domain.plugin.ServerPlugin;
+import org.rhq.enterprise.server.TestServerPluginService;
+import org.rhq.enterprise.server.plugin.pc.AbstractTypeServerPluginContainer;
+import org.rhq.enterprise.server.plugin.pc.MasterServerPluginContainer;
+import org.rhq.enterprise.server.plugin.pc.ServerPluginEnvironment;
+import org.rhq.enterprise.server.plugin.pc.ServerPluginManager;
+import org.rhq.enterprise.server.plugin.pc.alert.AlertSenderPluginManager;
+import org.rhq.enterprise.server.plugin.pc.alert.AlertServerPluginContainer;
+
+/**
+ *
+ *
+ * @author Lukas Krejci
+ */
+public class TestAlertSenderPluginService extends TestServerPluginService {
+
+ @Override
+ protected List<AbstractTypeServerPluginContainer> createPluginContainers(MasterServerPluginContainer master) {
+ return Collections.<AbstractTypeServerPluginContainer>singletonList(new TestAlertServerPluginContainer(master));
+ }
+
+ class TestAlertServerPluginContainer extends AlertServerPluginContainer {
+ public TestAlertServerPluginContainer(MasterServerPluginContainer master) {
+ super(master);
+ }
+
+ @Override
+ protected ServerPluginManager createPluginManager() {
+ return new TestAlertServerPluginManager(this);
+ }
+ }
+
+ class TestAlertServerPluginManager extends AlertSenderPluginManager {
+ public TestAlertServerPluginManager(AlertServerPluginContainer pc) {
+ super(pc);
+ }
+
+ @Override
+ protected ServerPlugin getPlugin(ServerPluginEnvironment env) {
+ return TestServerPluginService.getPlugin(env);
+ }
+ }
+}
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/content/test/AdvisoryManagerBeanTest.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/content/test/AdvisoryManagerBeanTest.java
index abbd145..e7c0b35 100644
--- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/content/test/AdvisoryManagerBeanTest.java
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/content/test/AdvisoryManagerBeanTest.java
@@ -3,8 +3,6 @@ package org.rhq.enterprise.server.content.test;
import javax.persistence.EntityManager;
import javax.transaction.TransactionManager;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.rhq.core.domain.auth.Subject;
@@ -34,8 +32,8 @@ public class AdvisoryManagerBeanTest extends AbstractEJB3Test {
private Subject overlord;
private PackageType packageType1;
- @BeforeMethod
- public void setupBeforeMethod() throws Exception {
+ @Override
+ protected void beforeMethod() throws Exception {
TransactionManager tx = getTransactionManager();
tx.begin();
@@ -44,8 +42,8 @@ public class AdvisoryManagerBeanTest extends AbstractEJB3Test {
overlord = LookupUtil.getSubjectManager().getOverlord();
}
- @AfterMethod
- public void tearDownAfterMethod() throws Exception {
+ @Override
+ protected void afterMethod() throws Exception {
TransactionManager tx = getTransactionManager();
if (tx != null) {
tx.rollback();
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/drift/AbstractDriftServerTest.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/drift/AbstractDriftServerTest.java
new file mode 100644
index 0000000..3f1fa2a
--- /dev/null
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/drift/AbstractDriftServerTest.java
@@ -0,0 +1,264 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2011 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.server.drift;
+
+import static org.rhq.core.domain.resource.ResourceCategory.SERVER;
+import static org.rhq.enterprise.server.util.LookupUtil.getSubjectManager;
+
+import java.io.File;
+import java.lang.reflect.Method;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.NoResultException;
+import javax.persistence.NonUniqueResultException;
+
+import org.apache.commons.io.FileUtils;
+import org.testng.annotations.Test;
+
+import org.rhq.core.domain.auth.Subject;
+import org.rhq.core.domain.criteria.ResourceCriteria;
+import org.rhq.core.domain.drift.Drift;
+import org.rhq.core.domain.drift.DriftDefinition;
+import org.rhq.core.domain.drift.DriftDefinitionTemplate;
+import org.rhq.core.domain.resource.Agent;
+import org.rhq.core.domain.resource.Resource;
+import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.core.domain.shared.ResourceBuilder;
+import org.rhq.core.domain.shared.ResourceTypeBuilder;
+import org.rhq.enterprise.server.plugin.ServerPluginsLocal;
+import org.rhq.enterprise.server.test.AbstractEJB3Test;
+import org.rhq.enterprise.server.test.TestServerCommunicationsService;
+import org.rhq.enterprise.server.test.TransactionCallback;
+import org.rhq.enterprise.server.util.LookupUtil;
+import org.rhq.enterprise.server.util.ResourceTreeHelper;
+
+@Test(groups = "drift")
+public abstract class AbstractDriftServerTest extends AbstractEJB3Test {
+
+ protected final String RESOURCE_TYPE_NAME = getClass().getSimpleName() + "_RESOURCE_TYPE";
+
+ protected final String AGENT_NAME = getClass().getSimpleName() + "_AGENT";
+
+ protected final String RESOURCE_NAME = getClass().getSimpleName() + "_RESOURCE";
+
+ private ServerPluginsLocal serverPluginsMgr;
+
+ protected DriftServerPluginService driftServerPluginService;
+
+ protected TestServerCommunicationsService agentServiceContainer;
+
+ protected ResourceType resourceType;
+
+ protected Agent agent;
+
+ protected Resource resource;
+
+ // This is supposed to be an AfterClass method to do final cleanup, but Arquillian currently
+ // runs the entire Suite lifecycle on each test. So, Before/AfterXXX all act like Before/AfterMethod.
+ // So, it does nothing for now unless called from a superclass, and we simply leave junk in the DB.
+ //@AfterClass
+ protected void afterClass() throws Exception {
+ purgeDB();
+ executeInTransaction(false, new TransactionCallback() {
+ @Override
+ public void execute() throws Exception {
+ purgeDB(getEntityManager());
+ }
+ });
+ }
+
+ @Override
+ protected void beforeMethod(Method testMethod) throws Exception {
+
+ initDriftServer();
+ initAgentServices();
+
+ InitDB annotation = testMethod.getAnnotation(InitDB.class);
+ if (annotation == null || annotation.value()) {
+ initDB();
+ } else {
+ fetchDB();
+ }
+ }
+
+ @Override
+ protected void afterMethod() throws Exception {
+ shutDownDriftServer();
+ shutDownAgentServices();
+ }
+
+ private void initDriftServer() throws Exception {
+ driftServerPluginService = new DriftServerPluginService();
+ prepareCustomServerPluginService(driftServerPluginService);
+ driftServerPluginService.masterConfig.getPluginDirectory().mkdirs();
+
+ String projectVersion = System.getProperty("project.version");
+
+ File jpaDriftPlugin = new File("../plugins/drift-rhq/target/rhq-serverplugin-drift-" + projectVersion + ".jar");
+ assertTrue("Drift server plugin JAR file not found at" + jpaDriftPlugin.getPath(), jpaDriftPlugin.exists());
+ FileUtils.copyFileToDirectory(jpaDriftPlugin, driftServerPluginService.masterConfig.getPluginDirectory());
+
+ driftServerPluginService.startMasterPluginContainer();
+
+ //serverPluginsMgr = LookupUtil.getServerPlugins();
+ }
+
+ private void initAgentServices() {
+ agentServiceContainer = prepareForTestAgents();
+ agentServiceContainer.driftService = new TestDefService();
+ }
+
+ private void shutDownDriftServer() throws Exception {
+ unprepareServerPluginService();
+ //already done by the above call
+ //driftServerPluginService.stopMasterPluginContainer();
+ }
+
+ private void shutDownAgentServices() {
+ agentServiceContainer = null;
+ unprepareForTestAgents();
+ }
+
+ private void initDB() throws Exception {
+ purgeDB();
+ executeInTransaction(false, new TransactionCallback() {
+ @Override
+ public void execute() throws Exception {
+ EntityManager em = getEntityManager();
+ initResourceType();
+ initAgent();
+ initResource();
+
+ em.persist(resourceType);
+ em.persist(agent);
+ resource.setAgent(agent);
+ em.persist(resource);
+
+ initDB(em);
+ }
+ });
+ }
+
+ private void fetchDB() throws Exception {
+ executeInTransaction(false, new TransactionCallback() {
+ @Override
+ public void execute() throws Exception {
+ ResourceCriteria c = new ResourceCriteria();
+ c.addFilterName(RESOURCE_NAME);
+ c.addFilterInventoryStatus(null);
+ resource = LookupUtil.getResourceManager().findResourcesByCriteria(getOverlord(), c).get(0);
+ resource = em.find(Resource.class, resource.getId());
+ resourceType = resource.getResourceType();
+ agent = resource.getAgent();
+
+ fetchDB(em);
+ }
+ });
+ }
+
+ protected void fetchDB(EntityManager em) throws Exception {
+ }
+
+ private void purgeDB() {
+ executeInTransaction(false, new TransactionCallback() {
+ @Override
+ public void execute() throws Exception {
+ EntityManager em = getEntityManager();
+
+ em.createQuery("delete from JPADrift ").executeUpdate();
+ em.createQuery("delete from JPADriftChangeSet").executeUpdate();
+ em.createQuery("delete from JPADriftSet").executeUpdate();
+ em.createQuery("delete from JPADriftFile").executeUpdate();
+ em.createQuery("delete from DriftDefinition").executeUpdate();
+ em.createQuery("delete from DriftDefinitionTemplate").executeUpdate();
+
+ deleteEntity(Resource.class, RESOURCE_NAME, em);
+ deleteEntity(Agent.class, AGENT_NAME, em);
+ deleteEntity(ResourceType.class, RESOURCE_TYPE_NAME, em);
+
+ purgeDB(em);
+ }
+ });
+ }
+
+ protected void purgeDB(EntityManager em) {
+ }
+
+ protected void initDB(EntityManager em) {
+ }
+
+ protected void deleteEntity(Class<?> clazz, String name, EntityManager em) {
+ try {
+ Object entity = em
+ .createQuery("select entity from " + clazz.getSimpleName() + " entity where entity.name = :name")
+ .setParameter("name", name).getSingleResult();
+ if (clazz.equals(Resource.class)) {
+ ResourceTreeHelper.deleteResource(em, (Resource) entity);
+ } else {
+ em.remove(entity);
+ }
+ } catch (NoResultException e) {
+ // we can ignore no results because this code will run when the db
+ // is empty and we expect no results in that case
+ } catch (NonUniqueResultException e) {
+ // we will fail here to let the person running the test know that
+ // the database may not be in a consistent state
+ fail("Purging " + name + " failed. Expected to find one instance of " + clazz.getSimpleName()
+ + " but found more than one. The database may not be in a consistent state.");
+ }
+ }
+
+ protected void initResourceType() {
+ resourceType = new ResourceTypeBuilder().createResourceType().withId(0).withName(RESOURCE_TYPE_NAME)
+ .withCategory(SERVER).withPlugin(RESOURCE_TYPE_NAME.toLowerCase()).build();
+ }
+
+ protected void initAgent() {
+ agent = new Agent(AGENT_NAME, AGENT_NAME, 17080, "", AGENT_NAME + "_TOKEN");
+ }
+
+ protected void initResource() {
+ resource = new ResourceBuilder().createResource().withId(0).withName(RESOURCE_NAME)
+ .withResourceKey(RESOURCE_NAME).withRandomUuid().withResourceType(resourceType).build();
+ }
+
+ protected Subject getOverlord() {
+ return getSubjectManager().getOverlord();
+ }
+
+ protected String toString(DriftDefinition def) {
+ return "DriftDefinition[id: " + def.getId() + ", name: " + def.getName() + "]";
+ }
+
+ protected String toString(DriftDefinitionTemplate template) {
+ return DriftDefinitionTemplate.class.getSimpleName() + "[id: " + template.getId() + ", name: "
+ + template.getName() + "]";
+ }
+
+ protected Drift findDriftByPath(List<? extends Drift> drifts, String path) {
+ for (Drift drift : drifts) {
+ if (drift.getPath().equals(path)) {
+ return drift;
+ }
+ }
+ return null;
+ }
+
+}
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/drift/DriftServerPluginService.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/drift/DriftServerPluginService.java
new file mode 100644
index 0000000..46d725f
--- /dev/null
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/drift/DriftServerPluginService.java
@@ -0,0 +1,63 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2011 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+package org.rhq.enterprise.server.drift;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.rhq.core.domain.plugin.ServerPlugin;
+import org.rhq.enterprise.server.TestServerPluginService;
+import org.rhq.enterprise.server.plugin.pc.AbstractTypeServerPluginContainer;
+import org.rhq.enterprise.server.plugin.pc.MasterServerPluginContainer;
+import org.rhq.enterprise.server.plugin.pc.ServerPluginEnvironment;
+import org.rhq.enterprise.server.plugin.pc.ServerPluginManager;
+import org.rhq.enterprise.server.plugin.pc.drift.DriftServerPluginContainer;
+import org.rhq.enterprise.server.plugin.pc.drift.DriftServerPluginManager;
+
+public class DriftServerPluginService extends TestServerPluginService {
+
+ @Override
+ protected List<AbstractTypeServerPluginContainer> createPluginContainers(MasterServerPluginContainer master) {
+ return Collections.<AbstractTypeServerPluginContainer>singletonList(new TestDriftServerPluginContainer(master));
+ }
+
+
+ class TestDriftServerPluginContainer extends DriftServerPluginContainer {
+ public TestDriftServerPluginContainer(MasterServerPluginContainer master) {
+ super(master);
+ }
+
+ @Override
+ protected ServerPluginManager createPluginManager() {
+ return new TestDriftServerPluginManager(this);
+ }
+ }
+
+ class TestDriftServerPluginManager extends DriftServerPluginManager {
+ public TestDriftServerPluginManager(DriftServerPluginContainer pc) {
+ super(pc);
+ }
+
+ @Override
+ protected ServerPlugin getPlugin(ServerPluginEnvironment env) {
+ return TestServerPluginService.getPlugin(env);
+ }
+ }
+}
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/drift/DriftTemplateManagerBeanTest.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/drift/DriftTemplateManagerBeanTest.java
new file mode 100644
index 0000000..14d7cc1
--- /dev/null
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/drift/DriftTemplateManagerBeanTest.java
@@ -0,0 +1,653 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2011 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+package org.rhq.enterprise.server.drift;
+
+import static java.util.Arrays.asList;
+import static org.rhq.core.domain.common.EntityContext.forResource;
+import static org.rhq.core.domain.drift.DriftCategory.FILE_ADDED;
+import static org.rhq.core.domain.drift.DriftChangeSetCategory.COVERAGE;
+import static org.rhq.core.domain.drift.DriftChangeSetCategory.DRIFT;
+import static org.rhq.core.domain.drift.DriftConfigurationDefinition.BaseDirValueContext.fileSystem;
+import static org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode.normal;
+import static org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode.plannedChanges;
+import static org.rhq.core.domain.drift.DriftDefinitionComparator.CompareMode.BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS;
+import static org.rhq.enterprise.server.safeinvoker.HibernateDetachUtility.SerializationType.SERIALIZATION;
+import static org.rhq.enterprise.server.util.LookupUtil.getDriftManager;
+import static org.rhq.enterprise.server.util.LookupUtil.getDriftTemplateManager;
+import static org.rhq.test.AssertUtils.assertPropertiesMatch;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+
+import javax.ejb.EJBException;
+import javax.persistence.EntityManager;
+
+import org.testng.annotations.Test;
+
+import org.rhq.core.domain.auth.Subject;
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.criteria.DriftCriteria;
+import org.rhq.core.domain.criteria.DriftDefinitionCriteria;
+import org.rhq.core.domain.criteria.DriftDefinitionTemplateCriteria;
+import org.rhq.core.domain.criteria.GenericDriftChangeSetCriteria;
+import org.rhq.core.domain.criteria.JPADriftChangeSetCriteria;
+import org.rhq.core.domain.criteria.JPADriftCriteria;
+import org.rhq.core.domain.drift.Drift;
+import org.rhq.core.domain.drift.DriftCategory;
+import org.rhq.core.domain.drift.DriftChangeSet;
+import org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode;
+import org.rhq.core.domain.drift.DriftDefinition;
+import org.rhq.core.domain.drift.DriftDefinitionComparator;
+import org.rhq.core.domain.drift.DriftDefinitionTemplate;
+import org.rhq.core.domain.drift.DriftSnapshot;
+import org.rhq.core.domain.drift.Filter;
+import org.rhq.core.domain.drift.JPADrift;
+import org.rhq.core.domain.drift.JPADriftChangeSet;
+import org.rhq.core.domain.drift.JPADriftFile;
+import org.rhq.core.domain.drift.JPADriftSet;
+import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.core.domain.util.PageList;
+import org.rhq.enterprise.server.safeinvoker.HibernateDetachUtility;
+import org.rhq.enterprise.server.test.TransactionCallback;
+import org.rhq.enterprise.server.util.LookupUtil;
+import org.rhq.test.AssertUtils;
+
+public class DriftTemplateManagerBeanTest extends AbstractDriftServerTest {
+
+ private static final String TEST_CREATE_TEMPLATE = "test-createTemplateForNegativeUpdateTests";
+ private static final String TEST_PIN_TEMPLATE = "test-pinTemplate";
+
+ private DriftTemplateManagerLocal templateMgr;
+ private DriftManagerLocal driftMgr;
+
+ private static final String drift1Path = "drift.1";
+ private static final String drift2Path = "drift.2";
+
+ private static final String driftFile1Hash = "a1b2c3";
+ private static final String driftFile2Hash = "1a2b3c";
+
+ // Note: Arquillian currently (1.0.2) runs each test in its own testng lifecycle. Think of it as each
+ // test being in its own suite, and the test class being new'd for each test. Instance variables
+ // don't retain thier set values between tests. We must reset these from the db, as necessary, when
+ // tests have dependencies on other tests.
+ private JPADrift drift1;
+ private JPADrift drift2;
+ private JPADriftFile driftFile1;
+ private JPADriftFile driftFile2;
+
+ @Override
+ protected void beforeMethod() throws Exception {
+ super.beforeMethod();
+
+ templateMgr = getDriftTemplateManager();
+ driftMgr = getDriftManager();
+ }
+
+ @Override
+ protected void initDB(EntityManager em) {
+ agentServiceContainer.driftService = new TestDefService() {
+ @Override
+ public void unscheduleDriftDetection(int resourceId, DriftDefinition driftDef) {
+ detach(driftDef);
+ }
+
+ @Override
+ public void updateDriftDetection(int resourceId, DriftDefinition driftDef) {
+ detach(driftDef);
+ }
+
+ @Override
+ public void updateDriftDetection(int resourceId, DriftDefinition driftDef, DriftSnapshot driftSnapshot) {
+ detach(driftDef);
+ detach(driftSnapshot);
+ }
+
+ private void detach(Object object) {
+ try {
+ HibernateDetachUtility.nullOutUninitializedFields(object, SERIALIZATION);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+ };
+ }
+
+ @Override
+ protected void fetchDB(EntityManager em) throws Exception {
+ Subject overlord = getOverlord();
+ JPADriftServerLocal driftServer = LookupUtil.getJPADriftServer();
+ driftFile1 = driftServer.getDriftFile(overlord, driftFile1Hash);
+ driftFile2 = driftServer.getDriftFile(overlord, driftFile2Hash);
+ DriftCriteria c = new JPADriftCriteria();
+ c.addFilterDriftHandlingModes((DriftHandlingMode[]) null);
+ c.addFilterCategories((DriftCategory[]) null);
+ c.addFilterResourceIds((Integer[]) null);
+ c.addFilterPath(drift1Path);
+ List<JPADrift> drift = driftServer.findDriftsByCriteria(overlord, c);
+ if (0 != drift.size()) {
+ drift1 = em.find(JPADrift.class, drift.get(0).getId());
+ }
+ c.addFilterPath(drift2Path);
+ drift = driftServer.findDriftsByCriteria(overlord, c);
+ if (0 != drift.size()) {
+ drift2 = em.find(JPADrift.class, drift.get(0).getId());
+ }
+ }
+
+ @Test(dependsOnGroups = "pinning")
+ public void createNewTemplate() {
+ final DriftDefinition definition = new DriftDefinition(new Configuration());
+ definition.setName("test-createNewTemplate");
+ definition.setEnabled(true);
+ definition.setDriftHandlingMode(normal);
+ definition.setInterval(2400L);
+ definition.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test"));
+
+ final DriftDefinitionTemplate newTemplate = templateMgr.createTemplate(getOverlord(), resourceType.getId(),
+ true, definition);
+
+ executeInTransaction(false, new TransactionCallback() {
+ @Override
+ public void execute() throws Exception {
+ EntityManager em = getEntityManager();
+
+ ResourceType updatedType = em.find(ResourceType.class, resourceType.getId());
+
+ assertEquals("Failed to add new drift definition to resource type", 1, updatedType
+ .getDriftDefinitionTemplates().size());
+
+ DriftDefinitionTemplate expectedTemplate = new DriftDefinitionTemplate();
+ expectedTemplate.setTemplateDefinition(definition);
+ expectedTemplate.setUserDefined(true);
+
+ assertDriftTemplateEquals("Failed to save template", expectedTemplate, newTemplate);
+ assertTrue("The template should have its id set", newTemplate.getId() > 0);
+ }
+ });
+ }
+
+ @Test(groups = "negativeUpdate")
+ public void createTemplateForNegativeUpdateTests() {
+ DriftDefinition definition = new DriftDefinition(new Configuration());
+ definition.setName(TEST_CREATE_TEMPLATE);
+ definition.setEnabled(true);
+ definition.setDriftHandlingMode(normal);
+ definition.setInterval(2400L);
+ definition.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test"));
+
+ templateMgr.createTemplate(getOverlord(), resourceType.getId(), true, definition);
+
+ DriftDefinitionTemplate template = loadTemplate(definition.getName());
+ assertNotNull("Failed to load template", template);
+ getEntityManager().clear();
+ //System.out.println("Created " + template.toString(false));
+ }
+
+ @Test(groups = "negativeUpdate", dependsOnMethods = "createTemplateForNegativeUpdateTests", expectedExceptions = EJBException.class, expectedExceptionsMessageRegExp = ".*base directory.*cannot be modified")
+ @InitDB(false)
+ public void doNotAllowBaseDirToBeUpdated() {
+ DriftDefinitionTemplate template = loadTemplate(TEST_CREATE_TEMPLATE);
+ DriftDefinition definition = template.getTemplateDefinition();
+ definition.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/TEST"));
+
+ templateMgr.updateTemplate(getOverlord(), template);
+ }
+
+ @Test(groups = "negativeUpdate", dependsOnMethods = "createTemplateForNegativeUpdateTests", expectedExceptions = EJBException.class, expectedExceptionsMessageRegExp = ".*filters.*cannot be modified")
+ @InitDB(false)
+ public void doNotAllowFiltersToBeUpdated() {
+ DriftDefinitionTemplate template = loadTemplate(TEST_CREATE_TEMPLATE);
+ DriftDefinition definition = template.getTemplateDefinition();
+ definition.addExclude(new Filter("/foo/bar/TEST/conf", "*.xml"));
+
+ templateMgr.updateTemplate(getOverlord(), template);
+ }
+
+ @Test(groups = "negativeUpdate", dependsOnMethods = "createTemplateForNegativeUpdateTests", expectedExceptions = EJBException.class, expectedExceptionsMessageRegExp = ".*name.*cannot be modified")
+ @InitDB(false)
+ public void doNotAllowTemplateNameToBeUpdated() {
+ DriftDefinitionTemplate template = loadTemplate(TEST_CREATE_TEMPLATE);
+ template.setName("A new name");
+
+ templateMgr.updateTemplate(getOverlord(), template);
+ }
+
+ @Test(groups = "negativeUpdate", dependsOnMethods = "createTemplateForNegativeUpdateTests", expectedExceptions = EJBException.class, expectedExceptionsMessageRegExp = ".*template name must be unique.*")
+ @InitDB(false)
+ public void doNotAllowDuplicateTemplateNames() {
+ DriftDefinition definition = new DriftDefinition(new Configuration());
+ definition.setName(TEST_CREATE_TEMPLATE);
+ definition.setEnabled(true);
+ definition.setDriftHandlingMode(normal);
+ definition.setInterval(2400L);
+ definition.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test"));
+
+ templateMgr.createTemplate(getOverlord(), resourceType.getId(), true, definition);
+ }
+
+ @Test(dependsOnGroups = "pinning")
+ public void createAndUpdateTemplate() {
+ // create the template
+ DriftDefinition definition = new DriftDefinition(new Configuration());
+ definition.setName("test-updateTemplate");
+ definition.setDescription("update template test");
+ definition.setEnabled(true);
+ definition.setDriftHandlingMode(normal);
+ definition.setInterval(2400L);
+ definition.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test"));
+
+ DriftDefinitionTemplate template = templateMgr.createTemplate(getOverlord(), resourceType.getId(), true,
+ definition);
+
+ // next create some definitions from the template
+ final DriftDefinition attachedDef1 = createDefinition(template, "attachedDef1", true);
+ final DriftDefinition attachedDef2 = createDefinition(template, "attachedDef2", true);
+ final DriftDefinition detachedDef1 = createDefinition(template, "detachedDef1", false);
+ final DriftDefinition detachedDef2 = createDefinition(template, "detachedDef2", false);
+
+ driftMgr.updateDriftDefinition(getOverlord(), forResource(resource.getId()), attachedDef1);
+ driftMgr.updateDriftDefinition(getOverlord(), forResource(resource.getId()), attachedDef2);
+ driftMgr.updateDriftDefinition(getOverlord(), forResource(resource.getId()), detachedDef1);
+ driftMgr.updateDriftDefinition(getOverlord(), forResource(resource.getId()), detachedDef2);
+
+ // update the template
+ final DriftDefinition newTemplateDef = template.getTemplateDefinition();
+ newTemplateDef.setInterval(4800L);
+ newTemplateDef.setDriftHandlingMode(plannedChanges);
+ newTemplateDef.setEnabled(false);
+
+ templateMgr.updateTemplate(getOverlord(), template);
+
+ // verify that the template has been updated
+ final DriftDefinitionTemplate updatedTemplate = loadTemplate(template.getName());
+ AssertUtils.assertPropertiesMatch("Failed to update template", template, updatedTemplate, "resourceType",
+ "driftDefinitions", "templateDefinition");
+
+ // verify that attached definitions are updated.
+ for (DriftDefinition def : asList(attachedDef1, attachedDef2)) {
+ DriftDefinition updatedDef = loadDefinition(def.getId());
+ String msg = "Failed to propagate update to attached definition " + toString(updatedDef) + " - ";
+ DriftDefinition updatedTemplateDef = updatedTemplate.getTemplateDefinition();
+
+ assertEquals(msg + "enabled property not updated", updatedTemplateDef.isEnabled(), updatedDef.isEnabled());
+ assertEquals(msg + "driftHandlingMode property not updated", updatedTemplateDef.getDriftHandlingMode(),
+ updatedDef.getDriftHandlingMode());
+ assertEquals(msg + "interval property not updated", updatedTemplateDef.getInterval(),
+ updatedDef.getInterval());
+ }
+
+ // verify that the detached definitions have not been updated.
+ for (DriftDefinition def : asList(detachedDef1, detachedDef2)) {
+ DriftDefinition defAfterUpdate = loadDefinition(def.getId());
+ String msg = "Detached definition " + toString(def) + " should not get updated - ";
+
+ assertEquals(msg + "enabled property was modified", def.isEnabled(), defAfterUpdate.isEnabled());
+ assertEquals(msg + "driftHandlingMode property was modified", def.getDriftHandlingMode(),
+ defAfterUpdate.getDriftHandlingMode());
+ assertEquals(msg + "interval property was modified", def.getInterval(), defAfterUpdate.getInterval());
+ }
+ }
+
+ @Test(groups = "pinning", dependsOnGroups = "negativeUpdate")
+ public void pinTemplate() throws Exception {
+ // First create the template
+ final DriftDefinition templateDef = new DriftDefinition(new Configuration());
+ templateDef.setName(TEST_PIN_TEMPLATE);
+ templateDef.setEnabled(true);
+ templateDef.setDriftHandlingMode(normal);
+ templateDef.setInterval(2400L);
+ templateDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test"));
+
+ final DriftDefinitionTemplate template = templateMgr.createTemplate(getOverlord(), resourceType.getId(), true,
+ templateDef);
+
+ // next create some resource level definitions
+ final DriftDefinition attachedDef1 = createDefinition(template, "attachedDef1", true);
+ final DriftDefinition attachedDef2 = createDefinition(template, "attachedDef2", true);
+ final DriftDefinition detachedDef1 = createDefinition(template, "detachedDef1", false);
+ final DriftDefinition detachedDef2 = createDefinition(template, "detachedDef2", false);
+
+ // create initial change set from which the snapshot will be generated
+ final JPADriftChangeSet changeSet0 = new JPADriftChangeSet(resource, 0, COVERAGE, attachedDef1);
+
+ driftFile1 = new JPADriftFile(driftFile1Hash);
+ drift1 = new JPADrift(changeSet0, drift1Path, FILE_ADDED, null, driftFile1);
+
+ final JPADriftSet driftSet = new JPADriftSet();
+ driftSet.addDrift(drift1);
+
+ // create change set v1
+ driftFile2 = new JPADriftFile(driftFile2Hash);
+ final JPADriftChangeSet changeSet1 = new JPADriftChangeSet(resource, 1, DRIFT, attachedDef1);
+ drift2 = new JPADrift(changeSet1, drift2Path, FILE_ADDED, null, driftFile2);
+
+ executeInTransaction(false, new TransactionCallback() {
+ @Override
+ public void execute() throws Exception {
+ EntityManager em = getEntityManager();
+
+ em.persist(attachedDef1);
+
+ em.persist(driftFile1);
+ em.persist(driftFile2);
+
+ em.persist(changeSet0);
+ em.persist(driftSet);
+ changeSet0.setInitialDriftSet(driftSet);
+ em.merge(changeSet0);
+
+ em.persist(changeSet1);
+ em.persist(drift2);
+
+ em.persist(attachedDef2);
+ em.persist(detachedDef1);
+ em.persist(detachedDef2);
+ }
+ });
+
+ // now we pin the snapshot to the template
+ templateMgr.pinTemplate(getOverlord(), template.getId(), attachedDef1.getId(), 1);
+
+ // verify that the template is now pinned
+ DriftDefinitionTemplate updatedTemplate = loadTemplate(template.getName());
+ assertTrue("Template should be marked pinned", updatedTemplate.isPinned());
+ }
+
+ @SuppressWarnings("unchecked")
+ @Test(groups = "pinning", dependsOnMethods = "pinTemplate")
+ @InitDB(false)
+ public void persistChangeSetWhenTemplateGetsPinned() throws Exception {
+
+ DriftDefinitionTemplate template = loadTemplate(TEST_PIN_TEMPLATE);
+
+ GenericDriftChangeSetCriteria criteria = new GenericDriftChangeSetCriteria();
+ criteria.addFilterId(template.getChangeSetId());
+
+ PageList<? extends DriftChangeSet<?>> changeSets = driftMgr.findDriftChangeSetsByCriteria(getOverlord(),
+ criteria);
+
+ assertEquals("Expected to find change set for pinned template", 1, changeSets.size());
+
+ JPADriftChangeSet expectedChangeSet = new JPADriftChangeSet(resource, 1, COVERAGE, null);
+ List<? extends Drift> expectedDrifts = asList(new JPADrift(expectedChangeSet, drift1Path, FILE_ADDED, null,
+ driftFile1), new JPADrift(expectedChangeSet, drift2.getPath(), FILE_ADDED, null, driftFile2));
+
+ DriftChangeSet<?> actualChangeSet = changeSets.get(0);
+ List<? extends Drift> actualDrifts = new ArrayList(actualChangeSet.getDrifts());
+
+ AssertUtils.assertCollectionMatchesNoOrder(
+ "Expected to find drifts from change sets 1 and 2 in the template change set",
+ (List<Drift>) expectedDrifts, (List<Drift>) actualDrifts, "id", "ctime", "changeSet", "newDriftFile");
+
+ // we need to compare the newDriftFile properties separately because
+ // assertCollectionMatchesNoOrder compares properties via equals() and JPADriftFile
+ // does not implement equals.
+ assertPropertiesMatch(drift1.getNewDriftFile(), findDriftByPath(actualDrifts, drift1Path).getNewDriftFile(),
+ "The newDriftFile property was not set correctly for " + drift1);
+ assertPropertiesMatch(drift2.getNewDriftFile(), findDriftByPath(actualDrifts, drift2Path).getNewDriftFile(),
+ "The newDriftFile property was not set correctly for " + drift1);
+ }
+
+ @Test(groups = "pinning", dependsOnMethods = "pinTemplate")
+ @InitDB(false)
+ public void updateAttachedDefinitionsWhenTemplateGetsPinned() throws Exception {
+ DriftDefinitionTemplate template = loadTemplate(TEST_PIN_TEMPLATE);
+
+ // get the attached definitions
+ List<DriftDefinition> attachedDefs = new LinkedList<DriftDefinition>();
+ for (DriftDefinition d : template.getDriftDefinitions()) {
+ if (d.isAttached() && (d.getName().equals("attachedDef1") || d.getName().equals("attachedDef2"))) {
+ attachedDefs.add(d);
+ }
+ }
+ assertEquals("Failed to get attached definitions for " + toString(template), 2, attachedDefs.size());
+ assertDefinitionIsPinned(attachedDefs.get(0));
+ assertDefinitionIsPinned(attachedDefs.get(1));
+ }
+
+ @Test(groups = "pinning", dependsOnMethods = "pinTemplate")
+ @InitDB(false)
+ public void doNotUpdateDetachedDefinitionsWhenTemplateGetsPinned() throws Exception {
+ DriftDefinitionTemplate template = loadTemplate(TEST_PIN_TEMPLATE);
+
+ // get the detached definitions
+ List<DriftDefinition> detachedDefs = new LinkedList<DriftDefinition>();
+ for (DriftDefinition d : template.getDriftDefinitions()) {
+ if (!d.isAttached() && (d.getName().equals("detachedDef1") || d.getName().equals("detachedDef2"))) {
+ detachedDefs.add(d);
+ }
+ }
+ assertEquals("Failed to get detached definitions for " + toString(template), 2, detachedDefs.size());
+ assertDefinitionIsNotPinned(detachedDefs.get(0));
+ assertDefinitionIsNotPinned(detachedDefs.get(1));
+ }
+
+ @Test(dependsOnGroups = "pinning")
+ public void deleteTemplate() throws Exception {
+ // first create the template
+ final DriftDefinition templateDef = new DriftDefinition(new Configuration());
+ templateDef.setName(TEST_PIN_TEMPLATE);
+ templateDef.setEnabled(true);
+ templateDef.setDriftHandlingMode(normal);
+ templateDef.setInterval(2400L);
+ templateDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test"));
+
+ final DriftDefinitionTemplate template = templateMgr.createTemplate(getOverlord(), resourceType.getId(), true,
+ templateDef);
+
+ // next create some resource level definitions
+ final DriftDefinition attachedDef1 = createDefinition(template, "attachedDef1", true);
+ final DriftDefinition attachedDef2 = createDefinition(template, "attachedDef2", true);
+ final DriftDefinition detachedDef1 = createDefinition(template, "detachedDef1", false);
+ final DriftDefinition detachedDef2 = createDefinition(template, "detachedDef2", false);
+
+ // create some change sets
+ final JPADriftChangeSet changeSet0 = new JPADriftChangeSet(resource, 0, COVERAGE, attachedDef1);
+
+ driftFile1 = new JPADriftFile(driftFile1Hash);
+ drift1 = new JPADrift(changeSet0, drift1Path, FILE_ADDED, null, driftFile1);
+
+ final JPADriftSet driftSet0 = new JPADriftSet();
+ driftSet0.addDrift(drift1);
+
+ final JPADriftChangeSet changeSet1 = new JPADriftChangeSet(resource, 0, DRIFT, detachedDef1);
+
+ driftFile2 = new JPADriftFile(driftFile2Hash);
+ drift2 = new JPADrift(changeSet1, drift2Path, FILE_ADDED, null, driftFile2);
+
+ final JPADriftSet driftSet1 = new JPADriftSet();
+ driftSet1.addDrift(drift2);
+
+ executeInTransaction(false, new TransactionCallback() {
+ @Override
+ public void execute() throws Exception {
+ EntityManager em = getEntityManager();
+
+ em.persist(attachedDef1);
+ em.persist(attachedDef2);
+ em.persist(detachedDef1);
+ em.persist(detachedDef2);
+
+ em.persist(driftFile1);
+ em.persist(driftFile2);
+
+ em.persist(changeSet0);
+ em.persist(driftSet0);
+ changeSet0.setInitialDriftSet(driftSet0);
+ em.merge(changeSet0);
+
+ em.persist(changeSet1);
+ em.persist(driftSet1);
+ changeSet1.setInitialDriftSet(driftSet1);
+ em.merge(changeSet1);
+ }
+ });
+
+ // delete the template
+ templateMgr.deleteTemplate(getOverlord(), template.getId());
+
+ // verify that attached definitions along with their change sets have
+ // been deleted
+ assertNull("Change sets belonging to attached definitions should be deleted", loadChangeSet(changeSet0.getId()));
+ assertNull("Attached definition " + toString(attachedDef1) + " should be deleted",
+ loadDefinition(attachedDef1.getId()));
+ assertNull("Attached definition " + toString(attachedDef2) + " should be deleted",
+ loadDefinition(attachedDef2.getId()));
+
+ // verify that detached definitions along with their change sets have not been deleted
+ assertNotNull("Change sets belonging to detached definitions should not be deleted",
+ loadChangeSet(changeSet1.getId()));
+ assertDetachedDefinitionNotDeleted(detachedDef1.getId());
+ assertDetachedDefinitionNotDeleted(detachedDef2.getId());
+
+ // verify that the template itself has been deleted
+ assertNull("The template " + toString(template) + " should have been deleted",
+ loadTemplate(template.getName(), false));
+ }
+
+ @SuppressWarnings("unchecked")
+ private void assertDefinitionIsPinned(DriftDefinition definition) throws Exception {
+ // verify that the definition is marked as pinned
+ assertTrue("Expected " + toString(definition) + " to be pinned", definition.isPinned());
+
+ // verify that the initial change set is generated for the definition
+ JPADriftChangeSetCriteria criteria = new JPADriftChangeSetCriteria();
+ criteria.addFilterDriftDefinitionId(definition.getId());
+ criteria.addFilterCategory(COVERAGE);
+ criteria.fetchDrifts(true);
+
+ PageList<? extends DriftChangeSet<?>> changeSets = driftMgr.findDriftChangeSetsByCriteria(getOverlord(),
+ criteria);
+ assertEquals("Expected to find one change set", 1, changeSets.size());
+
+ JPADriftChangeSet expectedChangeSet = new JPADriftChangeSet(resource, 1, COVERAGE, null);
+ List<? extends Drift> expectedDrifts = asList(new JPADrift(expectedChangeSet, drift1.getPath(), FILE_ADDED,
+ null, driftFile1), new JPADrift(expectedChangeSet, drift2.getPath(), FILE_ADDED, null, driftFile2));
+
+ DriftChangeSet<?> actualChangeSet = changeSets.get(0);
+ List<? extends Drift> actualDrifts = new ArrayList(actualChangeSet.getDrifts());
+
+ AssertUtils.assertCollectionMatchesNoOrder(
+ "Expected to find drifts from change sets 1 and 2 in the template change set",
+ (List<Drift>) expectedDrifts, (List<Drift>) actualDrifts, "id", "ctime", "changeSet", "newDriftFile");
+
+ // Finally make sure that there are no other change sets
+ criteria = new JPADriftChangeSetCriteria();
+ criteria.addFilterStartVersion(1);
+ criteria.addFilterDriftDefinitionId(definition.getId());
+
+ assertEquals("There should not be any drift change sets", 0,
+ driftMgr.findDriftChangeSetsByCriteria(getOverlord(), criteria).size());
+ }
+
+ private void assertDefinitionIsNotPinned(DriftDefinition definition) throws Exception {
+ // verify that the definition is not pinned
+ assertFalse("Expected " + toString(definition) + " to be unpinned", definition.isPinned());
+
+ // Note that this method assumes that the definition has no change sets
+ // associated with it and therefore checks that there are no change sets.
+ JPADriftChangeSetCriteria criteria = new JPADriftChangeSetCriteria();
+ criteria.addFilterDriftDefinitionId(definition.getId());
+
+ PageList<? extends DriftChangeSet<?>> changeSets = driftMgr.findDriftChangeSetsByCriteria(getOverlord(),
+ criteria);
+ assertEquals("Did not expect to find any change sets for " + toString(definition) + ". Note that this "
+ + "assertion method assumes that the definition you are testing is not supposed to have any change sets.",
+ 0, changeSets.size());
+ }
+
+ private void assertDriftTemplateEquals(String msg, DriftDefinitionTemplate expected, DriftDefinitionTemplate actual) {
+ AssertUtils.assertPropertiesMatch(msg + ": basic drift definition template properties do not match", expected,
+ actual, "id", "resourceType", "ctime", "templateDefinition");
+ assertDriftDefEquals(msg + ": template definitions do not match", expected.getTemplateDefinition(),
+ actual.getTemplateDefinition());
+ }
+
+ private void assertDriftDefEquals(String msg, DriftDefinition expected, DriftDefinition actual) {
+ DriftDefinitionComparator comparator = new DriftDefinitionComparator(
+ BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS);
+ assertEquals(msg, 0, comparator.compare(expected, actual));
+ }
+
+ private void assertDetachedDefinitionNotDeleted(int definitionId) {
+ DriftDefinition definition = loadDefinition(definitionId);
+ assertNotNull("Detached definition " + toString(definition) + " should not be deleted", definition);
+ assertNull("The detached definition's template reference should be set to null when the template is deleted",
+ definition.getTemplate());
+ }
+
+ private DriftDefinition createDefinition(DriftDefinitionTemplate template, String defName, boolean isAttached) {
+ DriftDefinition def = template.createDefinition();
+ def.setName(defName);
+ def.setAttached(isAttached);
+ def.setTemplate(template);
+ def.setResource(resource);
+ return def;
+ }
+
+ private DriftDefinitionTemplate loadTemplate(String name) {
+ return loadTemplate(name, true);
+ }
+
+ private DriftDefinitionTemplate loadTemplate(String name, boolean verifyResultsUnique) {
+ DriftDefinitionTemplateCriteria criteria = new DriftDefinitionTemplateCriteria();
+ criteria.addFilterResourceTypeId(resourceType.getId());
+ criteria.addFilterName(name);
+ criteria.fetchDriftDefinitions(true);
+ criteria.fetchResourceType(true);
+
+ PageList<DriftDefinitionTemplate> templates = templateMgr.findTemplatesByCriteria(getOverlord(), criteria);
+ if (verifyResultsUnique) {
+ assertEquals("Expected to find one template", 1, templates.size());
+ }
+
+ if (templates.isEmpty()) {
+ return null;
+ }
+ return templates.get(0);
+ }
+
+ private DriftDefinition loadDefinition(int definitionId) {
+ DriftDefinitionCriteria criteria = new DriftDefinitionCriteria();
+ criteria.addFilterId(definitionId);
+ criteria.fetchConfiguration(true);
+ criteria.fetchTemplate(true);
+ PageList<DriftDefinition> definitions = driftMgr.findDriftDefinitionsByCriteria(getOverlord(), criteria);
+
+ if (definitions.isEmpty()) {
+ return null;
+ }
+ return definitions.get(0);
+ }
+
+ private DriftChangeSet<?> loadChangeSet(String id) throws Exception {
+ GenericDriftChangeSetCriteria criteria = new GenericDriftChangeSetCriteria();
+ criteria.addFilterId(id);
+ PageList<? extends DriftChangeSet<?>> changeSets = driftMgr.findDriftChangeSetsByCriteria(getOverlord(),
+ criteria);
+
+ if (changeSets.isEmpty()) {
+ return null;
+ }
+ return changeSets.get(0);
+ }
+
+}
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/drift/InitDB.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/drift/InitDB.java
new file mode 100644
index 0000000..65a6523
--- /dev/null
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/drift/InitDB.java
@@ -0,0 +1,32 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2011 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+package org.rhq.enterprise.server.drift;
+
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+@Retention(RUNTIME)
+(a)Target({ElementType.METHOD })
+public @interface InitDB {
+ boolean value() default true;
+}
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/drift/JPADriftServerBeanTest.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/drift/JPADriftServerBeanTest.java
new file mode 100644
index 0000000..88a0143
--- /dev/null
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/drift/JPADriftServerBeanTest.java
@@ -0,0 +1,308 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2011 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+package org.rhq.enterprise.server.drift;
+
+import static java.util.Arrays.asList;
+import static org.apache.commons.io.IOUtils.toInputStream;
+import static org.rhq.core.domain.drift.DriftCategory.FILE_ADDED;
+import static org.rhq.core.domain.drift.DriftChangeSetCategory.COVERAGE;
+import static org.rhq.core.domain.drift.DriftConfigurationDefinition.BaseDirValueContext.fileSystem;
+import static org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode.normal;
+import static org.rhq.core.domain.drift.DriftFileStatus.LOADED;
+import static org.rhq.enterprise.server.util.LookupUtil.getJPADriftServer;
+import static org.rhq.test.AssertUtils.assertPropertiesMatch;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import javax.persistence.EntityManager;
+
+import org.testng.annotations.Test;
+
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.criteria.JPADriftChangeSetCriteria;
+import org.rhq.core.domain.drift.Drift;
+import org.rhq.core.domain.drift.DriftDefinition;
+import org.rhq.core.domain.drift.JPADrift;
+import org.rhq.core.domain.drift.JPADriftChangeSet;
+import org.rhq.core.domain.drift.JPADriftFile;
+import org.rhq.core.domain.drift.JPADriftSet;
+import org.rhq.core.domain.drift.dto.DriftChangeSetDTO;
+import org.rhq.core.domain.drift.dto.DriftDTO;
+import org.rhq.core.domain.drift.dto.DriftFileDTO;
+import org.rhq.core.domain.util.PageList;
+import org.rhq.enterprise.server.test.TransactionCallback;
+import org.rhq.test.AssertUtils;
+
+@Test
+public class JPADriftServerBeanTest extends AbstractDriftServerTest {
+
+ private JPADriftServerLocal jpaDriftServer;
+
+ private final String DRIFT_FILE_1_ID = "a1b2c3d4";
+
+ private final String DRIFT_FILE_2_ID = "1ab2b3c4d";
+
+ private JPADriftFile driftFile1;
+
+ private JPADriftFile driftFile2;
+
+ @Override
+ public void beforeMethod() throws Exception {
+ super.beforeMethod();
+
+ jpaDriftServer = getJPADriftServer();
+
+ driftFile1 = jpaDriftServer.persistDriftFile(new JPADriftFile(DRIFT_FILE_1_ID));
+ driftFile2 = jpaDriftServer.persistDriftFile(new JPADriftFile(DRIFT_FILE_2_ID));
+
+ String driftFile1Content = "drift file 1 content...";
+ String driftFile2Content = "drift file 2 content...";
+
+ jpaDriftServer.persistDriftFileData(driftFile1, toInputStream(driftFile1Content), driftFile1Content.length());
+ jpaDriftServer.persistDriftFileData(driftFile2, toInputStream(driftFile2Content), driftFile2Content.length());
+
+ driftFile1 = jpaDriftServer.getDriftFile(getOverlord(), DRIFT_FILE_1_ID);
+ driftFile2 = jpaDriftServer.getDriftFile(getOverlord(), DRIFT_FILE_2_ID);
+
+ assertDriftFilePersisted(driftFile1, "driftFile1", driftFile1Content);
+ assertDriftFilePersisted(driftFile2, "driftFile2", driftFile2Content);
+ }
+
+ public void persistResourceChangeSet() {
+ // first create and persist the drift definition
+ final DriftDefinition driftDef = new DriftDefinition(new Configuration());
+ driftDef.setName("test::persistResourceChangeSet");
+ driftDef.setEnabled(true);
+ driftDef.setDriftHandlingMode(normal);
+ driftDef.setInterval(2400L);
+ driftDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test"));
+ driftDef.setResource(resource);
+
+ executeInTransaction(false, new TransactionCallback() {
+ @Override
+ public void execute() throws Exception {
+ EntityManager em = getEntityManager();
+ em.persist(driftDef);
+ }
+ });
+
+ // create the change set to be persisted
+ DriftChangeSetDTO changeSet = new DriftChangeSetDTO();
+ changeSet.setCategory(COVERAGE);
+ changeSet.setVersion(1);
+ changeSet.setDriftDefinitionId(driftDef.getId());
+ changeSet.setResourceId(resource.getId());
+ changeSet.setDriftHandlingMode(normal);
+ changeSet.setCtime(System.currentTimeMillis());
+
+ DriftDTO drift1 = new DriftDTO();
+ drift1.setCategory(FILE_ADDED);
+ drift1.setPath("drift.1");
+ drift1.setChangeSet(changeSet);
+ drift1.setCtime(System.currentTimeMillis());
+ drift1.setNewDriftFile(toDTo(driftFile1));
+
+ DriftDTO drift2 = new DriftDTO();
+ drift2.setCategory(FILE_ADDED);
+ drift2.setPath("drift.2");
+ drift2.setChangeSet(changeSet);
+ drift2.setCtime(System.currentTimeMillis());
+ drift2.setNewDriftFile(toDTo(driftFile2));
+
+ Set<DriftDTO> drifts = new HashSet<DriftDTO>();
+ drifts.add(drift1);
+ drifts.add(drift2);
+ changeSet.setDrifts(drifts);
+
+ String newChangeSetId = jpaDriftServer.persistChangeSet(getOverlord(), changeSet);
+
+ // verify that the change set was persisted
+ JPADriftChangeSetCriteria criteria = new JPADriftChangeSetCriteria();
+ criteria.addFilterId(newChangeSetId);
+ criteria.fetchDrifts(true);
+
+ PageList<JPADriftChangeSet> changeSets = jpaDriftServer.findDriftChangeSetsByCriteria(getOverlord(), criteria);
+ assertEquals("Expected to find one change set", 1, changeSets.size());
+
+ JPADriftChangeSet jpaChangeSet = changeSets.get(0);
+ assertEquals("Expected change set to contain two drifts. This could be a result of the change set not being " +
+ "persisted correctly or the criteria fetch being done incorrectly.", 2, jpaChangeSet.getDrifts().size());
+
+ AssertUtils
+ .assertPropertiesMatch("The change set was not persisted correctly", changeSet, jpaChangeSet, "id", "drifts",
+ "class", "ctime");
+
+ List<? extends Drift> expectedDrifts = asList(drift1, drift2);
+ List<? extends Drift> actualDrifts = new ArrayList(jpaChangeSet.getDrifts());
+
+ // We ignore the id and ctime properties because those are set by JPADriftServerBean
+ // and are somewhat implmentation specific. We ignore the directory property because
+ // it is really a calculated property. newDriftFile has to be compared separately
+ // since it does not implement equals.
+ AssertUtils.assertCollectionMatchesNoOrder("The change set drifts were not persisted correctly",
+ (List<Drift>) expectedDrifts, (List<Drift>) actualDrifts, "id", "ctime", "changeSet", "directory",
+ "newDriftFile", "class");
+
+ assertPropertiesMatch("The newDriftFile property was not set correctly for " + drift1, drift1.getNewDriftFile(),
+ findDriftByPath(actualDrifts, "drift.1").getNewDriftFile(), "class", "ctime") ;
+ assertPropertiesMatch("The newDriftFile property was not set correctly for " + drift2, drift2.getNewDriftFile(),
+ findDriftByPath(actualDrifts, "drift.2").getNewDriftFile(), "class", "ctime") ;
+ }
+
+ public void persistTemplateChangeSet() {
+ // create the change set to be persisted
+ //
+ // Note that we do not set the drift definition id or resource id since
+ // the change set is not owned by a resource. It is owned by the
+ // resource type.
+ DriftChangeSetDTO changeSet = new DriftChangeSetDTO();
+ changeSet.setCategory(COVERAGE);
+ changeSet.setVersion(1);
+ changeSet.setDriftHandlingMode(normal);
+ changeSet.setCtime(System.currentTimeMillis());
+
+ DriftDTO drift1 = new DriftDTO();
+ drift1.setCategory(FILE_ADDED);
+ drift1.setPath("drift.1");
+ drift1.setChangeSet(changeSet);
+ drift1.setCtime(System.currentTimeMillis());
+ drift1.setNewDriftFile(toDTo(driftFile1));
+
+ DriftDTO drift2 = new DriftDTO();
+ drift2.setCategory(FILE_ADDED);
+ drift2.setPath("drift.2");
+ drift2.setChangeSet(changeSet);
+ drift2.setCtime(System.currentTimeMillis());
+ drift2.setNewDriftFile(toDTo(driftFile2));
+
+ Set<DriftDTO> drifts = new HashSet<DriftDTO>();
+ drifts.add(drift1);
+ drifts.add(drift2);
+ changeSet.setDrifts(drifts);
+
+ String newChangeSetId = jpaDriftServer.persistChangeSet(getOverlord(), changeSet);
+
+ // verify that the change set was persisted
+ JPADriftChangeSetCriteria criteria = new JPADriftChangeSetCriteria();
+ criteria.addFilterId(newChangeSetId);
+ criteria.fetchDrifts(true);
+
+ PageList<JPADriftChangeSet> changeSets = jpaDriftServer.findDriftChangeSetsByCriteria(getOverlord(), criteria);
+ assertEquals("Expected to find one change set", 1, changeSets.size());
+
+ JPADriftChangeSet jpaChangeSet = changeSets.get(0);
+ assertEquals("Expected change set to contain two drifts. This could be a result of the change set not being " +
+ "persisted correctly or the criteria fetch being done incorrectly.", 2, jpaChangeSet.getDrifts().size());
+
+ AssertUtils
+ .assertPropertiesMatch("The change set was not persisted correctly", changeSet, jpaChangeSet, "id", "drifts",
+ "class", "ctime");
+
+ List<? extends Drift> expectedDrifts = asList(drift1, drift2);
+ List<? extends Drift> actualDrifts = new ArrayList(jpaChangeSet.getDrifts());
+
+ // We ignore the id and ctime properties because those are set by JPADriftServerBean
+ // and are somewhat implmentation specific. We ignore the directory property because
+ // it is really a calculated property. newDriftFile has to be compared separately
+ // since it does not implement equals.
+ AssertUtils.assertCollectionMatchesNoOrder("The change set drifts were not persisted correctly",
+ (List<Drift>) expectedDrifts, (List<Drift>) actualDrifts, "id", "ctime", "changeSet", "directory",
+ "newDriftFile", "class");
+
+ assertPropertiesMatch("The newDriftFile property was not set correctly for " + drift1, drift1.getNewDriftFile(),
+ findDriftByPath(actualDrifts, "drift.1").getNewDriftFile(), "class", "ctime") ;
+ assertPropertiesMatch("The newDriftFile property was not set correctly for " + drift2, drift2.getNewDriftFile(),
+ findDriftByPath(actualDrifts, "drift.2").getNewDriftFile(), "class", "ctime") ;
+ }
+
+ public void copyChangeSet() {
+ // first create the change set that will be copied
+ final JPADriftChangeSet changeSet = new JPADriftChangeSet(null, 0, COVERAGE, null);
+ changeSet.setDriftHandlingMode(normal);
+
+ final JPADrift drift1 = new JPADrift(changeSet, "drift.1", FILE_ADDED, null, driftFile1);
+ final JPADrift drift2 = new JPADrift(changeSet, "drift.2", FILE_ADDED, null, driftFile2);
+
+ final JPADriftSet driftSet = new JPADriftSet();
+ driftSet.addDrift(drift1);
+ driftSet.addDrift(drift2);
+
+ // next create the drift definition
+ final DriftDefinition driftDef = new DriftDefinition(new Configuration());
+ driftDef.setName("test::copyChangeSet");
+ driftDef.setEnabled(true);
+ driftDef.setDriftHandlingMode(normal);
+ driftDef.setInterval(2400L);
+ driftDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test"));
+ driftDef.setResource(resource);
+
+ // persist the change set and drift definition
+ executeInTransaction(false, new TransactionCallback() {
+ @Override
+ public void execute() throws Exception {
+ EntityManager em = getEntityManager();
+ em.persist(changeSet);
+ em.persist(driftDef);
+ em.persist(driftSet);
+ changeSet.setInitialDriftSet(driftSet);
+ em.merge(changeSet);
+ }
+ });
+
+ jpaDriftServer.copyChangeSet(getOverlord(), changeSet.getId(), driftDef.getId(), resource.getId());
+
+ // verify that the change set was created for the definition
+ JPADriftChangeSetCriteria criteria = new JPADriftChangeSetCriteria();
+ criteria.addFilterDriftDefinitionId(driftDef.getId());
+ criteria.addFilterCategory(COVERAGE);
+
+ PageList<JPADriftChangeSet> changeSets = jpaDriftServer.findDriftChangeSetsByCriteria(getOverlord(), criteria);
+
+ assertEquals("Expected to get back one change set", 1,changeSets.size());
+
+ JPADriftChangeSet newChangeSet = changeSets.get(0);
+ Set<JPADrift> expectedDrifts = new HashSet<JPADrift>(asList(drift1, drift2));
+ Set<JPADrift> actualDrifts = newChangeSet.getDrifts();
+
+ AssertUtils.assertCollectionMatchesNoOrder("The change set drifts were not copied correctly", expectedDrifts,
+ actualDrifts,
+ "changeSet", "newDriftFile");
+ }
+
+ private DriftFileDTO toDTo(JPADriftFile driftFile) {
+ DriftFileDTO dto = new DriftFileDTO();
+ dto.setHashId(driftFile.getHashId());
+ dto.setDataSize(driftFile.getDataSize());
+ dto.setStatus(driftFile.getStatus());
+ return dto;
+ }
+
+
+ private void assertDriftFilePersisted(JPADriftFile driftFile, String name, String content) {
+ assertNotNull("Failed to get " + name + " Was it persisted?", driftFile);
+ assertEquals("The content for " + name + " is wrong", content, jpaDriftServer.getDriftFileBits(
+ driftFile.getHashId()));
+ assertEquals("The drift file status is wrong", LOADED, driftFile.getStatus());
+ }
+
+}
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/drift/ManageDriftDefinitionsTest.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/drift/ManageDriftDefinitionsTest.java
new file mode 100644
index 0000000..26ccf94
--- /dev/null
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/drift/ManageDriftDefinitionsTest.java
@@ -0,0 +1,338 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2011 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+package org.rhq.enterprise.server.drift;
+
+import static java.util.Arrays.asList;
+import static org.rhq.core.domain.drift.DriftCategory.FILE_ADDED;
+import static org.rhq.core.domain.drift.DriftChangeSetCategory.COVERAGE;
+import static org.rhq.core.domain.drift.DriftConfigurationDefinition.BaseDirValueContext.fileSystem;
+import static org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode.normal;
+import static org.rhq.core.domain.drift.DriftDefinitionComparator.CompareMode.BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS;
+import static org.rhq.enterprise.server.util.LookupUtil.getDriftManager;
+import static org.rhq.enterprise.server.util.LookupUtil.getDriftTemplateManager;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import javax.persistence.EntityManager;
+
+import org.testng.annotations.Test;
+
+import org.rhq.core.domain.common.EntityContext;
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.criteria.DriftDefinitionCriteria;
+import org.rhq.core.domain.criteria.JPADriftChangeSetCriteria;
+import org.rhq.core.domain.drift.Drift;
+import org.rhq.core.domain.drift.DriftChangeSet;
+import org.rhq.core.domain.drift.DriftComplianceStatus;
+import org.rhq.core.domain.drift.DriftConfigurationDefinition;
+import org.rhq.core.domain.drift.DriftDefinition;
+import org.rhq.core.domain.drift.DriftDefinitionComparator;
+import org.rhq.core.domain.drift.DriftDefinitionTemplate;
+import org.rhq.core.domain.drift.DriftSnapshot;
+import org.rhq.core.domain.drift.JPADrift;
+import org.rhq.core.domain.drift.JPADriftChangeSet;
+import org.rhq.core.domain.drift.JPADriftFile;
+import org.rhq.core.domain.drift.JPADriftSet;
+import org.rhq.core.domain.resource.Resource;
+import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.core.domain.util.PageList;
+import org.rhq.enterprise.server.safeinvoker.HibernateDetachUtility;
+import org.rhq.enterprise.server.test.TransactionCallback;
+import org.rhq.test.AssertUtils;
+
+@Test
+public class ManageDriftDefinitionsTest extends AbstractDriftServerTest {
+
+ private final String DRIFT_NOT_SUPPORTED_TYPE = getClass().getSimpleName() + "DRIFT_NOT_SUPPORTED_RESOURCE_TYPE";
+
+ private final String DRIFT_NOT_SUPPORTED_RESOURCE = getClass().getSimpleName() + "DRIFT_NOT_SUPPORTED_RESOURCE";
+
+ private DriftManagerLocal driftMgr;
+
+ private DriftTemplateManagerLocal templateMgr;
+
+ private ResourceType driftNotSupportedType;
+
+ private Resource driftNotSupportedResource;
+
+ @Override
+ public void beforeMethod() throws Exception {
+ driftMgr = getDriftManager();
+ templateMgr = getDriftTemplateManager();
+ }
+
+ @Override
+ protected void purgeDB(EntityManager em) {
+ deleteEntity(Resource.class, DRIFT_NOT_SUPPORTED_RESOURCE, em);
+ deleteEntity(ResourceType.class, DRIFT_NOT_SUPPORTED_TYPE, em);
+ }
+
+ public void createDefinitionFromUnpinnedTemplate() {
+ // first create a template
+ final DriftDefinition templateDef = new DriftDefinition(new Configuration());
+ templateDef.setName("test_createUnpinnedDefinition");
+ templateDef.setEnabled(true);
+ templateDef.setDriftHandlingMode(normal);
+ templateDef.setInterval(2400L);
+ templateDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test"));
+
+ // persist the template
+ DriftDefinitionTemplate template = templateMgr.createTemplate(getOverlord(), resourceType.getId(), false,
+ templateDef);
+
+ // create and persist the definition
+ DriftDefinition definition = template.createDefinition();
+ definition.setTemplate(template);
+ driftMgr.updateDriftDefinition(getOverlord(), EntityContext.forResource(resource.getId()), definition);
+
+ // verify that the definition was created
+ DriftDefinition newDef = loadDefinition(definition.getName());
+ DriftDefinitionComparator comparator = new DriftDefinitionComparator(
+ BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS);
+
+ assertEquals("The drift definition was not persisted correctly", 0, comparator.compare(definition, newDef));
+ assertEquals("The template association was not set on the definition", template, newDef.getTemplate());
+ }
+
+ // The following two tests are commented out because when they are enabled
+ // and all tests in the itests module are run, the @AfterClass method for
+ // DriftTemplateManagerBeanTest does not run immediately after all of its
+ // test methods have finished running. Instead, some of the tests in
+ // ManageDriftDefinitionsTest start running. This leads to some database
+ // constraint violations because of how agents are created in the parent
+ // class, DriftServerTest. See http://groups.google.com/group/testng-users/browse_thread/thread/da279067...
+ // more info on the order in which TestNG executes tests.
+
+// public void createEntitiesThatDoNotSupportDrift() {
+// // first create the resource type that does not support drift
+// driftNotSupportedType = new ResourceTypeBuilder()
+// .createResourceType()
+// .withId(0)
+// .withName(DRIFT_NOT_SUPPORTED_TYPE)
+// .withCategory(SERVER)
+// .withPlugin(DRIFT_NOT_SUPPORTED_TYPE.toLowerCase())
+// .build();
+//
+// // create a resource of the type that does not support drift
+// driftNotSupportedResource = new ResourceBuilder()
+// .createResource()
+// .withId(0)
+// .withName(DRIFT_NOT_SUPPORTED_RESOURCE)
+// .withResourceKey(DRIFT_NOT_SUPPORTED_RESOURCE)
+// .withRandomUuid()
+// .withResourceType(driftNotSupportedType)
+// .build();
+//
+// executeInTransaction(new TransactionCallback() {
+// @Override
+// public void execute() throws Exception {
+// EntityManager em = getEntityManager();
+// em.persist(driftNotSupportedType);
+// em.persist(driftNotSupportedResource);
+// }
+// });
+// }
+//
+// @Test(dependsOnMethods = "createEntitiesThatDoNotSupportDrift",
+// expectedExceptions = EJBException.class,
+// expectedExceptionsMessageRegExp = ".*Cannot create drift definition.*type.*does not support drift management")
+// @InitDB(false)
+// public void doNotAllowDefinitionToBeCreatedForTypeThatDoesNotSupportDrift() {
+// DriftDefinition driftDef = new DriftDefinition(new Configuration());
+// driftDef.setName("test_typeDoesNotSupportDrift");
+// driftDef.setEnabled(true);
+// driftDef.setInterval(1800L);
+// driftDef.setDriftHandlingMode(normal);
+// driftDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test"));
+//
+// driftMgr.updateDriftDefinition(getOverlord(), EntityContext.forResource(driftNotSupportedResource.getId()),
+// driftDef);
+// }
+
+ @SuppressWarnings("unchecked")
+ public void createDefinitionFromPinnedTemplate() throws Exception {
+ // We first need to create a pinned template. Users can only create a pinned
+ // template from a snapshot of an existing resource-level drift definition.
+ // We are going to take a bit of a short cut though by directly creating
+ // and persisting the pinned change set.
+
+ // first create the change set
+ final JPADriftChangeSet changeSet0 = new JPADriftChangeSet(null, 0, COVERAGE, null);
+ changeSet0.setDriftHandlingMode(DriftConfigurationDefinition.DriftHandlingMode.normal);
+
+ final JPADriftFile driftFile1 = new JPADriftFile("a1b2c3");
+ final JPADriftFile driftFile2 = new JPADriftFile("1a2b3c");
+
+ JPADrift drift1 = new JPADrift(changeSet0, "drift.1", FILE_ADDED, null, driftFile1);
+ JPADrift drift2 = new JPADrift(changeSet0, "drift.2", FILE_ADDED, null, driftFile2);
+
+ final JPADriftSet driftSet = new JPADriftSet();
+ driftSet.addDrift(drift1);
+ driftSet.addDrift(drift2);
+
+ // create the template
+ final DriftDefinition templateDef = new DriftDefinition(new Configuration());
+ templateDef.setName("test_createUnpinnedDefinition");
+ templateDef.setEnabled(true);
+ templateDef.setDriftHandlingMode(normal);
+ templateDef.setInterval(2400L);
+ templateDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test"));
+ templateDef.setPinned(true);
+
+ final DriftDefinitionTemplate template = templateMgr.createTemplate(getOverlord(), resourceType.getId(), true,
+ templateDef);
+
+ executeInTransaction(false, new TransactionCallback() {
+ @Override
+ public void execute() throws Exception {
+ EntityManager em = getEntityManager();
+
+ em.persist(driftFile1);
+ em.persist(driftFile2);
+ em.persist(changeSet0);
+ em.persist(driftSet);
+ changeSet0.setInitialDriftSet(driftSet);
+ em.merge(changeSet0);
+
+ // setting the change set id on the template is the last and the
+ // most important step in making the template pinned
+ template.setChangeSetId(changeSet0.getId());
+ em.merge(template);
+ }
+ });
+
+ // Create and persist a resource-level definition.
+ final DriftDefinition definition = template.createDefinition();
+ definition.setTemplate(template);
+
+ final AtomicBoolean agentInvoked = new AtomicBoolean(false);
+
+ agentServiceContainer.driftService = new TestDefService() {
+ @Override
+ public void updateDriftDetection(int resourceId, DriftDefinition driftDef, DriftSnapshot snapshot) {
+ try {
+ HibernateDetachUtility.nullOutUninitializedFields(driftDef,
+ HibernateDetachUtility.SerializationType.SERIALIZATION);
+ HibernateDetachUtility.nullOutUninitializedFields(snapshot,
+ HibernateDetachUtility.SerializationType.SERIALIZATION);
+ agentInvoked.set(true);
+ assertNotNull("Expected snapshot drift instances collection to be non-null",
+ snapshot.getDriftInstances());
+ assertEquals("Expected snapshot to contain two drift entries", 2, snapshot.getDriftInstances().size());
+ } catch (Exception e) {
+ String msg = "Do not pass attached entites to agent since those entities are outside of " +
+ "Hibernate's control. The persistence context should be flushed and cleared to ensure that " +
+ "only detached objects are sent to the agent";
+ throw new RuntimeException(msg, e);
+ }
+ }
+ };
+
+ driftMgr.updateDriftDefinition(getOverlord(), EntityContext.forResource(resource.getId()), definition);
+
+ DriftDefinition newDef = loadDefinition(definition.getName());
+
+ // verify that the definition is marked as pinned
+ assertTrue("The drift definition should be marked as pinned", newDef.isPinned());
+
+ // verify that the initial change set is generated for the definition
+ JPADriftChangeSetCriteria criteria = new JPADriftChangeSetCriteria();
+ criteria.addFilterDriftDefinitionId(definition.getId());
+ criteria.addFilterCategory(COVERAGE);
+ criteria.fetchDrifts(true);
+
+ PageList<? extends DriftChangeSet<?>> changeSets = driftMgr.findDriftChangeSetsByCriteria(getOverlord(),
+ criteria);
+ assertEquals("Expected to find one change set", 1, changeSets.size());
+
+ JPADriftChangeSet expectedChangeSet = new JPADriftChangeSet(resource, 1, COVERAGE, null);
+ List<? extends Drift> expectedDrifts = asList(
+ new JPADrift(expectedChangeSet, drift1.getPath(), FILE_ADDED, null, driftFile1),
+ new JPADrift(expectedChangeSet, drift2.getPath(), FILE_ADDED, null, driftFile2));
+
+ DriftChangeSet<?> actualChangeSet = changeSets.get(0);
+ List<? extends Drift> actualDrifts = new ArrayList(actualChangeSet.getDrifts());
+
+ AssertUtils.assertCollectionMatchesNoOrder(
+ "Expected to find drifts from change sets 1 and 2 in the template change set",
+ (List<Drift>) expectedDrifts, (List<Drift>) actualDrifts, "id", "ctime", "changeSet", "newDriftFile");
+
+ // lastly verify that the agent is called
+ assertTrue("Failed to send drift definition along with snapshot to agent", agentInvoked.get());
+ }
+
+ public void unpinDefinition() {
+ // First create the template
+ final DriftDefinition templateDef = new DriftDefinition(new Configuration());
+ templateDef.setName("test_unpin_def_template");
+ templateDef.setEnabled(true);
+ templateDef.setDriftHandlingMode(normal);
+ templateDef.setInterval(2400L);
+ templateDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test"));
+
+ final DriftDefinitionTemplate template = templateMgr.createTemplate(getOverlord(), resourceType.getId(), true,
+ templateDef);
+
+ // First create the definition
+ DriftDefinition definition = template.createDefinition();
+ definition.setName("test_unpin");
+ definition.setEnabled(true);
+ definition.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test"));
+ definition.setComplianceStatus(DriftComplianceStatus.OUT_OF_COMPLIANCE_DRIFT);
+ definition.setInterval(1800L);
+ definition.setDriftHandlingMode(normal);
+ definition.setPinned(true);
+
+ // persist the definition
+ driftMgr.updateDriftDefinition(getOverlord(), EntityContext.forResource(resource.getId()), definition);
+
+ // now update the definition
+ DriftDefinition newDef = loadDefinition(definition.getName());
+ assertNotNull("Failed to load new definition, " + toString(definition));
+ newDef.setPinned(false);
+
+ driftMgr.updateDriftDefinition(getOverlord(), EntityContext.forResource(resource.getId()), newDef);
+
+ // now verify that the definition was updated
+ DriftDefinition updatedDef = loadDefinition(definition.getName());
+ assertNotNull("Failed to load updated definition, " + toString(newDef));
+
+ assertFalse("The updated definition should be set to unpinned", updatedDef.isPinned());
+ assertEquals("The updated definition should be set to in compliance", DriftComplianceStatus.IN_COMPLIANCE,
+ updatedDef.getComplianceStatus());
+ }
+
+ private DriftDefinition loadDefinition(String name) {
+ DriftDefinitionCriteria criteria = new DriftDefinitionCriteria();
+ criteria.addFilterResourceIds(resource.getId());
+ criteria.addFilterName(name);
+ criteria.fetchConfiguration(true);
+ criteria.fetchResource(true);
+ criteria.fetchTemplate(true);
+
+ PageList<DriftDefinition> driftDefs = driftMgr.findDriftDefinitionsByCriteria(getOverlord(), criteria);
+ assertEquals("Expected to find one drift definition", 1, driftDefs.size());
+
+ return driftDefs.get(0);
+ }
+
+}
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/drift/ManageSnapshotsTest.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/drift/ManageSnapshotsTest.java
new file mode 100644
index 0000000..a7294bf
--- /dev/null
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/drift/ManageSnapshotsTest.java
@@ -0,0 +1,275 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2011 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+package org.rhq.enterprise.server.drift;
+
+import static java.util.Arrays.asList;
+import static org.rhq.core.domain.drift.DriftCategory.FILE_ADDED;
+import static org.rhq.core.domain.drift.DriftChangeSetCategory.COVERAGE;
+import static org.rhq.core.domain.drift.DriftChangeSetCategory.DRIFT;
+import static org.rhq.core.domain.drift.DriftConfigurationDefinition.BaseDirValueContext.fileSystem;
+import static org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode.normal;
+import static org.rhq.enterprise.server.util.LookupUtil.getDriftManager;
+import static org.rhq.enterprise.server.util.LookupUtil.getDriftTemplateManager;
+import static org.rhq.test.AssertUtils.assertPropertiesMatch;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectOutputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import javax.persistence.EntityManager;
+
+import org.testng.annotations.Test;
+
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.criteria.GenericDriftChangeSetCriteria;
+import org.rhq.core.domain.drift.Drift;
+import org.rhq.core.domain.drift.DriftChangeSet;
+import org.rhq.core.domain.drift.DriftDefinition;
+import org.rhq.core.domain.drift.DriftDefinitionTemplate;
+import org.rhq.core.domain.drift.DriftSnapshot;
+import org.rhq.core.domain.drift.JPADrift;
+import org.rhq.core.domain.drift.JPADriftChangeSet;
+import org.rhq.core.domain.drift.JPADriftFile;
+import org.rhq.core.domain.drift.JPADriftSet;
+import org.rhq.core.domain.server.EntitySerializer;
+import org.rhq.core.domain.util.PageList;
+import org.rhq.enterprise.server.test.TransactionCallback;
+import org.rhq.test.AssertUtils;
+
+@Test
+public class ManageSnapshotsTest extends AbstractDriftServerTest {
+
+ private DriftManagerLocal driftMgr;
+
+ private DriftTemplateManagerLocal templateMgr;
+
+ @Override
+ public void beforeMethod() throws Exception {
+ driftMgr = getDriftManager();
+ templateMgr = getDriftTemplateManager();
+ }
+
+ public void pinningSnapshotShouldSetDriftDefAsPinned() {
+ final DriftDefinition driftDef = createAndPersistDriftDef("test::setPinnedFlag");
+
+ // create initial change set
+ final JPADriftChangeSet changeSet = new JPADriftChangeSet(resource, 0, COVERAGE, driftDef);
+
+ final JPADriftFile driftFile1 = new JPADriftFile("a1b2c3");
+ JPADrift drift = new JPADrift(changeSet, "drift.1", FILE_ADDED, null, driftFile1);
+
+ final JPADriftSet driftSet = new JPADriftSet();
+ driftSet.addDrift(drift);
+
+ executeInTransaction(false, new TransactionCallback() {
+ @Override
+ public void execute() throws Exception {
+ EntityManager em = getEntityManager();
+ em.persist(driftFile1);
+ em.persist(changeSet);
+ em.persist(driftSet);
+ changeSet.setInitialDriftSet(driftSet);
+ em.merge(changeSet);
+ }
+ });
+
+ driftMgr.pinSnapshot(getOverlord(), driftDef.getId(), 0);
+ DriftDefinition updatedDriftDef = driftMgr.getDriftDefinition(getOverlord(), driftDef.getId());
+
+ assertNotNull("Failed to get " + toString(driftDef), updatedDriftDef);
+ assertTrue("Failed to set pinned flag of " + toString(driftDef), updatedDriftDef.isPinned());
+ }
+
+ @SuppressWarnings("unchecked")
+ public void pinningSnapshotShouldMakeSnapshotTheInitialChangeSet() throws Exception {
+ final DriftDefinition driftDef = createAndPersistDriftDef("test::makeSnapshotVersionZero");
+
+ // create initial change set
+ final JPADriftChangeSet changeSet0 = new JPADriftChangeSet(resource, 0, COVERAGE, driftDef);
+
+ final JPADriftFile driftFile1 = new JPADriftFile("a1b2c3");
+ JPADrift drift1 = new JPADrift(changeSet0, "drift.1", FILE_ADDED, null, driftFile1);
+
+ final JPADriftSet driftSet = new JPADriftSet();
+ driftSet.addDrift(drift1);
+
+ // create change set v1
+ final JPADriftFile driftFile2 = new JPADriftFile("1a2b3c");
+ final JPADriftChangeSet changeSet1 = new JPADriftChangeSet(resource, 1, DRIFT, driftDef);
+ final JPADrift drift2 = new JPADrift(changeSet1, "drift.2", FILE_ADDED, null, driftFile2);
+
+ executeInTransaction(false, new TransactionCallback() {
+ @Override
+ public void execute() throws Exception {
+ EntityManager em = getEntityManager();
+ em.persist(driftFile1);
+ em.persist(driftFile2);
+ em.persist(changeSet0);
+ em.persist(driftSet);
+ changeSet0.setInitialDriftSet(driftSet);
+ em.merge(changeSet0);
+ em.persist(changeSet1);
+ em.persist(drift2);
+ }
+ });
+
+ driftMgr.pinSnapshot(getOverlord(), driftDef.getId(), 1);
+
+ // Verify that there is now only one change set for the drift def
+ GenericDriftChangeSetCriteria criteria = new GenericDriftChangeSetCriteria();
+ criteria.addFilterDriftDefinitionId(driftDef.getId());
+
+ PageList<? extends DriftChangeSet<?>> changeSets = driftMgr.findDriftChangeSetsByCriteria(getOverlord(),
+ criteria);
+ assertEquals("All change sets except the change set representing the pinned snapshot should be removed",
+ 1, changeSets.size());
+ DriftChangeSet<?> changeSet = changeSets.get(0);
+
+ assertEquals("The pinned snapshot version should be reset to zero", 0, changeSet.getVersion());
+ assertEquals("The change set category is wrong", COVERAGE, changeSet.getCategory());
+
+ JPADriftChangeSet expectedChangeSet = new JPADriftChangeSet(resource, 1, COVERAGE, driftDef);
+ List<? extends Drift> expectedDrifts = asList(
+ new JPADrift(expectedChangeSet, drift1.getPath(), FILE_ADDED, null, driftFile1),
+ new JPADrift(expectedChangeSet, drift2.getPath(), FILE_ADDED, null, driftFile2));
+
+ List<? extends Drift> actualDrifts = new ArrayList(changeSet.getDrifts());
+
+ AssertUtils.assertCollectionMatchesNoOrder(
+ "Expected to find drifts from change sets 1 and 2 in the new initial change set",
+ (List<Drift>) expectedDrifts, (List<Drift>) actualDrifts, "id", "ctime", "changeSet", "newDriftFile");
+
+ // we need to compare the newDriftFile properties separately because
+ // assertCollectionMatchesNoOrder compares properties via equals() and JPADriftFile
+ // does not implement equals.
+ assertPropertiesMatch(drift1.getNewDriftFile(), findDriftByPath(actualDrifts, "drift.1").getNewDriftFile(),
+ "The newDriftFile property was not set correctly for " + drift1);
+ assertPropertiesMatch(drift2.getNewDriftFile(), findDriftByPath(actualDrifts, "drift.2").getNewDriftFile(),
+ "The newDriftFile property was not set correctly for " + drift1);
+ }
+
+ public void pinningSnapshotShouldSendRequestToAgent() {
+ final DriftDefinition driftDef = createAndPersistDriftDef("test::setPinnedFlag");
+
+ // create initial change set
+ final JPADriftChangeSet changeSet = new JPADriftChangeSet(resource, 0, COVERAGE, driftDef);
+
+ final JPADriftFile driftFile1 = new JPADriftFile("a1b2c3");
+ JPADrift drift = new JPADrift(changeSet, "drift.1", FILE_ADDED, null, driftFile1);
+
+ final JPADriftSet driftSet = new JPADriftSet();
+ driftSet.addDrift(drift);
+
+ executeInTransaction(false, new TransactionCallback() {
+ @Override
+ public void execute() throws Exception {
+ EntityManager em = getEntityManager();
+ em.persist(driftFile1);
+ em.persist(changeSet);
+ em.persist(driftSet);
+ changeSet.setInitialDriftSet(driftSet);
+ em.merge(changeSet);
+ }
+ });
+
+ final AtomicBoolean agentInvoked = new AtomicBoolean(false);
+ agentServiceContainer.driftService = new TestDefService() {
+ @Override
+ public void pinSnapshot(int resourceId, String configName, DriftSnapshot snapshot) {
+ try {
+ agentInvoked.set(true);
+ // serialize the method arguments here to more closely simulate what
+ // happens during the call. We cannot send hibernate-proxied objects
+ // to the agent. This is an attempt to catch that.
+ ObjectOutputStream stream = new ObjectOutputStream(new ByteArrayOutputStream());
+ EntitySerializer.writeExternalRemote(resourceId, stream);
+ EntitySerializer.writeExternalRemote(configName, stream);
+ EntitySerializer.writeExternalRemote(snapshot, stream);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ };
+
+ driftMgr.pinSnapshot(getOverlord(), driftDef.getId(), 0);
+
+ assertTrue("Failed to send request to agent to pin snapshot", agentInvoked.get());
+ }
+
+ @Test(expectedExceptions = IllegalArgumentException.class,
+ expectedExceptionsMessageRegExp = "Cannot repin.*definition.*")
+ public void doNotAllowSnapshotToBePinnedWhenDefinitionIsAttachedToPinnedTemplate() {
+ // First create the template
+ final DriftDefinition templateDef = new DriftDefinition(new Configuration());
+ templateDef.setName("Template-Pinned_Test");
+ templateDef.setEnabled(true);
+ templateDef.setDriftHandlingMode(normal);
+ templateDef.setInterval(2400L);
+ templateDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test"));
+
+ final DriftDefinitionTemplate template = templateMgr.createTemplate(getOverlord(), resourceType.getId(), true,
+ templateDef);
+
+ // Now we will pin the template. We are going to take a bit of a short cut
+ // here. Pinning a template requires a drift definition with at least one
+ // snapshot. For the purposes of this test we can simply set the
+ // changeSetId field of the template to indicate that it is pinned.
+ template.setChangeSetId("1234");
+
+ // Next create a resource-level definition from the template.
+ final DriftDefinition driftDef = template.createDefinition();
+ driftDef.setResource(resource);
+
+ executeInTransaction(false, new TransactionCallback() {
+ @Override
+ public void execute() throws Exception {
+ EntityManager em = getEntityManager();
+ em.merge(template);
+ em.persist(driftDef);
+ }
+ });
+
+ // Now try resource-level pinning, i.e., pin a snapshot to the definition
+ driftMgr.pinSnapshot(getOverlord(), driftDef.getId(), 0);
+ }
+
+ private DriftDefinition createAndPersistDriftDef(String name) {
+ final DriftDefinition driftDef = new DriftDefinition(new Configuration());
+ driftDef.setName(name);
+ driftDef.setEnabled(true);
+ driftDef.setDriftHandlingMode(normal);
+ driftDef.setInterval(1800L);
+ driftDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test"));
+
+ executeInTransaction(false, new TransactionCallback() {
+ @Override
+ public void execute() throws Exception {
+ driftDef.setResource(resource);
+ getEntityManager().persist(driftDef);
+ }
+ });
+
+ return driftDef;
+ }
+
+}
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/test/AbstractMeasurementScheduleManagerTest.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/test/AbstractMeasurementScheduleManagerTest.java
index b11102e..ab15fd5 100644
--- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/test/AbstractMeasurementScheduleManagerTest.java
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/test/AbstractMeasurementScheduleManagerTest.java
@@ -24,13 +24,10 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Set;
-import javax.management.MBeanServer;
-
import org.rhq.core.domain.measurement.MeasurementScheduleRequest;
import org.rhq.core.domain.measurement.ResourceMeasurementScheduleRequest;
import org.rhq.core.domain.resource.Agent;
import org.rhq.enterprise.server.agentclient.AgentClient;
-import org.rhq.enterprise.server.core.comm.ServerCommunicationsServiceMBean;
import org.rhq.enterprise.server.measurement.MeasurementConstants;
import org.rhq.enterprise.server.test.AbstractEJB3Test;
import org.rhq.enterprise.server.test.TestAgentClient;
@@ -44,17 +41,7 @@ public class AbstractMeasurementScheduleManagerTest extends AbstractEJB3Test {
@Override
public TestServerCommunicationsService prepareForTestAgents() {
- try {
- MBeanServer mbs = getPlatformMBeanServer();
- if (mbs.isRegistered(ServerCommunicationsServiceMBean.OBJECT_NAME)) {
- mbs.unregisterMBean(ServerCommunicationsServiceMBean.OBJECT_NAME);
- }
- TestServerCommunicationsService testAgentContainer = new MeasurementScheduleTestServerCommunicationsService();
- mbs.registerMBean(testAgentContainer, ServerCommunicationsServiceMBean.OBJECT_NAME);
- return testAgentContainer;
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
+ return prepareForTestAgents(new MeasurementScheduleTestServerCommunicationsService());
}
public static class MeasurementScheduleTestServerCommunicationsService extends TestServerCommunicationsService {
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/test/MeasurementScheduleManagerTest.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/test/MeasurementScheduleManagerTest.java
index e978521..f12c0f7 100644
--- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/test/MeasurementScheduleManagerTest.java
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/test/MeasurementScheduleManagerTest.java
@@ -28,8 +28,6 @@ import javax.persistence.Query;
import junit.framework.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.rhq.core.domain.auth.Subject;
@@ -68,8 +66,8 @@ public class MeasurementScheduleManagerTest extends AbstractMeasurementScheduleM
private Agent theAgent;
private MeasurementScheduleTestServerCommunicationsService testCommService;
- @BeforeMethod
- public void beforeMethod() {
+ @Override
+ protected void beforeMethod() {
try {
prepareScheduler();
testCommService = (MeasurementScheduleTestServerCommunicationsService) prepareForTestAgents();
@@ -84,8 +82,8 @@ public class MeasurementScheduleManagerTest extends AbstractMeasurementScheduleM
}
}
- @AfterMethod
- public void afterMethod() {
+ @Override
+ protected void afterMethod() {
EntityManager em = null;
try {
@@ -356,7 +354,7 @@ public class MeasurementScheduleManagerTest extends AbstractMeasurementScheduleM
try {
if (null != em) {
em.flush();
- getTransactionManager().commit();
+ getTransactionManager().rollback();
em.close();
}
} catch (Throwable t) {
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java
index 8064bdc..b68a517 100644
--- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java
@@ -2,6 +2,7 @@ package org.rhq.enterprise.server.test;
import java.io.File;
import java.lang.management.ManagementFactory;
+import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Collection;
@@ -25,22 +26,29 @@ import org.testng.annotations.BeforeMethod;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.test.api.ArquillianResource;
import org.jboss.arquillian.testng.Arquillian;
+import org.jboss.shrinkwrap.api.Archive;
import org.jboss.shrinkwrap.api.ArchivePaths;
import org.jboss.shrinkwrap.api.Filters;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.EmptyAsset;
+import org.jboss.shrinkwrap.api.exporter.ZipExporter;
import org.jboss.shrinkwrap.api.spec.EnterpriseArchive;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
+import org.jboss.shrinkwrap.impl.base.exporter.zip.ZipExporterImpl;
import org.jboss.shrinkwrap.resolver.api.DependencyResolvers;
import org.jboss.shrinkwrap.resolver.api.maven.MavenDependencyResolver;
import org.rhq.core.db.DatabaseTypeFactory;
import org.rhq.core.domain.auth.Subject;
+import org.rhq.core.domain.shared.BuilderException;
+import org.rhq.core.domain.shared.ResourceBuilder;
+import org.rhq.core.domain.shared.ResourceTypeBuilder;
import org.rhq.core.util.MessageDigestGenerator;
import org.rhq.core.util.exception.ThrowableUtil;
import org.rhq.core.util.stream.StreamUtil;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.auth.SessionManager;
+import org.rhq.enterprise.server.core.comm.ServerCommunicationsServiceMBean;
import org.rhq.enterprise.server.core.plugin.PluginDeploymentScanner;
import org.rhq.enterprise.server.core.plugin.PluginDeploymentScannerMBean;
import org.rhq.enterprise.server.plugin.pc.ServerPluginService;
@@ -57,6 +65,7 @@ public abstract class AbstractEJB3Test extends Arquillian {
protected static final String JNDI_RHQDS = "java:jboss/datasources/RHQDS";
+ private TestServerCommunicationsService agentService;
private SchedulerService schedulerService;
private ServerPluginService serverPluginService;
private PluginDeploymentScannerMBean pluginScannerService;
@@ -105,9 +114,13 @@ public abstract class AbstractEJB3Test extends Arquillian {
testClassesJar.addClass(MessageDigestGenerator.class);
testClassesJar.addClass(StreamUtil.class);
testClassesJar.addClass(AssertUtils.class);
+ testClassesJar.addClass(ResourceBuilder.class);
+ testClassesJar.addClass(ResourceTypeBuilder.class);
+ testClassesJar.addClass(BuilderException.class);
testClassesJar.addClasses(PropertyMatcher.class, MatchResult.class, PropertyMatchException.class);
testClassesJar.addAsManifestResource(EmptyAsset.INSTANCE, ArchivePaths.create("beans.xml")); // add CDI injection (needed by arquillian injection);
testClassesJar.addAsResource("test-scheduler.properties");
+ testClassesJar.addAsResource("test-alert-sender-serverplugin.xml");
// create test ear by starting with rhq.ear and thinning it
MavenDependencyResolver earResolver = DependencyResolvers.use(MavenDependencyResolver.class);
@@ -144,6 +157,8 @@ public abstract class AbstractEJB3Test extends Arquillian {
Collection<JavaArchive> dependencies = new HashSet<JavaArchive>();
dependencies.addAll(resolver.artifact("org.powermock:powermock-api-mockito").resolveAs(JavaArchive.class));
dependencies.addAll(resolver.artifact("org.liquibase:liquibase-core").resolveAs(JavaArchive.class));
+ dependencies
+ .addAll(resolver.artifact("org.jboss.shrinkwrap:shrinkwrap-impl-base").resolveAs(JavaArchive.class));
dependencies.addAll(resolver.artifact("org.rhq:test-utils").resolveAs(JavaArchive.class));
dependencies.addAll(resolver.artifact("org.rhq.helpers:perftest-support").resolveAs(JavaArchive.class));
@@ -157,16 +172,21 @@ public abstract class AbstractEJB3Test extends Arquillian {
// System.out.println("** The Deployment EAR: " + ear.toString(true) + "\n");
// Save the test EAR to a zip file for inspection (set file explicitly)
- // try {
- // ZipExporter exporter = new ZipExporterImpl(ear);
- // exporter.exportTo(new File("/home/jshaughn/temp/test-ear.ear"), true);
- // } catch (Exception e) {
- // e.printStackTrace();
- // }
+ //exportZip(testEar, new File("/home/jshaughn/temp/test-ear.ear"));
return testEar;
}
+ @SuppressWarnings("unused")
+ static private void exportZip(Archive<?> zipArchive, File outFile) {
+ try {
+ ZipExporter exporter = new ZipExporterImpl(zipArchive);
+ exporter.exportTo(outFile, true);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
/**
* @param dependencies The current set of deps - THIS IS FILTERED, not copied
* @param filters regex filters
@@ -241,7 +261,7 @@ public abstract class AbstractEJB3Test extends Arquillian {
* and {@link #inContainer()} call.
*/
@BeforeMethod
- protected void __beforeMethod() throws Throwable {
+ protected void __beforeMethod(Method method) throws Throwable {
// Note that Arquillian calls the testng BeforeMethod twice (as of 1.0.2.Final, once
// out of container and once in container. In general the expectation is to execute it
// one time, and doing it in container allows for the expected injections and context.
@@ -264,6 +284,7 @@ public abstract class AbstractEJB3Test extends Arquillian {
}
beforeMethod();
+ beforeMethod(method);
} catch (Throwable t) {
// Arquillian is eating these, make sure they show up in some way
@@ -299,6 +320,13 @@ public abstract class AbstractEJB3Test extends Arquillian {
}
/**
+ * Override Point! Do not implement a @BeforeMethod, instead override this method.
+ */
+ protected void beforeMethod(Method method) throws Exception {
+ // do nothing if we're not overridden
+ }
+
+ /**
* Override Point! Do not implement an @AfterMethod, instead override this method.
*/
protected void afterMethod() throws Exception {
@@ -600,7 +628,83 @@ public abstract class AbstractEJB3Test extends Arquillian {
} else {
//MBeanServerFactory.releaseMBeanServer(mbs);
}
+ }
+ }
+
+ /**
+ * If you need to test round trips from server to agent and back, you first must install the server communications
+ * service that houses all the agent clients. Call this method and add your test agent services to the public fields
+ * in the returned object.
+ *
+ * @return the object that will house your test agent service impls and the agent clients.
+ *
+ * @throws RuntimeException
+ */
+ public TestServerCommunicationsService prepareForTestAgents() {
+ if (agentService != null) {
+ return agentService;
+ }
+
+ return prepareForTestAgents(new TestServerCommunicationsService());
+ }
+
+ /**
+ * If you need to test round trips from server to agent and back, you first must install the server communications
+ * service that houses all the agent clients. Call this method and add your test agent services to the public fields
+ * in the returned object.
+ *
+ * @return the object that will house your test agent service impls and the agent clients.
+ *
+ * @throws RuntimeException
+ */
+ public TestServerCommunicationsService prepareForTestAgents(TestServerCommunicationsServiceMBean customAgentService) {
+ try {
+ if (agentService != null) {
+ return agentService;
+ }
+
+ // first, unregister the real service...
+ MBeanServer mbs = getPlatformMBeanServer();
+ if (mbs.isRegistered(ServerCommunicationsServiceMBean.OBJECT_NAME)) {
+ mbs.unregisterMBean(ServerCommunicationsServiceMBean.OBJECT_NAME);
+ }
+
+ // Now replace with the test service...
+ TestServerCommunicationsService agentService = new TestServerCommunicationsService();
+ mbs.registerMBean(customAgentService, ServerCommunicationsServiceMBean.OBJECT_NAME);
+ return agentService;
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw new RuntimeException(e);
+ }
+ }
+ /**
+ * Call this after your tests have finished. You only need to call this if your test previously called
+ * {@link #prepareForTestAgents()}.
+ */
+ public void unprepareForTestAgents() {
+ unprepareForTestAgents(false);
+ }
+
+ public void unprepareForTestAgents(boolean beanOnly) {
+ try {
+ if (agentService != null) {
+ agentService.stop();
+ agentService = null;
+
+ MBeanServer mbs = getPlatformMBeanServer();
+ if (beanOnly) {
+ if (mbs.isRegistered(ServerCommunicationsServiceMBean.OBJECT_NAME)) {
+ mbs.unregisterMBean(ServerCommunicationsServiceMBean.OBJECT_NAME);
+ }
+ } else {
+ //MBeanServerFactory.releaseMBeanServer(mbs);
+ }
+ }
+ } catch (Exception e) {
+ throw new RuntimeException(e);
}
}
@@ -646,51 +750,6 @@ public abstract class AbstractEJB3Test extends Arquillian {
pluginScannerService = null;
}
- /**
- * If you need to test round trips from server to agent and back, you first must install the server communications
- * service that houses all the agent clients. Call this method and add your test agent services to the public fields
- * in the returned object.
- *
- * @return the object that will house your test agent service impls and the agent clients.
- *
- * @throws RuntimeException
- */
- public TestServerCommunicationsService prepareForTestAgents() {
- try {
- // MBeanServer mbs = getJBossMBeanServer();
- // if (mbs.isRegistered(ServerCommunicationsServiceMBean.OBJECT_NAME)) {
- // mbs.unregisterMBean(ServerCommunicationsServiceMBean.OBJECT_NAME);
- // }
- TestServerCommunicationsService testAgentContainer = new TestServerCommunicationsService();
- // mbs.registerMBean(testAgentContainer, ServerCommunicationsServiceMBean.OBJECT_NAME);
- return testAgentContainer;
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
-
- /**
- * Call this after your tests have finished. You only need to call this if your test previously called
- * {@link #prepareForTestAgents()}.
- */
- public void unprepareForTestAgents() {
- unprepareForTestAgents(false);
- }
-
- public void unprepareForTestAgents(boolean beanOnly) {
- try {
- if (beanOnly) {
- // MBeanServer mbs = getJBossMBeanServer();
- // if (mbs.isRegistered(ServerCommunicationsServiceMBean.OBJECT_NAME)) {
- // mbs.unregisterMBean(ServerCommunicationsServiceMBean.OBJECT_NAME);
- // }
- } else {
- // releaseJBossMBeanServer();
- }
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
public MBeanServer getPlatformMBeanServer() {
return ManagementFactory.getPlatformMBeanServer();
diff --git a/modules/enterprise/server/itests-2/src/test/resources/test-alert-sender-serverplugin.xml b/modules/enterprise/server/itests-2/src/test/resources/test-alert-sender-serverplugin.xml
new file mode 100644
index 0000000..f6bf879
--- /dev/null
+++ b/modules/enterprise/server/itests-2/src/test/resources/test-alert-sender-serverplugin.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<alert-plugin
+ name="alert-complex-test"
+ displayName="Alert:ComplexTest"
+ xmlns="urn:xmlns:rhq-serverplugin.alert"
+ xmlns:c="urn:xmlns:rhq-configuration"
+ xmlns:serverplugin="urn:xmlns:rhq-serverplugin"
+ package="org.rhq.enterprise.server.alert"
+ description="Alert sender plugin for testing the complex validation behavior."
+ >
+
+ <!-- How does this sender show up in drop downs etc -->
+ <short-name>Test Alert Sender</short-name>
+
+ <!-- Class that does the actual sending -->
+ <plugin-class>TestAlertSender</plugin-class>
+
+ <alert-configuration>
+ <c:simple-property name="persistent" type="string" required="true" description="The property that is persisted into the database."/>
+ <c:simple-property name="ephemeral" type="string" required="true" description="The property used only at creation/update time. It is not stored into the datbase because the plugin actually removes it from the configuration." />
+ </alert-configuration>
+</alert-plugin>
\ No newline at end of file
diff --git a/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/TestServerPluginService.java b/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/TestServerPluginService.java
deleted file mode 100644
index be9b752..0000000
--- a/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/TestServerPluginService.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2005-2012 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., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-package org.rhq.enterprise.server;
-
-import java.io.File;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.rhq.core.domain.configuration.Configuration;
-import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
-import org.rhq.core.domain.plugin.PluginKey;
-import org.rhq.core.domain.plugin.PluginStatusType;
-import org.rhq.core.domain.plugin.ServerPlugin;
-import org.rhq.core.util.MessageDigestGenerator;
-import org.rhq.enterprise.server.plugin.pc.AbstractTypeServerPluginContainer;
-import org.rhq.enterprise.server.plugin.pc.MasterServerPluginContainer;
-import org.rhq.enterprise.server.plugin.pc.MasterServerPluginContainerConfiguration;
-import org.rhq.enterprise.server.plugin.pc.ServerPluginEnvironment;
-import org.rhq.enterprise.server.plugin.pc.ServerPluginService;
-import org.rhq.enterprise.server.plugin.pc.ServerPluginType;
-import org.rhq.enterprise.server.xmlschema.ServerPluginDescriptorMetadataParser;
-import org.rhq.enterprise.server.xmlschema.ServerPluginDescriptorUtil;
-import org.rhq.enterprise.server.xmlschema.generated.serverplugin.ServerPluginDescriptorType;
-
-/**
- *
- *
- * @author Lukas Krejci
- */
-public abstract class TestServerPluginService extends ServerPluginService implements TestServerPluginServiceMBean {
- public TestMasterServerPluginContainer master;
- public MasterServerPluginContainerConfiguration masterConfig;
-
- protected TestServerPluginService() {
- // build the config at constructor time so tests have it even before the PC is initialized
- File dir = new File(System.getProperty("java.io.tmpdir"), "test-server-plugins");
- this.masterConfig = new MasterServerPluginContainerConfiguration(dir, dir, dir, null);
- }
-
- @Override
- public MasterServerPluginContainer createMasterPluginContainer() {
- this.master = new TestMasterServerPluginContainer();
- this.master.initialize(this.masterConfig);
- return this.master;
- }
-
- protected abstract List<AbstractTypeServerPluginContainer> createPluginContainers(MasterServerPluginContainer master);
-
- public static ServerPlugin getPlugin(ServerPluginEnvironment env) {
- return getPlugin(env.getPluginUrl(), env.getPluginDescriptor());
- }
-
- public static ServerPlugin getPlugin(URL pluginUrl, ServerPluginDescriptorType pluginDescriptor) {
- try {
- Configuration pluginConfig = null;
- Configuration scheduledJobsConfig = null;
- ConfigurationDefinition configDef;
-
- configDef = ServerPluginDescriptorMetadataParser.getPluginConfigurationDefinition(pluginDescriptor);
- if (configDef != null) {
- pluginConfig = configDef.getDefaultTemplate().createConfiguration();
- }
-
- configDef = ServerPluginDescriptorMetadataParser.getScheduledJobsDefinition(pluginDescriptor);
- if (configDef != null) {
- scheduledJobsConfig = configDef.getDefaultTemplate().createConfiguration();
- }
-
- File pluginFile = new File(pluginUrl.toURI());
- PluginKey pluginKey = PluginKey.createServerPluginKey(new ServerPluginType(pluginDescriptor).stringify(), pluginDescriptor.getName());
- ServerPlugin plugin =
- new ServerPlugin(0, pluginKey.getPluginName(), pluginFile.getName(),
- pluginDescriptor.getDisplayName(), true, PluginStatusType.INSTALLED,
- pluginDescriptor.getDescription(), "", MessageDigestGenerator.getDigestString(pluginFile),
- pluginDescriptor.getVersion(), pluginDescriptor.getVersion(), pluginConfig,
- scheduledJobsConfig, new ServerPluginType(pluginDescriptor).stringify(),
- System.currentTimeMillis(), System.currentTimeMillis());
- return plugin;
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
-
- public static ServerPlugin getPlugin(URL pluginUrl) throws Exception {
- ServerPluginDescriptorType type = ServerPluginDescriptorUtil.loadPluginDescriptorFromUrl(pluginUrl);
-
- return getPlugin(pluginUrl, type);
- }
-
- protected Map<URL, ? extends ServerPluginDescriptorType> preloadAllPlugins() throws Exception {
- return null;
- }
-
- private class TestMasterServerPluginContainer extends MasterServerPluginContainer {
-
- @Override
- protected ClassLoader createRootServerPluginClassLoader() {
- return getClass().getClassLoader();
- }
-
- @Override
- protected Map<URL, ? extends ServerPluginDescriptorType> preloadAllPlugins() throws Exception {
- Map<URL, ? extends ServerPluginDescriptorType> plugins = TestServerPluginService.this.preloadAllPlugins();
- if (plugins != null) {
- return plugins;
- }
-
- // if our test never setup any plugins, ignore it and just return an empty map
- File pluginDir = getConfiguration().getPluginDirectory();
- if (pluginDir == null || pluginDir.listFiles() == null || pluginDir.listFiles().length == 0) {
- return new HashMap<URL, ServerPluginDescriptorType>();
- } else {
- return super.preloadAllPlugins();
- }
- }
-
- @Override
- protected List<PluginKey> getDisabledPluginKeys() {
- // in the real world, the db is checked for enable flag, here we say all plugins are enabled
- return new ArrayList<PluginKey>();
- }
-
- @Override
- protected List<AbstractTypeServerPluginContainer> createPluginContainers() {
- return TestServerPluginService.this.createPluginContainers(this);
- }
- }
-}
diff --git a/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/TestServerPluginServiceMBean.java b/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/TestServerPluginServiceMBean.java
deleted file mode 100644
index 5c478a9..0000000
--- a/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/TestServerPluginServiceMBean.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2005-2012 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., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-package org.rhq.enterprise.server;
-
-import org.rhq.enterprise.server.plugin.pc.ServerPluginServiceMBean;
-
-/**
- *
- *
- * @author Lukas Krejci
- */
-public interface TestServerPluginServiceMBean extends ServerPluginServiceMBean {
-
-}
diff --git a/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/alert/AlertDefinitionWithComplexNotificationsTest.java b/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/alert/AlertDefinitionWithComplexNotificationsTest.java
deleted file mode 100644
index 9ab2cf9..0000000
--- a/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/alert/AlertDefinitionWithComplexNotificationsTest.java
+++ /dev/null
@@ -1,712 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2005-2012 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., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-package org.rhq.enterprise.server.alert;
-
-import java.io.File;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Set;
-
-import javax.persistence.EntityManager;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import org.jboss.shrinkwrap.api.ShrinkWrap;
-import org.jboss.shrinkwrap.api.exporter.ZipExporter;
-import org.jboss.shrinkwrap.api.spec.JavaArchive;
-
-import org.rhq.core.domain.alert.AlertDampening;
-import org.rhq.core.domain.alert.AlertDefinition;
-import org.rhq.core.domain.alert.AlertPriority;
-import org.rhq.core.domain.alert.BooleanExpression;
-import org.rhq.core.domain.alert.notification.AlertNotification;
-import org.rhq.core.domain.auth.Subject;
-import org.rhq.core.domain.authz.Permission;
-import org.rhq.core.domain.authz.Role;
-import org.rhq.core.domain.cloud.Server;
-import org.rhq.core.domain.cloud.Server.OperationMode;
-import org.rhq.core.domain.configuration.Configuration;
-import org.rhq.core.domain.configuration.PropertySimple;
-import org.rhq.core.domain.criteria.AlertDefinitionCriteria;
-import org.rhq.core.domain.criteria.ResourceCriteria;
-import org.rhq.core.domain.plugin.ServerPlugin;
-import org.rhq.core.domain.resource.Agent;
-import org.rhq.core.domain.resource.InventoryStatus;
-import org.rhq.core.domain.resource.Resource;
-import org.rhq.core.domain.resource.ResourceType;
-import org.rhq.core.domain.resource.group.ResourceGroup;
-import org.rhq.core.domain.shared.ResourceBuilder;
-import org.rhq.core.domain.shared.ResourceTypeBuilder;
-import org.rhq.enterprise.server.TestServerPluginService;
-import org.rhq.enterprise.server.auth.SessionManager;
-import org.rhq.enterprise.server.test.AbstractEJB3Test;
-import org.rhq.enterprise.server.test.TestServerCommunicationsService;
-import org.rhq.enterprise.server.test.TransactionCallback;
-import org.rhq.enterprise.server.util.LookupUtil;
-import org.rhq.enterprise.server.util.ResourceTreeHelper;
-
-/**
- *
- *
- * @author Lukas Krejci
- */
-@Test(groups = "alert")
-public class AlertDefinitionWithComplexNotificationsTest extends AbstractEJB3Test {
-
- private static final Log LOG = LogFactory.getLog(AlertDefinitionWithComplexNotificationsTest.class);
-
- private enum ParentType {
- GROUP, TEMPLATE
- }
-
- private String universalName;
-
- private Server server;
- private Agent agent;
- private Subject subject;
- private Role role;
- private ResourceType resourceType;
- private ResourceGroup resourceGroup;
- private Set<Resource> resources;
- private AlertDefinition templateAlertDefinition;
- private AlertDefinition groupAlertDefinition;
- private AlertDefinition resourceAlertDefinition;
- private ServerPlugin serverPlugin;
- private Set<Object> junk = new LinkedHashSet<Object>();
-
- private int resourceLevelAlertDefinitionId;
- private int groupLevelAlertDefinitionId;
- private int templateLevelAlertDefinitionId;
- private Resource copyTestsResource;
-
- private TestAlertSenderPluginService alertSenderService;
- private TestServerCommunicationsService agentService;
-
- @BeforeClass
- public void prepareDB() {
- executeInTransaction(new TransactionCallback() {
- @Override
- public void execute() throws Exception {
- EntityManager em = getEntityManager();
-
- universalName = getClass().getName();
-
- agent = new Agent("localhost", "localhost", 0, "foo", "bar");
-
- server = new Server();
- server.setAddress("localhost");
- server.setName("localhost");
- server.setOperationMode(OperationMode.NORMAL);
-
- server.setAgents(Collections.singletonList(agent));
-
- role = new Role(universalName);
- role.addPermission(Permission.MANAGE_INVENTORY);
- role.addPermission(Permission.MANAGE_SETTINGS);
-
- subject = new Subject(universalName, true, false);
- subject.addRole(role);
-
- resourceType =
- new ResourceTypeBuilder().createPlatformResourceType().withId(0).withName(universalName)
- .withPlugin(universalName).build();
-
- resourceGroup = new ResourceGroup(universalName, resourceType);
-
- resources = new LinkedHashSet<Resource>();
- for (int i = 0; i < 10; ++i) {
- Resource res = createResourceForTest(universalName + i);
-
- resources.add(res);
-
- resourceGroup.addExplicitResource(res);
- }
-
- templateAlertDefinition = createDefinitionForTest(universalName + " template", true);
- templateAlertDefinition.setResourceType(resourceType);
-
- groupAlertDefinition = createDefinitionForTest(universalName + " group", true);
- groupAlertDefinition.setResourceGroup(resourceGroup);
-
- resourceAlertDefinition = createDefinitionForTest(universalName + " resource", true);
- resourceAlertDefinition.setResource(resources.iterator().next());
-
- em.persist(agent);
- em.persist(server);
- em.persist(role);
- em.persist(subject);
- em.persist(resourceType);
- em.persist(resourceGroup);
- for (Resource r : resources) {
- em.persist(r);
- }
- em.persist(templateAlertDefinition);
- em.persist(groupAlertDefinition);
- em.persist(resourceAlertDefinition);
-
- //only need this for a short time now, so that we can precreate the plugin structure
- alertSenderService = new TestAlertSenderPluginService();
- prepareCustomServerPluginService(alertSenderService);
- alertSenderService.masterConfig.getPluginDirectory().mkdirs();
- unprepareServerPluginService();
-
- JavaArchive archive =
- ShrinkWrap.create(JavaArchive.class).addClass(TestAlertSender.class)
- .addAsResource("test-alert-sender-serverplugin.xml", "META-INF/rhq-serverplugin.xml");
-
- File pluginFile =
- new File(alertSenderService.masterConfig.getPluginDirectory(), "test-aler-plugin.jar");
-
- archive.as(ZipExporter.class).exportTo(pluginFile, true);
-
- //the alert sender plugin manager needs the plugins in the database...
- serverPlugin = TestServerPluginService.getPlugin(pluginFile.toURI().toURL());
- em.persist(serverPlugin);
- }
- });
- }
-
- @BeforeMethod
- public void containerSetup() {
- alertSenderService = new TestAlertSenderPluginService();
- prepareCustomServerPluginService(alertSenderService);
- alertSenderService.masterConfig.getPluginDirectory().mkdirs();
-
- alertSenderService.startMasterPluginContainer();
-
- agentService = prepareForTestAgents();
- }
-
- @AfterMethod
- public void containerTearDown() throws Exception {
- unprepareServerPluginService();
- unprepareForTestAgents();
- }
-
- @AfterClass(alwaysRun = true)
- public void cleanDB() throws Exception {
- for (Object o : junk) {
- removeNoExceptions(o);
- }
-
- removeNoExceptions(resourceAlertDefinition);
- removeNoExceptions(groupAlertDefinition);
- removeNoExceptions(templateAlertDefinition);
- removeNoExceptions(resourceGroup);
- for (Resource r : resources) {
- r.removeExplicitGroup(resourceGroup);
- r.getAlertDefinitions().clear();
- removeNoExceptions(r);
- }
- removeNoExceptions(resourceType);
- removeNoExceptions(subject);
- removeNoExceptions(role);
- removeNoExceptions(server);
- removeNoExceptions(agent);
-
- removeNoExceptions(serverPlugin);
- }
-
- @BeforeMethod
- public void login() throws Exception {
- //the embedded server cannot do a full-blown login
- //so we hack our way in
- subject = SessionManager.getInstance().put(subject);
- }
-
- @AfterMethod(alwaysRun = true)
- public void logout() throws Exception {
- SessionManager.getInstance().invalidate(subject.getSessionId());
- }
-
- private Resource getCopyTestsResource() throws Exception {
- if (copyTestsResource == null) {
- final String keyAndName = universalName + "-copyTests";
-
- LookupUtil.getResourceManager().createResource(subject, createResourceForTest(keyAndName), Resource.ROOT_ID);
-
- //ok, now the new resource should contain the alert definition defined by the template
- ResourceCriteria crit = new ResourceCriteria();
- crit.addFilterResourceKey(keyAndName);
- crit.fetchExplicitGroups(true); //so that cleanup works
- crit.fetchAlertDefinitions(true); //so that cleanup works
-
- List<Resource> foundResources = LookupUtil.getResourceManager().findResourcesByCriteria(subject, crit);
-
- assertEquals("A new resource should have been created", 1, foundResources.size());
-
- Resource res = foundResources.get(0);
- resources.add(res);
-
- copyTestsResource = res;
- }
-
- return copyTestsResource;
- }
-
- public void testNotificationsCopiedOnAlertTemplateApplication() throws Exception {
- TestAlertSender.setExpectedSubject(null);
- TestAlertSender.resetValidateMethodCallCount();
-
- Resource res = getCopyTestsResource();
-
- //apply the template manually - this is done in server-agent back-and-forth that we
- //don't test here and which is complex to mock out.
- //this method has to be called using the overlord subject
- LookupUtil.getAlertTemplateManager().updateAlertDefinitionsForResource(LookupUtil.getSubjectManager().getOverlord(), res.getId());
-
- assertEquals("No validation should occur on the copied notifications", 0, TestAlertSender.getValidateMethodCallCount());
-
- AlertDefinitionManagerLocal adm = LookupUtil.getAlertDefinitionManager();
- AlertDefinitionCriteria adCrit = new AlertDefinitionCriteria();
- adCrit.addFilterResourceIds(res.getId());
- adCrit.fetchAlertNotifications(true);
-
- List<AlertDefinition> foundAlertDefs = adm.findAlertDefinitionsByCriteria(subject, adCrit);
- junk.addAll(foundAlertDefs);
-
- assertEquals("The new resource should have an alert definition obtained from the template.", 1, foundAlertDefs.size());
-
- AlertDefinition defWithNotifications = foundAlertDefs.get(0);
-
- testSingleDependentAlertDefinition(defWithNotifications, ParentType.TEMPLATE, defWithNotifications.getParentId());
- }
-
- @Test(dependsOnMethods = "testNotificationsCopiedOnAlertTemplateApplication")
- public void testNotificationsCopiedOnGroupMemberAddition() throws Exception {
- TestAlertSender.setExpectedSubject(null);
- TestAlertSender.resetValidateMethodCallCount();
-
- Resource res = getCopyTestsResource();
-
- LookupUtil.getResourceGroupManager().addResourcesToGroup(subject, resourceGroup.getId(), new int[] { res.getId() });
-
- assertEquals("No validation should occur on the copied notifications", 0, TestAlertSender.getValidateMethodCallCount());
-
- AlertDefinitionManagerLocal adm = LookupUtil.getAlertDefinitionManager();
- AlertDefinitionCriteria adCrit = new AlertDefinitionCriteria();
- adCrit.addFilterResourceIds(res.getId());
- adCrit.fetchAlertNotifications(true);
-
- List<AlertDefinition> foundAlertDefs = adm.findAlertDefinitionsByCriteria(subject, adCrit);
- junk.addAll(foundAlertDefs);
-
- //1 from the group, 1 from the template
- assertEquals("The new resource should have an alert definition obtained from the group.", 2, foundAlertDefs.size());
-
- AlertDefinition groupOriginatingDef = null;
- for(AlertDefinition d : foundAlertDefs) {
- if ((universalName + " group").equals(d.getName())) {
- groupOriginatingDef = d;
- break;
- }
- }
-
- assertNotNull("The alert definition originating from the group not present on the resource.", groupOriginatingDef);
-
- testSingleDependentAlertDefinition(groupOriginatingDef, ParentType.GROUP, groupOriginatingDef.getGroupAlertDefinition().getId());
- }
-
- public void testCorrectSubjectPassedOnResourceLevelAlertDefinitionCreation() throws Exception {
- TestAlertSender.setExpectedSubject(subject);
-
- AlertDefinitionManagerLocal adm = LookupUtil.getAlertDefinitionManager();
-
- Resource res = resources.iterator().next();
-
- AlertDefinition def = createDefinitionForTest("testCorrectSubjectPassedOnResourceLevelAlertDefinitionCreation", false);
- def.setResource(resources.iterator().next());
-
- int id = adm.createAlertDefinition(subject, def, res.getId(), true);
- def.setId(id);
-
- resourceLevelAlertDefinitionId = id;
-
- junk.add(def);
-
- testMainAlertDefinition(id);
- }
-
- @Test(dependsOnMethods = { "testNotificationsCopiedOnAlertTemplateApplication", "testNotificationsCopiedOnGroupMemberAddition" })
- public void testCorrectSubjectPassedOnGroupLevelAlertDefinitionCreation() throws Exception {
- TestAlertSender.setExpectedSubject(subject);
-
- GroupAlertDefinitionManagerLocal gadm = LookupUtil.getGroupAlertDefinitionManager();
-
- AlertDefinition def = createDefinitionForTest("testCorrectSubjectPassedOnGroupLevelAlertDefinitionCreation", false);
- def.setResourceGroup(resourceGroup);
-
- int id = gadm.createGroupAlertDefinitions(subject, def, resourceGroup.getId());
- def.setId(id);
-
- groupLevelAlertDefinitionId = id;
-
- junk.add(def);
-
- testMainAlertDefinition(id);
- List<AlertDefinition> deps = testDependentAlertDefinitions(id, ParentType.GROUP);
-
- junk.addAll(deps);
- }
-
- @Test(dependsOnMethods = { "testNotificationsCopiedOnAlertTemplateApplication", "testNotificationsCopiedOnGroupMemberAddition" })
- public void testCorrectSubjectPassedOnTemplateLevelAlertDefinitionCreation() throws Exception {
- TestAlertSender.setExpectedSubject(subject);
-
- AlertTemplateManagerLocal atm = LookupUtil.getAlertTemplateManager();
-
- AlertDefinition def = createDefinitionForTest("testCorrectSubjectPassedOnTemplateLevelAlertDefinitionCreation", false);
- def.setResourceGroup(resourceGroup);
-
- int id = atm.createAlertTemplate(subject, def, resourceType.getId());
- def.setId(id);
-
- templateLevelAlertDefinitionId = id;
-
- junk.add(def);
-
- testMainAlertDefinition(id);
- List<AlertDefinition> deps = testDependentAlertDefinitions(id, ParentType.TEMPLATE);
-
- junk.addAll(deps);
- }
-
- @Test(dependsOnMethods = "testCorrectSubjectPassedOnResourceLevelAlertDefinitionCreation")
- public void testNoValidationWhenNoNotificationUpdateOnResourceLevel() throws Exception {
- TestAlertSender.setExpectedSubject(subject);
- TestAlertSender.resetValidateMethodCallCount();
-
- AlertDefinitionManagerLocal adm = LookupUtil.getAlertDefinitionManager();
-
- AlertDefinitionCriteria crit = new AlertDefinitionCriteria();
- crit.addFilterId(resourceLevelAlertDefinitionId);
- crit.fetchAlertNotifications(true);
- crit.fetchConditions(true);
-
- List<AlertDefinition> foundDefs = adm.findAlertDefinitionsByCriteria(subject, crit);
-
- assertEquals("Failed to find the previously created resource level alert definition.", 1, foundDefs.size());
-
- AlertDefinition foundDef = foundDefs.get(0);
-
- foundDef.setEnabled(true);
-
- adm.updateAlertDefinition(subject, resourceLevelAlertDefinitionId, foundDef, false);
-
- assertEquals("The notification validation method shouldn't have been called", 0, TestAlertSender.getValidateMethodCallCount());
- }
-
- @Test(dependsOnMethods = "testCorrectSubjectPassedOnGroupLevelAlertDefinitionCreation")
- public void testNoValidationWhenNoNotificationUpdateOnGroupLevel() throws Exception {
- TestAlertSender.setExpectedSubject(subject);
- TestAlertSender.resetValidateMethodCallCount();
-
- AlertDefinitionManagerLocal adm = LookupUtil.getAlertDefinitionManager();
-
- AlertDefinitionCriteria crit = new AlertDefinitionCriteria();
- crit.addFilterId(groupLevelAlertDefinitionId);
- crit.fetchAlertNotifications(true);
- crit.fetchConditions(true);
-
- List<AlertDefinition> foundDefs = adm.findAlertDefinitionsByCriteria(subject, crit);
-
- assertEquals("Failed to find the previously created group level alert definition.", 1, foundDefs.size());
-
- AlertDefinition foundDef = foundDefs.get(0);
-
- foundDef.setEnabled(true);
-
- GroupAlertDefinitionManagerLocal gadm = LookupUtil.getGroupAlertDefinitionManager();
- gadm.updateGroupAlertDefinitions(subject, foundDef, true);
-
- assertEquals("The notification validation method shouldn't have been called", 0, TestAlertSender.getValidateMethodCallCount());
- }
-
- @Test(dependsOnMethods = "testCorrectSubjectPassedOnTemplateLevelAlertDefinitionCreation")
- public void testNoValidationWhenNoNotificationUpdateOnTemplateLevel() throws Exception {
- TestAlertSender.setExpectedSubject(subject);
- TestAlertSender.resetValidateMethodCallCount();
-
- AlertDefinitionManagerLocal adm = LookupUtil.getAlertDefinitionManager();
-
- AlertDefinitionCriteria crit = new AlertDefinitionCriteria();
- crit.addFilterId(templateLevelAlertDefinitionId);
- crit.fetchAlertNotifications(true);
- crit.fetchConditions(true);
-
- List<AlertDefinition> foundDefs = adm.findAlertDefinitionsByCriteria(subject, crit);
-
- assertEquals("Failed to find the previously created resource level alert definition.", 1, foundDefs.size());
-
- AlertDefinition foundDef = foundDefs.get(0);
-
- foundDef.setEnabled(true);
-
- AlertTemplateManagerLocal atm = LookupUtil.getAlertTemplateManager();
-
- atm.updateAlertTemplate(subject, foundDef, true);
-
- assertEquals("The notification validation method shouldn't have been called", 0, TestAlertSender.getValidateMethodCallCount());
- }
-
- @Test(dependsOnMethods = "testNoValidationWhenNoNotificationUpdateOnResourceLevel")
- public void testCorrectSubjectPassedOnResourceLevelAlertDefinitionUpdate() throws Exception {
- TestAlertSender.setExpectedSubject(subject);
- TestAlertSender.resetValidateMethodCallCount();
-
- AlertDefinitionManagerLocal adm = LookupUtil.getAlertDefinitionManager();
-
- AlertDefinitionCriteria crit = new AlertDefinitionCriteria();
- crit.addFilterId(resourceLevelAlertDefinitionId);
- crit.fetchAlertNotifications(true);
- crit.fetchConditions(true);
-
- List<AlertDefinition> foundDefs = adm.findAlertDefinitionsByCriteria(subject, crit);
-
- assertEquals("Failed to find the previously created resource level alert definition.", 1, foundDefs.size());
-
- AlertDefinition foundDef = foundDefs.get(0);
-
- AlertNotification newNotif = createAlertNotificationForTest(foundDef, false);
- //just add some dummy config property so that the 2 notifs are distinguishable from each other
- //and are saved separately
- newNotif.getConfiguration().put(new PropertySimple("foo-resource", "bar"));
-
- adm.updateAlertDefinition(subject, resourceLevelAlertDefinitionId, foundDef, false);
-
- assertEquals("Validation should have been called for a new notification during alert def update", 1, TestAlertSender.getValidateMethodCallCount());
- }
-
- @Test(dependsOnMethods = "testCorrectSubjectPassedOnGroupLevelAlertDefinitionCreation")
- public void testCorrectSubjectPassedOnGroupLevelAlertDefinitionUpdate() throws Exception {
- TestAlertSender.setExpectedSubject(subject);
- TestAlertSender.resetValidateMethodCallCount();
-
- AlertDefinitionManagerLocal adm = LookupUtil.getAlertDefinitionManager();
-
- AlertDefinitionCriteria crit = new AlertDefinitionCriteria();
- crit.addFilterId(groupLevelAlertDefinitionId);
- crit.fetchAlertNotifications(true);
- crit.fetchConditions(true);
-
- List<AlertDefinition> foundDefs = adm.findAlertDefinitionsByCriteria(subject, crit);
-
- assertEquals("Failed to find the previously created group level alert definition.", 1, foundDefs.size());
-
- AlertDefinition foundDef = foundDefs.get(0);
-
- AlertNotification newNotif = createAlertNotificationForTest(foundDef, false);
- //just add some dummy config property so that the 2 notifs are distinguishable from each other
- //and are saved separately
- newNotif.getConfiguration().put(new PropertySimple("foo-group", "bar"));
-
- GroupAlertDefinitionManagerLocal gadm = LookupUtil.getGroupAlertDefinitionManager();
- gadm.updateGroupAlertDefinitions(subject, foundDef, true);
-
- //notice that the validation should be called just once, even though in effect we're creating 11 notifs
- //1 for group and 10 for its members.
- assertEquals("Validation should have been called for a new notification during alert def update", 1, TestAlertSender.getValidateMethodCallCount());
- }
-
- @Test(dependsOnMethods = "testCorrectSubjectPassedOnTemplateLevelAlertDefinitionCreation")
- public void testCorrectSubjectPassedOnTemplateLevelAlertDefinitionUpdate() throws Exception {
- TestAlertSender.setExpectedSubject(subject);
- TestAlertSender.resetValidateMethodCallCount();
-
- AlertDefinitionManagerLocal adm = LookupUtil.getAlertDefinitionManager();
-
- AlertDefinitionCriteria crit = new AlertDefinitionCriteria();
- crit.addFilterId(templateLevelAlertDefinitionId);
- crit.fetchAlertNotifications(true);
- crit.fetchConditions(true);
-
- List<AlertDefinition> foundDefs = adm.findAlertDefinitionsByCriteria(subject, crit);
-
- assertEquals("Failed to find the previously created template level alert definition.", 1, foundDefs.size());
-
- AlertDefinition foundDef = foundDefs.get(0);
-
- AlertNotification newNotif = createAlertNotificationForTest(foundDef, false);
- //just add some dummy config property so that the 2 notifs are distinguishable from each other
- //and are saved separately
- newNotif.getConfiguration().put(new PropertySimple("foo-template", "bar"));
-
- AlertTemplateManagerLocal atm = LookupUtil.getAlertTemplateManager();
- atm.updateAlertTemplate(subject, foundDef, true);
-
- //notice that the validation should be called just once, even though in effect we're creating 11 notifs
- //1 for template and 10 for its members.
- assertEquals("Validation should have been called for a new notification during alert def update", 1, TestAlertSender.getValidateMethodCallCount());
- }
-
- private void removeNoExceptions(final Object o) {
- try {
- executeInTransaction(new TransactionCallback() {
- public void execute() {
- EntityManager em = getEntityManager();
- Object o2 = em.merge(o);
-
- if (o2 instanceof Resource) {
- ResourceTreeHelper.deleteResource(em, (Resource) o2);
- } else {
- em.remove(o2);
- }
- }
- });
- } catch (Exception e) {
- LOG.error("Failed to DELETE an object from database: " + o, e);
- }
- }
-
- private AlertDefinition createDefinition(String name) {
- AlertDefinition ret = new AlertDefinition();
- ret.setName(name);
- ret.setPriority(AlertPriority.MEDIUM);
- ret.setAlertDampening(new AlertDampening(AlertDampening.Category.NONE));
- ret.setConditionExpression(BooleanExpression.ANY);
- ret.setRecoveryId(0);
-
- return ret;
- }
-
- private AlertDefinition createDefinitionForTest(String name, boolean precanned) {
- AlertDefinition def = createDefinition(name);
- createAlertNotificationForTest(def, precanned);
-
- return def;
- }
-
- private AlertNotification createAlertNotificationForTest(AlertDefinition alertDefinition, boolean precanned) {
- AlertNotification notif = new AlertNotification("Test Alert Sender");
-
- Configuration alertConfig = new Configuration();
-
- if (precanned) {
- alertConfig.put(new PropertySimple(TestAlertSender.PERSISTENT_PROPERTY_NAME, TestAlertSender.PERSISTEN_PROPERTY_EXPECTED_VALUE));
- } else {
- alertConfig.put(new PropertySimple(TestAlertSender.PERSISTENT_PROPERTY_NAME, "persistent"));
- alertConfig.put(new PropertySimple(TestAlertSender.EPHEMERAL_PROPERTY_NAME, "ephemeral"));
- }
-
- Configuration extraConfig = new Configuration();
-
- if (precanned) {
- extraConfig.put(new PropertySimple(TestAlertSender.PERSISTENT_PROPERTY_NAME, TestAlertSender.PERSISTEN_PROPERTY_EXPECTED_VALUE));
- } else {
- extraConfig.put(new PropertySimple(TestAlertSender.PERSISTENT_PROPERTY_NAME, "persistent"));
- extraConfig.put(new PropertySimple(TestAlertSender.EPHEMERAL_PROPERTY_NAME, "ephemeral"));
- }
-
- notif.setConfiguration(alertConfig);
- notif.setExtraConfiguration(extraConfig);
-
- alertDefinition.addAlertNotification(notif);
- notif.setAlertDefinition(alertDefinition);
-
- return notif;
- }
-
- private void testMainAlertDefinition(int id) {
- AlertDefinitionCriteria crit = new AlertDefinitionCriteria();
- crit.addFilterId(id);
- crit.fetchAlertNotifications(true);
-
- List<AlertDefinition> checkList =
- LookupUtil.getAlertDefinitionManager().findAlertDefinitionsByCriteria(subject, crit);
-
- assertNotNull("Failed to retrieve the save alert definition", checkList);
- assertEquals("The alert definition should have been saved.", 1, checkList.size());
-
- AlertDefinition check = checkList.get(0);
-
- assertEquals("There should be exactly 1 notification on the definition", 1, check.getAlertNotifications()
- .size());
-
- Configuration config = check.getAlertNotifications().get(0).getConfiguration();
- assertEquals("Unexpected persistent value in notif config", TestAlertSender.PERSISTEN_PROPERTY_EXPECTED_VALUE,
- config.getSimpleValue(TestAlertSender.PERSISTENT_PROPERTY_NAME, null));
- assertNull("Ephemeral property seems to have been saved",
- config.getSimpleValue(TestAlertSender.EPHEMERAL_PROPERTY_NAME, null));
- }
-
- private List<AlertDefinition> testDependentAlertDefinitions(int expectedParentId, ParentType parentType) {
- AlertDefinitionCriteria crit = new AlertDefinitionCriteria();
-
- Set<Integer> resourceIds = new HashSet<Integer>(resources.size());
- for (Resource r : resources) {
- resourceIds.add(r.getId());
- }
-
- if (parentType == ParentType.TEMPLATE) {
- crit.addFilterAlertTemplateParentId(expectedParentId);
- } else if (parentType == ParentType.GROUP) {
- crit.addFilterGroupAlertDefinitionId(expectedParentId);
- }
-
- crit.fetchAlertNotifications(true);
-
- List<AlertDefinition> checkList =
- LookupUtil.getAlertDefinitionManager().findAlertDefinitionsByCriteria(subject, crit);
-
- assertNotNull("Failed to retrieve the save alert definition", checkList);
- assertEquals("The dependent alert definitions should have been saved.", resources.size(), checkList.size());
-
- for (AlertDefinition check : checkList) {
- testSingleDependentAlertDefinition(check, parentType, expectedParentId);
- }
-
- return checkList;
- }
-
- private void testSingleDependentAlertDefinition(AlertDefinition alertDef, ParentType parentType, int expectedParentId) {
- assertEquals("There should be exactly 1 notification on the definition " + alertDef, 1, alertDef
- .getAlertNotifications().size());
-
- Configuration config = alertDef.getAlertNotifications().get(0).getConfiguration();
- assertEquals("Unexpected persistent value in notif config " + alertDef,
- TestAlertSender.PERSISTEN_PROPERTY_EXPECTED_VALUE,
- config.getSimpleValue(TestAlertSender.PERSISTENT_PROPERTY_NAME, null));
- assertNull("Ephemeral property seems to have been saved " + alertDef,
- config.getSimpleValue(TestAlertSender.EPHEMERAL_PROPERTY_NAME, null));
-
- if (parentType == ParentType.GROUP) {
- assertEquals("The group parent id has unexpected value", expectedParentId, alertDef.getGroupAlertDefinition().getId());
- } else if (parentType == ParentType.TEMPLATE) {
- assertEquals("The parent id has unexpected value", Integer.valueOf(expectedParentId), alertDef.getParentId());
- }
- }
-
- private Resource createResourceForTest(String resourceKey) {
- Resource res = new ResourceBuilder().createPlatform().withRandomUuid().withResourceKey(resourceKey)
- .withResourceType(resourceType).withName(resourceKey)
- .withInventoryStatus(InventoryStatus.COMMITTED).build();
- res.setAgent(agent);
-
- return res;
- }
-}
diff --git a/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/alert/TestAlertSender.java b/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/alert/TestAlertSender.java
deleted file mode 100644
index 900d74c..0000000
--- a/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/alert/TestAlertSender.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2005-2012 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., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-package org.rhq.enterprise.server.alert;
-
-import org.testng.Assert;
-
-import org.rhq.core.domain.alert.Alert;
-import org.rhq.core.domain.alert.notification.SenderResult;
-import org.rhq.core.domain.auth.Subject;
-import org.rhq.core.domain.configuration.Configuration;
-import org.rhq.core.domain.configuration.PropertySimple;
-import org.rhq.enterprise.server.plugin.pc.ServerPluginComponent;
-import org.rhq.enterprise.server.plugin.pc.alert.AlertSender;
-import org.rhq.enterprise.server.plugin.pc.alert.AlertSenderValidationResults;
-
-/**
- *
- *
- * @author Lukas Krejci
- */
-public class TestAlertSender extends AlertSender<ServerPluginComponent> {
-
- public static final String NAME = "Test Alert Sender";
-
- public static final String PERSISTENT_PROPERTY_NAME = "persistent";
- public static final String PERSISTEN_PROPERTY_EXPECTED_VALUE = "persistentephemeral";
- public static final String EPHEMERAL_PROPERTY_NAME = "ephemeral";
-
- private static Subject EXPECTED_SUBJECT;
- private static volatile int VALIDATE_METHOD_CALL_COUNT;
- private static Runnable VALIDATION_CHECKER;
-
- public static void setExpectedSubject(Subject subject) {
- EXPECTED_SUBJECT = subject;
- }
-
- public static void setValidationChecker(Runnable validationChecker) {
- VALIDATION_CHECKER = validationChecker;
- }
-
- public static int getValidateMethodCallCount() {
- return VALIDATE_METHOD_CALL_COUNT;
- }
-
- public static void resetValidateMethodCallCount() {
- VALIDATE_METHOD_CALL_COUNT = 0;
- }
-
- @Override
- public SenderResult send(Alert alert) {
- SenderResult ret = new SenderResult();
- ret.addSuccessMessage("kachny");
-
- return ret;
- }
-
- @Override
- public AlertSenderValidationResults validateAndFinalizeConfiguration(Subject subject) {
- ++VALIDATE_METHOD_CALL_COUNT;
-
- if (EXPECTED_SUBJECT != null && !subject.equals(EXPECTED_SUBJECT)) {
- throw new AssertionError("Unexpected subject. Expected " + EXPECTED_SUBJECT + " but was " + subject);
- }
-
- if (VALIDATION_CHECKER != null) {
- VALIDATION_CHECKER.run();
- }
-
- if (alertParameters.getSimple(EPHEMERAL_PROPERTY_NAME) == null) {
- Assert.fail("Ephemeral property not present in alert parameters during validation. This should never happen.");
- }
-
- if (extraParameters.getSimple(EPHEMERAL_PROPERTY_NAME) == null) {
- Assert.fail("Ephemeral property not present in extra parameters during validation. This should never happen.");
- }
-
- updateConfig(alertParameters);
- updateConfig(extraParameters);
-
- return new AlertSenderValidationResults(alertParameters, extraParameters);
- }
-
- private void updateConfig(Configuration configuration) {
- String persistentValue = configuration.getSimpleValue(PERSISTENT_PROPERTY_NAME, "");
- String ephemeralValue = configuration.getSimpleValue(EPHEMERAL_PROPERTY_NAME, "");
-
- configuration.put(new PropertySimple(PERSISTENT_PROPERTY_NAME, persistentValue + ephemeralValue));
- configuration.remove(EPHEMERAL_PROPERTY_NAME);
- }
-}
diff --git a/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/alert/TestAlertSenderPluginService.java b/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/alert/TestAlertSenderPluginService.java
deleted file mode 100644
index 9aae985..0000000
--- a/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/alert/TestAlertSenderPluginService.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2005-2012 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., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-package org.rhq.enterprise.server.alert;
-
-import java.util.Collections;
-import java.util.List;
-
-import org.rhq.core.domain.plugin.ServerPlugin;
-import org.rhq.enterprise.server.TestServerPluginService;
-import org.rhq.enterprise.server.plugin.pc.AbstractTypeServerPluginContainer;
-import org.rhq.enterprise.server.plugin.pc.MasterServerPluginContainer;
-import org.rhq.enterprise.server.plugin.pc.ServerPluginEnvironment;
-import org.rhq.enterprise.server.plugin.pc.ServerPluginManager;
-import org.rhq.enterprise.server.plugin.pc.alert.AlertSenderPluginManager;
-import org.rhq.enterprise.server.plugin.pc.alert.AlertServerPluginContainer;
-
-/**
- *
- *
- * @author Lukas Krejci
- */
-public class TestAlertSenderPluginService extends TestServerPluginService {
-
- @Override
- protected List<AbstractTypeServerPluginContainer> createPluginContainers(MasterServerPluginContainer master) {
- return Collections.<AbstractTypeServerPluginContainer>singletonList(new TestAlertServerPluginContainer(master));
- }
-
- class TestAlertServerPluginContainer extends AlertServerPluginContainer {
- public TestAlertServerPluginContainer(MasterServerPluginContainer master) {
- super(master);
- }
-
- @Override
- protected ServerPluginManager createPluginManager() {
- return new TestAlertServerPluginManager(this);
- }
- }
-
- class TestAlertServerPluginManager extends AlertSenderPluginManager {
- public TestAlertServerPluginManager(AlertServerPluginContainer pc) {
- super(pc);
- }
-
- @Override
- protected ServerPlugin getPlugin(ServerPluginEnvironment env) {
- return TestServerPluginService.getPlugin(env);
- }
- }
-}
diff --git a/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/AbstractDriftServerTest.java b/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/AbstractDriftServerTest.java
deleted file mode 100644
index 4f43c5d..0000000
--- a/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/AbstractDriftServerTest.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2011 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., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-package org.rhq.enterprise.server.drift;
-
-import static org.rhq.core.domain.resource.ResourceCategory.SERVER;
-import static org.rhq.enterprise.server.util.LookupUtil.getSubjectManager;
-
-import java.io.File;
-import java.lang.reflect.Method;
-import java.util.List;
-
-import javax.persistence.EntityManager;
-import javax.persistence.NoResultException;
-import javax.persistence.NonUniqueResultException;
-
-import org.apache.commons.io.FileUtils;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import org.rhq.core.domain.auth.Subject;
-import org.rhq.core.domain.drift.Drift;
-import org.rhq.core.domain.drift.DriftDefinition;
-import org.rhq.core.domain.drift.DriftDefinitionTemplate;
-import org.rhq.core.domain.resource.Agent;
-import org.rhq.core.domain.resource.Resource;
-import org.rhq.core.domain.resource.ResourceType;
-import org.rhq.core.domain.shared.ResourceBuilder;
-import org.rhq.core.domain.shared.ResourceTypeBuilder;
-import org.rhq.enterprise.server.plugin.ServerPluginsLocal;
-import org.rhq.enterprise.server.test.AbstractEJB3Test;
-import org.rhq.enterprise.server.test.TestServerCommunicationsService;
-import org.rhq.enterprise.server.util.ResourceTreeHelper;
-import org.rhq.enterprise.server.test.TransactionCallback;
-
-@Test(groups = "drift", sequential = true)
-public abstract class AbstractDriftServerTest extends AbstractEJB3Test {
-
- protected final String RESOURCE_TYPE_NAME = getClass().getSimpleName() + "_RESOURCE_TYPE";
-
- protected final String AGENT_NAME = getClass().getSimpleName() + "_AGENT";
-
- protected final String RESOURCE_NAME = getClass().getSimpleName() + "_RESOURCE";
-
- private ServerPluginsLocal serverPluginsMgr;
-
- protected DriftServerPluginService driftServerPluginService;
-
- protected TestServerCommunicationsService agentServiceContainer;
-
- protected ResourceType resourceType;
-
- protected Agent agent;
-
- protected Resource resource;
-
- @BeforeMethod
- public void initServices(Method testMethod) throws Exception {
- initDriftServer();
- initAgentServices();
-
- InitDB annotation = testMethod.getAnnotation(InitDB.class);
- if (annotation == null || annotation.value()) {
- initDB();
- }
- }
-
- private void initDriftServer() throws Exception {
- driftServerPluginService = new DriftServerPluginService();
- prepareCustomServerPluginService(driftServerPluginService);
- driftServerPluginService.masterConfig.getPluginDirectory().mkdirs();
-
- String projectVersion = System.getProperty("projectVersion");
-
- File jpaDriftPlugin = new File("../plugins/drift-rhq/target/rhq-serverplugin-drift-" + projectVersion + ".jar");
- assertTrue("Drift server plugin JAR file not found at" + jpaDriftPlugin.getPath(), jpaDriftPlugin.exists());
- FileUtils.copyFileToDirectory(jpaDriftPlugin, driftServerPluginService.masterConfig.getPluginDirectory());
-
- driftServerPluginService.startMasterPluginContainer();
-
- //serverPluginsMgr = LookupUtil.getServerPlugins();
- }
-
- private void initAgentServices() {
- agentServiceContainer = prepareForTestAgents();
- agentServiceContainer.driftService = new TestDefService();
- }
-
- @AfterMethod
- public void shutDownServices() throws Exception {
- shutDownDriftServer();
- shutDownAgentServices();
- }
-
- private void shutDownDriftServer() throws Exception {
- unprepareServerPluginService();
- //already done by the above call
- //driftServerPluginService.stopMasterPluginContainer();
- }
-
- private void shutDownAgentServices() {
- agentServiceContainer = null;
- unprepareForTestAgents();
- }
-
- @AfterClass
- public void cleanUpDB() throws Exception {
- purgeDB();
- executeInTransaction(new TransactionCallback() {
- @Override
- public void execute() throws Exception {
- purgeDB(getEntityManager());
- }
- });
- }
-
- private void initDB() throws Exception {
- purgeDB();
- executeInTransaction(new TransactionCallback() {
- @Override
- public void execute() throws Exception {
- EntityManager em = getEntityManager();
- initResourceType();
- initAgent();
- initResource();
-
- em.persist(resourceType);
- em.persist(agent);
- resource.setAgent(agent);
- em.persist(resource);
-
- initDB(em);
- }
- });
- }
-
- private void purgeDB() {
- executeInTransaction(new TransactionCallback() {
- @Override
- public void execute() throws Exception {
- EntityManager em = getEntityManager();
-
- em.createQuery("delete from JPADrift ").executeUpdate();
- em.createQuery("delete from JPADriftChangeSet").executeUpdate();
- em.createQuery("delete from JPADriftSet").executeUpdate();
- em.createQuery("delete from JPADriftFile").executeUpdate();
- em.createQuery("delete from DriftDefinition").executeUpdate();
- em.createQuery("delete from DriftDefinitionTemplate").executeUpdate();
-
- deleteEntity(Resource.class, RESOURCE_NAME, em);
- deleteEntity(Agent.class, AGENT_NAME, em);
- deleteEntity(ResourceType.class, RESOURCE_TYPE_NAME, em);
-
- purgeDB(em);
- }
- });
- }
-
- protected void purgeDB(EntityManager em) {
- }
-
- protected void initDB(EntityManager em) {
- }
-
- protected void deleteEntity(Class<?> clazz, String name, EntityManager em) {
- try {
- Object entity = em
- .createQuery("select entity from " + clazz.getSimpleName() + " entity where entity.name = :name")
- .setParameter("name", name).getSingleResult();
- if (clazz.equals(Resource.class)) {
- ResourceTreeHelper.deleteResource(em, (Resource) entity);
- } else {
- em.remove(entity);
- }
- } catch (NoResultException e) {
- // we can ignore no results because this code will run when the db
- // is empty and we expect no results in that case
- } catch (NonUniqueResultException e) {
- // we will fail here to let the person running the test know that
- // the database may not be in a consistent state
- fail("Purging " + name + " failed. Expected to find one instance of " + clazz.getSimpleName()
- + " but found more than one. The database may not be in a consistent state.");
- }
- }
-
- protected void initResourceType() {
- resourceType = new ResourceTypeBuilder().createResourceType().withId(0).withName(RESOURCE_TYPE_NAME)
- .withCategory(SERVER).withPlugin(RESOURCE_TYPE_NAME.toLowerCase()).build();
- }
-
- protected void initAgent() {
- agent = new Agent(AGENT_NAME, AGENT_NAME, 17080, "", AGENT_NAME + "_TOKEN");
- }
-
- protected void initResource() {
- resource = new ResourceBuilder().createResource().withId(0).withName(RESOURCE_NAME)
- .withResourceKey(RESOURCE_NAME).withRandomUuid().withResourceType(resourceType).build();
- }
-
- protected Subject getOverlord() {
- return getSubjectManager().getOverlord();
- }
-
- protected String toString(DriftDefinition def) {
- return "DriftDefinition[id: " + def.getId() + ", name: " + def.getName() + "]";
- }
-
- protected String toString(DriftDefinitionTemplate template) {
- return DriftDefinitionTemplate.class.getSimpleName() + "[id: " + template.getId() + ", name: "
- + template.getName() + "]";
- }
-
- protected Drift findDriftByPath(List<? extends Drift> drifts, String path) {
- for (Drift drift : drifts) {
- if (drift.getPath().equals(path)) {
- return drift;
- }
- }
- return null;
- }
-}
diff --git a/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/DriftServerPluginService.java b/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/DriftServerPluginService.java
deleted file mode 100644
index 46d725f..0000000
--- a/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/DriftServerPluginService.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2011 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., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-package org.rhq.enterprise.server.drift;
-
-import java.util.Collections;
-import java.util.List;
-
-import org.rhq.core.domain.plugin.ServerPlugin;
-import org.rhq.enterprise.server.TestServerPluginService;
-import org.rhq.enterprise.server.plugin.pc.AbstractTypeServerPluginContainer;
-import org.rhq.enterprise.server.plugin.pc.MasterServerPluginContainer;
-import org.rhq.enterprise.server.plugin.pc.ServerPluginEnvironment;
-import org.rhq.enterprise.server.plugin.pc.ServerPluginManager;
-import org.rhq.enterprise.server.plugin.pc.drift.DriftServerPluginContainer;
-import org.rhq.enterprise.server.plugin.pc.drift.DriftServerPluginManager;
-
-public class DriftServerPluginService extends TestServerPluginService {
-
- @Override
- protected List<AbstractTypeServerPluginContainer> createPluginContainers(MasterServerPluginContainer master) {
- return Collections.<AbstractTypeServerPluginContainer>singletonList(new TestDriftServerPluginContainer(master));
- }
-
-
- class TestDriftServerPluginContainer extends DriftServerPluginContainer {
- public TestDriftServerPluginContainer(MasterServerPluginContainer master) {
- super(master);
- }
-
- @Override
- protected ServerPluginManager createPluginManager() {
- return new TestDriftServerPluginManager(this);
- }
- }
-
- class TestDriftServerPluginManager extends DriftServerPluginManager {
- public TestDriftServerPluginManager(DriftServerPluginContainer pc) {
- super(pc);
- }
-
- @Override
- protected ServerPlugin getPlugin(ServerPluginEnvironment env) {
- return TestServerPluginService.getPlugin(env);
- }
- }
-}
diff --git a/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/DriftTemplateManagerBeanTest.java b/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/DriftTemplateManagerBeanTest.java
deleted file mode 100644
index bbd93b1..0000000
--- a/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/DriftTemplateManagerBeanTest.java
+++ /dev/null
@@ -1,614 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2011 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., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-package org.rhq.enterprise.server.drift;
-
-import static java.util.Arrays.asList;
-import static org.rhq.core.domain.common.EntityContext.forResource;
-import static org.rhq.core.domain.drift.DriftCategory.FILE_ADDED;
-import static org.rhq.core.domain.drift.DriftChangeSetCategory.COVERAGE;
-import static org.rhq.core.domain.drift.DriftChangeSetCategory.DRIFT;
-import static org.rhq.core.domain.drift.DriftConfigurationDefinition.BaseDirValueContext.fileSystem;
-import static org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode.normal;
-import static org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode.plannedChanges;
-import static org.rhq.core.domain.drift.DriftDefinitionComparator.CompareMode.BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS;
-import static org.rhq.enterprise.server.safeinvoker.HibernateDetachUtility.SerializationType.SERIALIZATION;
-import static org.rhq.enterprise.server.util.LookupUtil.getDriftManager;
-import static org.rhq.enterprise.server.util.LookupUtil.getDriftTemplateManager;
-import static org.rhq.test.AssertUtils.assertPropertiesMatch;
-
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
-
-import javax.ejb.EJBException;
-import javax.persistence.EntityManager;
-
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import org.rhq.core.domain.configuration.Configuration;
-import org.rhq.core.domain.criteria.DriftDefinitionCriteria;
-import org.rhq.core.domain.criteria.DriftDefinitionTemplateCriteria;
-import org.rhq.core.domain.criteria.GenericDriftChangeSetCriteria;
-import org.rhq.core.domain.criteria.JPADriftChangeSetCriteria;
-import org.rhq.core.domain.drift.Drift;
-import org.rhq.core.domain.drift.DriftChangeSet;
-import org.rhq.core.domain.drift.DriftDefinition;
-import org.rhq.core.domain.drift.DriftDefinitionComparator;
-import org.rhq.core.domain.drift.DriftDefinitionTemplate;
-import org.rhq.core.domain.drift.DriftSnapshot;
-import org.rhq.core.domain.drift.Filter;
-import org.rhq.core.domain.drift.JPADrift;
-import org.rhq.core.domain.drift.JPADriftChangeSet;
-import org.rhq.core.domain.drift.JPADriftFile;
-import org.rhq.core.domain.drift.JPADriftSet;
-import org.rhq.core.domain.resource.ResourceType;
-import org.rhq.core.domain.util.PageList;
-import org.rhq.enterprise.server.safeinvoker.HibernateDetachUtility;
-import org.rhq.test.AssertUtils;
-import org.rhq.enterprise.server.test.TransactionCallback;
-
-public class DriftTemplateManagerBeanTest extends AbstractDriftServerTest {
-
- private static final String TEST_CREATE_TEMPLATE = "test-createTemplateForNegativeUpdateTests";
- private static final String TEST_PIN_TEMPLATE = "test-pinTemplate";
-
- private DriftTemplateManagerLocal templateMgr;
-
- private DriftManagerLocal driftMgr;
-
- private JPADrift drift1;
- private JPADrift drift2;
- private JPADriftFile driftFile1;
- private JPADriftFile driftFile2;
-
- @BeforeClass
- public void initClass() {
- templateMgr = getDriftTemplateManager();
- driftMgr = getDriftManager();
- }
-
- @Override
- protected void initDB(EntityManager em) {
- agentServiceContainer.driftService = new TestDefService() {
- @Override
- public void unscheduleDriftDetection(int resourceId, DriftDefinition driftDef) {
- detach(driftDef);
- }
-
- @Override
- public void updateDriftDetection(int resourceId, DriftDefinition driftDef) {
- detach(driftDef);
- }
-
- @Override
- public void updateDriftDetection(int resourceId, DriftDefinition driftDef, DriftSnapshot driftSnapshot) {
- detach(driftDef);
- detach(driftSnapshot);
- }
-
- private void detach(Object object) {
- try {
- HibernateDetachUtility.nullOutUninitializedFields(object, SERIALIZATION);
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
- };
- }
-
- @Test(dependsOnGroups = "pinning")
- public void createNewTemplate() {
- final DriftDefinition definition = new DriftDefinition(new Configuration());
- definition.setName("test-createNewTemplate");
- definition.setEnabled(true);
- definition.setDriftHandlingMode(normal);
- definition.setInterval(2400L);
- definition.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test"));
-
- final DriftDefinitionTemplate newTemplate = templateMgr.createTemplate(getOverlord(), resourceType.getId(),
- true, definition);
-
- executeInTransaction(new TransactionCallback() {
- @Override
- public void execute() throws Exception {
- EntityManager em = getEntityManager();
-
- ResourceType updatedType = em.find(ResourceType.class, resourceType.getId());
-
- assertEquals("Failed to add new drift definition to resource type", 1, updatedType
- .getDriftDefinitionTemplates().size());
-
- DriftDefinitionTemplate expectedTemplate = new DriftDefinitionTemplate();
- expectedTemplate.setTemplateDefinition(definition);
- expectedTemplate.setUserDefined(true);
-
- assertDriftTemplateEquals("Failed to save template", expectedTemplate, newTemplate);
- assertTrue("The template should have its id set", newTemplate.getId() > 0);
- }
- });
- }
-
- @Test(groups = "negativeUpdate")
- public void createTemplateForNegativeUpdateTests() {
- DriftDefinition definition = new DriftDefinition(new Configuration());
- definition.setName(TEST_CREATE_TEMPLATE);
- definition.setEnabled(true);
- definition.setDriftHandlingMode(normal);
- definition.setInterval(2400L);
- definition.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test"));
-
- templateMgr.createTemplate(getOverlord(), resourceType.getId(), true, definition);
-
- DriftDefinitionTemplate template = loadTemplate(definition.getName());
- assertNotNull("Failed to load template", template);
- getEntityManager().clear();
- System.out.println("Created " + template.toString(false));
- }
-
- @Test(groups = "negativeUpdate", dependsOnMethods = "createTemplateForNegativeUpdateTests", expectedExceptions = EJBException.class, expectedExceptionsMessageRegExp = ".*base directory.*cannot be modified")
- @InitDB(false)
- public void doNotAllowBaseDirToBeUpdated() {
- DriftDefinitionTemplate template = loadTemplate(TEST_CREATE_TEMPLATE);
- DriftDefinition definition = template.getTemplateDefinition();
- definition.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/TEST"));
-
- templateMgr.updateTemplate(getOverlord(), template);
- }
-
- @Test(groups = "negativeUpdate", dependsOnMethods = "createTemplateForNegativeUpdateTests", expectedExceptions = EJBException.class, expectedExceptionsMessageRegExp = ".*filters.*cannot be modified")
- @InitDB(false)
- public void doNotAllowFiltersToBeUpdated() {
- DriftDefinitionTemplate template = loadTemplate(TEST_CREATE_TEMPLATE);
- DriftDefinition definition = template.getTemplateDefinition();
- definition.addExclude(new Filter("/foo/bar/TEST/conf", "*.xml"));
-
- templateMgr.updateTemplate(getOverlord(), template);
- }
-
- @Test(groups = "negativeUpdate", dependsOnMethods = "createTemplateForNegativeUpdateTests", expectedExceptions = EJBException.class, expectedExceptionsMessageRegExp = ".*name.*cannot be modified")
- @InitDB(false)
- public void doNotAllowTemplateNameToBeUpdated() {
- DriftDefinitionTemplate template = loadTemplate(TEST_CREATE_TEMPLATE);
- template.setName("A new name");
-
- templateMgr.updateTemplate(getOverlord(), template);
- }
-
- @Test(groups = "negativeUpdate", dependsOnMethods = "createTemplateForNegativeUpdateTests", expectedExceptions = EJBException.class, expectedExceptionsMessageRegExp = ".*template name must be unique.*")
- @InitDB(false)
- public void doNotAllowDuplicateTemplateNames() {
- DriftDefinition definition = new DriftDefinition(new Configuration());
- definition.setName(TEST_CREATE_TEMPLATE);
- definition.setEnabled(true);
- definition.setDriftHandlingMode(normal);
- definition.setInterval(2400L);
- definition.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test"));
-
- templateMgr.createTemplate(getOverlord(), resourceType.getId(), true, definition);
- }
-
- @Test(dependsOnGroups = "pinning")
- public void createAndUpdateTemplate() {
- // create the template
- DriftDefinition definition = new DriftDefinition(new Configuration());
- definition.setName("test-updateTemplate");
- definition.setDescription("update template test");
- definition.setEnabled(true);
- definition.setDriftHandlingMode(normal);
- definition.setInterval(2400L);
- definition.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test"));
-
- DriftDefinitionTemplate template = templateMgr.createTemplate(getOverlord(), resourceType.getId(), true,
- definition);
-
- // next create some definitions from the template
- final DriftDefinition attachedDef1 = createDefinition(template, "attachedDef1", true);
- final DriftDefinition attachedDef2 = createDefinition(template, "attachedDef2", true);
- final DriftDefinition detachedDef1 = createDefinition(template, "detachedDef1", false);
- final DriftDefinition detachedDef2 = createDefinition(template, "detachedDef2", false);
-
- driftMgr.updateDriftDefinition(getOverlord(), forResource(resource.getId()), attachedDef1);
- driftMgr.updateDriftDefinition(getOverlord(), forResource(resource.getId()), attachedDef2);
- driftMgr.updateDriftDefinition(getOverlord(), forResource(resource.getId()), detachedDef1);
- driftMgr.updateDriftDefinition(getOverlord(), forResource(resource.getId()), detachedDef2);
-
- // update the template
- final DriftDefinition newTemplateDef = template.getTemplateDefinition();
- newTemplateDef.setInterval(4800L);
- newTemplateDef.setDriftHandlingMode(plannedChanges);
- newTemplateDef.setEnabled(false);
-
- templateMgr.updateTemplate(getOverlord(), template);
-
- // verify that the tempalte has been updated
- final DriftDefinitionTemplate updatedTemplate = loadTemplate(template.getName());
- AssertUtils.assertPropertiesMatch("Failed to update template", template, updatedTemplate, "resourceType",
- "driftDefinitions", "templateDefinition");
-
- // verify that attached definitions are updated.
- for (DriftDefinition def : asList(attachedDef1, attachedDef2)) {
- DriftDefinition updatedDef = loadDefinition(def.getId());
- String msg = "Failed to propagate update to attached definition " + toString(updatedDef) + " - ";
- DriftDefinition updatedTemplateDef = updatedTemplate.getTemplateDefinition();
-
- assertEquals(msg + "enabled property not updated", updatedTemplateDef.isEnabled(), updatedDef.isEnabled());
- assertEquals(msg + "driftHandlingMode property not updated", updatedTemplateDef.getDriftHandlingMode(),
- updatedDef.getDriftHandlingMode());
- assertEquals(msg + "interval property not updated", updatedTemplateDef.getInterval(), updatedDef
- .getInterval());
- }
-
- // verify that the detached definitions have not been updated.
- for (DriftDefinition def : asList(detachedDef1, detachedDef2)) {
- DriftDefinition defAfterUpdate = loadDefinition(def.getId());
- String msg = "Detached definition " + toString(def) + " should not get updated - ";
-
- assertEquals(msg + "enabled property was modified", def.isEnabled(), defAfterUpdate.isEnabled());
- assertEquals(msg + "driftHandlingMode property was modified", def.getDriftHandlingMode(), defAfterUpdate
- .getDriftHandlingMode());
- assertEquals(msg + "interval property was modified", def.getInterval(), defAfterUpdate.getInterval());
- }
- }
-
- @Test(groups = "pinning", dependsOnGroups = "negativeUpdate")
- public void pinTemplate() throws Exception {
- // First create the template
- final DriftDefinition templateDef = new DriftDefinition(new Configuration());
- templateDef.setName(TEST_PIN_TEMPLATE);
- templateDef.setEnabled(true);
- templateDef.setDriftHandlingMode(normal);
- templateDef.setInterval(2400L);
- templateDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test"));
-
- final DriftDefinitionTemplate template = templateMgr.createTemplate(getOverlord(), resourceType.getId(), true,
- templateDef);
-
- // next create some resource level definitions
- final DriftDefinition attachedDef1 = createDefinition(template, "attachedDef1", true);
- final DriftDefinition attachedDef2 = createDefinition(template, "attachedDef2", true);
- final DriftDefinition detachedDef1 = createDefinition(template, "detachedDef1", false);
- final DriftDefinition detachedDef2 = createDefinition(template, "detachedDef2", false);
-
- // create initial change set from which the snapshot will be generated
- final JPADriftChangeSet changeSet0 = new JPADriftChangeSet(resource, 0, COVERAGE, attachedDef1);
-
- driftFile1 = new JPADriftFile("a1b2c3");
- drift1 = new JPADrift(changeSet0, "drift.1", FILE_ADDED, null, driftFile1);
-
- final JPADriftSet driftSet = new JPADriftSet();
- driftSet.addDrift(drift1);
-
- // create change set v1
- driftFile2 = new JPADriftFile("1a2b3c");
- final JPADriftChangeSet changeSet1 = new JPADriftChangeSet(resource, 1, DRIFT, attachedDef1);
- drift2 = new JPADrift(changeSet1, "drift.2", FILE_ADDED, null, driftFile2);
-
- executeInTransaction(new TransactionCallback() {
- @Override
- public void execute() throws Exception {
- EntityManager em = getEntityManager();
-
- em.persist(attachedDef1);
-
- em.persist(driftFile1);
- em.persist(driftFile2);
-
- em.persist(changeSet0);
- em.persist(driftSet);
- changeSet0.setInitialDriftSet(driftSet);
- em.merge(changeSet0);
-
- em.persist(changeSet1);
- em.persist(drift2);
-
- em.persist(attachedDef2);
- em.persist(detachedDef1);
- em.persist(detachedDef2);
- }
- });
-
- // now we pin the snapshot to the template
- templateMgr.pinTemplate(getOverlord(), template.getId(), attachedDef1.getId(), 1);
-
- // verify that the template is now pinned
- DriftDefinitionTemplate updatedTemplate = loadTemplate(template.getName());
- assertTrue("Template should be marked pinned", updatedTemplate.isPinned());
- }
-
- @SuppressWarnings("unchecked")
- @Test(groups = "pinning", dependsOnMethods = "pinTemplate")
- @InitDB(false)
- public void persistChangeSetWhenTemplateGetsPinned() throws Exception {
- DriftDefinitionTemplate template = loadTemplate(TEST_PIN_TEMPLATE);
-
- GenericDriftChangeSetCriteria criteria = new GenericDriftChangeSetCriteria();
- criteria.addFilterId(template.getChangeSetId());
-
- PageList<? extends DriftChangeSet<?>> changeSets = driftMgr.findDriftChangeSetsByCriteria(getOverlord(),
- criteria);
-
- assertEquals("Expected to find change set for pinned template", 1, changeSets.size());
-
- JPADriftChangeSet expectedChangeSet = new JPADriftChangeSet(resource, 1, COVERAGE, null);
- List<? extends Drift> expectedDrifts = asList(new JPADrift(expectedChangeSet, "drift.1", FILE_ADDED, null,
- driftFile1), new JPADrift(expectedChangeSet, drift2.getPath(), FILE_ADDED, null, driftFile2));
-
- DriftChangeSet<?> actualChangeSet = changeSets.get(0);
- List<? extends Drift> actualDrifts = new ArrayList(actualChangeSet.getDrifts());
-
- AssertUtils.assertCollectionMatchesNoOrder(
- "Expected to find drifts from change sets 1 and 2 in the template change set",
- (List<Drift>) expectedDrifts, (List<Drift>) actualDrifts, "id", "ctime", "changeSet", "newDriftFile");
-
- // we need to compare the newDriftFile properties separately because
- // assertCollectionMatchesNoOrder compares properties via equals() and JPADriftFile
- // does not implement equals.
- assertPropertiesMatch(drift1.getNewDriftFile(), findDriftByPath(actualDrifts, "drift.1").getNewDriftFile(),
- "The newDriftFile property was not set correctly for " + drift1);
- assertPropertiesMatch(drift2.getNewDriftFile(), findDriftByPath(actualDrifts, "drift.2").getNewDriftFile(),
- "The newDriftFile property was not set correctly for " + drift1);
- }
-
- @Test(groups = "pinning", dependsOnMethods = "pinTemplate")
- @InitDB(false)
- public void updateAttachedDefinitionsWhenTemplateGetsPinned() throws Exception {
- DriftDefinitionTemplate template = loadTemplate(TEST_PIN_TEMPLATE);
-
- // get the attached definitions
- List<DriftDefinition> attachedDefs = new LinkedList<DriftDefinition>();
- for (DriftDefinition d : template.getDriftDefinitions()) {
- if (d.isAttached() && (d.getName().equals("attachedDef1") || d.getName().equals("attachedDef2"))) {
- attachedDefs.add(d);
- }
- }
- assertEquals("Failed to get attached definitions for " + toString(template), 2, attachedDefs.size());
- assertDefinitionIsPinned(attachedDefs.get(0));
- assertDefinitionIsPinned(attachedDefs.get(1));
- }
-
- @Test(groups = "pinning", dependsOnMethods = "pinTemplate")
- @InitDB(false)
- public void doNotUpdateDetachedDefinitionsWhenTemplateGetsPinned() throws Exception {
- DriftDefinitionTemplate template = loadTemplate(TEST_PIN_TEMPLATE);
-
- // get the detached definitions
- List<DriftDefinition> detachedDefs = new LinkedList<DriftDefinition>();
- for (DriftDefinition d : template.getDriftDefinitions()) {
- if (!d.isAttached() && (d.getName().equals("detachedDef1") || d.getName().equals("detachedDef2"))) {
- detachedDefs.add(d);
- }
- }
- assertEquals("Failed to get detached definitions for " + toString(template), 2, detachedDefs.size());
- assertDefinitionIsNotPinned(detachedDefs.get(0));
- assertDefinitionIsNotPinned(detachedDefs.get(1));
- }
-
- @Test(dependsOnGroups = "pinning")
- public void deleteTemplate() throws Exception {
- // first create the template
- final DriftDefinition templateDef = new DriftDefinition(new Configuration());
- templateDef.setName(TEST_PIN_TEMPLATE);
- templateDef.setEnabled(true);
- templateDef.setDriftHandlingMode(normal);
- templateDef.setInterval(2400L);
- templateDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test"));
-
- final DriftDefinitionTemplate template = templateMgr.createTemplate(getOverlord(), resourceType.getId(), true,
- templateDef);
-
- // next create some resource level definitions
- final DriftDefinition attachedDef1 = createDefinition(template, "attachedDef1", true);
- final DriftDefinition attachedDef2 = createDefinition(template, "attachedDef2", true);
- final DriftDefinition detachedDef1 = createDefinition(template, "detachedDef1", false);
- final DriftDefinition detachedDef2 = createDefinition(template, "detachedDef2", false);
-
- // create some change sets
- final JPADriftChangeSet changeSet0 = new JPADriftChangeSet(resource, 0, COVERAGE, attachedDef1);
-
- driftFile1 = new JPADriftFile("a1b2c3");
- drift1 = new JPADrift(changeSet0, "drift.1", FILE_ADDED, null, driftFile1);
-
- final JPADriftSet driftSet0 = new JPADriftSet();
- driftSet0.addDrift(drift1);
-
- final JPADriftChangeSet changeSet1 = new JPADriftChangeSet(resource, 0, DRIFT, detachedDef1);
-
- driftFile2 = new JPADriftFile("1a2b3c");
- drift2 = new JPADrift(changeSet1, "drift.2", FILE_ADDED, null, driftFile2);
-
- final JPADriftSet driftSet1 = new JPADriftSet();
- driftSet1.addDrift(drift2);
-
- executeInTransaction(new TransactionCallback() {
- @Override
- public void execute() throws Exception {
- EntityManager em = getEntityManager();
-
- em.persist(attachedDef1);
- em.persist(attachedDef2);
- em.persist(detachedDef1);
- em.persist(detachedDef2);
-
- em.persist(driftFile1);
- em.persist(driftFile2);
-
- em.persist(changeSet0);
- em.persist(driftSet0);
- changeSet0.setInitialDriftSet(driftSet0);
- em.merge(changeSet0);
-
- em.persist(changeSet1);
- em.persist(driftSet1);
- changeSet1.setInitialDriftSet(driftSet1);
- em.merge(changeSet1);
- }
- });
-
- // delete the template
- templateMgr.deleteTemplate(getOverlord(), template.getId());
-
- // verify that attached definitions along with their change sets have
- // been deleted
- assertNull("Change sets belonging to attached definitions should be deleted", loadChangeSet(changeSet0.getId()));
- assertNull("Attached definition " + toString(attachedDef1) + " should be deleted", loadDefinition(attachedDef1
- .getId()));
- assertNull("Attached definition " + toString(attachedDef2) + " should be deleted", loadDefinition(attachedDef2
- .getId()));
-
- // verify that detached definitions along with their change sets have not been deleted
- assertNotNull("Change sets belonging to detached definitions should not be deleted", loadChangeSet(changeSet1
- .getId()));
- assertDetachedDefinitionNotDeleted(detachedDef1.getId());
- assertDetachedDefinitionNotDeleted(detachedDef2.getId());
-
- // verify that the template itself has been deleted
- assertNull("The template " + toString(template) + " should have been deleted", loadTemplate(template.getName(),
- false));
- }
-
- @SuppressWarnings("unchecked")
- private void assertDefinitionIsPinned(DriftDefinition definition) throws Exception {
- // verify that the definition is marked as pinned
- assertTrue("Expected " + toString(definition) + " to be pinned", definition.isPinned());
-
- // verify that the initial change set is generated for the definition
- JPADriftChangeSetCriteria criteria = new JPADriftChangeSetCriteria();
- criteria.addFilterDriftDefinitionId(definition.getId());
- criteria.addFilterCategory(COVERAGE);
- criteria.fetchDrifts(true);
-
- PageList<? extends DriftChangeSet<?>> changeSets = driftMgr.findDriftChangeSetsByCriteria(getOverlord(),
- criteria);
- assertEquals("Expected to find one change set", 1, changeSets.size());
-
- JPADriftChangeSet expectedChangeSet = new JPADriftChangeSet(resource, 1, COVERAGE, null);
- List<? extends Drift> expectedDrifts = asList(new JPADrift(expectedChangeSet, drift1.getPath(), FILE_ADDED,
- null, driftFile1), new JPADrift(expectedChangeSet, drift2.getPath(), FILE_ADDED, null, driftFile2));
-
- DriftChangeSet<?> actualChangeSet = changeSets.get(0);
- List<? extends Drift> actualDrifts = new ArrayList(actualChangeSet.getDrifts());
-
- AssertUtils.assertCollectionMatchesNoOrder(
- "Expected to find drifts from change sets 1 and 2 in the template change set",
- (List<Drift>) expectedDrifts, (List<Drift>) actualDrifts, "id", "ctime", "changeSet", "newDriftFile");
-
- // Finally make sure that there are no other change sets
- criteria = new JPADriftChangeSetCriteria();
- criteria.addFilterStartVersion(1);
- criteria.addFilterDriftDefinitionId(definition.getId());
-
- assertEquals("There should not be any drift change sets", 0, driftMgr.findDriftChangeSetsByCriteria(
- getOverlord(), criteria).size());
- }
-
- private void assertDefinitionIsNotPinned(DriftDefinition definition) throws Exception {
- // verify that the definition is not pinned
- assertFalse("Expected " + toString(definition) + " to be unpinned", definition.isPinned());
-
- // Note that this method assumes that the definition has no change sets
- // associated with it and therefore checks that there are no change sets.
- JPADriftChangeSetCriteria criteria = new JPADriftChangeSetCriteria();
- criteria.addFilterDriftDefinitionId(definition.getId());
-
- PageList<? extends DriftChangeSet<?>> changeSets = driftMgr.findDriftChangeSetsByCriteria(getOverlord(),
- criteria);
- assertEquals("Did not expect to find any change sets for " + toString(definition) + ". Note that this "
- + "assertion method assumes that the definition you are testing is not supposed to have any change sets.",
- 0, changeSets.size());
- }
-
- private void assertDriftTemplateEquals(String msg, DriftDefinitionTemplate expected, DriftDefinitionTemplate actual) {
- AssertUtils.assertPropertiesMatch(msg + ": basic drift definition template properties do not match", expected,
- actual, "id", "resourceType", "ctime", "templateDefinition");
- assertDriftDefEquals(msg + ": template definitions do not match", expected.getTemplateDefinition(), actual
- .getTemplateDefinition());
- }
-
- private void assertDriftDefEquals(String msg, DriftDefinition expected, DriftDefinition actual) {
- DriftDefinitionComparator comparator = new DriftDefinitionComparator(
- BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS);
- assertEquals(msg, 0, comparator.compare(expected, actual));
- }
-
- private void assertDetachedDefinitionNotDeleted(int definitionId) {
- DriftDefinition definition = loadDefinition(definitionId);
- assertNotNull("Detached definition " + toString(definition) + " should not be deleted", definition);
- assertNull("The detached definition's template reference should be set to null when the template is deleted",
- definition.getTemplate());
- }
-
- private DriftDefinition createDefinition(DriftDefinitionTemplate template, String defName, boolean isAttached) {
- DriftDefinition def = template.createDefinition();
- def.setName(defName);
- def.setAttached(isAttached);
- def.setTemplate(template);
- def.setResource(resource);
- return def;
- }
-
- private DriftDefinitionTemplate loadTemplate(String name) {
- return loadTemplate(name, true);
- }
-
- private DriftDefinitionTemplate loadTemplate(String name, boolean verifyResultsUnique) {
- DriftDefinitionTemplateCriteria criteria = new DriftDefinitionTemplateCriteria();
- criteria.addFilterResourceTypeId(resourceType.getId());
- criteria.addFilterName(name);
- criteria.fetchDriftDefinitions(true);
- criteria.fetchResourceType(true);
-
- PageList<DriftDefinitionTemplate> templates = templateMgr.findTemplatesByCriteria(getOverlord(), criteria);
- if (verifyResultsUnique) {
- assertEquals("Expected to find one template", 1, templates.size());
- }
-
- if (templates.isEmpty()) {
- return null;
- }
- return templates.get(0);
- }
-
- private DriftDefinition loadDefinition(int definitionId) {
- DriftDefinitionCriteria criteria = new DriftDefinitionCriteria();
- criteria.addFilterId(definitionId);
- criteria.fetchConfiguration(true);
- criteria.fetchTemplate(true);
- PageList<DriftDefinition> definitions = driftMgr.findDriftDefinitionsByCriteria(getOverlord(), criteria);
-
- if (definitions.isEmpty()) {
- return null;
- }
- return definitions.get(0);
- }
-
- private DriftChangeSet<?> loadChangeSet(String id) throws Exception {
- GenericDriftChangeSetCriteria criteria = new GenericDriftChangeSetCriteria();
- criteria.addFilterId(id);
- PageList<? extends DriftChangeSet<?>> changeSets = driftMgr.findDriftChangeSetsByCriteria(getOverlord(),
- criteria);
-
- if (changeSets.isEmpty()) {
- return null;
- }
- return changeSets.get(0);
- }
-
-}
diff --git a/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/InitDB.java b/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/InitDB.java
deleted file mode 100644
index 65a6523..0000000
--- a/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/InitDB.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2011 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., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-package org.rhq.enterprise.server.drift;
-
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-@Retention(RUNTIME)
-(a)Target({ElementType.METHOD })
-public @interface InitDB {
- boolean value() default true;
-}
diff --git a/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/JPADriftServerBeanTest.java b/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/JPADriftServerBeanTest.java
deleted file mode 100644
index dee42d9..0000000
--- a/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/JPADriftServerBeanTest.java
+++ /dev/null
@@ -1,311 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2011 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., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-package org.rhq.enterprise.server.drift;
-
-import static java.util.Arrays.asList;
-import static org.apache.commons.io.IOUtils.toInputStream;
-import static org.rhq.core.domain.drift.DriftCategory.FILE_ADDED;
-import static org.rhq.core.domain.drift.DriftChangeSetCategory.COVERAGE;
-import static org.rhq.core.domain.drift.DriftConfigurationDefinition.BaseDirValueContext.fileSystem;
-import static org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode.normal;
-import static org.rhq.core.domain.drift.DriftFileStatus.LOADED;
-import static org.rhq.enterprise.server.util.LookupUtil.getJPADriftServer;
-import static org.rhq.test.AssertUtils.assertPropertiesMatch;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import javax.persistence.EntityManager;
-
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import org.rhq.core.domain.configuration.Configuration;
-import org.rhq.core.domain.criteria.JPADriftChangeSetCriteria;
-import org.rhq.core.domain.drift.Drift;
-import org.rhq.core.domain.drift.DriftDefinition;
-import org.rhq.core.domain.drift.JPADrift;
-import org.rhq.core.domain.drift.JPADriftChangeSet;
-import org.rhq.core.domain.drift.JPADriftFile;
-import org.rhq.core.domain.drift.JPADriftSet;
-import org.rhq.core.domain.drift.dto.DriftChangeSetDTO;
-import org.rhq.core.domain.drift.dto.DriftDTO;
-import org.rhq.core.domain.drift.dto.DriftFileDTO;
-import org.rhq.core.domain.util.PageList;
-import org.rhq.test.AssertUtils;
-import org.rhq.enterprise.server.test.TransactionCallback;
-
-@Test(dependsOnGroups = "pinning")
-public class JPADriftServerBeanTest extends AbstractDriftServerTest {
-
- private JPADriftServerLocal jpaDriftServer;
-
- private final String DRIFT_FILE_1_ID = "a1b2c3d4";
-
- private final String DRIFT_FILE_2_ID = "1ab2b3c4d";
-
- private JPADriftFile driftFile1;
-
- private JPADriftFile driftFile2;
-
- @BeforeClass
- public void initTests() {
- jpaDriftServer = getJPADriftServer();
- }
-
- @BeforeMethod
- public void persistDriftFiles() throws Exception {
- driftFile1 = jpaDriftServer.persistDriftFile(new JPADriftFile(DRIFT_FILE_1_ID));
- driftFile2 = jpaDriftServer.persistDriftFile(new JPADriftFile(DRIFT_FILE_2_ID));
-
- String driftFile1Content = "drift file 1 content...";
- String driftFile2Content = "drift file 2 content...";
-
- jpaDriftServer.persistDriftFileData(driftFile1, toInputStream(driftFile1Content), driftFile1Content.length());
- jpaDriftServer.persistDriftFileData(driftFile2, toInputStream(driftFile2Content), driftFile2Content.length());
-
- driftFile1 = jpaDriftServer.getDriftFile(getOverlord(), DRIFT_FILE_1_ID);
- driftFile2 = jpaDriftServer.getDriftFile(getOverlord(), DRIFT_FILE_2_ID);
-
- assertDriftFilePersisted(driftFile1, "driftFile1", driftFile1Content);
- assertDriftFilePersisted(driftFile2, "driftFile2", driftFile2Content);
- }
-
- public void persistResourceChangeSet() {
- // first create and persist the drift definition
- final DriftDefinition driftDef = new DriftDefinition(new Configuration());
- driftDef.setName("test::persistResourceChangeSet");
- driftDef.setEnabled(true);
- driftDef.setDriftHandlingMode(normal);
- driftDef.setInterval(2400L);
- driftDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test"));
- driftDef.setResource(resource);
-
- executeInTransaction(new TransactionCallback() {
- @Override
- public void execute() throws Exception {
- EntityManager em = getEntityManager();
- em.persist(driftDef);
- }
- });
-
- // create the change set to be persisted
- DriftChangeSetDTO changeSet = new DriftChangeSetDTO();
- changeSet.setCategory(COVERAGE);
- changeSet.setVersion(1);
- changeSet.setDriftDefinitionId(driftDef.getId());
- changeSet.setResourceId(resource.getId());
- changeSet.setDriftHandlingMode(normal);
- changeSet.setCtime(System.currentTimeMillis());
-
- DriftDTO drift1 = new DriftDTO();
- drift1.setCategory(FILE_ADDED);
- drift1.setPath("drift.1");
- drift1.setChangeSet(changeSet);
- drift1.setCtime(System.currentTimeMillis());
- drift1.setNewDriftFile(toDTo(driftFile1));
-
- DriftDTO drift2 = new DriftDTO();
- drift2.setCategory(FILE_ADDED);
- drift2.setPath("drift.2");
- drift2.setChangeSet(changeSet);
- drift2.setCtime(System.currentTimeMillis());
- drift2.setNewDriftFile(toDTo(driftFile2));
-
- Set<DriftDTO> drifts = new HashSet<DriftDTO>();
- drifts.add(drift1);
- drifts.add(drift2);
- changeSet.setDrifts(drifts);
-
- String newChangeSetId = jpaDriftServer.persistChangeSet(getOverlord(), changeSet);
-
- // verify that the change set was persisted
- JPADriftChangeSetCriteria criteria = new JPADriftChangeSetCriteria();
- criteria.addFilterId(newChangeSetId);
- criteria.fetchDrifts(true);
-
- PageList<JPADriftChangeSet> changeSets = jpaDriftServer.findDriftChangeSetsByCriteria(getOverlord(), criteria);
- assertEquals("Expected to find one change set", 1, changeSets.size());
-
- JPADriftChangeSet jpaChangeSet = changeSets.get(0);
- assertEquals("Expected change set to contain two drifts. This could be a result of the change set not being " +
- "persisted correctly or the criteria fetch being done incorrectly.", 2, jpaChangeSet.getDrifts().size());
-
- AssertUtils
- .assertPropertiesMatch("The change set was not persisted correctly", changeSet, jpaChangeSet, "id", "drifts",
- "class", "ctime");
-
- List<? extends Drift> expectedDrifts = asList(drift1, drift2);
- List<? extends Drift> actualDrifts = new ArrayList(jpaChangeSet.getDrifts());
-
- // We ignore the id and ctime properties because those are set by JPADriftServerBean
- // and are somewhat implmentation specific. We ignore the directory property because
- // it is really a calculated property. newDriftFile has to be compared separately
- // since it does not implement equals.
- AssertUtils.assertCollectionMatchesNoOrder("The change set drifts were not persisted correctly",
- (List<Drift>) expectedDrifts, (List<Drift>) actualDrifts, "id", "ctime", "changeSet", "directory",
- "newDriftFile", "class");
-
- assertPropertiesMatch("The newDriftFile property was not set correctly for " + drift1, drift1.getNewDriftFile(),
- findDriftByPath(actualDrifts, "drift.1").getNewDriftFile(), "class", "ctime") ;
- assertPropertiesMatch("The newDriftFile property was not set correctly for " + drift2, drift2.getNewDriftFile(),
- findDriftByPath(actualDrifts, "drift.2").getNewDriftFile(), "class", "ctime") ;
- }
-
- public void persistTemplateChangeSet() {
- // create the change set to be persisted
- //
- // Note that we do not set the drift definition id or resource id since
- // the change set is not owned by a resource. It is owned by the
- // resource type.
- DriftChangeSetDTO changeSet = new DriftChangeSetDTO();
- changeSet.setCategory(COVERAGE);
- changeSet.setVersion(1);
- changeSet.setDriftHandlingMode(normal);
- changeSet.setCtime(System.currentTimeMillis());
-
- DriftDTO drift1 = new DriftDTO();
- drift1.setCategory(FILE_ADDED);
- drift1.setPath("drift.1");
- drift1.setChangeSet(changeSet);
- drift1.setCtime(System.currentTimeMillis());
- drift1.setNewDriftFile(toDTo(driftFile1));
-
- DriftDTO drift2 = new DriftDTO();
- drift2.setCategory(FILE_ADDED);
- drift2.setPath("drift.2");
- drift2.setChangeSet(changeSet);
- drift2.setCtime(System.currentTimeMillis());
- drift2.setNewDriftFile(toDTo(driftFile2));
-
- Set<DriftDTO> drifts = new HashSet<DriftDTO>();
- drifts.add(drift1);
- drifts.add(drift2);
- changeSet.setDrifts(drifts);
-
- String newChangeSetId = jpaDriftServer.persistChangeSet(getOverlord(), changeSet);
-
- // verify that the change set was persisted
- JPADriftChangeSetCriteria criteria = new JPADriftChangeSetCriteria();
- criteria.addFilterId(newChangeSetId);
- criteria.fetchDrifts(true);
-
- PageList<JPADriftChangeSet> changeSets = jpaDriftServer.findDriftChangeSetsByCriteria(getOverlord(), criteria);
- assertEquals("Expected to find one change set", 1, changeSets.size());
-
- JPADriftChangeSet jpaChangeSet = changeSets.get(0);
- assertEquals("Expected change set to contain two drifts. This could be a result of the change set not being " +
- "persisted correctly or the criteria fetch being done incorrectly.", 2, jpaChangeSet.getDrifts().size());
-
- AssertUtils
- .assertPropertiesMatch("The change set was not persisted correctly", changeSet, jpaChangeSet, "id", "drifts",
- "class", "ctime");
-
- List<? extends Drift> expectedDrifts = asList(drift1, drift2);
- List<? extends Drift> actualDrifts = new ArrayList(jpaChangeSet.getDrifts());
-
- // We ignore the id and ctime properties because those are set by JPADriftServerBean
- // and are somewhat implmentation specific. We ignore the directory property because
- // it is really a calculated property. newDriftFile has to be compared separately
- // since it does not implement equals.
- AssertUtils.assertCollectionMatchesNoOrder("The change set drifts were not persisted correctly",
- (List<Drift>) expectedDrifts, (List<Drift>) actualDrifts, "id", "ctime", "changeSet", "directory",
- "newDriftFile", "class");
-
- assertPropertiesMatch("The newDriftFile property was not set correctly for " + drift1, drift1.getNewDriftFile(),
- findDriftByPath(actualDrifts, "drift.1").getNewDriftFile(), "class", "ctime") ;
- assertPropertiesMatch("The newDriftFile property was not set correctly for " + drift2, drift2.getNewDriftFile(),
- findDriftByPath(actualDrifts, "drift.2").getNewDriftFile(), "class", "ctime") ;
- }
-
- public void copyChangeSet() {
- // first create the change set that will be copied
- final JPADriftChangeSet changeSet = new JPADriftChangeSet(null, 0, COVERAGE, null);
- changeSet.setDriftHandlingMode(normal);
-
- final JPADrift drift1 = new JPADrift(changeSet, "drift.1", FILE_ADDED, null, driftFile1);
- final JPADrift drift2 = new JPADrift(changeSet, "drift.2", FILE_ADDED, null, driftFile2);
-
- final JPADriftSet driftSet = new JPADriftSet();
- driftSet.addDrift(drift1);
- driftSet.addDrift(drift2);
-
- // next create the drift definition
- final DriftDefinition driftDef = new DriftDefinition(new Configuration());
- driftDef.setName("test::copyChangeSet");
- driftDef.setEnabled(true);
- driftDef.setDriftHandlingMode(normal);
- driftDef.setInterval(2400L);
- driftDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test"));
- driftDef.setResource(resource);
-
- // persist the change set and drift definition
- executeInTransaction(new TransactionCallback() {
- @Override
- public void execute() throws Exception {
- EntityManager em = getEntityManager();
- em.persist(changeSet);
- em.persist(driftDef);
- em.persist(driftSet);
- changeSet.setInitialDriftSet(driftSet);
- em.merge(changeSet);
- }
- });
-
- jpaDriftServer.copyChangeSet(getOverlord(), changeSet.getId(), driftDef.getId(), resource.getId());
-
- // verify that the change set was created for the definition
- JPADriftChangeSetCriteria criteria = new JPADriftChangeSetCriteria();
- criteria.addFilterDriftDefinitionId(driftDef.getId());
- criteria.addFilterCategory(COVERAGE);
-
- PageList<JPADriftChangeSet> changeSets = jpaDriftServer.findDriftChangeSetsByCriteria(getOverlord(), criteria);
-
- assertEquals("Expected to get back one change set", 1,changeSets.size());
-
- JPADriftChangeSet newChangeSet = changeSets.get(0);
- Set<JPADrift> expectedDrifts = new HashSet<JPADrift>(asList(drift1, drift2));
- Set<JPADrift> actualDrifts = newChangeSet.getDrifts();
-
- AssertUtils.assertCollectionMatchesNoOrder("The change set drifts were not copied correctly", expectedDrifts,
- actualDrifts,
- "changeSet", "newDriftFile");
- }
-
- private DriftFileDTO toDTo(JPADriftFile driftFile) {
- DriftFileDTO dto = new DriftFileDTO();
- dto.setHashId(driftFile.getHashId());
- dto.setDataSize(driftFile.getDataSize());
- dto.setStatus(driftFile.getStatus());
- return dto;
- }
-
-
- private void assertDriftFilePersisted(JPADriftFile driftFile, String name, String content) {
- assertNotNull("Failed to get " + name + " Was it persisted?", driftFile);
- assertEquals("The content for " + name + " is wrong", content, jpaDriftServer.getDriftFileBits(
- driftFile.getHashId()));
- assertEquals("The drift file status is wrong", LOADED, driftFile.getStatus());
- }
-
-}
diff --git a/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/ManageDriftDefinitionsTest.java b/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/ManageDriftDefinitionsTest.java
deleted file mode 100644
index 564264a..0000000
--- a/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/ManageDriftDefinitionsTest.java
+++ /dev/null
@@ -1,326 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2011 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., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-package org.rhq.enterprise.server.drift;
-
-import org.rhq.core.domain.common.EntityContext;
-import org.rhq.core.domain.configuration.Configuration;
-import org.rhq.core.domain.criteria.DriftDefinitionCriteria;
-import org.rhq.core.domain.criteria.JPADriftChangeSetCriteria;
-import org.rhq.core.domain.drift.*;
-import org.rhq.core.domain.resource.Resource;
-import org.rhq.core.domain.resource.ResourceType;
-import org.rhq.core.domain.util.PageList;
-import org.rhq.enterprise.server.safeinvoker.HibernateDetachUtility;
-import org.rhq.test.AssertUtils;
-import org.rhq.enterprise.server.test.TransactionCallback;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import javax.persistence.EntityManager;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import static java.util.Arrays.asList;
-import static org.rhq.core.domain.drift.DriftCategory.FILE_ADDED;
-import static org.rhq.core.domain.drift.DriftChangeSetCategory.COVERAGE;
-import static org.rhq.core.domain.drift.DriftConfigurationDefinition.BaseDirValueContext.fileSystem;
-import static org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode.normal;
-import static org.rhq.core.domain.drift.DriftDefinitionComparator.CompareMode.BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS;
-import static org.rhq.enterprise.server.util.LookupUtil.getDriftManager;
-import static org.rhq.enterprise.server.util.LookupUtil.getDriftTemplateManager;
-
-@Test(dependsOnGroups = "pinning")
-public class ManageDriftDefinitionsTest extends AbstractDriftServerTest {
-
- private final String DRIFT_NOT_SUPPORTED_TYPE = getClass().getSimpleName() + "DRIFT_NOT_SUPPORTED_RESOURCE_TYPE";
-
- private final String DRIFT_NOT_SUPPORTED_RESOURCE = getClass().getSimpleName() + "DRIFT_NOT_SUPPORTED_RESOURCE";
-
- private DriftManagerLocal driftMgr;
-
- private DriftTemplateManagerLocal templateMgr;
-
- private ResourceType driftNotSupportedType;
-
- private Resource driftNotSupportedResource;
-
- @BeforeClass
- public void initClass() throws Exception {
- driftMgr = getDriftManager();
- templateMgr = getDriftTemplateManager();
- }
-
- @Override
- protected void purgeDB(EntityManager em) {
- deleteEntity(Resource.class, DRIFT_NOT_SUPPORTED_RESOURCE, em);
- deleteEntity(ResourceType.class, DRIFT_NOT_SUPPORTED_TYPE, em);
- }
-
- public void createDefinitionFromUnpinnedTemplate() {
- // first create a template
- final DriftDefinition templateDef = new DriftDefinition(new Configuration());
- templateDef.setName("test_createUnpinnedDefinition");
- templateDef.setEnabled(true);
- templateDef.setDriftHandlingMode(normal);
- templateDef.setInterval(2400L);
- templateDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test"));
-
- // persist the template
- DriftDefinitionTemplate template = templateMgr.createTemplate(getOverlord(), resourceType.getId(), false,
- templateDef);
-
- // create and persist the definition
- DriftDefinition definition = template.createDefinition();
- definition.setTemplate(template);
- driftMgr.updateDriftDefinition(getOverlord(), EntityContext.forResource(resource.getId()), definition);
-
- // verify that the definition was created
- DriftDefinition newDef = loadDefinition(definition.getName());
- DriftDefinitionComparator comparator = new DriftDefinitionComparator(
- BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS);
-
- assertEquals("The drift definition was not persisted correctly", 0, comparator.compare(definition, newDef));
- assertEquals("The template association was not set on the definition", template, newDef.getTemplate());
- }
-
- // The following two tests are commented out because when they are enabled
- // and all tests in the itests module are run, the @AfterClass method for
- // DriftTemplateManagerBeanTest does not run immediately after all of its
- // test methods have finished running. Instead, some of the tests in
- // ManageDriftDefinitionsTest start running. This leads to some database
- // constraint violations because of how agents are created in the parent
- // class, DriftServerTest. See http://groups.google.com/group/testng-users/browse_thread/thread/da279067...
- // more info on the order in which TestNG executes tests.
-
-// public void createEntitiesThatDoNotSupportDrift() {
-// // first create the resource type that does not support drift
-// driftNotSupportedType = new ResourceTypeBuilder()
-// .createResourceType()
-// .withId(0)
-// .withName(DRIFT_NOT_SUPPORTED_TYPE)
-// .withCategory(SERVER)
-// .withPlugin(DRIFT_NOT_SUPPORTED_TYPE.toLowerCase())
-// .build();
-//
-// // create a resource of the type that does not support drift
-// driftNotSupportedResource = new ResourceBuilder()
-// .createResource()
-// .withId(0)
-// .withName(DRIFT_NOT_SUPPORTED_RESOURCE)
-// .withResourceKey(DRIFT_NOT_SUPPORTED_RESOURCE)
-// .withRandomUuid()
-// .withResourceType(driftNotSupportedType)
-// .build();
-//
-// executeInTransaction(new TransactionCallback() {
-// @Override
-// public void execute() throws Exception {
-// EntityManager em = getEntityManager();
-// em.persist(driftNotSupportedType);
-// em.persist(driftNotSupportedResource);
-// }
-// });
-// }
-//
-// @Test(dependsOnMethods = "createEntitiesThatDoNotSupportDrift",
-// expectedExceptions = EJBException.class,
-// expectedExceptionsMessageRegExp = ".*Cannot create drift definition.*type.*does not support drift management")
-// @InitDB(false)
-// public void doNotAllowDefinitionToBeCreatedForTypeThatDoesNotSupportDrift() {
-// DriftDefinition driftDef = new DriftDefinition(new Configuration());
-// driftDef.setName("test_typeDoesNotSupportDrift");
-// driftDef.setEnabled(true);
-// driftDef.setInterval(1800L);
-// driftDef.setDriftHandlingMode(normal);
-// driftDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test"));
-//
-// driftMgr.updateDriftDefinition(getOverlord(), EntityContext.forResource(driftNotSupportedResource.getId()),
-// driftDef);
-// }
-
- @SuppressWarnings("unchecked")
- public void createDefinitionFromPinnedTemplate() throws Exception {
- // We first need to create a pinned template. Users can only create a pinned
- // template from a snapshot of an existing resource-level drift definition.
- // We are going to take a bit of a short cut though by directly creating
- // and persisting the pinned change set.
-
- // first create the change set
- final JPADriftChangeSet changeSet0 = new JPADriftChangeSet(null, 0, COVERAGE, null);
- changeSet0.setDriftHandlingMode(DriftConfigurationDefinition.DriftHandlingMode.normal);
-
- final JPADriftFile driftFile1 = new JPADriftFile("a1b2c3");
- final JPADriftFile driftFile2 = new JPADriftFile("1a2b3c");
-
- JPADrift drift1 = new JPADrift(changeSet0, "drift.1", FILE_ADDED, null, driftFile1);
- JPADrift drift2 = new JPADrift(changeSet0, "drift.2", FILE_ADDED, null, driftFile2);
-
- final JPADriftSet driftSet = new JPADriftSet();
- driftSet.addDrift(drift1);
- driftSet.addDrift(drift2);
-
- // create the template
- final DriftDefinition templateDef = new DriftDefinition(new Configuration());
- templateDef.setName("test_createUnpinnedDefinition");
- templateDef.setEnabled(true);
- templateDef.setDriftHandlingMode(normal);
- templateDef.setInterval(2400L);
- templateDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test"));
- templateDef.setPinned(true);
-
- final DriftDefinitionTemplate template = templateMgr.createTemplate(getOverlord(), resourceType.getId(), true,
- templateDef);
-
- executeInTransaction(new TransactionCallback() {
- @Override
- public void execute() throws Exception {
- EntityManager em = getEntityManager();
-
- em.persist(driftFile1);
- em.persist(driftFile2);
- em.persist(changeSet0);
- em.persist(driftSet);
- changeSet0.setInitialDriftSet(driftSet);
- em.merge(changeSet0);
-
- // setting the change set id on the template is the last and the
- // most important step in making the template pinned
- template.setChangeSetId(changeSet0.getId());
- em.merge(template);
- }
- });
-
- // Create and persist a resource-level definition.
- final DriftDefinition definition = template.createDefinition();
- definition.setTemplate(template);
-
- final AtomicBoolean agentInvoked = new AtomicBoolean(false);
-
- agentServiceContainer.driftService = new TestDefService() {
- @Override
- public void updateDriftDetection(int resourceId, DriftDefinition driftDef, DriftSnapshot snapshot) {
- try {
- HibernateDetachUtility.nullOutUninitializedFields(driftDef,
- HibernateDetachUtility.SerializationType.SERIALIZATION);
- HibernateDetachUtility.nullOutUninitializedFields(snapshot,
- HibernateDetachUtility.SerializationType.SERIALIZATION);
- agentInvoked.set(true);
- assertNotNull("Expected snapshot drift instances collection to be non-null",
- snapshot.getDriftInstances());
- assertEquals("Expected snapshot to contain two drift entries", 2, snapshot.getDriftInstances().size());
- } catch (Exception e) {
- String msg = "Do not pass attached entites to agent since those entities are outside of " +
- "Hibernate's control. The persistence context should be flushed and cleared to ensure that " +
- "only detached objects are sent to the agent";
- throw new RuntimeException(msg, e);
- }
- }
- };
-
- driftMgr.updateDriftDefinition(getOverlord(), EntityContext.forResource(resource.getId()), definition);
-
- DriftDefinition newDef = loadDefinition(definition.getName());
-
- // verify that the definition is marked as pinned
- assertTrue("The drift definition should be marked as pinned", newDef.isPinned());
-
- // verify that the initial change set is generated for the definition
- JPADriftChangeSetCriteria criteria = new JPADriftChangeSetCriteria();
- criteria.addFilterDriftDefinitionId(definition.getId());
- criteria.addFilterCategory(COVERAGE);
- criteria.fetchDrifts(true);
-
- PageList<? extends DriftChangeSet<?>> changeSets = driftMgr.findDriftChangeSetsByCriteria(getOverlord(),
- criteria);
- assertEquals("Expected to find one change set", 1, changeSets.size());
-
- JPADriftChangeSet expectedChangeSet = new JPADriftChangeSet(resource, 1, COVERAGE, null);
- List<? extends Drift> expectedDrifts = asList(
- new JPADrift(expectedChangeSet, drift1.getPath(), FILE_ADDED, null, driftFile1),
- new JPADrift(expectedChangeSet, drift2.getPath(), FILE_ADDED, null, driftFile2));
-
- DriftChangeSet<?> actualChangeSet = changeSets.get(0);
- List<? extends Drift> actualDrifts = new ArrayList(actualChangeSet.getDrifts());
-
- AssertUtils.assertCollectionMatchesNoOrder(
- "Expected to find drifts from change sets 1 and 2 in the template change set",
- (List<Drift>) expectedDrifts, (List<Drift>) actualDrifts, "id", "ctime", "changeSet", "newDriftFile");
-
- // lastly verify that the agent is called
- assertTrue("Failed to send drift definition along with snapshot to agent", agentInvoked.get());
- }
-
- public void unpinDefinition() {
- // First create the template
- final DriftDefinition templateDef = new DriftDefinition(new Configuration());
- templateDef.setName("test_unpin_def_template");
- templateDef.setEnabled(true);
- templateDef.setDriftHandlingMode(normal);
- templateDef.setInterval(2400L);
- templateDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test"));
-
- final DriftDefinitionTemplate template = templateMgr.createTemplate(getOverlord(), resourceType.getId(), true,
- templateDef);
-
- // First create the definition
- DriftDefinition definition = template.createDefinition();
- definition.setName("test_unpin");
- definition.setEnabled(true);
- definition.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test"));
- definition.setComplianceStatus(DriftComplianceStatus.OUT_OF_COMPLIANCE_DRIFT);
- definition.setInterval(1800L);
- definition.setDriftHandlingMode(normal);
- definition.setPinned(true);
-
- // persist the definition
- driftMgr.updateDriftDefinition(getOverlord(), EntityContext.forResource(resource.getId()), definition);
-
- // now update the definition
- DriftDefinition newDef = loadDefinition(definition.getName());
- assertNotNull("Failed to load new definition, " + toString(definition));
- newDef.setPinned(false);
-
- driftMgr.updateDriftDefinition(getOverlord(), EntityContext.forResource(resource.getId()), newDef);
-
- // now verify that the definition was updated
- DriftDefinition updatedDef = loadDefinition(definition.getName());
- assertNotNull("Failed to load updated definition, " + toString(newDef));
-
- assertFalse("The updated definition should be set to unpinned", updatedDef.isPinned());
- assertEquals("The updated definition should be set to in compliance", DriftComplianceStatus.IN_COMPLIANCE,
- updatedDef.getComplianceStatus());
- }
-
- private DriftDefinition loadDefinition(String name) {
- DriftDefinitionCriteria criteria = new DriftDefinitionCriteria();
- criteria.addFilterResourceIds(resource.getId());
- criteria.addFilterName(name);
- criteria.fetchConfiguration(true);
- criteria.fetchResource(true);
- criteria.fetchTemplate(true);
-
- PageList<DriftDefinition> driftDefs = driftMgr.findDriftDefinitionsByCriteria(getOverlord(), criteria);
- assertEquals("Expected to find one drift definition", 1, driftDefs.size());
-
- return driftDefs.get(0);
- }
-
-}
diff --git a/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/ManageSnapshotsTest.java b/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/ManageSnapshotsTest.java
deleted file mode 100644
index a214621..0000000
--- a/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/ManageSnapshotsTest.java
+++ /dev/null
@@ -1,276 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2011 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., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-package org.rhq.enterprise.server.drift;
-
-import static java.util.Arrays.asList;
-import static org.rhq.core.domain.drift.DriftCategory.FILE_ADDED;
-import static org.rhq.core.domain.drift.DriftChangeSetCategory.COVERAGE;
-import static org.rhq.core.domain.drift.DriftChangeSetCategory.DRIFT;
-import static org.rhq.core.domain.drift.DriftConfigurationDefinition.BaseDirValueContext.fileSystem;
-import static org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode.normal;
-import static org.rhq.enterprise.server.util.LookupUtil.getDriftManager;
-import static org.rhq.enterprise.server.util.LookupUtil.getDriftTemplateManager;
-import static org.rhq.test.AssertUtils.assertPropertiesMatch;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.ObjectOutputStream;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import javax.persistence.EntityManager;
-
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import org.rhq.core.domain.configuration.Configuration;
-import org.rhq.core.domain.criteria.GenericDriftChangeSetCriteria;
-import org.rhq.core.domain.drift.Drift;
-import org.rhq.core.domain.drift.DriftChangeSet;
-import org.rhq.core.domain.drift.DriftDefinition;
-import org.rhq.core.domain.drift.DriftDefinitionTemplate;
-import org.rhq.core.domain.drift.DriftSnapshot;
-import org.rhq.core.domain.drift.JPADrift;
-import org.rhq.core.domain.drift.JPADriftChangeSet;
-import org.rhq.core.domain.drift.JPADriftFile;
-import org.rhq.core.domain.drift.JPADriftSet;
-import org.rhq.core.domain.server.EntitySerializer;
-import org.rhq.core.domain.util.PageList;
-import org.rhq.test.AssertUtils;
-import org.rhq.enterprise.server.test.TransactionCallback;
-
-@Test(dependsOnGroups = "pinning")
-public class ManageSnapshotsTest extends AbstractDriftServerTest {
-
- private DriftManagerLocal driftMgr;
-
- private DriftTemplateManagerLocal templateMgr;
-
- @BeforeClass
- public void initClass() throws Exception {
- driftMgr = getDriftManager();
- templateMgr = getDriftTemplateManager();
- }
-
- public void pinningSnapshotShouldSetDriftDefAsPinned() {
- final DriftDefinition driftDef = createAndPersistDriftDef("test::setPinnedFlag");
-
- // create initial change set
- final JPADriftChangeSet changeSet = new JPADriftChangeSet(resource, 0, COVERAGE, driftDef);
-
- final JPADriftFile driftFile1 = new JPADriftFile("a1b2c3");
- JPADrift drift = new JPADrift(changeSet, "drift.1", FILE_ADDED, null, driftFile1);
-
- final JPADriftSet driftSet = new JPADriftSet();
- driftSet.addDrift(drift);
-
- executeInTransaction(new TransactionCallback() {
- @Override
- public void execute() throws Exception {
- EntityManager em = getEntityManager();
- em.persist(driftFile1);
- em.persist(changeSet);
- em.persist(driftSet);
- changeSet.setInitialDriftSet(driftSet);
- em.merge(changeSet);
- }
- });
-
- driftMgr.pinSnapshot(getOverlord(), driftDef.getId(), 0);
- DriftDefinition updatedDriftDef = driftMgr.getDriftDefinition(getOverlord(), driftDef.getId());
-
- assertNotNull("Failed to get " + toString(driftDef), updatedDriftDef);
- assertTrue("Failed to set pinned flag of " + toString(driftDef), updatedDriftDef.isPinned());
- }
-
- @SuppressWarnings("unchecked")
- public void pinningSnapshotShouldMakeSnapshotTheInitialChangeSet() throws Exception {
- final DriftDefinition driftDef = createAndPersistDriftDef("test::makeSnapshotVersionZero");
-
- // create initial change set
- final JPADriftChangeSet changeSet0 = new JPADriftChangeSet(resource, 0, COVERAGE, driftDef);
-
- final JPADriftFile driftFile1 = new JPADriftFile("a1b2c3");
- JPADrift drift1 = new JPADrift(changeSet0, "drift.1", FILE_ADDED, null, driftFile1);
-
- final JPADriftSet driftSet = new JPADriftSet();
- driftSet.addDrift(drift1);
-
- // create change set v1
- final JPADriftFile driftFile2 = new JPADriftFile("1a2b3c");
- final JPADriftChangeSet changeSet1 = new JPADriftChangeSet(resource, 1, DRIFT, driftDef);
- final JPADrift drift2 = new JPADrift(changeSet1, "drift.2", FILE_ADDED, null, driftFile2);
-
- executeInTransaction(new TransactionCallback() {
- @Override
- public void execute() throws Exception {
- EntityManager em = getEntityManager();
- em.persist(driftFile1);
- em.persist(driftFile2);
- em.persist(changeSet0);
- em.persist(driftSet);
- changeSet0.setInitialDriftSet(driftSet);
- em.merge(changeSet0);
- em.persist(changeSet1);
- em.persist(drift2);
- }
- });
-
- driftMgr.pinSnapshot(getOverlord(), driftDef.getId(), 1);
-
- // Verify that there is now only one change set for the drift def
- GenericDriftChangeSetCriteria criteria = new GenericDriftChangeSetCriteria();
- criteria.addFilterDriftDefinitionId(driftDef.getId());
-
- PageList<? extends DriftChangeSet<?>> changeSets = driftMgr.findDriftChangeSetsByCriteria(getOverlord(),
- criteria);
- assertEquals("All change sets except the change set representing the pinned snapshot should be removed",
- 1, changeSets.size());
- DriftChangeSet<?> changeSet = changeSets.get(0);
-
- assertEquals("The pinned snapshot version should be reset to zero", 0, changeSet.getVersion());
- assertEquals("The change set category is wrong", COVERAGE, changeSet.getCategory());
-
- JPADriftChangeSet expectedChangeSet = new JPADriftChangeSet(resource, 1, COVERAGE, driftDef);
- List<? extends Drift> expectedDrifts = asList(
- new JPADrift(expectedChangeSet, drift1.getPath(), FILE_ADDED, null, driftFile1),
- new JPADrift(expectedChangeSet, drift2.getPath(), FILE_ADDED, null, driftFile2));
-
- List<? extends Drift> actualDrifts = new ArrayList(changeSet.getDrifts());
-
- AssertUtils.assertCollectionMatchesNoOrder(
- "Expected to find drifts from change sets 1 and 2 in the new initial change set",
- (List<Drift>) expectedDrifts, (List<Drift>) actualDrifts, "id", "ctime", "changeSet", "newDriftFile");
-
- // we need to compare the newDriftFile properties separately because
- // assertCollectionMatchesNoOrder compares properties via equals() and JPADriftFile
- // does not implement equals.
- assertPropertiesMatch(drift1.getNewDriftFile(), findDriftByPath(actualDrifts, "drift.1").getNewDriftFile(),
- "The newDriftFile property was not set correctly for " + drift1);
- assertPropertiesMatch(drift2.getNewDriftFile(), findDriftByPath(actualDrifts, "drift.2").getNewDriftFile(),
- "The newDriftFile property was not set correctly for " + drift1);
- }
-
- public void pinningSnapshotShouldSendRequestToAgent() {
- final DriftDefinition driftDef = createAndPersistDriftDef("test::setPinnedFlag");
-
- // create initial change set
- final JPADriftChangeSet changeSet = new JPADriftChangeSet(resource, 0, COVERAGE, driftDef);
-
- final JPADriftFile driftFile1 = new JPADriftFile("a1b2c3");
- JPADrift drift = new JPADrift(changeSet, "drift.1", FILE_ADDED, null, driftFile1);
-
- final JPADriftSet driftSet = new JPADriftSet();
- driftSet.addDrift(drift);
-
- executeInTransaction(new TransactionCallback() {
- @Override
- public void execute() throws Exception {
- EntityManager em = getEntityManager();
- em.persist(driftFile1);
- em.persist(changeSet);
- em.persist(driftSet);
- changeSet.setInitialDriftSet(driftSet);
- em.merge(changeSet);
- }
- });
-
- final AtomicBoolean agentInvoked = new AtomicBoolean(false);
- agentServiceContainer.driftService = new TestDefService() {
- @Override
- public void pinSnapshot(int resourceId, String configName, DriftSnapshot snapshot) {
- try {
- agentInvoked.set(true);
- // serialize the method arguments here to more closely simulate what
- // happens during the call. We cannot send hibernate-proxied objects
- // to the agent. This is an attempt to catch that.
- ObjectOutputStream stream = new ObjectOutputStream(new ByteArrayOutputStream());
- EntitySerializer.writeExternalRemote(resourceId, stream);
- EntitySerializer.writeExternalRemote(configName, stream);
- EntitySerializer.writeExternalRemote(snapshot, stream);
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
- };
-
- driftMgr.pinSnapshot(getOverlord(), driftDef.getId(), 0);
-
- assertTrue("Failed to send request to agent to pin snapshot", agentInvoked.get());
- }
-
- @Test(expectedExceptions = IllegalArgumentException.class,
- expectedExceptionsMessageRegExp = "Cannot repin.*definition.*")
- public void doNotAllowSnapshotToBePinnedWhenDefinitionIsAttachedToPinnedTemplate() {
- // First create the template
- final DriftDefinition templateDef = new DriftDefinition(new Configuration());
- templateDef.setName("Template-Pinned_Test");
- templateDef.setEnabled(true);
- templateDef.setDriftHandlingMode(normal);
- templateDef.setInterval(2400L);
- templateDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test"));
-
- final DriftDefinitionTemplate template = templateMgr.createTemplate(getOverlord(), resourceType.getId(), true,
- templateDef);
-
- // Now we will pin the template. We are going to take a bit of a short cut
- // here. Pinning a template requires a drift definition with at least one
- // snapshot. For the purposes of this test we can simply set the
- // changeSetId field of the template to indicate that it is pinned.
- template.setChangeSetId("1234");
-
- // Next create a resource-level definition from the template.
- final DriftDefinition driftDef = template.createDefinition();
- driftDef.setResource(resource);
-
- executeInTransaction(new TransactionCallback() {
- @Override
- public void execute() throws Exception {
- EntityManager em = getEntityManager();
- em.merge(template);
- em.persist(driftDef);
- }
- });
-
- // Now try resource-level pinning, i.e., pin a snapshot to the definition
- driftMgr.pinSnapshot(getOverlord(), driftDef.getId(), 0);
- }
-
- private DriftDefinition createAndPersistDriftDef(String name) {
- final DriftDefinition driftDef = new DriftDefinition(new Configuration());
- driftDef.setName(name);
- driftDef.setEnabled(true);
- driftDef.setDriftHandlingMode(normal);
- driftDef.setInterval(1800L);
- driftDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test"));
-
- executeInTransaction(new TransactionCallback() {
- @Override
- public void execute() throws Exception {
- driftDef.setResource(resource);
- getEntityManager().persist(driftDef);
- }
- });
-
- return driftDef;
- }
-
-}
commit 1aa4c1f65dfd021b902060e64b82f0ba291691dd
Author: Jay Shaughnessy <jshaughn(a)jshaughn.csb>
Date: Fri Nov 2 14:08:21 2012 -0400
Protect toString() impls from detached entities
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftDefinition.java b/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftDefinition.java
index f714d9e..a9b0ad3 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftDefinition.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftDefinition.java
@@ -284,10 +284,16 @@ public class DriftDefinition implements Serializable {
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
- builder.append("DriftDefinition [id=").append(id).append(", name=").append(name).append(", enabled=").append(
- isEnabled).append(", interval=").append(interval).append(", resource=").append(resource).append(
- ", basedir=").append(getBasedir()).append(", includes=").append(getIncludes()).append(", excludes=")
- .append(getExcludes()).append("]");
+ builder.append("DriftDefinition [id=").append(id).append(", name=").append(name).append(", enabled=")
+ .append(isEnabled).append(", interval=").append(interval).append(", resource=").append(resource);
+ try {
+ builder.append(", basedir=").append(getBasedir()).append(", includes=").append(getIncludes())
+ .append(", excludes=").append(getExcludes());
+ } catch (Exception e) {
+ // ignore, not attached
+ }
+ builder.append("]");
+
return builder.toString();
}
@@ -425,8 +431,8 @@ public class DriftDefinition implements Serializable {
}
private Long getIntervalProperty() {
- return Long.parseLong(configuration.getSimpleValue(DriftConfigurationDefinition.PROP_INTERVAL, String
- .valueOf(DriftConfigurationDefinition.DEFAULT_INTERVAL)));
+ return Long.parseLong(configuration.getSimpleValue(DriftConfigurationDefinition.PROP_INTERVAL,
+ String.valueOf(DriftConfigurationDefinition.DEFAULT_INTERVAL)));
}
private void setIntervalProperty(Long interval) {
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/drift/JPADrift.java b/modules/core/domain/src/main/java/org/rhq/core/domain/drift/JPADrift.java
index 5bde9e0..c3d6bb3 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/drift/JPADrift.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/drift/JPADrift.java
@@ -198,7 +198,15 @@ public class JPADrift implements Serializable, Drift<JPADriftChangeSet, JPADrift
@Override
public String toString() {
- return "JPADrift [ id=" + id + ", category=" + category + ", path=" + path + ", changeSet=" + changeSet + "]";
+ StringBuilder sb = new StringBuilder("JPADrift [");
+ sb.append("id=" + id).append(", category=" + category).append(", path=" + path);
+ try {
+ sb.append(", changeSet=" + changeSet);
+ } catch (Exception e) {
+ // not attached
+ }
+ sb.append("]");
+ return sb.toString();
}
}
11 years, 6 months