diff --git a/src/main/java/org/wiremock/integrations/testcontainers/WireMockContainer.java b/src/main/java/org/wiremock/integrations/testcontainers/WireMockContainer.java index cdf614d..8d8fb09 100644 --- a/src/main/java/org/wiremock/integrations/testcontainers/WireMockContainer.java +++ b/src/main/java/org/wiremock/integrations/testcontainers/WireMockContainer.java @@ -30,12 +30,13 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; -import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -81,7 +82,8 @@ public class WireMockContainer extends GenericContainer { private final StringBuilder wireMockArgs; private final Map mappingStubs = new HashMap<>(); private final Map mappingFiles = new HashMap<>(); - private final Map plugins = new HashMap<>(); + private final Set extensionClassNames = new LinkedHashSet<>(); + private final Set extensionJars = new LinkedHashSet<>(); private boolean isBannerDisabled = true; private File rootDir = new File("src/test/resources"); @@ -292,58 +294,67 @@ public WireMockContainer withFileFromResource(Class resource, String filename } /** - * Add extension that will be loaded from the specified JAR files. - * In the internal engine, it will be handled as a single plugin. + * Add an extension that will be loaded from the specified JAR file. * @param classNames Class names of the extension to be included - * @param jars JARs to be included into the container + * @param jar JAR to be included into the container * @return this instance */ - public WireMockContainer withExtensions(Collection classNames, Collection jars) { - return withExtensions(WireMockPlugin.guessPluginId(classNames, jars), classNames, jars); + public WireMockContainer withExtension(Collection classNames, File jar) { + return withExtensions(classNames, Collections.singleton(jar)); + } + + // TODO: Add actual usage for the extension name + /** + * Add an extension that will be loaded from the specified JAR file. + * @param extensionName Name of the extension to be included + * @param classNames Class names of the extension to be included + * @param jars JAR to be included in the container + * @return this instance + */ + public WireMockContainer withExtension(String extensionName, Collection classNames, Collection jars) { + return withExtensions(classNames, jars); } /** - * Add extension that will be loaded from the specified JAR files. - * In the internal engine, it will be handled as a single plugin. - * @param id Identifier top use + * Add extension that will be loaded from the specified JAR file. * @param classNames Class names of the extension to be included * @param jars JARs to be included into the container * @return this instance */ - public WireMockContainer withExtensions(String id, Collection classNames, Collection jars) { - final WireMockPlugin extension = new WireMockPlugin(id) - .withExtensions(classNames) - .withJars(jars); - return withPlugin(extension); + public WireMockContainer withExtensions(Collection classNames, Collection jars) { + extensionClassNames.addAll(classNames); + extensionJars.addAll(jars); + return this; } /** - * Add extension that will be loaded from the specified directory with JAR files. - * In the internal engine, it will be handled as a single plugin. + * Add an extension or multiple extensions that will be loaded from the specified directory with JAR files. * @param classNames Class names of the extension to be included - * @param jarDirectory Directory that stores all JARs + * @param jarsDirectory Directory that stores all JARs * @return this instance */ - public WireMockContainer withExtensions(Collection classNames, File jarDirectory) { - final List jarsInTheDirectory; - try (Stream walk = Files.walk(jarDirectory.toPath())) { - jarsInTheDirectory = walk + public WireMockContainer withExtensions(Collection classNames, Path jarsDirectory) { + if (!Files.isDirectory(jarsDirectory)) { + throw new IllegalArgumentException("Path must refers to directory " + jarsDirectory); + } + try (Stream walk = Files.walk(jarsDirectory)) { + + final List jarsInTheDirectory = walk .filter(p -> !Files.isDirectory(p)) .map(Path::toFile) .filter(f -> f.toString().endsWith(".jar")) .collect(Collectors.toList()); + return withExtensions(classNames, jarsInTheDirectory); + } catch (IOException e) { - throw new IllegalArgumentException("Cannot list JARs in the directory " + jarDirectory, e); + throw new IllegalArgumentException("Cannot list JARs in the directory " + jarsDirectory, e); } - - return withExtensions(classNames, jarsInTheDirectory); } /** * Add extension that will be loaded from the classpath. * This method can be used if the extension is a part of the WireMock bundle, - * or a Jar is already added via {@link #withExtensions(Collection, Collection)}}. - * In the internal engine, it will be handled as a single plugin. + * or a Jar is already added via {@link #withExtensions(Collection, Collection)}} * @param className Class name of the extension * @return this instance */ @@ -351,15 +362,6 @@ public WireMockContainer withExtension(String className) { return withExtensions(Collections.singleton(className), Collections.emptyList()); } - private WireMockContainer withPlugin(WireMockPlugin plugin) { - String pluginId = plugin.getPluginId(); - if (plugins.containsKey(pluginId)) { - throw new IllegalArgumentException("The plugin is already included: " + pluginId); - } - plugins.put(pluginId, plugin); - return this; - } - public String getBaseUrl() { return String.format("http://%s:%d", getHost(), getPort()); } @@ -390,14 +392,10 @@ protected void configure() { withCopyToContainer(mount.getValue(), CONTAINER_FILES_DIR + mount.getKey()); } - final ArrayList extensionClassNames = new ArrayList<>(); - for (Map.Entry entry : plugins.entrySet()) { - final WireMockPlugin ext = entry.getValue(); - extensionClassNames.addAll(ext.getExtensionClassNames()); - for (File jar : ext.getJars()) { - withCopyToContainer(MountableFile.forHostPath(jar.toPath()), EXTENSIONS_DIR + jar.getName()); - } + for (File jar : extensionJars) { + withCopyToContainer(MountableFile.forHostPath(jar.toPath()), EXTENSIONS_DIR + jar.getName()); } + if (!extensionClassNames.isEmpty()) { wireMockArgs.append(" --extensions "); wireMockArgs.append(String.join(",", extensionClassNames)); diff --git a/src/test/java/org/wiremock/integrations/testcontainers/WireMockContainerExtensionTest.java b/src/test/java/org/wiremock/integrations/testcontainers/WireMockContainerExtensionTest.java index f6595a1..6184bee 100644 --- a/src/test/java/org/wiremock/integrations/testcontainers/WireMockContainerExtensionTest.java +++ b/src/test/java/org/wiremock/integrations/testcontainers/WireMockContainerExtensionTest.java @@ -41,7 +41,7 @@ class WireMockContainerExtensionTest { .withLogConsumer(new Slf4jLogConsumer(LOGGER)) .withStartupTimeout(Duration.ofSeconds(60)) .withMapping("json-body-transformer", WireMockContainerExtensionTest.class, "json-body-transformer.json") - .withExtensions("JSON Body Transformer", + .withExtension("JSON Body Transformer", Collections.singleton("com.ninecookies.wiremock.extensions.JsonBodyTransformer"), Collections.singleton(Paths.get("target", "test-wiremock-extension", "wiremock-extensions-0.4.1-jar-with-dependencies.jar").toFile())); diff --git a/src/test/java/org/wiremock/integrations/testcontainers/WireMockContainerExtensionsCombinationTest.java b/src/test/java/org/wiremock/integrations/testcontainers/WireMockContainerExtensionsCombinationTest.java index 3bba2b8..e6e2bd3 100644 --- a/src/test/java/org/wiremock/integrations/testcontainers/WireMockContainerExtensionsCombinationTest.java +++ b/src/test/java/org/wiremock/integrations/testcontainers/WireMockContainerExtensionsCombinationTest.java @@ -24,6 +24,7 @@ import org.wiremock.integrations.testcontainers.testsupport.http.TestHttpClient; import java.nio.file.Paths; +import java.util.Arrays; import java.util.Collections; import static org.assertj.core.api.Assertions.assertThat; @@ -39,10 +40,11 @@ class WireMockContainerExtensionsCombinationTest { WireMockContainer wiremockServer = new WireMockContainer(TestConfig.WIREMOCK_DEFAULT_IMAGE) .withLogConsumer(new Slf4jLogConsumer(LOGGER)) .withMapping("json-body-transformer", WireMockContainerExtensionsCombinationTest.class, "json-body-transformer.json") - .withExtensions("Webhook", + + .withExtension("Webhook", Collections.singleton("org.wiremock.webhooks.Webhooks"), Collections.singleton(Paths.get("target", "test-wiremock-extension", "wiremock-webhooks-extension-3.5.4.jar").toFile())) - .withExtensions("JSON Body Transformer", + .withExtension("JSON Body Transformer", Collections.singleton("com.ninecookies.wiremock.extensions.JsonBodyTransformer"), Collections.singleton(Paths.get("target", "test-wiremock-extension", "wiremock-extensions-0.4.1-jar-with-dependencies.jar").toFile())); diff --git a/src/test/java/org/wiremock/integrations/testcontainers/wiremock2/WebhooksExtensionTest.java b/src/test/java/org/wiremock/integrations/testcontainers/wiremock2/WebhooksExtensionTest.java index bf1ab27..a9f045e 100644 --- a/src/test/java/org/wiremock/integrations/testcontainers/wiremock2/WebhooksExtensionTest.java +++ b/src/test/java/org/wiremock/integrations/testcontainers/wiremock2/WebhooksExtensionTest.java @@ -59,7 +59,7 @@ class WebhooksExtensionTest { .withLogConsumer(new Slf4jLogConsumer(LOGGER)) .withCliArg("--global-response-templating") .withMapping("webhook-callback-template", WebhooksExtensionTest.class, "webhook-callback-template.json") - .withExtensions("Webhooks", + .withExtension("Webhooks", Collections.singleton("org.wiremock.webhooks.Webhooks"), Collections.singleton(Paths.get("target", "test-wiremock-extension", "wiremock-webhooks-extension-2.35.0.jar").toFile())) .withAccessToHost(true); // Force the host access mechanism diff --git a/src/test/java/org/wiremock/integrations/testcontainers/wiremock2/WireMockContainerExtensionsCombinationTest.java b/src/test/java/org/wiremock/integrations/testcontainers/wiremock2/WireMockContainerExtensionsCombinationTest.java index ea8804a..37d1913 100644 --- a/src/test/java/org/wiremock/integrations/testcontainers/wiremock2/WireMockContainerExtensionsCombinationTest.java +++ b/src/test/java/org/wiremock/integrations/testcontainers/wiremock2/WireMockContainerExtensionsCombinationTest.java @@ -41,10 +41,10 @@ class WireMockContainerExtensionsCombinationTest { WireMockContainer wiremockServer = new WireMockContainer(TestConfig.WIREMOCK_2_IMAGE) .withLogConsumer(new Slf4jLogConsumer(LOGGER)) .withMapping("json-body-transformer", WireMockContainerExtensionsCombinationTest.class, "json-body-transformer.json") - .withExtensions("Webhook", + .withExtension("Webhook", Collections.singleton("org.wiremock.webhooks.Webhooks"), Collections.singleton(Paths.get("target", "test-wiremock-extension", "wiremock-webhooks-extension-2.35.0.jar").toFile())) - .withExtensions("JSON Body Transformer", + .withExtension("JSON Body Transformer", Collections.singleton("com.ninecookies.wiremock.extensions.JsonBodyTransformer"), Collections.singleton(Paths.get("target", "test-wiremock-extension", "wiremock-extensions-0.4.1-jar-with-dependencies.jar").toFile()));