瀏覽代碼

Add VersionManager abstractization (breaking change) (#155)

tags/release-2.0.0
Decebal Suiu 6 年之前
父節點
當前提交
c9bdd98e6d

+ 25
- 10
pf4j/src/main/java/ro/fortsoft/pf4j/AbstractPluginManager.java 查看文件

@@ -15,7 +15,6 @@
*/
package ro.fortsoft.pf4j;

import com.github.zafarkhaja.semver.Version;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ro.fortsoft.pf4j.util.StringUtils;
@@ -25,7 +24,13 @@ import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
* This class implements the boilerplate plugin code that any {@link PluginManager}
@@ -83,7 +88,7 @@ public abstract class AbstractPluginManager implements PluginManager {
/*
* The system version used for comparisons to the plugin requires attribute.
*/
private Version systemVersion = Version.forIntegers(0);
private String systemVersion = "0.0.0";

private PluginRepository pluginRepository;
private PluginFactory pluginFactory;
@@ -93,6 +98,8 @@ public abstract class AbstractPluginManager implements PluginManager {
private PluginLoader pluginLoader;
private boolean exactVersionAllowed = false;

private VersionManager versionManager;

/**
* The plugins root is supplied by {@code System.getProperty("pf4j.pluginsDir", "plugins")}.
*/
@@ -112,12 +119,12 @@ public abstract class AbstractPluginManager implements PluginManager {
}

@Override
public void setSystemVersion(Version version) {
public void setSystemVersion(String version) {
systemVersion = version;
}

@Override
public Version getSystemVersion() {
public String getSystemVersion() {
return systemVersion;
}

@@ -601,7 +608,7 @@ public abstract class AbstractPluginManager implements PluginManager {
pluginStateListeners.remove(listener);
}

public Version getVersion() {
public String getVersion() {
String version = null;

Package pf4jPackage = PluginManager.class.getPackage();
@@ -612,7 +619,7 @@ public abstract class AbstractPluginManager implements PluginManager {
}
}

return (version != null) ? Version.valueOf(version) : Version.forIntegers(0);
return (version != null) ? version : "0.0.0";
}

protected abstract PluginRepository createPluginRepository();
@@ -629,6 +636,8 @@ public abstract class AbstractPluginManager implements PluginManager {

protected abstract PluginLoader createPluginLoader();

protected abstract VersionManager createVersionManager();

protected PluginDescriptorFinder getPluginDescriptorFinder() {
return pluginDescriptorFinder;
}
@@ -656,8 +665,6 @@ public abstract class AbstractPluginManager implements PluginManager {

System.setProperty("pf4j.pluginsDir", pluginsRoot.toString());

dependencyResolver = new DependencyResolver();

pluginRepository = createPluginRepository();
pluginFactory = createPluginFactory();
extensionFactory = createExtensionFactory();
@@ -665,6 +672,9 @@ public abstract class AbstractPluginManager implements PluginManager {
extensionFinder = createExtensionFinder();
pluginStatusProvider = createPluginStatusProvider();
pluginLoader = createPluginLoader();

versionManager = createVersionManager();
dependencyResolver = new DependencyResolver(versionManager);
}

/**
@@ -700,7 +710,7 @@ public abstract class AbstractPluginManager implements PluginManager {
// If exact versions are not allowed in requires, rewrite to >= expression
requires = ">=" + requires;
}
if (systemVersion.equals(Version.forIntegers(0)) || systemVersion.satisfies(requires)) {
if (systemVersion.equals("0.0.0") || versionManager.satisfies(requires, systemVersion)) {
return true;
}

@@ -864,4 +874,9 @@ public abstract class AbstractPluginManager implements PluginManager {
this.exactVersionAllowed = exactVersionAllowed;
}

@Override
public VersionManager getVersionManager() {
return versionManager;
}

}

+ 6
- 0
pf4j/src/main/java/ro/fortsoft/pf4j/DefaultPluginManager.java 查看文件

@@ -89,6 +89,11 @@ public class DefaultPluginManager extends AbstractPluginManager {
return new DefaultPluginLoader(this, pluginClasspath);
}

@Override
protected VersionManager createVersionManager() {
return new DefaultVersionManager();
}

/**
* By default if {@link DefaultPluginManager#isDevelopment()} returns true
* than a {@link DevelopmentPluginClasspath} is returned
@@ -125,4 +130,5 @@ public class DefaultPluginManager extends AbstractPluginManager {

return super.loadPluginFromPath(pluginPath);
}

}

pf4j/src/test/java/ro/fortsoft/pf4j/util/SemVerUtils.java → pf4j/src/main/java/ro/fortsoft/pf4j/DefaultVersionManager.java 查看文件

@@ -5,7 +5,7 @@
* 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
* 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,
@@ -13,16 +13,21 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package ro.fortsoft.pf4j.util;
package ro.fortsoft.pf4j;

import com.github.zafarkhaja.semver.Version;
import com.github.zafarkhaja.semver.expr.ExpressionParser;

/**
* Utility for semantic version testing
* Default implementation for {@link VersionManager}.
* This implementation uses jSemVer (a Java implementation of the SemVer Specification).
*
* @author Decebal Suiu
*/
public class SemVerUtils {
public static boolean versionMatches(String expression, String systemVersion) {
return ExpressionParser.newInstance().parse(expression).interpret(Version.valueOf(systemVersion));
public class DefaultVersionManager implements VersionManager {

@Override
public boolean satisfies(String constraint, String version) {
return Version.valueOf(version).satisfies(constraint);
}

}

+ 12
- 7
pf4j/src/main/java/ro/fortsoft/pf4j/DependencyResolver.java 查看文件

@@ -15,7 +15,6 @@
*/
package ro.fortsoft.pf4j;

import com.github.zafarkhaja.semver.Version;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ro.fortsoft.pf4j.util.DirectedGraph;
@@ -42,10 +41,16 @@ public class DependencyResolver {

private static final Logger log = LoggerFactory.getLogger(DependencyResolver.class);

private VersionManager versionManager;

private DirectedGraph<String> dependenciesGraph; // the value is 'pluginId'
private DirectedGraph<String> dependentsGraph; // the value is 'pluginId'
private boolean resolved;

public DependencyResolver(VersionManager versionManager) {
this.versionManager = versionManager;
}

public Result resolve(List<PluginDescriptor> plugins) {
// create graphs
dependenciesGraph = new DirectedGraph<>();
@@ -81,7 +86,7 @@ public class DependencyResolver {
// check dependencies versions
for (PluginDescriptor plugin : plugins) {
String pluginId = plugin.getPluginId();
Version existingVersion = plugin.getVersion();
String existingVersion = plugin.getVersion();

List<String> dependents = getDependents(pluginId);
while (!dependents.isEmpty()) {
@@ -127,8 +132,8 @@ public class DependencyResolver {
* @param existingVersion
* @return
*/
protected boolean checkDependencyVersion(String requiredVersion, Version existingVersion) {
return existingVersion.satisfies(requiredVersion);
protected boolean checkDependencyVersion(String requiredVersion, String existingVersion) {
return versionManager.satisfies(requiredVersion, existingVersion);
}

private void addPlugin(PluginDescriptor descriptor) {
@@ -224,10 +229,10 @@ public class DependencyResolver {

private String dependencyId; // value is "pluginId"
private String dependentId; // value is "pluginId"
private Version existingVersion;
private String existingVersion;
private String requiredVersion;

WrongDependencyVersion(String dependencyId, String dependentId, Version existingVersion, String requiredVersion) {
WrongDependencyVersion(String dependencyId, String dependentId, String existingVersion, String requiredVersion) {
this.dependencyId = dependencyId;
this.dependentId = dependentId;
this.existingVersion = existingVersion;
@@ -242,7 +247,7 @@ public class DependencyResolver {
return dependentId;
}

public Version getExistingVersion() {
public String getExistingVersion() {
return existingVersion;
}


+ 3
- 14
pf4j/src/main/java/ro/fortsoft/pf4j/ManifestPluginDescriptorFinder.java 查看文件

@@ -15,7 +15,6 @@
*/
package ro.fortsoft.pf4j;

import com.github.zafarkhaja.semver.Version;
import ro.fortsoft.pf4j.util.StringUtils;

import java.nio.file.Path;
@@ -29,7 +28,7 @@ import java.util.jar.Manifest;
*/
public abstract class ManifestPluginDescriptorFinder implements PluginDescriptorFinder {

@Override
@Override
public PluginDescriptor find(Path pluginPath) throws PluginException {
Manifest manifest = readManifest(pluginPath);

@@ -58,7 +57,7 @@ public abstract class ManifestPluginDescriptorFinder implements PluginDescriptor

String version = attributes.getValue("Plugin-Version");
if (StringUtils.isNotEmpty(version)) {
pluginDescriptor.setPluginVersion(createPluginVersion(version));
pluginDescriptor.setPluginVersion(version);
}

String provider = attributes.getValue("Plugin-Provider");
@@ -76,18 +75,8 @@ public abstract class ManifestPluginDescriptorFinder implements PluginDescriptor
return pluginDescriptor;
}

/**
* Parse version to semver {@link Version} object.
* Example : 1.1.1.RC1 -> 1.1.1-RC1.
* This may be override to use a custom parsing to semver Version.
* @param version given string to be the plugin version
* @return a semver version
*/
protected Version createPluginVersion(String version) {
return Version.valueOf(version);
}

protected PluginDescriptor createPluginDescriptorInstance() {
return new PluginDescriptor();
}

}

+ 3
- 5
pf4j/src/main/java/ro/fortsoft/pf4j/PluginDescriptor.java 查看文件

@@ -15,8 +15,6 @@
*/
package ro.fortsoft.pf4j;

import com.github.zafarkhaja.semver.Version;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -32,7 +30,7 @@ public class PluginDescriptor {
private String pluginId;
private String pluginDescription;
private String pluginClass;
private Version version;
private String version;
private String requires = "*"; // SemVer format
private String provider;
private List<PluginDependency> dependencies;
@@ -66,7 +64,7 @@ public class PluginDescriptor {
/**
* Returns the version of this plugin.
*/
public Version getVersion() {
public String getVersion() {
return version;
}

@@ -127,7 +125,7 @@ public class PluginDescriptor {
return this;
}

PluginDescriptor setPluginVersion(Version version) {
PluginDescriptor setPluginVersion(String version) {
this.version = version;

return this;

+ 5
- 5
pf4j/src/main/java/ro/fortsoft/pf4j/PluginManager.java 查看文件

@@ -15,8 +15,6 @@
*/
package ro.fortsoft.pf4j;

import com.github.zafarkhaja.semver.Version;

import java.nio.file.Path;
import java.util.List;
import java.util.Set;
@@ -165,14 +163,14 @@ public interface PluginManager {
* @default 0.0.0
* @param version
*/
void setSystemVersion(Version version);
void setSystemVersion(String version);

/**
* Returns the system version.
*
* * @return the system version
* @return the system version
*/
Version getSystemVersion();
String getSystemVersion();

/**
* Gets the path of the folder where plugins are installed
@@ -180,4 +178,6 @@ public interface PluginManager {
*/
Path getPluginsRoot();

VersionManager getVersionManager();

}

+ 3
- 3
pf4j/src/main/java/ro/fortsoft/pf4j/PropertiesPluginDescriptorFinder.java 查看文件

@@ -15,7 +15,6 @@
*/
package ro.fortsoft.pf4j;

import com.github.zafarkhaja.semver.Version;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ro.fortsoft.pf4j.util.StringUtils;
@@ -38,7 +37,7 @@ public class PropertiesPluginDescriptorFinder implements PluginDescriptorFinder

private static final String DEFAULT_PROPERTIES_FILE_NAME = "plugin.properties";

private String propertiesFileName;
protected String propertiesFileName;

public PropertiesPluginDescriptorFinder() {
this(DEFAULT_PROPERTIES_FILE_NAME);
@@ -91,7 +90,7 @@ public class PropertiesPluginDescriptorFinder implements PluginDescriptorFinder

String version = properties.getProperty("plugin.version");
if (StringUtils.isNotEmpty(version)) {
pluginDescriptor.setPluginVersion(Version.valueOf(version));
pluginDescriptor.setPluginVersion(version);
}

String provider = properties.getProperty("plugin.provider");
@@ -113,4 +112,5 @@ public class PropertiesPluginDescriptorFinder implements PluginDescriptorFinder
protected PluginDescriptor createPluginDescriptorInstance() {
return new PluginDescriptor();
}

}

+ 34
- 0
pf4j/src/main/java/ro/fortsoft/pf4j/VersionManager.java 查看文件

@@ -0,0 +1,34 @@
/*
* Copyright 2017 Decebal Suiu
*
* 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 ro.fortsoft.pf4j;

/**
* Manager responsible for versions of plugins.
*
* @author Decebal Suiu
*/
public interface VersionManager {

/**
* Check if a {@code constraint} and a {@code version} match.
*
* @param constraint
* @param version
* @return
*/
boolean satisfies(String constraint, String version);

}

+ 9
- 8
pf4j/src/test/java/ro/fortsoft/pf4j/DefaultPluginManagerTest.java 查看文件

@@ -15,7 +15,6 @@
*/
package ro.fortsoft.pf4j;

import com.github.zafarkhaja.semver.Version;
import org.junit.Before;
import org.junit.Test;

@@ -27,6 +26,7 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

public class DefaultPluginManagerTest {

private PluginDescriptor pd1 = null;
private DefaultPluginManager pluginManager = new DefaultPluginManager();
private PluginWrapper pw1;
@@ -35,7 +35,7 @@ public class DefaultPluginManagerTest {
public void init() throws IOException {
pd1 = new PluginDescriptor();
pd1.setPluginId("myPlugin");
pd1.setPluginVersion(Version.valueOf("1.2.3"));
pd1.setPluginVersion("1.2.3");
pd1.setPluginClass("foo");
pd1.setPluginDescription("My plugin");
pd1.setDependencies("bar, baz");
@@ -73,13 +73,13 @@ public class DefaultPluginManagerTest {
// By default accept all since system version not given
assertTrue(pluginManager.isPluginValid(pw1));

pluginManager.setSystemVersion(Version.valueOf("1.0.0"));
pluginManager.setSystemVersion("1.0.0");
assertFalse(pluginManager.isPluginValid(pw1));

pluginManager.setSystemVersion(Version.valueOf("5.0.0"));
pluginManager.setSystemVersion("5.0.0");
assertTrue(pluginManager.isPluginValid(pw1));

pluginManager.setSystemVersion(Version.valueOf("6.0.0"));
pluginManager.setSystemVersion("6.0.0");
assertTrue(pluginManager.isPluginValid(pw1));
}

@@ -90,13 +90,13 @@ public class DefaultPluginManagerTest {
// By default accept all since system version not given
assertTrue(pluginManager.isPluginValid(pw1));

pluginManager.setSystemVersion(Version.valueOf("1.0.0"));
pluginManager.setSystemVersion("1.0.0");
assertFalse(pluginManager.isPluginValid(pw1));

pluginManager.setSystemVersion(Version.valueOf("5.0.0"));
pluginManager.setSystemVersion("5.0.0");
assertTrue(pluginManager.isPluginValid(pw1));

pluginManager.setSystemVersion(Version.valueOf("6.0.0"));
pluginManager.setSystemVersion("6.0.0");
assertFalse(pluginManager.isPluginValid(pw1));
}

@@ -104,4 +104,5 @@ public class DefaultPluginManagerTest {
public void testDefaultExactVersionAllowed() throws Exception {
assertEquals(false, pluginManager.isExactVersionAllowed());
}

}

+ 52
- 0
pf4j/src/test/java/ro/fortsoft/pf4j/DefaultVersionManagerTest.java 查看文件

@@ -0,0 +1,52 @@
/*
* Copyright 2017 Decebal Suiu
*
* 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 ro.fortsoft.pf4j;

import com.github.zafarkhaja.semver.ParseException;
import org.junit.Before;
import org.junit.Test;

import static org.junit.Assert.*;

/**
* @author Decebal Suiu
*/
public class DefaultVersionManagerTest {

private VersionManager versionManager;

@Before
public void init() {
versionManager = new DefaultVersionManager();
}

@Test
public void satisfies() {
assertFalse(versionManager.satisfies(">2.0.0", "1.4.3")); // simple
assertTrue(versionManager.satisfies(">=1.4.0 & <1.6.0", "1.4.3")); // range
}

@Test(expected = IllegalArgumentException.class)
public void nullOrEmptyVersion() {
assertFalse(versionManager.satisfies(">2.0.0", null));
}

@Test(expected = ParseException.class)
public void invalidVersion() {
assertFalse(versionManager.satisfies(">2.0.0", "1.0"));
}

}

+ 16
- 15
pf4j/src/test/java/ro/fortsoft/pf4j/DependencyResolverTest.java 查看文件

@@ -15,22 +15,28 @@
*/
package ro.fortsoft.pf4j;

import com.github.zafarkhaja.semver.Version;
import org.junit.Before;
import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.*;

/**
* @author Decebal Suiu
*/
public class DependencyResolverTest {

private DependencyResolver resolver;

@Before
public void init() {
VersionManager versionManager = new DefaultVersionManager();
resolver = new DependencyResolver(versionManager);
}

@Test
public void sortedPlugins() {
// create incomplete plugin descriptor (ignore some attributes)
@@ -40,13 +46,12 @@ public class DependencyResolverTest {

PluginDescriptor pd2 = new PluginDescriptor()
.setPluginId("p2")
.setPluginVersion(Version.forIntegers(0)); // needed in "checkDependencyVersion" method
.setPluginVersion("0.0.0"); // needed in "checkDependencyVersion" method

List<PluginDescriptor> plugins = new ArrayList<>();
plugins.add(pd1);
plugins.add(pd2);

DependencyResolver resolver = new DependencyResolver();
DependencyResolver.Result result = resolver.resolve(plugins);

assertTrue(result.getNotFoundDependencies().isEmpty());
@@ -62,7 +67,6 @@ public class DependencyResolverTest {
List<PluginDescriptor> plugins = new ArrayList<>();
plugins.add(pd1);

DependencyResolver resolver = new DependencyResolver();
DependencyResolver.Result result = resolver.resolve(plugins);

assertFalse(result.getNotFoundDependencies().isEmpty());
@@ -73,17 +77,17 @@ public class DependencyResolverTest {
public void cyclicDependencies() {
PluginDescriptor pd1 = new PluginDescriptor()
.setPluginId("p1")
.setPluginVersion(Version.forIntegers(0))
.setPluginVersion("0.0.0")
.setDependencies("p2");

PluginDescriptor pd2 = new PluginDescriptor()
.setPluginId("p2")
.setPluginVersion(Version.forIntegers(0))
.setPluginVersion("0.0.0")
.setDependencies("p3");

PluginDescriptor pd3 = new PluginDescriptor()
.setPluginId("p3")
.setPluginVersion(Version.forIntegers(0))
.setPluginVersion("0.0.0")
.setDependencies("p1");

List<PluginDescriptor> plugins = new ArrayList<>();
@@ -91,7 +95,6 @@ public class DependencyResolverTest {
plugins.add(pd2);
plugins.add(pd3);

DependencyResolver resolver = new DependencyResolver();
DependencyResolver.Result result = resolver.resolve(plugins);

assertTrue(result.hasCyclicDependency());
@@ -106,13 +109,12 @@ public class DependencyResolverTest {

PluginDescriptor pd2 = new PluginDescriptor()
.setPluginId("p2")
.setPluginVersion(Version.forIntegers(1, 4));
.setPluginVersion("1.4.0");

List<PluginDescriptor> plugins = new ArrayList<>();
plugins.add(pd1);
plugins.add(pd2);

DependencyResolver resolver = new DependencyResolver();
DependencyResolver.Result result = resolver.resolve(plugins);

assertFalse(result.getWrongVersionDependencies().isEmpty());
@@ -126,13 +128,12 @@ public class DependencyResolverTest {

PluginDescriptor pd2 = new PluginDescriptor()
.setPluginId("p2")
.setPluginVersion(Version.forIntegers(2));
.setPluginVersion("2.0.0");

List<PluginDescriptor> plugins = new ArrayList<>();
plugins.add(pd1);
plugins.add(pd2);

DependencyResolver resolver = new DependencyResolver();
DependencyResolver.Result result = resolver.resolve(plugins);

assertTrue(result.getWrongVersionDependencies().isEmpty());

+ 7
- 4
pf4j/src/test/java/ro/fortsoft/pf4j/LoadPluginsTest.java 查看文件

@@ -15,7 +15,6 @@
*/
package ro.fortsoft.pf4j;

import com.github.zafarkhaja.semver.Version;
import org.junit.Before;
import org.junit.Test;
import ro.fortsoft.pf4j.plugin.MockPluginManager;
@@ -31,6 +30,7 @@ import static junit.framework.TestCase.assertNull;
import static org.junit.Assert.*;

public class LoadPluginsTest {

private Path tmpDir;
private MockPluginManager pluginManager;
private MockZipPlugin p1;
@@ -92,14 +92,14 @@ public class LoadPluginsTest {
pluginManager.loadPlugins();
pluginManager.startPlugins();
assertEquals(1, pluginManager.getPlugins().size());
assertEquals(Version.valueOf("1.2.3"), pluginManager.getPlugin(p2.id).getDescriptor().getVersion());
assertEquals("1.2.3", pluginManager.getPlugin(p2.id).getDescriptor().getVersion());
assertEquals(1, pluginManager.getStartedPlugins().size());
p2.create();
pluginManager.loadPlugins();
pluginManager.startPlugin(p2.id);
assertEquals(1, pluginManager.getPlugins().size());
assertEquals(Version.valueOf("2.0.0"), pluginManager.getPlugin(p2.id).getDescriptor().getVersion());
assertEquals(Version.valueOf("2.0.0"), pluginManager.getStartedPlugins().get(1).getDescriptor().getVersion());
assertEquals("2.0.0", pluginManager.getPlugin(p2.id).getDescriptor().getVersion());
assertEquals("2.0.0", pluginManager.getStartedPlugins().get(1).getDescriptor().getVersion());
}

@Test
@@ -131,6 +131,7 @@ public class LoadPluginsTest {
}

private class MockZipPlugin {

public final String id;
public final String version;
public final String filename;
@@ -165,5 +166,7 @@ public class LoadPluginsTest {
Files.move(propsFile, propsInZip);
}
}

}

}

+ 9
- 8
pf4j/src/test/java/ro/fortsoft/pf4j/ManifestPluginDescriptorFinderTest.java 查看文件

@@ -15,7 +15,6 @@
*/
package ro.fortsoft.pf4j;

import com.github.zafarkhaja.semver.Version;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
@@ -28,9 +27,7 @@ import java.nio.file.Path;
import java.util.Arrays;
import java.util.List;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static ro.fortsoft.pf4j.util.SemVerUtils.versionMatches;
import static org.junit.Assert.*;

/**
* @author Mario Franco
@@ -38,6 +35,8 @@ import static ro.fortsoft.pf4j.util.SemVerUtils.versionMatches;
*/
public class ManifestPluginDescriptorFinderTest {

private VersionManager versionManager;

@Rule
public TemporaryFolder testFolder = new TemporaryFolder();

@@ -70,6 +69,8 @@ public class ManifestPluginDescriptorFinderTest {
pluginPath = testFolder.newFolder("test-plugin-6", "classes", "META-INF").toPath();
Files.write(pluginPath.resolve("extensions.idx"), "ro.fortsoft.pf4j.demo.hello.HelloPlugin$HelloGreeting".getBytes());
Files.write(pluginPath.resolve("MANIFEST.MF"), getPlugin6Manifest(), charset);

versionManager = new DefaultVersionManager();
}

/**
@@ -85,22 +86,22 @@ public class ManifestPluginDescriptorFinderTest {
assertEquals("test-plugin-1", plugin1.getPluginId());
assertEquals("Test Plugin 1", plugin1.getPluginDescription());
assertEquals("ro.fortsoft.pf4j.plugin.TestPlugin", plugin1.getPluginClass());
assertEquals(Version.valueOf("0.0.1"), plugin1.getVersion());
assertEquals("0.0.1", plugin1.getVersion());
assertEquals("Decebal Suiu", plugin1.getProvider());
assertEquals(2, plugin1.getDependencies().size());
assertEquals("test-plugin-2", plugin1.getDependencies().get(0).getPluginId());
assertEquals("test-plugin-3", plugin1.getDependencies().get(1).getPluginId());
assertEquals("~1.0", plugin1.getDependencies().get(1).getPluginVersionSupport());
assertEquals("Apache-2.0", plugin1.getLicense());
assertTrue(versionMatches(plugin1.getRequires(), "1.0.0"));
assertTrue(versionManager.satisfies(plugin1.getRequires(), "1.0.0"));

assertEquals("test-plugin-2", plugin2.getPluginId());
assertEquals("", plugin2.getPluginDescription());
assertEquals("ro.fortsoft.pf4j.plugin.TestPlugin", plugin2.getPluginClass());
assertEquals(Version.valueOf("0.0.1"), plugin2.getVersion());
assertEquals("0.0.1", plugin2.getVersion());
assertEquals("Decebal Suiu", plugin2.getProvider());
assertEquals(0, plugin2.getDependencies().size());
assertTrue(versionMatches(plugin2.getRequires(),"1.0.0"));
assertTrue(versionManager.satisfies(plugin2.getRequires(), "1.0.0"));
}

/**

+ 10
- 7
pf4j/src/test/java/ro/fortsoft/pf4j/PropertiesPluginDescriptorFinderTest.java 查看文件

@@ -15,7 +15,6 @@
*/
package ro.fortsoft.pf4j;

import com.github.zafarkhaja.semver.Version;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
@@ -29,10 +28,11 @@ import java.util.Arrays;
import java.util.List;

import static org.junit.Assert.*;
import static ro.fortsoft.pf4j.util.SemVerUtils.versionMatches;

public class PropertiesPluginDescriptorFinderTest {

private VersionManager versionManager;

@Rule
public TemporaryFolder testFolder = new TemporaryFolder();

@@ -60,6 +60,8 @@ public class PropertiesPluginDescriptorFinderTest {
// no plugin id
pluginPath = testFolder.newFolder("test-plugin-6").toPath();
Files.write(pluginPath.resolve("plugin.properties"), getPlugin6Properties(), charset);

versionManager = new DefaultVersionManager();
}

@Test
@@ -72,7 +74,7 @@ public class PropertiesPluginDescriptorFinderTest {
assertEquals("test-plugin-1", plugin1.getPluginId());
assertEquals("Test Plugin 1", plugin1.getPluginDescription());
assertEquals("ro.fortsoft.pf4j.plugin.TestPlugin", plugin1.getPluginClass());
assertEquals(Version.valueOf("0.0.1"), plugin1.getVersion());
assertEquals("0.0.1", plugin1.getVersion());
assertEquals("Decebal Suiu", plugin1.getProvider());
assertEquals(2, plugin1.getDependencies().size());
assertEquals("test-plugin-2", plugin1.getDependencies().get(0).getPluginId());
@@ -80,17 +82,17 @@ public class PropertiesPluginDescriptorFinderTest {
assertEquals("~1.0", plugin1.getDependencies().get(1).getPluginVersionSupport());
assertEquals("Apache-2.0", plugin1.getLicense());
assertEquals(">=1", plugin1.getRequires());
assertTrue(versionMatches(plugin1.getRequires(),"1.0.0"));
assertFalse(versionMatches(plugin1.getRequires(), "0.1.0"));
assertTrue(versionManager.satisfies(plugin1.getRequires(), "1.0.0"));
assertFalse(versionManager.satisfies(plugin1.getRequires(), "0.1.0"));

assertEquals("test-plugin-2", plugin2.getPluginId());
assertEquals("", plugin2.getPluginDescription());
assertEquals("ro.fortsoft.pf4j.plugin.TestPlugin", plugin2.getPluginClass());
assertEquals(Version.valueOf("0.0.1"), plugin2.getVersion());
assertEquals("0.0.1", plugin2.getVersion());
assertEquals("Decebal Suiu", plugin2.getProvider());
assertEquals(0, plugin2.getDependencies().size());
assertEquals("*", plugin2.getRequires()); // Default is *
assertTrue(versionMatches(plugin2.getRequires(),"1.0.0"));
assertTrue(versionManager.satisfies(plugin2.getRequires(), "1.0.0"));
}

@Test(expected = PluginException.class)
@@ -171,6 +173,7 @@ public class PropertiesPluginDescriptorFinderTest {

return Arrays.asList(lines);
}

private Path getPluginsRoot() {
return testFolder.getRoot().toPath();
}

+ 2
- 0
pf4j/src/test/java/ro/fortsoft/pf4j/plugin/MockPluginManager.java 查看文件

@@ -26,6 +26,7 @@ import java.nio.file.Path;
* Manager for testing
*/
public class MockPluginManager extends DefaultPluginManager {

private PluginDescriptorFinder finder = new DefaultPluginDescriptorFinder(new DefaultPluginClasspath());

public MockPluginManager() {
@@ -46,4 +47,5 @@ public class MockPluginManager extends DefaultPluginManager {
protected PluginDescriptorFinder createPluginDescriptorFinder() {
return finder;
}

}

+ 5
- 1
pf4j/src/test/java/ro/fortsoft/pf4j/util/FileUtilsTest.java 查看文件

@@ -22,12 +22,16 @@ import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.net.URI;
import java.nio.file.*;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Collections;

import static org.junit.Assert.*;

public class FileUtilsTest {

private Path zipFile;
private Path tmpDir;
private Path propsFile;

Loading…
取消
儲存