diff --git a/core/src/main/java/org/elasticsearch/plugins/ListPluginsCommand.java b/core/src/main/java/org/elasticsearch/plugins/ListPluginsCommand.java index 953e698a4c2..b513be99dcf 100644 --- a/core/src/main/java/org/elasticsearch/plugins/ListPluginsCommand.java +++ b/core/src/main/java/org/elasticsearch/plugins/ListPluginsCommand.java @@ -51,6 +51,8 @@ class ListPluginsCommand extends Command { try (DirectoryStream stream = Files.newDirectoryStream(env.pluginsFile())) { for (Path plugin : stream) { terminal.println(plugin.getFileName().toString()); + PluginInfo info = PluginInfo.readFromProperties(env.pluginsFile().resolve(plugin.toAbsolutePath())); + terminal.println(Terminal.Verbosity.VERBOSE, info.toString()); } } } diff --git a/qa/evil-tests/src/test/java/org/elasticsearch/plugins/ListPluginsCommandTests.java b/qa/evil-tests/src/test/java/org/elasticsearch/plugins/ListPluginsCommandTests.java index cbdd031dea1..f26857e19af 100644 --- a/qa/evil-tests/src/test/java/org/elasticsearch/plugins/ListPluginsCommandTests.java +++ b/qa/evil-tests/src/test/java/org/elasticsearch/plugins/ListPluginsCommandTests.java @@ -19,9 +19,13 @@ package org.elasticsearch.plugins; + import java.io.IOException; import java.nio.file.Files; +import java.nio.file.NoSuchFileException; import java.nio.file.Path; +import java.util.Arrays; +import java.util.stream.Collectors; import org.apache.lucene.util.LuceneTestCase; import org.elasticsearch.cli.ExitCodes; @@ -29,6 +33,7 @@ import org.elasticsearch.cli.MockTerminal; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.env.Environment; import org.elasticsearch.test.ESTestCase; +import org.elasticsearch.Version; @LuceneTestCase.SuppressFileSystems("*") public class ListPluginsCommandTests extends ESTestCase { @@ -43,12 +48,30 @@ public class ListPluginsCommandTests extends ESTestCase { } static MockTerminal listPlugins(Environment env) throws Exception { + return listPlugins(env, new String[0]); + } + + static MockTerminal listPlugins(Environment env, String[] args) throws Exception { MockTerminal terminal = new MockTerminal(); - String[] args = {}; int status = new ListPluginsCommand(env).main(args, terminal); assertEquals(ExitCodes.OK, status); return terminal; } + + static String buildMultiline(String... args){ + return Arrays.asList(args).stream().collect(Collectors.joining("\n", "", "\n")); + } + + static void buildFakePlugin(Environment env, String description, String name, String classname) throws IOException { + PluginTestUtil.writeProperties(env.pluginsFile().resolve(name), + "description", description, + "name", name, + "version", "1.0", + "elasticsearch.version", Version.CURRENT.toString(), + "java.version", System.getProperty("java.specification.version"), + "classname", classname); + } + public void testPluginsDirMissing() throws Exception { Environment env = createEnv(); @@ -56,7 +79,7 @@ public class ListPluginsCommandTests extends ESTestCase { IOException e = expectThrows(IOException.class, () -> { listPlugins(env); }); - assertTrue(e.getMessage(), e.getMessage().contains("Plugins directory missing")); + assertEquals(e.getMessage(), "Plugins directory missing: " + env.pluginsFile()); } public void testNoPlugins() throws Exception { @@ -66,18 +89,63 @@ public class ListPluginsCommandTests extends ESTestCase { public void testOnePlugin() throws Exception { Environment env = createEnv(); - Files.createDirectory(env.pluginsFile().resolve("fake")); + buildFakePlugin(env, "fake desc", "fake", "org.fake"); MockTerminal terminal = listPlugins(env); - assertTrue(terminal.getOutput(), terminal.getOutput().contains("fake")); + assertEquals(terminal.getOutput(), buildMultiline("fake")); } public void testTwoPlugins() throws Exception { Environment env = createEnv(); - Files.createDirectory(env.pluginsFile().resolve("fake1")); - Files.createDirectory(env.pluginsFile().resolve("fake2")); + buildFakePlugin(env, "fake desc", "fake1", "org.fake"); + buildFakePlugin(env, "fake desc 2", "fake2", "org.fake"); MockTerminal terminal = listPlugins(env); - String output = terminal.getOutput(); - assertTrue(output, output.contains("fake1")); - assertTrue(output, output.contains("fake2")); + assertEquals(terminal.getOutput(), buildMultiline("fake1", "fake2")); } + + public void testPluginWithVerbose() throws Exception { + Environment env = createEnv(); + buildFakePlugin(env, "fake desc", "fake_plugin", "org.fake"); + String[] params = { "-v" }; + MockTerminal terminal = listPlugins(env, params); + assertEquals(terminal.getOutput(), buildMultiline("Plugins directory: " + env.pluginsFile(), "fake_plugin", + "- Plugin information:", "Name: fake_plugin", "Description: fake desc", "Version: 1.0", " * Classname: org.fake")); + } + + public void testPluginWithVerboseMultiplePlugins() throws Exception { + Environment env = createEnv(); + buildFakePlugin(env, "fake desc 1", "fake_plugin1", "org.fake"); + buildFakePlugin(env, "fake desc 2", "fake_plugin2", "org.fake2"); + String[] params = { "-v" }; + MockTerminal terminal = listPlugins(env, params); + assertEquals(terminal.getOutput(), buildMultiline("Plugins directory: " + env.pluginsFile(), + "fake_plugin1", "- Plugin information:", "Name: fake_plugin1", "Description: fake desc 1", "Version: 1.0", + " * Classname: org.fake", "fake_plugin2", "- Plugin information:", "Name: fake_plugin2", + "Description: fake desc 2", "Version: 1.0", " * Classname: org.fake2")); + } + + public void testPluginWithoutVerboseMultiplePlugins() throws Exception { + Environment env = createEnv(); + buildFakePlugin(env, "fake desc 1", "fake_plugin1", "org.fake"); + buildFakePlugin(env, "fake desc 2", "fake_plugin2", "org.fake2"); + MockTerminal terminal = listPlugins(env, new String[0]); + String output = terminal.getOutput(); + assertEquals(output, buildMultiline("fake_plugin1", "fake_plugin2")); + } + + public void testPluginWithoutDescriptorFile() throws Exception{ + Environment env = createEnv(); + Files.createDirectories(env.pluginsFile().resolve("fake1")); + NoSuchFileException e = expectThrows(NoSuchFileException.class, () -> listPlugins(env)); + assertEquals(e.getFile(), env.pluginsFile().resolve("fake1").resolve(PluginInfo.ES_PLUGIN_PROPERTIES).toString()); + } + + public void testPluginWithWrongDescriptorFile() throws Exception{ + Environment env = createEnv(); + PluginTestUtil.writeProperties(env.pluginsFile().resolve("fake1"), + "description", "fake desc"); + IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> listPlugins(env)); + assertEquals(e.getMessage(), "Property [name] is missing in [" + + env.pluginsFile().resolve("fake1").resolve(PluginInfo.ES_PLUGIN_PROPERTIES).toString() + "]"); + } + }