modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/PluginManagerBean.java
| 24 -
modules/enterprise/server/jar/src/test/groovy/org/rhq/enterprise/server/resource/metadata/MetadataTest.groovy
| 5
modules/enterprise/server/jar/src/test/groovy/org/rhq/enterprise/server/resource/metadata/PluginManagerBeanTest.groovy
| 182 ++++++++++
3 files changed, 199 insertions(+), 12 deletions(-)
New commits:
commit 45ca087390b49ec594bcf045dc81f4e12e5385fb
Author: John Sanda <jsanda(a)redhat.com>
Date: Mon Nov 29 12:20:04 2010 -0500
Adding tests for PluginManagerBean
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/PluginManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/PluginManagerBean.java
index 9ac0dd9..b948ab9 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/PluginManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/PluginManagerBean.java
@@ -303,7 +303,7 @@ public class PluginManagerBean implements PluginManagerLocal {
}
@RequiredPermission(Permission.MANAGE_SETTINGS)
- public boolean registerPluginTypes(Subject subject, Plugin plugin, PluginDescriptor
pluginDescriptor,
+ public boolean registerPluginTypes(Subject subject, Plugin newPlugin,
PluginDescriptor pluginDescriptor,
File pluginFile, boolean forceUpdate) throws Exception {
// TODO GH: Consider how to remove features from plugins in updates without
breaking everything
@@ -313,38 +313,38 @@ public class PluginManagerBean implements PluginManagerLocal {
boolean typesUpdated = false;
try {
- existingPlugin = getPlugin(plugin.getName());
+ existingPlugin = getPlugin(newPlugin.getName());
} catch (NoResultException nre) {
newOrUpdated = true; // this is expected for new plugins
}
if (existingPlugin != null) {
- Plugin obsolete = AgentPluginDescriptorUtil.determineObsoletePlugin(plugin,
existingPlugin);
+ Plugin obsolete =
AgentPluginDescriptorUtil.determineObsoletePlugin(newPlugin, existingPlugin);
if (obsolete == existingPlugin) { // yes, use == for reference equality
newOrUpdated = true;
}
- plugin.setId(existingPlugin.getId());
- plugin.setEnabled(existingPlugin.isEnabled());
+ newPlugin.setId(existingPlugin.getId());
+ newPlugin.setEnabled(existingPlugin.isEnabled());
}
// If this is a brand new plugin, it gets "updated" too.
if (newOrUpdated) {
- if (plugin.getDisplayName() == null) {
- plugin.setDisplayName(plugin.getName());
+ if (newPlugin.getDisplayName() == null) {
+ newPlugin.setDisplayName(newPlugin.getName());
}
- plugin = updatePluginExceptContent(plugin);
+ newPlugin = updatePluginExceptContent(newPlugin);
if (pluginFile != null) {
entityManager.flush();
- streamPluginFileContentToDatabase(plugin.getId(), pluginFile);
+ streamPluginFileContentToDatabase(newPlugin.getId(), pluginFile);
}
- log.debug("Updated plugin entity [" + plugin + "]");
+ log.debug("Updated plugin entity [" + newPlugin + "]");
}
- if (newOrUpdated || forceUpdate ||
!PLUGIN_METADATA_MANAGER.getPluginNames().contains(plugin.getName())) {
+ if (newOrUpdated || forceUpdate ||
!PLUGIN_METADATA_MANAGER.getPluginNames().contains(newPlugin.getName())) {
Set<ResourceType> rootResourceTypes =
PLUGIN_METADATA_MANAGER.loadPlugin(pluginDescriptor);
if (rootResourceTypes == null) {
- throw new Exception("Failed to load plugin [" +
plugin.getName() + "].");
+ throw new Exception("Failed to load plugin [" +
newPlugin.getName() + "].");
}
if (newOrUpdated || forceUpdate) {
// Only merge the plugin's ResourceTypes into the DB if the plugin is
new or updated or we were forced to
diff --git
a/modules/enterprise/server/jar/src/test/groovy/org/rhq/enterprise/server/resource/metadata/MetadataTest.groovy
b/modules/enterprise/server/jar/src/test/groovy/org/rhq/enterprise/server/resource/metadata/MetadataTest.groovy
index 59d510b..b1dba37 100644
---
a/modules/enterprise/server/jar/src/test/groovy/org/rhq/enterprise/server/resource/metadata/MetadataTest.groovy
+++
b/modules/enterprise/server/jar/src/test/groovy/org/rhq/enterprise/server/resource/metadata/MetadataTest.groovy
@@ -47,6 +47,11 @@ class MetadataTest extends AbstractEJB3Test {
prepareScheduler()
}
+ /**
+ * 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.
+ */
@AfterGroups(groups = ['plugin.metadata'])
void removePluginsFromDB() {
unprepareScheduler()
diff --git
a/modules/enterprise/server/jar/src/test/groovy/org/rhq/enterprise/server/resource/metadata/PluginManagerBeanTest.groovy
b/modules/enterprise/server/jar/src/test/groovy/org/rhq/enterprise/server/resource/metadata/PluginManagerBeanTest.groovy
new file mode 100644
index 0000000..26eea7d
--- /dev/null
+++
b/modules/enterprise/server/jar/src/test/groovy/org/rhq/enterprise/server/resource/metadata/PluginManagerBeanTest.groovy
@@ -0,0 +1,182 @@
+package org.rhq.enterprise.server.resource.metadata
+
+import org.testng.annotations.Test
+import org.rhq.enterprise.server.util.LookupUtil
+import org.testng.annotations.BeforeMethod
+import org.rhq.enterprise.server.auth.SubjectManagerLocal
+import org.rhq.core.domain.plugin.Plugin
+import javax.ejb.EJBException
+import org.rhq.core.domain.plugin.PluginDeploymentType
+import org.rhq.core.domain.plugin.PluginStatusType
+
+class PluginManagerBeanTest extends MetadataTest {
+
+ SubjectManagerLocal subjectMgr
+
+ PluginManagerLocal pluginMgr
+
+ @BeforeMethod
+ void initTest() {
+ subjectMgr = LookupUtil.subjectManager
+ pluginMgr = LookupUtil.pluginManager
+ }
+
+ @Test(groups = ['plugin.metadata'])
+ void registerPlugins() {
+ def pluginDescriptor1 =
+ """
+ <plugin name="PluginManagerBeanTestPlugin1"
+ package="org.rhq.plugins.test"
+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="urn:xmlns:rhq-plugin"
+ xmlns:c="urn:xmlns:rhq-configuration">
+ <server name="TestServer1"/>
+ </plugin>
+ """
+
+ createPlugin("test-plugin1", "1.0", pluginDescriptor1)
+
+ def pluginDescriptor2 =
+ """
+ <plugin name="PluginManagerBeanTestPlugin2"
+ package="org.rhq.plugins.test"
+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="urn:xmlns:rhq-plugin"
+ xmlns:c="urn:xmlns:rhq-configuration">
+
+ <depends plugin="PluginManagerBeanTestPlugin1"
useClasses="true"/>
+
+ <server name="TestServer2"/>
+ </plugin>
+ """
+
+ createPlugin("test-plugin2", "1.0", pluginDescriptor2)
+
+ def pluginDescriptor3 =
+ """
+ <plugin name="PluginManagerBeanTestPlugin3"
+ package="org.rhq.plugins.test"
+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="urn:xmlns:rhq-plugin"
+ xmlns:c="urn:xmlns:rhq-configuration">
+
+ <server name="TestServer3"/>
+ </plugin>
+ """
+
+ createPlugin("test-plugin3", "1.0", pluginDescriptor3)
+ }
+
+ @Test(groups = ['plugin.metadata'], dependsOnMethods =
['registerPlugins'])
+ void disablePlugin() {
+ def plugin = getPlugin('PluginManagerBeanTestPlugin3')
+
+ pluginMgr.disablePlugins subjectMgr.overlord, [plugin.id]
+ plugin = pluginMgr.getPlugin('PluginManagerBeanTestPlugin3')
+
+ assertFalse 'Failed to disable plugin', plugin.enabled
+ }
+
+ @Test(groups = ['plugin.metadata'], dependsOnMethods =
['registerPlugins'])
+ void doNotDisablePluginIfDependentPluginsAreNotAlsoDisabled() {
+ def plugin = getPlugin('PluginManagerBeanTestPlugin1')
+ def exception = null
+
+ try {
+ pluginMgr.disablePlugins subjectMgr.overlord, [plugin.id]
+ } catch (EJBException e) {
+ exception = e
+ }
+
+ assertNotNull 'Expected exception to be thrown when trying to disable a plugin
that has dependent plugins', exception
+ assertTrue(
+ 'Expected an IllegalArgumentException when trying to disable a plugin with
dependent plugins',
+ exception.causedByException instanceof IllegalArgumentException
+ )
+ }
+
+ @Test(groups = ['plugin.metadata'], dependsOnMethods =
['doNotDisablePluginIfDependentPluginsAreNotAlsoDisabled'])
+ void disablePluginAndDependentPlugins() {
+ def plugin1 = getPlugin('PluginManagerBeanTestPlugin1')
+ def plugin2 = getPlugin('PluginManagerBeanTestPlugin2')
+
+ pluginMgr.disablePlugins subjectMgr.overlord, [plugin1.id, plugin2.id]
+
+ plugin1 = getPlugin('PluginManagerBeanTestPlugin1')
+ plugin2 = getPlugin('PluginManagerBeanTestPlugin2')
+
+ assertFalse 'Failed to disable plugin', plugin1.enabled
+ assertFalse 'Failed to disable plugin', plugin2.enabled
+ }
+
+ @Test(groups = ['plugin.metadata'], dependsOnMethods =
['disablePluginAndDependentPlugins'])
+ void enablePlugins() {
+ def plugin1 = getPlugin('PluginManagerBeanTestPlugin1')
+ def plugin2 = getPlugin('PluginManagerBeanTestPlugin2')
+
+ pluginMgr.enablePlugins subjectMgr.overlord, [plugin1.id, plugin2.id]
+
+ plugin1 = getPlugin('PluginManagerBeanTestPlugin1')
+ plugin2 = getPlugin('PluginManagerBeanTestPlugin2')
+
+ assertTrue 'Failed to enable plugin', plugin1.enabled
+ assertTrue 'Failed to enable plugin', plugin2.enabled
+ }
+
+ @Test(groups = ['plugin.metadata'], dependsOnMethods =
['enablePlugins'])
+ void doNotDeletePluginIfDependentPluginIsNotAlsoDeleted() {
+ def plugin = getPlugin('PluginManagerBeanTestPlugin1')
+ def exception = null
+
+ try {
+ pluginMgr.deletePlugins subjectMgr.overlord, [plugin.id]
+ } catch (EJBException e) {
+ exception = e
+ }
+
+ assertNotNull 'Expected exception to be thrown when trying to delete a plugin
that has dependent plugins', exception
+ assertTrue(
+ 'Expected an IllegalArgumentException when trying to delete a plugin with
dependent plugins',
+ exception.causedByException instanceof IllegalArgumentException
+ )
+ }
+
+ @Test(groups = ['plugin.metadata'], dependsOnMethods =
['doNotDeletePluginIfDependentPluginIsNotAlsoDeleted'])
+ void deletePlugins() {
+ def plugin1 = getPlugin('PluginManagerBeanTestPlugin1')
+ def plugin2 = getPlugin('PluginManagerBeanTestPlugin2')
+
+ pluginMgr.deletePlugins subjectMgr.overlord, [plugin1.id, plugin2.id]
+
+ plugin1 = getPlugin('PluginManagerBeanTestPlugin1', 'Deleting a plugin
should not remove it from the database')
+ plugin2 = getPlugin('PluginManagerBeanTestPlugin2', 'Deleting a plugin
should not remove it from the database')
+
+ assertTrue 'Expected plugin status to be set to DELETED', plugin1.status ==
PluginStatusType.DELETED
+ assertTrue 'Expected plugin status to be set to DELETED', plugin2.status ==
PluginStatusType.DELETED
+ }
+
+ @Test(groups = ['plugin.metadata'], dependsOnMethods =
['deletePlugins'])
+ void purgePlugins() {
+ def plugin1 = getPlugin('PluginManagerBeanTestPlugin1', 'Deleting a
plugin should not remove it from the database')
+ def plugin2 = getPlugin('PluginManagerBeanTestPlugin2', 'Deleting a
plugin should not remove it from the database')
+
+ pluginMgr.purgePlugins subjectMgr.overlord, [plugin1.id, plugin2.id]
+
+ assertEquals('Failed to purge plugins from the database', 1,
pluginMgr.getPlugins().size())
+ }
+
+ Plugin getPlugin(String name) {
+ def plugin = pluginMgr.getPlugin(name)
+ assertNotNull "Failed to find plugin <$name>", plugin
+
+ return plugin
+ }
+
+ Plugin getPlugin(String name, String msg) {
+ def plugins = entityManager.createQuery("from Plugin where name =
:name").setParameter('name', name).resultList
+ assertTrue "Failed to find plugin <$name>: $msg", plugins.size() ==
1
+
+ return plugins[0]
+ }
+
+}