From 318623dd708364abb660f029b2bbe7ecb642a743 Mon Sep 17 00:00:00 2001 From: simonbrandhof Date: Fri, 10 Jun 2011 16:17:01 +0200 Subject: [PATCH] SONAR-2507 add unit tests to ServerPluginRepository --- .../sonar/server/plugins/PluginDeployer.java | 2 +- .../plugins/ServerPluginRepository.java | 13 +- .../plugins/ServerPluginRepositoryTest.java | 111 +++++++++++++++--- .../sonar-artifact-size-plugin-0.2.jar | Bin 0 -> 7456 bytes 4 files changed, 106 insertions(+), 20 deletions(-) create mode 100644 sonar-server/src/test/resources/org/sonar/server/plugins/ServerPluginRepositoryTest/sonar-artifact-size-plugin-0.2.jar diff --git a/sonar-server/src/main/java/org/sonar/server/plugins/PluginDeployer.java b/sonar-server/src/main/java/org/sonar/server/plugins/PluginDeployer.java index b39126da4bb..a5c9281dbd3 100644 --- a/sonar-server/src/main/java/org/sonar/server/plugins/PluginDeployer.java +++ b/sonar-server/src/main/java/org/sonar/server/plugins/PluginDeployer.java @@ -45,7 +45,7 @@ import java.util.Collection; import java.util.List; import java.util.Map; -public final class PluginDeployer implements ServerComponent { +public class PluginDeployer implements ServerComponent { private static final Logger LOG = LoggerFactory.getLogger(PluginDeployer.class); diff --git a/sonar-server/src/main/java/org/sonar/server/plugins/ServerPluginRepository.java b/sonar-server/src/main/java/org/sonar/server/plugins/ServerPluginRepository.java index 8f175f5139d..a3bd938116f 100644 --- a/sonar-server/src/main/java/org/sonar/server/plugins/ServerPluginRepository.java +++ b/sonar-server/src/main/java/org/sonar/server/plugins/ServerPluginRepository.java @@ -49,6 +49,13 @@ public class ServerPluginRepository implements PluginRepository { pluginsByKey = classloaders.init(deployer.getMetadata()); } + public void stop() { + if (classloaders != null) { + classloaders.clean(); + classloaders = null; + } + } + public Collection getPlugins() { return pluginsByKey.values(); } @@ -95,7 +102,11 @@ public class ServerPluginRepository implements PluginRepository { } public void registerExtensions(MutablePicoContainer container) { - for (Plugin plugin : getPlugins()) { + registerExtensions(container, getPlugins()); + } + + void registerExtensions(MutablePicoContainer container, Collection plugins) { + for (Plugin plugin : plugins) { container.as(Characteristics.CACHE).addComponent(plugin); for (Object extension : plugin.getExtensions()) { installExtension(container, extension); diff --git a/sonar-server/src/test/java/org/sonar/server/plugins/ServerPluginRepositoryTest.java b/sonar-server/src/test/java/org/sonar/server/plugins/ServerPluginRepositoryTest.java index 82af3fcc770..dcc85e5b519 100644 --- a/sonar-server/src/test/java/org/sonar/server/plugins/ServerPluginRepositoryTest.java +++ b/sonar-server/src/test/java/org/sonar/server/plugins/ServerPluginRepositoryTest.java @@ -19,26 +19,93 @@ */ package org.sonar.server.plugins; -import org.junit.Ignore; -import org.sonar.api.BatchExtension; -import org.sonar.api.ServerExtension; +import org.apache.commons.io.FileUtils; +import org.hamcrest.core.Is; +import org.junit.After; +import org.junit.Test; +import org.picocontainer.containers.TransientPicoContainer; +import org.sonar.api.*; +import org.sonar.api.platform.PluginMetadata; +import org.sonar.core.plugins.DefaultPluginMetadata; + +import java.io.File; +import java.util.Arrays; +import java.util.List; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.nullValue; +import static org.hamcrest.core.IsNot.not; +import static org.junit.Assert.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; -@Ignore public class ServerPluginRepositoryTest { -// @Test -// public void shouldRegisterServerExtensions() { -// ServerPluginRepository repository = new ServerPluginRepository(); -// -// // check classes -// assertThat(repository.shouldRegisterExtension(null, "foo", FakeBatchExtension.class), is(false)); -// assertThat(repository.shouldRegisterExtension(null, "foo", FakeServerExtension.class), is(true)); -// assertThat(repository.shouldRegisterExtension(null, "foo", String.class), is(false)); -// -// // check objects -// assertThat(repository.shouldRegisterExtension(null, "foo", new FakeBatchExtension()), is(false)); -// assertThat(repository.shouldRegisterExtension(null, "foo", new FakeServerExtension()), is(true)); -// assertThat(repository.shouldRegisterExtension(null, "foo", "foo"), is(false)); -// } + + private ServerPluginRepository repository; + + @After + public void stop() { + if (repository != null) { + repository.stop(); + } + } + + @Test + public void testStart() { + PluginDeployer deployer = mock(PluginDeployer.class); + File pluginFile = FileUtils.toFile(getClass().getResource("/org/sonar/server/plugins/ServerPluginRepositoryTest/sonar-artifact-size-plugin-0.2.jar")); + PluginMetadata plugin = DefaultPluginMetadata.create(pluginFile) + .setKey("artifactsize") + .setMainClass("org.sonar.plugins.artifactsize.ArtifactSizePlugin") + .addDeployedFile(pluginFile); + when(deployer.getMetadata()).thenReturn(Arrays.asList(plugin)); + + repository = new ServerPluginRepository(deployer); + repository.start(); + + assertThat(repository.getPlugins().size(), Is.is(1)); + assertThat(repository.getPlugin("artifactsize"), not(nullValue())); + assertThat(repository.getClassloader("artifactsize"), not(nullValue())); + assertThat(repository.getClass("artifactsize", "org.sonar.plugins.artifactsize.ArtifactSizeMetrics"), not(nullValue())); + assertThat(repository.getClass("artifactsize", "org.Unknown"), nullValue()); + assertThat(repository.getClass("other", "org.sonar.plugins.artifactsize.ArtifactSizeMetrics"), nullValue()); + } + + @Test + public void shouldRegisterServerExtensions() { + ServerPluginRepository repository = new ServerPluginRepository(mock(PluginDeployer.class)); + + TransientPicoContainer container = new TransientPicoContainer(); + repository.registerExtensions(container, Arrays.asList(new FakePlugin(Arrays.asList(FakeBatchExtension.class, FakeServerExtension.class)))); + + assertThat(container.getComponents(Extension.class).size(), is(1)); + assertThat(container.getComponents(FakeServerExtension.class).size(), is(1)); + assertThat(container.getComponents(FakeBatchExtension.class).size(), is(0)); + } + + @Test + public void shouldInvokeServerExtensionProviderss() { + ServerPluginRepository repository = new ServerPluginRepository(mock(PluginDeployer.class)); + + TransientPicoContainer container = new TransientPicoContainer(); + repository.registerExtensions(container, Arrays.asList(new FakePlugin(Arrays.asList(FakeExtensionProvider.class)))); + + assertThat(container.getComponents(Extension.class).size(), is(2));// provider + FakeServerExtension + assertThat(container.getComponents(FakeServerExtension.class).size(), is(1)); + assertThat(container.getComponents(FakeBatchExtension.class).size(), is(0)); + } + + public static class FakePlugin extends SonarPlugin { + private List extensions; + + public FakePlugin(List extensions) { + this.extensions = extensions; + } + + public List getExtensions() { + return extensions; + } + } public static class FakeBatchExtension implements BatchExtension { @@ -47,4 +114,12 @@ public class ServerPluginRepositoryTest { public static class FakeServerExtension implements ServerExtension { } + + public static class FakeExtensionProvider extends ExtensionProvider implements ServerExtension { + + @Override + public Object provide() { + return Arrays.asList(FakeBatchExtension.class, FakeServerExtension.class); + } + } } diff --git a/sonar-server/src/test/resources/org/sonar/server/plugins/ServerPluginRepositoryTest/sonar-artifact-size-plugin-0.2.jar b/sonar-server/src/test/resources/org/sonar/server/plugins/ServerPluginRepositoryTest/sonar-artifact-size-plugin-0.2.jar new file mode 100644 index 0000000000000000000000000000000000000000..1953323458279d70a1cab0fd6a8d88b1654f0f1c GIT binary patch literal 7456 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 F{Rdna14sY> literal 0 HcmV?d00001 -- 2.39.5