summaryrefslogtreecommitdiff
path: root/core/src/test/java/org/elasticsearch
diff options
context:
space:
mode:
authorJason Tedor <jason@tedor.me>2017-06-26 21:42:53 -0400
committerGitHub <noreply@github.com>2017-06-26 21:42:53 -0400
commitcca18a2c356afbe1025d6ba680e126236158a938 (patch)
treedcfacf13f16db57ab74697d1fe47504df7679260 /core/src/test/java/org/elasticsearch
parent2765ea41ca692fb8cf0207e1ef102565374d095e (diff)
Make plugin loading stricter
Today we load plugins reflectively, looking for constructors that conform to specific signatures. This commit tightens the reflective operations here, not allowing plugins to have ambiguous constructors. Relates #25405
Diffstat (limited to 'core/src/test/java/org/elasticsearch')
-rw-r--r--core/src/test/java/org/elasticsearch/plugins/PluginsServiceTests.java87
1 files changed, 87 insertions, 0 deletions
diff --git a/core/src/test/java/org/elasticsearch/plugins/PluginsServiceTests.java b/core/src/test/java/org/elasticsearch/plugins/PluginsServiceTests.java
index 7f91d11acd..c3fd0b19f7 100644
--- a/core/src/test/java/org/elasticsearch/plugins/PluginsServiceTests.java
+++ b/core/src/test/java/org/elasticsearch/plugins/PluginsServiceTests.java
@@ -30,6 +30,7 @@ import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Arrays;
+import java.util.Collection;
import java.util.List;
import java.util.Locale;
@@ -151,4 +152,90 @@ public class PluginsServiceTests extends ESTestCase {
assertThat(e, hasToString(containsString(expected)));
}
+ public void testLoadPluginWithNoPublicConstructor() {
+ class NoPublicConstructorPlugin extends Plugin {
+
+ private NoPublicConstructorPlugin() {
+
+ }
+
+ }
+
+ final Path home = createTempDir();
+ final Settings settings = Settings.builder().put(Environment.PATH_HOME_SETTING.getKey(), home).build();
+ final IllegalStateException e =
+ expectThrows(IllegalStateException.class, () -> newPluginsService(settings, NoPublicConstructorPlugin.class));
+ assertThat(e, hasToString(containsString("no public constructor")));
+ }
+
+ public void testLoadPluginWithMultiplePublicConstructors() {
+ class MultiplePublicConstructorsPlugin extends Plugin {
+
+ @SuppressWarnings("unused")
+ public MultiplePublicConstructorsPlugin() {
+
+ }
+
+ @SuppressWarnings("unused")
+ public MultiplePublicConstructorsPlugin(final Settings settings) {
+
+ }
+
+ }
+
+ final Path home = createTempDir();
+ final Settings settings = Settings.builder().put(Environment.PATH_HOME_SETTING.getKey(), home).build();
+ final IllegalStateException e =
+ expectThrows(IllegalStateException.class, () -> newPluginsService(settings, MultiplePublicConstructorsPlugin.class));
+ assertThat(e, hasToString(containsString("no unique public constructor")));
+ }
+
+ public void testLoadPluginWithNoPublicConstructorOfCorrectSignature() {
+ class TooManyParametersPlugin extends Plugin {
+
+ @SuppressWarnings("unused")
+ public TooManyParametersPlugin(Settings settings, Path configPath, Object object) {
+
+ }
+
+ }
+
+ class TwoParametersFirstIncorrectType extends Plugin {
+
+ @SuppressWarnings("unused")
+ public TwoParametersFirstIncorrectType(Object object, Path configPath) {
+
+ }
+ }
+
+ class TwoParametersSecondIncorrectType extends Plugin {
+
+ @SuppressWarnings("unused")
+ public TwoParametersSecondIncorrectType(Settings settings, Object object) {
+
+ }
+
+ }
+
+ class OneParameterIncorrectType extends Plugin {
+
+ @SuppressWarnings("unused")
+ public OneParameterIncorrectType(Object object) {
+
+ }
+ }
+
+ final Collection<Class<? extends Plugin>> classes = Arrays.asList(
+ TooManyParametersPlugin.class,
+ TwoParametersFirstIncorrectType.class,
+ TwoParametersSecondIncorrectType.class,
+ OneParameterIncorrectType.class);
+ for (Class<? extends Plugin> pluginClass : classes) {
+ final Path home = createTempDir();
+ final Settings settings = Settings.builder().put(Environment.PATH_HOME_SETTING.getKey(), home).build();
+ final IllegalStateException e = expectThrows(IllegalStateException.class, () -> newPluginsService(settings, pluginClass));
+ assertThat(e, hasToString(containsString("no public constructor of correct signature")));
+ }
+ }
+
}