mirror of https://github.com/apache/kafka.git
MINOR: Cleanup TestPlugins and normalize TestPlugin enum (#13333)
Signed-off-by: Greg Harris <greg.harris@aiven.io> Reviewers: Chris Egerton <chrise@aiven.io>
This commit is contained in:
parent
ae192bdd41
commit
4550550c7c
|
@ -17,7 +17,6 @@
|
||||||
|
|
||||||
package org.apache.kafka.connect.runtime.isolation;
|
package org.apache.kafka.connect.runtime.isolation;
|
||||||
|
|
||||||
import org.junit.jupiter.api.BeforeAll;
|
|
||||||
import org.junit.jupiter.api.io.TempDir;
|
import org.junit.jupiter.api.io.TempDir;
|
||||||
import org.junit.jupiter.params.ParameterizedTest;
|
import org.junit.jupiter.params.ParameterizedTest;
|
||||||
import org.junit.jupiter.params.provider.MethodSource;
|
import org.junit.jupiter.params.provider.MethodSource;
|
||||||
|
@ -49,12 +48,6 @@ public class PluginScannerTest {
|
||||||
return Stream.of(new ReflectionScanner(), new ServiceLoaderScanner());
|
return Stream.of(new ReflectionScanner(), new ServiceLoaderScanner());
|
||||||
}
|
}
|
||||||
|
|
||||||
@BeforeAll
|
|
||||||
public static void setUp() {
|
|
||||||
// Work around a circular-dependency in TestPlugins.
|
|
||||||
TestPlugins.pluginPath();
|
|
||||||
}
|
|
||||||
|
|
||||||
@ParameterizedTest
|
@ParameterizedTest
|
||||||
@MethodSource("parameters")
|
@MethodSource("parameters")
|
||||||
public void testScanningEmptyPluginPath(PluginScanner scanner) {
|
public void testScanningEmptyPluginPath(PluginScanner scanner) {
|
||||||
|
|
|
@ -34,7 +34,7 @@ import java.nio.file.Paths;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.HashMap;
|
import java.util.EnumMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
@ -45,6 +45,7 @@ import java.util.jar.JarEntry;
|
||||||
import java.util.jar.JarOutputStream;
|
import java.util.jar.JarOutputStream;
|
||||||
import java.util.jar.Manifest;
|
import java.util.jar.Manifest;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
import javax.tools.JavaCompiler;
|
import javax.tools.JavaCompiler;
|
||||||
import javax.tools.StandardJavaFileManager;
|
import javax.tools.StandardJavaFileManager;
|
||||||
|
@ -66,161 +67,35 @@ import javax.tools.ToolProvider;
|
||||||
* and reference the names of the different plugins directly via the {@link TestPlugin} enum.
|
* and reference the names of the different plugins directly via the {@link TestPlugin} enum.
|
||||||
*/
|
*/
|
||||||
public class TestPlugins {
|
public class TestPlugins {
|
||||||
private static final Predicate<String> REMOVE_CLASS_FILTER = s -> s.contains("NonExistentInterface");
|
|
||||||
public enum TestPlugin {
|
/**
|
||||||
/**
|
* Unit of compilation and distribution, containing zero or more plugin classes.
|
||||||
* A plugin which will always throw an exception during loading
|
*/
|
||||||
*/
|
public enum TestPackage {
|
||||||
ALWAYS_THROW_EXCEPTION("always-throw-exception", "test.plugins.AlwaysThrowException", false),
|
ALIASED_STATIC_FIELD("aliased-static-field"),
|
||||||
/**
|
ALWAYS_THROW_EXCEPTION("always-throw-exception"),
|
||||||
* A plugin which samples information about its initialization.
|
BAD_PACKAGING("bad-packaging", s -> s.contains("NonExistentInterface")),
|
||||||
*/
|
MULTIPLE_PLUGINS_IN_JAR("multiple-plugins-in-jar"),
|
||||||
ALIASED_STATIC_FIELD("aliased-static-field", "test.plugins.AliasedStaticField"),
|
NON_MIGRATED("non-migrated"),
|
||||||
/**
|
READ_VERSION_FROM_RESOURCE_V1("read-version-from-resource-v1"),
|
||||||
* A {@link org.apache.kafka.connect.storage.Converter}
|
READ_VERSION_FROM_RESOURCE_V2("read-version-from-resource-v2"),
|
||||||
* which samples information about its method calls.
|
SAMPLING_CONFIGURABLE("sampling-configurable"),
|
||||||
*/
|
SAMPLING_CONFIG_PROVIDER("sampling-config-provider"),
|
||||||
SAMPLING_CONVERTER("sampling-converter", "test.plugins.SamplingConverter"),
|
SAMPLING_CONNECTOR("sampling-connector"),
|
||||||
/**
|
SAMPLING_CONVERTER("sampling-converter"),
|
||||||
* A {@link org.apache.kafka.common.Configurable}
|
SAMPLING_HEADER_CONVERTER("sampling-header-converter"),
|
||||||
* which samples information about its method calls.
|
SERVICE_LOADER("service-loader"),
|
||||||
*/
|
SUBCLASS_OF_CLASSPATH("subclass-of-classpath");
|
||||||
SAMPLING_CONFIGURABLE("sampling-configurable", "test.plugins.SamplingConfigurable"),
|
|
||||||
/**
|
|
||||||
* A {@link org.apache.kafka.connect.storage.HeaderConverter}
|
|
||||||
* which samples information about its method calls.
|
|
||||||
*/
|
|
||||||
SAMPLING_HEADER_CONVERTER("sampling-header-converter", "test.plugins.SamplingHeaderConverter"),
|
|
||||||
/**
|
|
||||||
* A {@link org.apache.kafka.common.config.provider.ConfigProvider}
|
|
||||||
* which samples information about its method calls.
|
|
||||||
*/
|
|
||||||
SAMPLING_CONFIG_PROVIDER("sampling-config-provider", "test.plugins.SamplingConfigProvider"),
|
|
||||||
/**
|
|
||||||
* A {@link org.apache.kafka.connect.sink.SinkConnector}
|
|
||||||
* which samples information about its method calls.
|
|
||||||
*/
|
|
||||||
SAMPLING_CONNECTOR("sampling-connector", "test.plugins.SamplingConnector"),
|
|
||||||
/**
|
|
||||||
* A plugin which uses a {@link java.util.ServiceLoader}
|
|
||||||
* to load internal classes, and samples information about their initialization.
|
|
||||||
*/
|
|
||||||
SERVICE_LOADER("service-loader", "test.plugins.ServiceLoaderPlugin"),
|
|
||||||
/**
|
|
||||||
* A plugin which reads a version string from a resource and packages the version string 1.0.0.
|
|
||||||
*/
|
|
||||||
READ_VERSION_FROM_RESOURCE_V1("read-version-from-resource-v1", "test.plugins.ReadVersionFromResource"),
|
|
||||||
/**
|
|
||||||
* A plugin which reads a version string from a resource and packages the version string 2.0.0.
|
|
||||||
* This plugin is not included in {@link TestPlugins#pluginPath()} and must be included explicitly
|
|
||||||
*/
|
|
||||||
READ_VERSION_FROM_RESOURCE_V2("read-version-from-resource-v2", "test.plugins.ReadVersionFromResource", false),
|
|
||||||
/**
|
|
||||||
* A plugin which shares a jar file with {@link TestPlugin#MULTIPLE_PLUGINS_IN_JAR_THING_TWO}
|
|
||||||
*/
|
|
||||||
MULTIPLE_PLUGINS_IN_JAR_THING_ONE("multiple-plugins-in-jar", "test.plugins.ThingOne"),
|
|
||||||
/**
|
|
||||||
* A plugin which shares a jar file with {@link TestPlugin#MULTIPLE_PLUGINS_IN_JAR_THING_ONE}
|
|
||||||
*/
|
|
||||||
MULTIPLE_PLUGINS_IN_JAR_THING_TWO("multiple-plugins-in-jar", "test.plugins.ThingTwo"),
|
|
||||||
/**
|
|
||||||
* A plugin which is incorrectly packaged, and is missing a superclass definition.
|
|
||||||
*/
|
|
||||||
BAD_PACKAGING_MISSING_SUPERCLASS("bad-packaging", "test.plugins.MissingSuperclassConverter", false, REMOVE_CLASS_FILTER),
|
|
||||||
/**
|
|
||||||
* A plugin which is packaged with other incorrectly packaged plugins, but itself has no issues loading.
|
|
||||||
*/
|
|
||||||
BAD_PACKAGING_CO_LOCATED("bad-packaging", "test.plugins.CoLocatedPlugin", true, REMOVE_CLASS_FILTER),
|
|
||||||
/**
|
|
||||||
* A connector which is incorrectly packaged, and throws during static initialization.
|
|
||||||
*/
|
|
||||||
BAD_PACKAGING_STATIC_INITIALIZER_THROWS_CONNECTOR("bad-packaging", "test.plugins.StaticInitializerThrowsConnector", false, REMOVE_CLASS_FILTER),
|
|
||||||
/**
|
|
||||||
* A plugin which is incorrectly packaged, which throws an exception from the {@link Versioned#version()} method.
|
|
||||||
*/
|
|
||||||
BAD_PACKAGING_VERSION_METHOD_THROWS_CONNECTOR("bad-packaging", "test.plugins.VersionMethodThrowsConnector", true, REMOVE_CLASS_FILTER),
|
|
||||||
/**
|
|
||||||
* A plugin which is incorrectly packaged, which throws an exception from default constructor.
|
|
||||||
*/
|
|
||||||
BAD_PACKAGING_DEFAULT_CONSTRUCTOR_THROWS_CONNECTOR("bad-packaging", "test.plugins.DefaultConstructorThrowsConnector", false, REMOVE_CLASS_FILTER),
|
|
||||||
/**
|
|
||||||
* A plugin which is incorrectly packaged, which has a private default constructor.
|
|
||||||
*/
|
|
||||||
BAD_PACKAGING_DEFAULT_CONSTRUCTOR_PRIVATE_CONNECTOR("bad-packaging", "test.plugins.DefaultConstructorPrivateConnector", false, REMOVE_CLASS_FILTER),
|
|
||||||
/**
|
|
||||||
* A plugin which is incorrectly packaged, which has a constructor which takes arguments.
|
|
||||||
*/
|
|
||||||
BAD_PACKAGING_NO_DEFAULT_CONSTRUCTOR_CONNECTOR("bad-packaging", "test.plugins.NoDefaultConstructorConnector", false, REMOVE_CLASS_FILTER),
|
|
||||||
/**
|
|
||||||
* A plugin which is incorrectly packaged, which has a constructor which takes arguments.
|
|
||||||
*/
|
|
||||||
BAD_PACKAGING_NO_DEFAULT_CONSTRUCTOR_CONVERTER("bad-packaging", "test.plugins.NoDefaultConstructorConverter", false, REMOVE_CLASS_FILTER),
|
|
||||||
/**
|
|
||||||
* A plugin which is incorrectly packaged, which has a constructor which takes arguments.
|
|
||||||
*/
|
|
||||||
BAD_PACKAGING_NO_DEFAULT_CONSTRUCTOR_OVERRIDE_POLICY("bad-packaging", "test.plugins.NoDefaultConstructorOverridePolicy", false, REMOVE_CLASS_FILTER),
|
|
||||||
/**
|
|
||||||
* A plugin which is incorrectly packaged, which throws an exception from the {@link Versioned#version()} method.
|
|
||||||
*/
|
|
||||||
BAD_PACKAGING_INNER_CLASS_CONNECTOR("bad-packaging", "test.plugins.OuterClass$InnerClass", false, REMOVE_CLASS_FILTER),
|
|
||||||
/**
|
|
||||||
* A plugin which is incorrectly packaged, which throws an exception from the {@link Versioned#version()} method.
|
|
||||||
*/
|
|
||||||
BAD_PACKAGING_STATIC_INITIALIZER_THROWS_REST_EXTENSION("bad-packaging", "test.plugins.StaticInitializerThrowsRestExtension", false, REMOVE_CLASS_FILTER),
|
|
||||||
/**
|
|
||||||
* A reflectively discovered plugin which subclasses another plugin which is present on the classpath
|
|
||||||
*/
|
|
||||||
SUBCLASS_OF_CLASSPATH_CONVERTER("subclass-of-classpath", "test.plugins.SubclassOfClasspathConverter"),
|
|
||||||
/**
|
|
||||||
* A ServiceLoader discovered plugin which subclasses another plugin which is present on the classpath
|
|
||||||
*/
|
|
||||||
SUBCLASS_OF_CLASSPATH_OVERRIDE_POLICY("subclass-of-classpath", "test.plugins.SubclassOfClasspathOverridePolicy"),
|
|
||||||
/**
|
|
||||||
* A converter which does not have a corresponding ServiceLoader manifest
|
|
||||||
*/
|
|
||||||
NON_MIGRATED_CONVERTER("non-migrated", "test.plugins.NonMigratedConverter", false),
|
|
||||||
/**
|
|
||||||
* A header converter which does not have a corresponding ServiceLoader manifest
|
|
||||||
*/
|
|
||||||
NON_MIGRATED_HEADER_CONVERTER("non-migrated", "test.plugins.NonMigratedHeaderConverter", false),
|
|
||||||
/**
|
|
||||||
* A plugin which implements multiple interfaces, and has ServiceLoader manifests for some interfaces and not others.
|
|
||||||
*/
|
|
||||||
NON_MIGRATED_MULTI_PLUGIN("non-migrated", "test.plugins.NonMigratedMultiPlugin", false),
|
|
||||||
/**
|
|
||||||
* A predicate which does not have a corresponding ServiceLoader manifest
|
|
||||||
*/
|
|
||||||
NON_MIGRATED_PREDICATE("non-migrated", "test.plugins.NonMigratedPredicate", false),
|
|
||||||
/**
|
|
||||||
* A sink connector which does not have a corresponding ServiceLoader manifest
|
|
||||||
*/
|
|
||||||
NON_MIGRATED_SINK_CONNECTOR("non-migrated", "test.plugins.NonMigratedSinkConnector", false),
|
|
||||||
/**
|
|
||||||
* A source connector which does not have a corresponding ServiceLoader manifest
|
|
||||||
*/
|
|
||||||
NON_MIGRATED_SOURCE_CONNECTOR("non-migrated", "test.plugins.NonMigratedSourceConnector", false),
|
|
||||||
/**
|
|
||||||
* A transformation which does not have a corresponding ServiceLoader manifest
|
|
||||||
*/
|
|
||||||
NON_MIGRATED_TRANSFORMATION("non-migrated", "test.plugins.NonMigratedTransformation", false);
|
|
||||||
|
|
||||||
private final String resourceDir;
|
private final String resourceDir;
|
||||||
private final String className;
|
|
||||||
private final boolean includeByDefault;
|
|
||||||
private final Predicate<String> removeRuntimeClasses;
|
private final Predicate<String> removeRuntimeClasses;
|
||||||
|
|
||||||
TestPlugin(String resourceDir, String className) {
|
TestPackage(String resourceDir) {
|
||||||
this(resourceDir, className, true);
|
this(resourceDir, ignored -> false);
|
||||||
}
|
}
|
||||||
|
|
||||||
TestPlugin(String resourceDir, String className, boolean includeByDefault) {
|
TestPackage(String resourceDir, Predicate<String> removeRuntimeClasses) {
|
||||||
this(resourceDir, className, includeByDefault, ignored -> false);
|
|
||||||
}
|
|
||||||
|
|
||||||
TestPlugin(String resourceDir, String className, boolean includeByDefault, Predicate<String> removeRuntimeClasses) {
|
|
||||||
this.resourceDir = resourceDir;
|
this.resourceDir = resourceDir;
|
||||||
this.className = className;
|
|
||||||
this.includeByDefault = includeByDefault;
|
|
||||||
this.removeRuntimeClasses = removeRuntimeClasses;
|
this.removeRuntimeClasses = removeRuntimeClasses;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -228,6 +103,166 @@ public class TestPlugins {
|
||||||
return resourceDir;
|
return resourceDir;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Predicate<String> removeRuntimeClasses() {
|
||||||
|
return removeRuntimeClasses;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum TestPlugin {
|
||||||
|
/**
|
||||||
|
* A plugin which samples information about its initialization.
|
||||||
|
*/
|
||||||
|
ALIASED_STATIC_FIELD(TestPackage.ALIASED_STATIC_FIELD, "test.plugins.AliasedStaticField"),
|
||||||
|
/**
|
||||||
|
* A plugin which will always throw an exception during loading
|
||||||
|
*/
|
||||||
|
ALWAYS_THROW_EXCEPTION(TestPackage.ALWAYS_THROW_EXCEPTION, "test.plugins.AlwaysThrowException", false),
|
||||||
|
/**
|
||||||
|
* A plugin which is packaged with other incorrectly packaged plugins, but itself has no issues loading.
|
||||||
|
*/
|
||||||
|
BAD_PACKAGING_CO_LOCATED(TestPackage.BAD_PACKAGING, "test.plugins.CoLocatedPlugin", true),
|
||||||
|
/**
|
||||||
|
* A plugin which is incorrectly packaged, which has a private default constructor.
|
||||||
|
*/
|
||||||
|
BAD_PACKAGING_DEFAULT_CONSTRUCTOR_PRIVATE_CONNECTOR(TestPackage.BAD_PACKAGING, "test.plugins.DefaultConstructorPrivateConnector", false),
|
||||||
|
/**
|
||||||
|
* A plugin which is incorrectly packaged, which throws an exception from default constructor.
|
||||||
|
*/
|
||||||
|
BAD_PACKAGING_DEFAULT_CONSTRUCTOR_THROWS_CONNECTOR(TestPackage.BAD_PACKAGING, "test.plugins.DefaultConstructorThrowsConnector", false),
|
||||||
|
/**
|
||||||
|
* A plugin which is incorrectly packaged, which throws an exception from the {@link Versioned#version()} method.
|
||||||
|
*/
|
||||||
|
BAD_PACKAGING_INNER_CLASS_CONNECTOR(TestPackage.BAD_PACKAGING, "test.plugins.OuterClass$InnerClass", false),
|
||||||
|
/**
|
||||||
|
* A plugin which is incorrectly packaged, and is missing a superclass definition.
|
||||||
|
*/
|
||||||
|
BAD_PACKAGING_MISSING_SUPERCLASS(TestPackage.BAD_PACKAGING, "test.plugins.MissingSuperclassConverter", false),
|
||||||
|
/**
|
||||||
|
* A plugin which is incorrectly packaged, which has a private default constructor.
|
||||||
|
*/
|
||||||
|
BAD_PACKAGING_NO_DEFAULT_CONSTRUCTOR_CONNECTOR(TestPackage.BAD_PACKAGING, "test.plugins.NoDefaultConstructorConnector", false),
|
||||||
|
/**
|
||||||
|
* A plugin which is incorrectly packaged, which has a constructor which takes arguments.
|
||||||
|
*/
|
||||||
|
BAD_PACKAGING_NO_DEFAULT_CONSTRUCTOR_CONVERTER(TestPackage.BAD_PACKAGING, "test.plugins.NoDefaultConstructorConverter", false),
|
||||||
|
/**
|
||||||
|
* A plugin which is incorrectly packaged, which has a constructor which takes arguments.
|
||||||
|
*/
|
||||||
|
BAD_PACKAGING_NO_DEFAULT_CONSTRUCTOR_OVERRIDE_POLICY(TestPackage.BAD_PACKAGING, "test.plugins.NoDefaultConstructorOverridePolicy", false),
|
||||||
|
/**
|
||||||
|
* A connector which is incorrectly packaged, and throws during static initialization.
|
||||||
|
*/
|
||||||
|
BAD_PACKAGING_STATIC_INITIALIZER_THROWS_CONNECTOR(TestPackage.BAD_PACKAGING, "test.plugins.StaticInitializerThrowsConnector", false),
|
||||||
|
/**
|
||||||
|
* A plugin which is incorrectly packaged, which throws an exception from the {@link Versioned#version()} method.
|
||||||
|
*/
|
||||||
|
BAD_PACKAGING_STATIC_INITIALIZER_THROWS_REST_EXTENSION(TestPackage.BAD_PACKAGING, "test.plugins.StaticInitializerThrowsRestExtension", false),
|
||||||
|
/**
|
||||||
|
* A plugin which is incorrectly packaged, which throws an exception from the {@link Versioned#version()} method.
|
||||||
|
*/
|
||||||
|
BAD_PACKAGING_VERSION_METHOD_THROWS_CONNECTOR(TestPackage.BAD_PACKAGING, "test.plugins.VersionMethodThrowsConnector", true),
|
||||||
|
/**
|
||||||
|
* A plugin which shares a jar file with {@link TestPlugin#MULTIPLE_PLUGINS_IN_JAR_THING_TWO}
|
||||||
|
*/
|
||||||
|
MULTIPLE_PLUGINS_IN_JAR_THING_ONE(TestPackage.MULTIPLE_PLUGINS_IN_JAR, "test.plugins.ThingOne"),
|
||||||
|
/**
|
||||||
|
* A plugin which shares a jar file with {@link TestPlugin#MULTIPLE_PLUGINS_IN_JAR_THING_ONE}
|
||||||
|
*/
|
||||||
|
MULTIPLE_PLUGINS_IN_JAR_THING_TWO(TestPackage.MULTIPLE_PLUGINS_IN_JAR, "test.plugins.ThingTwo"),
|
||||||
|
/**
|
||||||
|
* A converter which does not have a corresponding ServiceLoader manifest
|
||||||
|
*/
|
||||||
|
NON_MIGRATED_CONVERTER(TestPackage.NON_MIGRATED, "test.plugins.NonMigratedConverter", false),
|
||||||
|
/**
|
||||||
|
* A header converter which does not have a corresponding ServiceLoader manifest
|
||||||
|
*/
|
||||||
|
NON_MIGRATED_HEADER_CONVERTER(TestPackage.NON_MIGRATED, "test.plugins.NonMigratedHeaderConverter", false),
|
||||||
|
/**
|
||||||
|
* A plugin which implements multiple interfaces, and has ServiceLoader manifests for some interfaces and not others.
|
||||||
|
*/
|
||||||
|
NON_MIGRATED_MULTI_PLUGIN(TestPackage.NON_MIGRATED, "test.plugins.NonMigratedMultiPlugin", false),
|
||||||
|
/**
|
||||||
|
* A predicate which does not have a corresponding ServiceLoader manifest
|
||||||
|
*/
|
||||||
|
NON_MIGRATED_PREDICATE(TestPackage.NON_MIGRATED, "test.plugins.NonMigratedPredicate", false),
|
||||||
|
/**
|
||||||
|
* A sink connector which does not have a corresponding ServiceLoader manifest
|
||||||
|
*/
|
||||||
|
NON_MIGRATED_SINK_CONNECTOR(TestPackage.NON_MIGRATED, "test.plugins.NonMigratedSinkConnector", false),
|
||||||
|
/**
|
||||||
|
* A source connector which does not have a corresponding ServiceLoader manifest
|
||||||
|
*/
|
||||||
|
NON_MIGRATED_SOURCE_CONNECTOR(TestPackage.NON_MIGRATED, "test.plugins.NonMigratedSourceConnector", false),
|
||||||
|
/**
|
||||||
|
* A transformation which does not have a corresponding ServiceLoader manifest
|
||||||
|
*/
|
||||||
|
NON_MIGRATED_TRANSFORMATION(TestPackage.NON_MIGRATED, "test.plugins.NonMigratedTransformation", false),
|
||||||
|
/**
|
||||||
|
* A plugin which reads a version string from a resource and packages the version string 1.0.0.
|
||||||
|
*/
|
||||||
|
READ_VERSION_FROM_RESOURCE_V1(TestPackage.READ_VERSION_FROM_RESOURCE_V1, "test.plugins.ReadVersionFromResource"),
|
||||||
|
/**
|
||||||
|
* A plugin which reads a version string from a resource and packages the version string 2.0.0.
|
||||||
|
* This plugin is not included in {@link TestPlugins#pluginPath()} and must be included explicitly
|
||||||
|
*/
|
||||||
|
READ_VERSION_FROM_RESOURCE_V2(TestPackage.READ_VERSION_FROM_RESOURCE_V2, "test.plugins.ReadVersionFromResource", false),
|
||||||
|
/**
|
||||||
|
* A {@link org.apache.kafka.common.Configurable}
|
||||||
|
* which samples information about its method calls.
|
||||||
|
*/
|
||||||
|
SAMPLING_CONFIGURABLE(TestPackage.SAMPLING_CONFIGURABLE, "test.plugins.SamplingConfigurable"),
|
||||||
|
/**
|
||||||
|
* A {@link org.apache.kafka.common.config.provider.ConfigProvider}
|
||||||
|
* which samples information about its method calls.
|
||||||
|
*/
|
||||||
|
SAMPLING_CONFIG_PROVIDER(TestPackage.SAMPLING_CONFIG_PROVIDER, "test.plugins.SamplingConfigProvider"),
|
||||||
|
/**
|
||||||
|
* A {@link org.apache.kafka.connect.sink.SinkConnector}
|
||||||
|
* which samples information about its method calls.
|
||||||
|
*/
|
||||||
|
SAMPLING_CONNECTOR(TestPackage.SAMPLING_CONNECTOR, "test.plugins.SamplingConnector"),
|
||||||
|
/**
|
||||||
|
* A {@link org.apache.kafka.connect.storage.Converter}
|
||||||
|
* which samples information about its method calls.
|
||||||
|
*/
|
||||||
|
SAMPLING_CONVERTER(TestPackage.SAMPLING_CONVERTER, "test.plugins.SamplingConverter"),
|
||||||
|
/**
|
||||||
|
* A {@link org.apache.kafka.connect.storage.HeaderConverter}
|
||||||
|
* which samples information about its method calls.
|
||||||
|
*/
|
||||||
|
SAMPLING_HEADER_CONVERTER(TestPackage.SAMPLING_HEADER_CONVERTER, "test.plugins.SamplingHeaderConverter"),
|
||||||
|
/**
|
||||||
|
* A plugin which uses a {@link java.util.ServiceLoader}
|
||||||
|
* to load internal classes, and samples information about their initialization.
|
||||||
|
*/
|
||||||
|
SERVICE_LOADER(TestPackage.SERVICE_LOADER, "test.plugins.ServiceLoaderPlugin"),
|
||||||
|
/**
|
||||||
|
* A reflectively discovered plugin which subclasses another plugin which is present on the classpath
|
||||||
|
*/
|
||||||
|
SUBCLASS_OF_CLASSPATH_CONVERTER(TestPackage.SUBCLASS_OF_CLASSPATH, "test.plugins.SubclassOfClasspathConverter"),
|
||||||
|
/**
|
||||||
|
* A ServiceLoader discovered plugin which subclasses another plugin which is present on the classpath
|
||||||
|
*/
|
||||||
|
SUBCLASS_OF_CLASSPATH_OVERRIDE_POLICY(TestPackage.SUBCLASS_OF_CLASSPATH, "test.plugins.SubclassOfClasspathOverridePolicy");
|
||||||
|
|
||||||
|
private final TestPackage testPackage;
|
||||||
|
private final String className;
|
||||||
|
private final boolean includeByDefault;
|
||||||
|
|
||||||
|
TestPlugin(TestPackage testPackage, String className) {
|
||||||
|
this(testPackage, className, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
TestPlugin(TestPackage testPackage, String className, boolean includeByDefault) {
|
||||||
|
this.testPackage = testPackage;
|
||||||
|
this.className = className;
|
||||||
|
this.includeByDefault = includeByDefault;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TestPackage testPackage() {
|
||||||
|
return testPackage;
|
||||||
|
}
|
||||||
|
|
||||||
public String className() {
|
public String className() {
|
||||||
return className;
|
return className;
|
||||||
}
|
}
|
||||||
|
@ -235,25 +270,21 @@ public class TestPlugins {
|
||||||
public boolean includeByDefault() {
|
public boolean includeByDefault() {
|
||||||
return includeByDefault;
|
return includeByDefault;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Predicate<String> removeRuntimeClasses() {
|
|
||||||
return removeRuntimeClasses;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final Logger log = LoggerFactory.getLogger(TestPlugins.class);
|
private static final Logger log = LoggerFactory.getLogger(TestPlugins.class);
|
||||||
private static final Map<String, Path> PLUGIN_JARS;
|
private static final Map<TestPackage, Path> PLUGIN_JARS;
|
||||||
private static final Throwable INITIALIZATION_EXCEPTION;
|
private static final Throwable INITIALIZATION_EXCEPTION;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
Throwable err = null;
|
Throwable err = null;
|
||||||
Map<String, Path> pluginJars = new HashMap<>();
|
Map<TestPackage, Path> pluginJars = new EnumMap<>(TestPackage.class);
|
||||||
try {
|
try {
|
||||||
for (TestPlugin testPlugin : TestPlugin.values()) {
|
for (TestPackage testPackage : TestPackage.values()) {
|
||||||
if (pluginJars.containsKey(testPlugin.resourceDir())) {
|
if (pluginJars.containsKey(testPackage)) {
|
||||||
log.debug("Skipping recompilation of " + testPlugin.resourceDir());
|
log.debug("Skipping recompilation of " + testPackage.resourceDir());
|
||||||
}
|
}
|
||||||
pluginJars.put(testPlugin.resourceDir(), createPluginJar(testPlugin.resourceDir(), testPlugin.removeRuntimeClasses()));
|
pluginJars.put(testPackage, createPluginJar(testPackage.resourceDir(), testPackage.removeRuntimeClasses()));
|
||||||
}
|
}
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
log.error("Could not set up plugin test jars", e);
|
log.error("Could not set up plugin test jars", e);
|
||||||
|
@ -296,7 +327,7 @@ public class TestPlugins {
|
||||||
assertAvailable();
|
assertAvailable();
|
||||||
return Arrays.stream(plugins)
|
return Arrays.stream(plugins)
|
||||||
.filter(Objects::nonNull)
|
.filter(Objects::nonNull)
|
||||||
.map(TestPlugin::resourceDir)
|
.map(TestPlugin::testPackage)
|
||||||
.distinct()
|
.distinct()
|
||||||
.map(PLUGIN_JARS::get)
|
.map(PLUGIN_JARS::get)
|
||||||
.collect(Collectors.toSet());
|
.collect(Collectors.toSet());
|
||||||
|
@ -374,11 +405,15 @@ public class TestPlugins {
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void removeDirectory(Path binDir) throws IOException {
|
private static void removeDirectory(Path binDir) throws IOException {
|
||||||
List<Path> classFiles = Files.walk(binDir)
|
List<File> classFiles;
|
||||||
.sorted(Comparator.reverseOrder())
|
try (Stream<Path> stream = Files.walk(binDir)) {
|
||||||
.collect(Collectors.toList());
|
classFiles = stream
|
||||||
for (Path classFile : classFiles) {
|
.sorted(Comparator.reverseOrder())
|
||||||
if (!Files.deleteIfExists(classFile)) {
|
.map(Path::toFile)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
for (File classFile : classFiles) {
|
||||||
|
if (!classFile.delete()) {
|
||||||
throw new IOException("Could not delete: " + classFile);
|
throw new IOException("Could not delete: " + classFile);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -390,18 +425,21 @@ public class TestPlugins {
|
||||||
*
|
*
|
||||||
* <p>Dependencies between source files in this directory are resolved against one another
|
* <p>Dependencies between source files in this directory are resolved against one another
|
||||||
* and the classes present in the test environment.
|
* and the classes present in the test environment.
|
||||||
* See https://stackoverflow.com/questions/1563909/ for more information.
|
* See <a href="https://stackoverflow.com/questions/1563909/"/> for more information.
|
||||||
* Additional dependencies in your plugins should be added as test scope to :connect:runtime.
|
* Additional dependencies in your plugins should be added as test scope to :connect:runtime.
|
||||||
* @param sourceDir Directory containing java source files
|
* @param sourceDir Directory containing java source files
|
||||||
* @throws IOException if the files cannot be compiled
|
* @throws IOException if the files cannot be compiled
|
||||||
*/
|
*/
|
||||||
private static void compileJavaSources(Path sourceDir, Path binDir) throws IOException {
|
private static void compileJavaSources(Path sourceDir, Path binDir) throws IOException {
|
||||||
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
|
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
|
||||||
List<File> sourceFiles = Files.walk(sourceDir)
|
List<File> sourceFiles;
|
||||||
.filter(Files::isRegularFile)
|
try (Stream<Path> stream = Files.walk(sourceDir)) {
|
||||||
.filter(path -> path.toFile().getName().endsWith(".java"))
|
sourceFiles = stream
|
||||||
.map(Path::toFile)
|
.filter(Files::isRegularFile)
|
||||||
.collect(Collectors.toList());
|
.map(Path::toFile)
|
||||||
|
.filter(file -> file.getName().endsWith(".java"))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
StringWriter writer = new StringWriter();
|
StringWriter writer = new StringWriter();
|
||||||
List<String> options = Arrays.asList(
|
List<String> options = Arrays.asList(
|
||||||
"-d", binDir.toString() // Write class output to a different directory.
|
"-d", binDir.toString() // Write class output to a different directory.
|
||||||
|
@ -423,11 +461,14 @@ public class TestPlugins {
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void writeJar(JarOutputStream jar, Path inputDir, Predicate<String> removeRuntimeClasses) throws IOException {
|
private static void writeJar(JarOutputStream jar, Path inputDir, Predicate<String> removeRuntimeClasses) throws IOException {
|
||||||
List<Path> paths = Files.walk(inputDir)
|
List<Path> paths;
|
||||||
.filter(Files::isRegularFile)
|
try (Stream<Path> stream = Files.walk(inputDir)) {
|
||||||
.filter(path -> !path.toFile().getName().endsWith(".java"))
|
paths = stream
|
||||||
.filter(path -> !removeRuntimeClasses.test(path.toFile().getName()))
|
.filter(Files::isRegularFile)
|
||||||
.collect(Collectors.toList());
|
.filter(path -> !path.toFile().getName().endsWith(".java"))
|
||||||
|
.filter(path -> !removeRuntimeClasses.test(path.toFile().getName()))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
for (Path path : paths) {
|
for (Path path : paths) {
|
||||||
try (InputStream in = new BufferedInputStream(Files.newInputStream(path))) {
|
try (InputStream in = new BufferedInputStream(Files.newInputStream(path))) {
|
||||||
jar.putNextEntry(new JarEntry(
|
jar.putNextEntry(new JarEntry(
|
||||||
|
|
|
@ -26,7 +26,6 @@ import org.apache.kafka.connect.runtime.isolation.ReflectionScanner;
|
||||||
import org.apache.kafka.connect.runtime.isolation.ServiceLoaderScanner;
|
import org.apache.kafka.connect.runtime.isolation.ServiceLoaderScanner;
|
||||||
import org.apache.kafka.connect.runtime.isolation.TestPlugins;
|
import org.apache.kafka.connect.runtime.isolation.TestPlugins;
|
||||||
|
|
||||||
import org.junit.jupiter.api.BeforeAll;
|
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.junit.jupiter.api.io.TempDir;
|
import org.junit.jupiter.api.io.TempDir;
|
||||||
import org.junit.jupiter.params.ParameterizedTest;
|
import org.junit.jupiter.params.ParameterizedTest;
|
||||||
|
@ -82,13 +81,6 @@ public class ConnectPluginPathTest {
|
||||||
@TempDir
|
@TempDir
|
||||||
public Path workspace;
|
public Path workspace;
|
||||||
|
|
||||||
@BeforeAll
|
|
||||||
public static void setUp() {
|
|
||||||
// Work around a circular-dependency in TestPlugins.
|
|
||||||
TestPlugins.pluginPath();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testNoArguments() {
|
public void testNoArguments() {
|
||||||
CommandResult res = runCommand();
|
CommandResult res = runCommand();
|
||||||
|
|
Loading…
Reference in New Issue