|
|
@@ -1,69 +1,73 @@ |
|
|
|
/* |
|
|
|
* Copyright (C) 2012-present the original author or authors. |
|
|
|
* |
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
|
|
* you may not use this file except in compliance with the License. |
|
|
|
* You may obtain a copy of the License at |
|
|
|
* |
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0 |
|
|
|
* |
|
|
|
* Unless required by applicable law or agreed to in writing, software |
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS, |
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
|
|
* See the License for the specific language governing permissions and |
|
|
|
* limitations under the License. |
|
|
|
*/ |
|
|
|
package org.pf4j; |
|
|
|
|
|
|
|
import static org.hamcrest.MatcherAssert.assertThat; |
|
|
|
import static org.hamcrest.Matchers.contains; |
|
|
|
import static org.hamcrest.Matchers.equalTo; |
|
|
|
import static org.hamcrest.Matchers.is; |
|
|
|
import static org.hamcrest.Matchers.notNullValue; |
|
|
|
import static org.junit.jupiter.api.Assumptions.assumeTrue; |
|
|
|
import org.junit.jupiter.api.Test; |
|
|
|
import org.junit.jupiter.api.condition.EnabledOnOs; |
|
|
|
import org.junit.jupiter.api.io.TempDir; |
|
|
|
import org.pf4j.plugin.PluginJar; |
|
|
|
import org.pf4j.plugin.TestExtension; |
|
|
|
import org.pf4j.plugin.TestPlugin; |
|
|
|
|
|
|
|
import java.io.IOException; |
|
|
|
import java.nio.file.Path; |
|
|
|
import java.util.Locale; |
|
|
|
import java.util.Map; |
|
|
|
import java.util.Set; |
|
|
|
|
|
|
|
import org.junit.jupiter.api.Test; |
|
|
|
import org.junit.jupiter.api.io.TempDir; |
|
|
|
import org.pf4j.plugin.PluginJar; |
|
|
|
import static org.hamcrest.MatcherAssert.assertThat; |
|
|
|
import static org.hamcrest.Matchers.contains; |
|
|
|
import static org.junit.jupiter.api.Assertions.assertEquals; |
|
|
|
import static org.junit.jupiter.api.Assertions.assertFalse; |
|
|
|
import static org.junit.jupiter.api.Assertions.assertNotNull; |
|
|
|
import static org.junit.jupiter.api.Assertions.assertTrue; |
|
|
|
import static org.junit.jupiter.api.condition.OS.WINDOWS; |
|
|
|
|
|
|
|
public class LegacyExtensionFinderTest { |
|
|
|
|
|
|
|
@TempDir |
|
|
|
public Path pluginsPath; |
|
|
|
|
|
|
|
public static class TestPlugin extends Plugin { |
|
|
|
|
|
|
|
public TestPlugin(PluginWrapper wrapper) { |
|
|
|
super(wrapper); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@Extension |
|
|
|
public static class TestExtension implements ExtensionPoint { |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
private static boolean systemIsWindows() { |
|
|
|
String os = System.getProperty("os.name").toLowerCase(Locale.ENGLISH); |
|
|
|
return os.startsWith("win"); |
|
|
|
} |
|
|
|
Path pluginsPath; |
|
|
|
|
|
|
|
@Test |
|
|
|
public void shouldUnlockFileAfterReadingExtensionsFromPlugin() throws IOException, PluginException { |
|
|
|
|
|
|
|
assumeTrue(systemIsWindows()); |
|
|
|
final Path pluginJarPath = pluginsPath.resolve("test-plugin.jar"); |
|
|
|
PluginJar pluginJar = new PluginJar.Builder(pluginJarPath, "test-plugin") |
|
|
|
@EnabledOnOs(WINDOWS) |
|
|
|
public void shouldUnlockFileAfterReadingExtensionsFromPlugin() throws Exception { |
|
|
|
PluginJar pluginJar = new PluginJar.Builder(pluginsPath.resolve("test-plugin.jar"), "test-plugin") |
|
|
|
.pluginClass(TestPlugin.class.getName()) |
|
|
|
.pluginVersion("1.2.3") |
|
|
|
.extension(TestExtension.class.getName()) |
|
|
|
.build(); |
|
|
|
|
|
|
|
JarPluginManager pluginManager = new JarPluginManager(pluginsPath); |
|
|
|
assertTrue(pluginJar.file().exists()); |
|
|
|
|
|
|
|
PluginManager pluginManager = new JarPluginManager(pluginsPath); |
|
|
|
pluginManager.loadPlugins(); |
|
|
|
|
|
|
|
assertEquals(1, pluginManager.getPlugins().size()); |
|
|
|
|
|
|
|
LegacyExtensionFinder extensionFinder = new LegacyExtensionFinder(pluginManager); |
|
|
|
Map<String, Set<String>> pluginStorages = extensionFinder.readPluginsStorages(); |
|
|
|
pluginManager.unloadPlugin(pluginJar.pluginId()); |
|
|
|
boolean fileDeleted = pluginJarPath.toFile().delete(); |
|
|
|
Map<String, Set<String>> pluginsStorages = extensionFinder.readPluginsStorages(); |
|
|
|
assertNotNull(pluginsStorages); |
|
|
|
|
|
|
|
assertThat(pluginStorages, is(notNullValue())); |
|
|
|
assertThat(pluginStorages.get(pluginJar.pluginId()), is(notNullValue())); |
|
|
|
assertThat(pluginStorages.get(pluginJar.pluginId()).size(), is(equalTo(1))); |
|
|
|
assertThat(pluginStorages.get(pluginJar.pluginId()), |
|
|
|
contains("org.pf4j.LegacyExtensionFinderTest$TestExtension")); |
|
|
|
assertThat(fileDeleted, is(equalTo(true))); |
|
|
|
pluginManager.unloadPlugin(pluginJar.pluginId()); |
|
|
|
boolean fileDeleted = pluginJar.file().delete(); |
|
|
|
|
|
|
|
Set<String> pluginStorages = pluginsStorages.get(pluginJar.pluginId()); |
|
|
|
assertNotNull(pluginStorages); |
|
|
|
assertEquals(1, pluginStorages.size()); |
|
|
|
assertThat(pluginStorages, contains(TestExtension.class.getName())); |
|
|
|
assertTrue(fileDeleted); |
|
|
|
assertFalse(pluginJar.file().exists()); |
|
|
|
} |
|
|
|
|
|
|
|
} |