You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

PropertiesPluginDescriptorFinderTest.java 7.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. /*
  2. * Copyright (C) 2012-present the original author or authors.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package org.pf4j;
  17. import org.junit.jupiter.api.BeforeEach;
  18. import org.junit.jupiter.api.Test;
  19. import org.junit.jupiter.api.io.TempDir;
  20. import org.pf4j.plugin.PluginZip;
  21. import java.io.FileOutputStream;
  22. import java.io.IOException;
  23. import java.io.OutputStreamWriter;
  24. import java.io.Writer;
  25. import java.nio.charset.StandardCharsets;
  26. import java.nio.file.Files;
  27. import java.nio.file.Path;
  28. import java.util.LinkedHashMap;
  29. import java.util.Map;
  30. import java.util.Properties;
  31. import static org.junit.jupiter.api.Assertions.assertEquals;
  32. import static org.junit.jupiter.api.Assertions.assertFalse;
  33. import static org.junit.jupiter.api.Assertions.assertThrows;
  34. import static org.junit.jupiter.api.Assertions.assertTrue;
  35. public class PropertiesPluginDescriptorFinderTest {
  36. private VersionManager versionManager;
  37. @TempDir
  38. Path pluginsPath;
  39. @BeforeEach
  40. public void setUp() throws IOException {
  41. Path pluginPath = Files.createDirectory(pluginsPath.resolve("test-plugin-1"));
  42. storePropertiesToPath(getPlugin1Properties(), pluginPath);
  43. pluginPath = Files.createDirectory(pluginsPath.resolve("test-plugin-2"));
  44. storePropertiesToPath(getPlugin2Properties(), pluginPath);
  45. // empty plugin
  46. Files.createDirectories(pluginsPath.resolve("test-plugin-3"));
  47. // no plugin class
  48. pluginPath = Files.createDirectory(pluginsPath.resolve("test-plugin-4"));
  49. storePropertiesToPath(getPlugin4Properties(), pluginPath);
  50. // no plugin version
  51. pluginPath = Files.createDirectory(pluginsPath.resolve("test-plugin-5"));
  52. storePropertiesToPath(getPlugin5Properties(), pluginPath);
  53. // no plugin id
  54. pluginPath = Files.createDirectory(pluginsPath.resolve("test-plugin-6"));
  55. storePropertiesToPath(getPlugin6Properties(), pluginPath);
  56. versionManager = new DefaultVersionManager();
  57. }
  58. @Test
  59. public void testFind() throws Exception {
  60. PluginDescriptorFinder descriptorFinder = new PropertiesPluginDescriptorFinder();
  61. PluginDescriptor plugin1 = descriptorFinder.find(pluginsPath.resolve("test-plugin-1"));
  62. PluginDescriptor plugin2 = descriptorFinder.find(pluginsPath.resolve("test-plugin-2"));
  63. assertEquals("test-plugin-1", plugin1.getPluginId());
  64. assertEquals("Test Plugin 1", plugin1.getPluginDescription());
  65. assertEquals("org.pf4j.plugin.TestPlugin", plugin1.getPluginClass());
  66. assertEquals("0.0.1", plugin1.getVersion());
  67. assertEquals("Decebal Suiu", plugin1.getProvider());
  68. assertEquals(2, plugin1.getDependencies().size());
  69. assertEquals("test-plugin-2", plugin1.getDependencies().get(0).getPluginId());
  70. assertEquals("test-plugin-3", plugin1.getDependencies().get(1).getPluginId());
  71. assertEquals("~1.0", plugin1.getDependencies().get(1).getPluginVersionSupport());
  72. assertEquals("Apache-2.0", plugin1.getLicense());
  73. assertEquals(">=1", plugin1.getRequires());
  74. assertTrue(versionManager.checkVersionConstraint("1.0.0", plugin1.getRequires()));
  75. assertFalse(versionManager.checkVersionConstraint("0.1.0", plugin1.getRequires()));
  76. assertEquals("test-plugin-2", plugin2.getPluginId());
  77. assertEquals("", plugin2.getPluginDescription());
  78. assertEquals("org.pf4j.plugin.TestPlugin", plugin2.getPluginClass());
  79. assertEquals("0.0.1", plugin2.getVersion());
  80. assertEquals("Decebal Suiu", plugin2.getProvider());
  81. assertEquals(0, plugin2.getDependencies().size());
  82. assertEquals("*", plugin2.getRequires()); // Default is *
  83. assertTrue(versionManager.checkVersionConstraint("1.0.0", plugin2.getRequires()));
  84. }
  85. @Test
  86. public void testNotFound() {
  87. PluginDescriptorFinder descriptorFinder = new PropertiesPluginDescriptorFinder();
  88. assertThrows(PluginException.class, () -> descriptorFinder.find(pluginsPath.resolve("test-plugin-3")));
  89. }
  90. private Properties getPlugin1Properties() {
  91. Map<String, String> map = new LinkedHashMap<>(8);
  92. map.put(PropertiesPluginDescriptorFinder.PLUGIN_ID, "test-plugin-1");
  93. map.put(PropertiesPluginDescriptorFinder.PLUGIN_VERSION, "0.0.1");
  94. map.put(PropertiesPluginDescriptorFinder.PLUGIN_DESCRIPTION, "Test Plugin 1");
  95. map.put(PropertiesPluginDescriptorFinder.PLUGIN_PROVIDER, "Decebal Suiu");
  96. map.put(PropertiesPluginDescriptorFinder.PLUGIN_CLASS, "org.pf4j.plugin.TestPlugin");
  97. map.put(PropertiesPluginDescriptorFinder.PLUGIN_DEPENDENCIES, "test-plugin-2,test-plugin-3@~1.0");
  98. map.put(PropertiesPluginDescriptorFinder.PLUGIN_REQUIRES, ">=1");
  99. map.put(PropertiesPluginDescriptorFinder.PLUGIN_LICENSE, "Apache-2.0");
  100. return PluginZip.createProperties(map);
  101. }
  102. private Properties getPlugin2Properties() {
  103. Map<String, String> map = new LinkedHashMap<>(5);
  104. map.put(PropertiesPluginDescriptorFinder.PLUGIN_ID, "test-plugin-2");
  105. map.put(PropertiesPluginDescriptorFinder.PLUGIN_VERSION, "0.0.1");
  106. map.put(PropertiesPluginDescriptorFinder.PLUGIN_PROVIDER, "Decebal Suiu");
  107. map.put(PropertiesPluginDescriptorFinder.PLUGIN_CLASS, "org.pf4j.plugin.TestPlugin");
  108. map.put(PropertiesPluginDescriptorFinder.PLUGIN_DEPENDENCIES, "");
  109. return PluginZip.createProperties(map);
  110. }
  111. private Properties getPlugin4Properties() {
  112. Map<String, String> map = new LinkedHashMap<>(5);
  113. map.put(PropertiesPluginDescriptorFinder.PLUGIN_ID, "test-plugin-2");
  114. map.put(PropertiesPluginDescriptorFinder.PLUGIN_VERSION, "0.0.1");
  115. map.put(PropertiesPluginDescriptorFinder.PLUGIN_PROVIDER, "Decebal Suiu");
  116. map.put(PropertiesPluginDescriptorFinder.PLUGIN_DEPENDENCIES, "");
  117. map.put(PropertiesPluginDescriptorFinder.PLUGIN_REQUIRES, "*");
  118. return PluginZip.createProperties(map);
  119. }
  120. private Properties getPlugin5Properties() {
  121. Map<String, String> map = new LinkedHashMap<>(5);
  122. map.put(PropertiesPluginDescriptorFinder.PLUGIN_ID, "test-plugin-2");
  123. map.put(PropertiesPluginDescriptorFinder.PLUGIN_PROVIDER, "Decebal Suiu");
  124. map.put(PropertiesPluginDescriptorFinder.PLUGIN_CLASS, "org.pf4j.plugin.TestPlugin");
  125. map.put(PropertiesPluginDescriptorFinder.PLUGIN_DEPENDENCIES, "");
  126. map.put(PropertiesPluginDescriptorFinder.PLUGIN_REQUIRES, "*");
  127. return PluginZip.createProperties(map);
  128. }
  129. private Properties getPlugin6Properties() {
  130. Map<String, String> map = new LinkedHashMap<>(5);
  131. map.put(PropertiesPluginDescriptorFinder.PLUGIN_VERSION, "0.0.1");
  132. map.put(PropertiesPluginDescriptorFinder.PLUGIN_PROVIDER, "Decebal Suiu");
  133. map.put(PropertiesPluginDescriptorFinder.PLUGIN_CLASS, "org.pf4j.plugin.TestPlugin");
  134. map.put(PropertiesPluginDescriptorFinder.PLUGIN_DEPENDENCIES, "");
  135. map.put(PropertiesPluginDescriptorFinder.PLUGIN_REQUIRES, "*");
  136. return PluginZip.createProperties(map);
  137. }
  138. private void storePropertiesToPath(Properties properties, Path pluginPath) throws IOException {
  139. Path path = pluginPath.resolve(PropertiesPluginDescriptorFinder.DEFAULT_PROPERTIES_FILE_NAME);
  140. try (Writer writer = new OutputStreamWriter(new FileOutputStream(path.toFile()), StandardCharsets.UTF_8)) {
  141. properties.store(writer, "");
  142. }
  143. }
  144. }