/* * RHQ Management Platform * Copyright (C) 2005-2009 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.plugin.pc.generic; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.util.List; import java.util.Map; import java.util.jar.JarEntry; import java.util.jar.JarOutputStream; import org.testng.annotations.Test; import org.rhq.core.domain.configuration.Configuration; 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.core.util.stream.StreamUtil; import org.rhq.enterprise.server.plugin.ServerPluginManagerLocal; import org.rhq.enterprise.server.plugin.pc.MasterServerPluginContainerConfiguration; import org.rhq.enterprise.server.plugin.pc.ServerPluginType; import org.rhq.enterprise.server.plugin.pc.generic.TestGenericServerPluginService.State; import org.rhq.enterprise.server.plugin.pc.generic.TestGenericServerPluginService.TestGenericPluginManager; import org.rhq.enterprise.server.plugin.pc.generic.TestGenericServerPluginService.TestGenericServerPluginContainer; import org.rhq.enterprise.server.plugin.pc.generic.TestLifecycleListener.LifecycleState; import org.rhq.enterprise.server.test.AbstractEJB3Test; import org.rhq.enterprise.server.util.LookupUtil; import org.rhq.enterprise.server.xmlschema.ScheduledJobDefinition; import org.rhq.enterprise.server.xmlschema.ServerPluginDescriptorUtil; import org.rhq.enterprise.server.xmlschema.generated.serverplugin.ServerPluginDescriptorType; import org.rhq.enterprise.server.xmlschema.generated.serverplugin.generic.GenericPluginDescriptorType; @Test public class GenericServerPluginTest extends AbstractEJB3Test { private TestGenericServerPluginService pluginService; @Override protected void beforeMethod() throws Exception { this.pluginService = new TestGenericServerPluginService(getTempDir()); deleteAllTestPluginJars(); // remove any old server plugins that might be still around prepareCustomServerPluginService(this.pluginService); } @Override protected void afterMethod() throws Exception { unprepareServerPluginService(); deleteAllTestPluginJars(); // remove any server plugins that tests created this.pluginService = null; } public void testSimpleGenericPlugin() throws Exception { createPluginJar("testSimpleGenericPlugin.jar", "serverplugins/simple-generic-serverplugin.xml"); this.pluginService.startMasterPluginContainer(); // make sure everything is started TestGenericServerPluginContainer pc = this.pluginService.genericPC; assert pc.state == State.STARTED; TestGenericPluginManager pm = (TestGenericPluginManager) pc.getPluginManager(); TestLifecycleListener component = (TestLifecycleListener) pm.components.values().iterator().next(); assert component.state == LifecycleState.STARTED; // make sure the context is correct Configuration config = component.context.getPluginConfiguration(); assert config != null; assert config.getSimple("plugin-simple-prop-1") != null; List<ScheduledJobDefinition> schedules = component.context.getSchedules(); assert schedules == null; // make sure everything is shutdown this.pluginService.stopMasterPluginContainer(); assert pc.state == State.UNINITIALIZED; assert component.state == LifecycleState.UNINITIALIZED; } public void testGetInstalledPlugins() throws Exception { File jar = createPluginJar("testSimpleGenericPlugin.jar", "serverplugins/simple-generic-serverplugin.xml"); ServerPluginType type = new ServerPluginType(GenericPluginDescriptorType.class); ServerPluginDescriptorType descriptor = ServerPluginDescriptorUtil.loadPluginDescriptorFromUrl(jar.toURI() .toURL()); ServerPlugin plugin = new ServerPlugin(0, descriptor.getName(), jar.getName(), descriptor.getDisplayName(), true, PluginStatusType.INSTALLED, descriptor.getDescription(), null, MessageDigestGenerator .getDigestString(jar), descriptor.getVersion(), descriptor.getApiVersion(), null, null, type .stringify(), System.currentTimeMillis(), System.currentTimeMillis()); ServerPluginManagerLocal serverPluginsLocal = LookupUtil.getServerPluginManager(); Map<ServerPluginType, List<PluginKey>> original = serverPluginsLocal.getInstalledServerPluginsGroupedByType(); serverPluginsLocal.registerServerPlugin(LookupUtil.getSubjectManager().getOverlord(), plugin, jar); try { Map<ServerPluginType, List<PluginKey>> map = serverPluginsLocal.getInstalledServerPluginsGroupedByType(); List<PluginKey> pluginKeys = map.get(type); if (original.containsKey(type)) { assert map.size() == original.size(); assert pluginKeys.size() == original.get(type).size() + 1; } else { assert map.size() == original.size() + 1; assert pluginKeys.size() == 1; } boolean got_it = false; for (PluginKey pluginKey : pluginKeys) { if (pluginKey.getPluginName().equals("TestSimpleGenericPlugin")) { got_it = true; break; } } assert got_it == true; } finally { // make sure we clean this up, even on error serverPluginsLocal.purgeServerPlugin(plugin.getId()); } // test that purge really deleted it Map<ServerPluginType, List<PluginKey>> map = serverPluginsLocal.getInstalledServerPluginsGroupedByType(); List<PluginKey> pluginKeys = map.get(type); assert map.size() == original.size(); if (pluginKeys == null) { assert !original.containsKey(type) : "we dont have any plugins of this type, neither should original"; } else { assert pluginKeys.size() == original.get(type).size(); boolean got_it = false; for (PluginKey pluginKey : pluginKeys) { if (pluginKey.getPluginName().equals("TestSimpleGenericPlugin")) { got_it = true; break; } } assert got_it == false : "we still have the plugin, but it should have been purged"; } return; } private File createPluginJar(String jarName, String descriptorXmlFilename) throws Exception { FileOutputStream stream = null; JarOutputStream out = null; InputStream in = null; try { this.pluginService.masterConfig.getPluginDirectory().mkdirs(); File jarFile = new File(this.pluginService.masterConfig.getPluginDirectory(), jarName); stream = new FileOutputStream(jarFile); out = new JarOutputStream(stream); // Add archive entry for the descriptor JarEntry jarAdd = new JarEntry("META-INF/rhq-serverplugin.xml"); jarAdd.setTime(System.currentTimeMillis()); out.putNextEntry(jarAdd); // Write the descriptor - note that we assume the xml file is in the test classloader in = getClass().getClassLoader().getResourceAsStream(descriptorXmlFilename); StreamUtil.copy(in, out, false); return jarFile; } finally { if (in != null) { in.close(); } if (out != null) { out.close(); } if (stream != null) { stream.close(); } } } private void deleteAllTestPluginJars() { if (this.pluginService==null) { System.err.println("Plugin service was null !!"); return; } MasterServerPluginContainerConfiguration masterConfig = this.pluginService.masterConfig; if (masterConfig==null) return; File pluginDirectory = masterConfig.getPluginDirectory(); File[] files = pluginDirectory.listFiles(); if (files != null) { for (File file : files) { if (file.getName().endsWith(".jar")) { file.delete(); } } } return; } }