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:
Greg Harris 2024-07-03 09:44:09 -07:00 committed by GitHub
parent ae192bdd41
commit 4550550c7c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 217 additions and 191 deletions

View File

@ -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) {

View File

@ -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(

View File

@ -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();