/* * The MIT License * * Copyright (c) 2010, Kohsuke Kawaguchi * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ package org.jvnet.hudson.test; import hudson.Plugin; import hudson.PluginManager; import hudson.PluginWrapper; import hudson.Util; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.net.URL; import java.util.Collection; import java.util.HashSet; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; /** * {@link PluginManager} to speed up unit tests. * * <p> * Instead of loading every plugin for every test case, this allows them to reuse a single plugin manager. * * <p> * TODO: {@link Plugin} start/stop/postInitialize invocation semantics gets different. Perhaps * * @author Kohsuke Kawaguchi * @see HudsonTestCase#useLocalPluginManager */ public class TestPluginManager extends PluginManager { public static final PluginManager INSTANCE; private TestPluginManager() throws IOException { // TestPluginManager outlives a Jetty server, so can't pass in ServletContext. super(null, Util.createTempDir()); } @Override protected Collection<String> loadBundledPlugins() throws Exception { Set<String> names = new HashSet<String>(); File[] children = new File(WarExploder.getExplodedDir(),"WEB-INF/plugins").listFiles(); for (File child : children) { try { names.add(child.getName()); copyBundledPlugin(child.toURI().toURL(), child.getName()); } catch (IOException e) { LOGGER.log(Level.SEVERE, "Failed to extract the bundled plugin "+child,e); } } // If running tests for a plugin, include the plugin being tested URL u = getClass().getClassLoader().getResource("the.hpl"); if (u!=null) try { names.add("the.hpl"); copyBundledPlugin(u, "the.hpl"); } catch (IOException e) { LOGGER.log(Level.SEVERE, "Failed to copy the.hpl",e); } // and pick up test dependency *.hpi that are placed by maven-hpi-plugin TestDependencyMojo. // and copy them into $HUDSON_HOME/plugins. URL index = getClass().getResource("/test-dependencies/index"); if (index!=null) {// if built with maven-hpi-plugin < 1.52 this file won't exist. BufferedReader r = new BufferedReader(new InputStreamReader(index.openStream(),"UTF-8")); String line; while ((line=r.readLine())!=null) { copyBundledPlugin(new URL(index, line + ".hpi"), line + ".hpi"); } } return names; } @Override public void stop() { for (PluginWrapper p : activePlugins) p.stop(); } private static final Logger LOGGER = Logger.getLogger(TestPluginManager.class.getName()); static { try { INSTANCE = new TestPluginManager(); } catch (IOException e) { throw new Error(e); } } }