modules/core/domain/src/main/java/org/rhq/core/domain/resource/flyweight/ResourceTypeFlyweight.java | 14 ++++- modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/discovery/DiscoveryBossBeanTest.java | 21 ++++---- modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/resource/metadata/MetadataBeanTest.java | 13 +++-- modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/resource/metadata/MetadataUpdateWithIgnoredTypesTest.java | 25 +++++++--- 4 files changed, 48 insertions(+), 25 deletions(-)
New commits: commit 8abed9ff39a345c79927f0964cf0af60528ed4c2 Author: Jay Shaughnessy jshaughn@redhat.com Date: Tue Oct 22 16:14:46 2013 -0400
Work to remove intermittent test failures in DiscoveryBossBeanTest - add some more debug if in fact these failures happen again - remove the root cause of the issue: MetadataUpdateWithIgnoredTypesTest creates ignored types that exist until the "AfterClass" logic is executed. In the failure case the ignored types can exist for some time and with unlucky test execution DiscoveryBossBeanTest fails because it executes DBB.mergeInventoryReport, which queries for ignored types...
To solve it, applied "single test design pattern" to MetadataUpdateWithIgnoredTypesTest which allows us to do all the clean up in the afterMethod, which always executes immediately after the [single] test.
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/flyweight/ResourceTypeFlyweight.java b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/flyweight/ResourceTypeFlyweight.java index cae0efe..2715d5b 100644 --- a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/flyweight/ResourceTypeFlyweight.java +++ b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/flyweight/ResourceTypeFlyweight.java @@ -28,8 +28,8 @@ import java.io.Serializable; import org.rhq.core.domain.resource.ResourceCategory;
/** - * A flyweight representation of the resource type intended for the display purposes. - * + * A flyweight representation of the resource type intended for the display purposes. + * * @author Lukas Krejci */ public class ResourceTypeFlyweight implements Serializable { @@ -86,7 +86,7 @@ public class ResourceTypeFlyweight implements Serializable { public void setSubCategory(ResourceSubCategoryFlyweight subCategory) { this.subCategory = subCategory; } - + public boolean isSingleton() { return singleton; } @@ -119,5 +119,11 @@ public class ResourceTypeFlyweight implements Serializable { result = 31 * id; } return result; - } + } + + @Override + public String toString() { + return "ResourceTypeFlyweight [id=" + id + ", name=" + name + ", plugin=" + plugin + "]"; + } + } 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 920ff07..e09db85 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 @@ -288,7 +288,8 @@ public class DiscoveryBossBeanTest extends AbstractEJB3Test { // Merge this inventory report MergeInventoryReportResults mergeResults = discoveryBoss.mergeInventoryReport(serialize(inventoryReport)); assert mergeResults != null; - assert mergeResults.getIgnoredResourceTypes() == null : "nothing should have been ignored"; + assert mergeResults.getIgnoredResourceTypes() == null : "nothing should have been ignored: " + + mergeResults.getIgnoredResourceTypes(); ResourceSyncInfo platformSyncInfo = mergeResults.getResourceSyncInfo(); assert platformSyncInfo != null;
@@ -420,7 +421,8 @@ public class DiscoveryBossBeanTest extends AbstractEJB3Test { // Merge this inventory report to get platform and servers in NEW state MergeInventoryReportResults mergeResults = discoveryBoss.mergeInventoryReport(serialize(inventoryReport)); assert mergeResults != null; - assert mergeResults.getIgnoredResourceTypes() == null : "nothing should have been ignored"; + assert mergeResults.getIgnoredResourceTypes() == null : "nothing should have been ignored: " + + mergeResults.getIgnoredResourceTypes(); ResourceSyncInfo platformSyncInfo = mergeResults.getResourceSyncInfo(); assert platformSyncInfo != null;
@@ -484,18 +486,16 @@ public class DiscoveryBossBeanTest extends AbstractEJB3Test { storageNode.setUuid(String.valueOf(new Random().nextInt())); storagePlatform.addChildResource(storageNode);
- storageNode.setPluginConfiguration(Configuration.builder() - .addSimple("nativeTransportPort", 9142) - .addSimple("storagePort", 7100) - .addSimple("host", "localhost") - .build()); + storageNode.setPluginConfiguration(Configuration.builder().addSimple("nativeTransportPort", 9142) + .addSimple("storagePort", 7100).addSimple("host", "localhost").build());
inventoryReport.addAddedRoot(storagePlatform);
// Merge this inventory report MergeInventoryReportResults mergeResults = discoveryBoss.mergeInventoryReport(serialize(inventoryReport)); assert mergeResults != null; - assert mergeResults.getIgnoredResourceTypes() == null : "nothing should have been ignored"; + assert mergeResults.getIgnoredResourceTypes() == null : "nothing should have been ignored: " + + mergeResults.getIgnoredResourceTypes(); ResourceSyncInfo platformSyncInfo = mergeResults.getResourceSyncInfo(); assert platformSyncInfo != null;
@@ -668,8 +668,9 @@ public class DiscoveryBossBeanTest extends AbstractEJB3Test { }
private StorageNode findStorageNode(Resource resource) { - List<StorageNode> storageNodes = em.createQuery("SELECT s FROM StorageNode s where s.resource = :resource", - StorageNode.class).setParameter("resource", resource).getResultList(); + List<StorageNode> storageNodes = em + .createQuery("SELECT s FROM StorageNode s where s.resource = :resource", StorageNode.class) + .setParameter("resource", resource).getResultList(); if (storageNodes.isEmpty()) { return null; } diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/resource/metadata/MetadataBeanTest.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/resource/metadata/MetadataBeanTest.java index a0b6620..b29d375 100644 --- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/resource/metadata/MetadataBeanTest.java +++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/resource/metadata/MetadataBeanTest.java @@ -51,16 +51,19 @@ public class MetadataBeanTest extends AbstractEJB3Test { private final String objectFileName = "pluginIds.obj"; private Set<Integer> pluginIds;
- /** + /** * <pre>IMPORTANT NOTE FOR SUBCLASS IMPLEMENTORS * Arquillian (1.0.2) executes @AfterXXX after each test. The work below would normally be done in - * an AfterClass method, but instead we'll use mock tests, that perform last for each subclass, to - * perform this cleanup code. + * an AfterClass method, but instead we'll use a "special" test that performs last for each subclass, to + * perform this cleanup code. * </pre> * Need to delete rows from RHQ_PLUGINS because subsequent tests in server/jar would otherwise fail. Some tests look * at what plugins are in the database, and then look for corresponding plugin files on the file system. MetadataTest * however removes the generated plugin files during each test run. - * + * + * Note that using this for cleanup is discouraged in favor or beforeMethod and afterMethod overrides. Remember + * that tests and test classes can execute in any order. This only guarantees clean up at some point, other tests + * [in other test classes] may encounter data that is left for cleanup by this mechanism. */ protected void afterClassWork() throws Exception { PluginManagerLocal pluginMgr = LookupUtil.getPluginManager(); @@ -262,7 +265,7 @@ public class MetadataBeanTest extends AbstractEJB3Test {
/** * This actually creates a .jar file on the file system but doesn't register it. - * + * * @param jarName the name to be given to the new jar file * @param descriptorXmlFilename where the descriptor XML can be found on the test classloader * @return the location of the new jar file diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/resource/metadata/MetadataUpdateWithIgnoredTypesTest.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/resource/metadata/MetadataUpdateWithIgnoredTypesTest.java index 5d51a2a..b2049da 100644 --- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/resource/metadata/MetadataUpdateWithIgnoredTypesTest.java +++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/resource/metadata/MetadataUpdateWithIgnoredTypesTest.java @@ -7,22 +7,35 @@ import org.rhq.enterprise.server.auth.SubjectManagerLocal; import org.rhq.enterprise.server.resource.ResourceTypeManagerLocal; import org.rhq.enterprise.server.util.LookupUtil;
+/** + * This class uses the single test design pattern. This helps eliminate intra-test dependencies, minimizes + * setup/cleanup and eliminates lag time between test completion and test class cleanup. + * </p> + * Therefore, this class does not implement an afterClassWorkTest(), instead that logic is moved to afterMethod(). + * </p> + * This design is specifically used here because we can't allow ignored test resource types to exist in + * the DB waiting for cleanup, it affects any calls to mergeInventoryReport that may be don in other test classes. + */ @Test(groups = { "plugin.metadata.ignoretypes" }) public class MetadataUpdateWithIgnoredTypesTest extends MetadataBeanTest {
private static final String PLUGIN_NAME = "RemoveIgnoredTypesPlugin";
+ @Override + protected void afterMethod() throws Exception { + // because we use the single test design pattern we can immediately perform the typical afterClass + // cleanup work in the afterMethod, which is guaranteed to run immediately after the test. + afterClassWork(); + + super.afterMethod(); + } + + // This must be the only test in this class. @Test public void upgradePluginWithIgnoredTypes() throws Exception { performTest(true); }
- // required cleanup - @Test(priority = 10, alwaysRun = true) - public void afterClassWorkTest() throws Exception { - afterClassWork(); - } - private void performTest(boolean ignoreTypes) throws Exception { createPlugin("remove-types-plugin", "1.0", "remove_types_v1.xml");
rhq-commits@lists.fedorahosted.org