From d4e3fea2c66243b21dfd14399efd33e4f0acfc04 Mon Sep 17 00:00:00 2001 From: AndyGee Date: Thu, 9 May 2019 22:26:46 +0200 Subject: [PATCH 1/7] Fix test for Win & filter tests requiring remote resources & trivial cleanups Flag tests with RequiresRemoteResource to enable filtering Remove unused imports Update junit version Log useful info and error conditions --- .../shrinkwrap/asset/CacheUrlAssetTest.java | 5 +- .../impl/client/CubeDockerConfiguration.java | 11 +-- .../CubeDockerConfigurationResolver.java | 10 ++- .../client/CubeSuiteLifecycleController.java | 6 +- .../client/SystemPropertiesCubeSetter.java | 7 +- .../DockerContainerObjectBuilder.java | 39 ++++------ .../cube/docker/impl/util/Ping.java | 19 +++-- .../impl/client/CubeConfiguratorTest.java | 30 ++++---- .../CubeDockerConfigurationResolverTest.java | 29 ++++--- ...erCustomizableURLResourceProviderTest.java | 1 - .../cube/persistence/UserRepositoryTest.java | 5 +- docker/ftest-docker-junit5/pom.xml | 3 +- .../SystemPropertiesJUnitRuleIT.java | 2 - .../cube/persistence/UserRepositoryTest.java | 3 + docker/junit5/pom.xml | 3 +- .../reporter/TakeDockerEnvironment.java | 44 ++++++----- .../reporter/TakeDockerEnvironmentTest.java | 77 +++++++++++-------- .../reporter/TakeVncDroneVideoTest.java | 10 +-- docs/enrichers.adoc | 4 +- .../build/ResourceGeneratorBuilderIT.java | 7 +- .../impl/DefaultConfigurationTest.java | 6 +- .../cube/kubernetes/impl/PodInjection.java | 3 + .../impl/ReplicationControllerInjection.java | 3 + .../kubernetes/impl/ServiceInjection.java | 3 + .../HelloPodDeploymentOpenShiftITCase.java | 3 +- .../requirement/RequiresRemoteResource.java | 16 ++++ 26 files changed, 205 insertions(+), 144 deletions(-) create mode 100644 requirement-spi/src/main/java/org/arquillian/cube/remote/requirement/RequiresRemoteResource.java diff --git a/core/src/test/java/org/arquillian/cube/impl/shrinkwrap/asset/CacheUrlAssetTest.java b/core/src/test/java/org/arquillian/cube/impl/shrinkwrap/asset/CacheUrlAssetTest.java index b885a644e..ffb13beba 100644 --- a/core/src/test/java/org/arquillian/cube/impl/shrinkwrap/asset/CacheUrlAssetTest.java +++ b/core/src/test/java/org/arquillian/cube/impl/shrinkwrap/asset/CacheUrlAssetTest.java @@ -5,6 +5,7 @@ import java.io.IOException; import java.io.InputStream; import java.net.URL; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -51,7 +52,7 @@ public void shouldGetCachedResult() throws IOException { CacheUrlAsset cacheUrlAsset = new CacheUrlAsset(new URL("http://arquillian.org/images/arq.txt")); CacheUrlAsset.TEMP_LOCATION = newFolder.getAbsolutePath(); final Path path = Paths.get(newFolder.getAbsolutePath(), "arq.txt"); - Files.write(path, "Hello".getBytes("UTF-8")); + Files.write(path, "Hello".getBytes(StandardCharsets.UTF_8)); InputStream is = cacheUrlAsset.openStream(); String content = slurp(is); @@ -62,7 +63,7 @@ public void shouldGetCachedResult() throws IOException { public void shouldDownloadFileIfExpired() throws IOException, InterruptedException { final File newFolder = temporaryFolder.newFolder(); final Path path = Paths.get(newFolder.getAbsolutePath(), "arquillian_crown_icon_glossy_256.png"); - Files.write(path, "invalidchunk".getBytes("UTF-8")); + Files.write(path, "invalidchunk".getBytes(StandardCharsets.UTF_8)); Thread.sleep(3000); CacheUrlAsset cacheUrlAsset = new CacheUrlAsset(new URL("http://arquillian.org/images/arquillian_crown_icon_glossy_256.png"), 2, diff --git a/docker/docker/src/main/java/org/arquillian/cube/docker/impl/client/CubeDockerConfiguration.java b/docker/docker/src/main/java/org/arquillian/cube/docker/impl/client/CubeDockerConfiguration.java index a33c23e02..cf7554a73 100644 --- a/docker/docker/src/main/java/org/arquillian/cube/docker/impl/client/CubeDockerConfiguration.java +++ b/docker/docker/src/main/java/org/arquillian/cube/docker/impl/client/CubeDockerConfiguration.java @@ -1,8 +1,8 @@ package org.arquillian.cube.docker.impl.client; import java.io.File; -import java.io.InputStream; import java.io.IOException; +import java.io.InputStream; import java.net.URI; import java.util.ArrayList; import java.util.List; @@ -37,7 +37,7 @@ public class CubeDockerConfiguration { public static final String CLEAN = "clean"; public static final String REMOVE_VOLUMES = "removeVolumes"; public static final String CLEAN_BUILD_IMAGE = "cleanBuildImage"; - static final String DIND_RESOLUTION = "dockerInsideDockerResolution"; + public static final String DIND_RESOLUTION = "dockerInsideDockerResolution"; private static final String DOCKER_VERSION = "serverVersion"; private static final String USERNAME = "username"; private static final String PASSWORD = "password"; @@ -185,8 +185,8 @@ public static CubeDockerConfiguration fromMap(Map map, Injector if (stream != null) { cubeConfiguration.dockerContainersContent = DockerContainerDefinitionParser.convert( - IOUtil.asStringPreservingNewLines(stream), - cubeConfiguration.definitionFormat); + IOUtil.asStringPreservingNewLines(stream), + cubeConfiguration.definitionFormat); } else { throw new IllegalArgumentException("Resource " + resource + " not found in classpath"); } @@ -379,7 +379,8 @@ public boolean isCleanBuildImage() { return cleanBuildImage; } - @Override public String toString() { + @Override + public String toString() { String lineSeparator = System.lineSeparator(); StringBuilder content = new StringBuilder(); diff --git a/docker/docker/src/main/java/org/arquillian/cube/docker/impl/client/CubeDockerConfigurationResolver.java b/docker/docker/src/main/java/org/arquillian/cube/docker/impl/client/CubeDockerConfigurationResolver.java index 3be89ebc7..e513324e4 100644 --- a/docker/docker/src/main/java/org/arquillian/cube/docker/impl/client/CubeDockerConfigurationResolver.java +++ b/docker/docker/src/main/java/org/arquillian/cube/docker/impl/client/CubeDockerConfigurationResolver.java @@ -29,6 +29,7 @@ import java.util.Optional; import java.util.Random; import java.util.Set; +import java.util.logging.Level; import java.util.logging.Logger; import static org.arquillian.cube.docker.impl.client.CubeDockerConfigurator.DOCKER_HOST; @@ -100,15 +101,18 @@ private Map resolveDownloadDockerMachine(Map con String machineVersion = GitHubUtil.getDockerMachineLatestVersion(); String machineCustomPath = config.get(CubeDockerConfiguration.DOCKER_MACHINE_CUSTOM_PATH); File dockerMachineFile = CubeDockerConfiguration.resolveMachinePath(machineCustomPath, machineVersion); - String dockerMachinePath = dockerMachineFile.getPath(); - boolean dockerMachineFileExist = dockerMachineFile != null && dockerMachineFile.exists(); + boolean dockerMachineFileExist = dockerMachineFile.exists(); + String dockerMachinePath = dockerMachineFile.getPath(); String machineName = config.get(CubeDockerConfiguration.DOCKER_MACHINE_NAME); String machineUrl = CubeDockerConfiguration.resolveUrl(machineVersion); if (!dockerMachineFileExist) { - dockerMachineFile.getParentFile().mkdirs(); + final File parentFile = dockerMachineFile.getParentFile(); + if(!parentFile.exists() && !parentFile.mkdirs()){ + log.log(Level.SEVERE, "Failed to create directory: " + parentFile); + } Spacelift.task(DownloadTool.class) .from(machineUrl) .to(dockerMachineFile) diff --git a/docker/docker/src/main/java/org/arquillian/cube/docker/impl/client/CubeSuiteLifecycleController.java b/docker/docker/src/main/java/org/arquillian/cube/docker/impl/client/CubeSuiteLifecycleController.java index d88d9fa1d..9890abf57 100644 --- a/docker/docker/src/main/java/org/arquillian/cube/docker/impl/client/CubeSuiteLifecycleController.java +++ b/docker/docker/src/main/java/org/arquillian/cube/docker/impl/client/CubeSuiteLifecycleController.java @@ -53,7 +53,7 @@ public class CubeSuiteLifecycleController { private Instance dockerClientExecutor; public void startAutoContainers(@Observes(precedence = 100) BeforeSuite event, CubeConfiguration cubeConfiguration, - CubeDockerConfiguration dockerConfiguration) { + CubeDockerConfiguration dockerConfiguration) { beforeAutoStartEvent.fire(new BeforeAutoStart()); final DockerAutoStartOrder dockerAutoStartOrder = dockerConfiguration.getDockerAutoStartOrder(); List autoStartSteps = dockerAutoStartOrder.getAutoStartOrder(dockerConfiguration); @@ -104,10 +104,10 @@ private void waitForCompletion(Map> stepStatus, try { RuntimeException e = result.getValue().get(); if (e != null) { - Logger.getLogger(CubeSuiteLifecycleController.class.getName()).log(Level.SEVERE, message + ": " + result.getKey(), e); + Logger.getLogger(CubeSuiteLifecycleController.class.getName()).log(Level.SEVERE, message + " - Error starting: " + result.getKey(), e); } } catch (Exception e) { - Logger.getLogger(CubeSuiteLifecycleController.class.getName()).log(Level.SEVERE, message + " process: " + result.getKey(), e); + Logger.getLogger(CubeSuiteLifecycleController.class.getName()).log(Level.SEVERE, message + " - Failed to start: " + result.getKey(), e); } } } diff --git a/docker/docker/src/main/java/org/arquillian/cube/docker/impl/client/SystemPropertiesCubeSetter.java b/docker/docker/src/main/java/org/arquillian/cube/docker/impl/client/SystemPropertiesCubeSetter.java index 5a1144a1d..e8c55bb26 100644 --- a/docker/docker/src/main/java/org/arquillian/cube/docker/impl/client/SystemPropertiesCubeSetter.java +++ b/docker/docker/src/main/java/org/arquillian/cube/docker/impl/client/SystemPropertiesCubeSetter.java @@ -32,8 +32,11 @@ public void createCubeSystemProperties(@Observes AfterStart afterStart, CubeRegi final Binding bindings = cube.bindings(); final String cubePrefix = String.format("%s.%s", PREFIX, cubeId); - System.setProperty(String.format("%s.ip", cubePrefix), bindings.getIP()); - System.setProperty(String.format("%s.internal.ip", cubePrefix), bindings.getInternalIP()); + + final String ip = bindings.getIP(); + final String internalIP = bindings.getInternalIP(); + System.setProperty(String.format("%s.ip", cubePrefix), null != ip ? ip : ""); + System.setProperty(String.format("%s.internal.ip", cubePrefix), null != internalIP ? internalIP : ""); for (Binding.PortBinding portBinding : bindings.getPortBindings()) { final int exposedPort = portBinding.getExposedPort(); diff --git a/docker/docker/src/main/java/org/arquillian/cube/docker/impl/client/containerobject/DockerContainerObjectBuilder.java b/docker/docker/src/main/java/org/arquillian/cube/docker/impl/client/containerobject/DockerContainerObjectBuilder.java index 35df15133..f85e4aba5 100644 --- a/docker/docker/src/main/java/org/arquillian/cube/docker/impl/client/containerobject/DockerContainerObjectBuilder.java +++ b/docker/docker/src/main/java/org/arquillian/cube/docker/impl/client/containerobject/DockerContainerObjectBuilder.java @@ -14,6 +14,7 @@ import java.util.List; import java.util.function.BiFunction; import java.util.function.Consumer; +import java.util.logging.Level; import java.util.logging.Logger; import java.util.stream.Collectors; import org.apache.commons.lang3.ArrayUtils; @@ -83,7 +84,7 @@ public class DockerContainerObjectBuilder { private DockerCube dockerCube; public DockerContainerObjectBuilder(DockerClientExecutor dockerClientExecutor, CubeController cubeController, - CubeRegistry cubeRegistry) { + CubeRegistry cubeRegistry) { this.dockerClientExecutor = dockerClientExecutor; this.cubeController = cubeController; this.cubeRegistry = cubeRegistry; @@ -161,11 +162,8 @@ private static String cubeNameFromCubeAnnotatedField(Field cubeField) { * is stored as part of the metadata of the container object. This object is expected to control the lifecycle of * the container object * - * @param containerObjectContainer - * the container object's container - * + * @param containerObjectContainer the container object's container * @return the current builder instance - * * @see IsContainerObject */ public DockerContainerObjectBuilder withContainerObjectContainer(Object containerObjectContainer) { @@ -176,9 +174,7 @@ public DockerContainerObjectBuilder withContainerObjectContainer(Object conta /** * Specifies the container object class to be instantiated * - * @param containerObjectClass - * container object class to be instantiated - * + * @param containerObjectClass container object class to be instantiated * @return the current builder instance */ public DockerContainerObjectBuilder withContainerObjectClass(Class containerObjectClass) { @@ -247,11 +243,8 @@ public DockerContainerObjectBuilder withContainerObjectClass(Class contain *

* Currently only supports instances of {@link CubeContainerObjectConfiguration} * - * @param configuration - * partial configuration to override default container object cube configuration - * + * @param configuration partial configuration to override default container object cube configuration * @return the current builder instance - * * @see CubeContainerObjectConfiguration * @see CubeContainer */ @@ -274,9 +267,7 @@ public DockerContainerObjectBuilder withContainerObjectConfiguration(Containe /** * Specifies the list of enrichers that will be used to enrich the container object. * - * @param enrichers - * list of enrichers that will be used to enrich the container object - * + * @param enrichers list of enrichers that will be used to enrich the container object * @return the current builder instance */ public DockerContainerObjectBuilder withEnrichers(Collection enrichers) { @@ -292,9 +283,7 @@ public DockerContainerObjectBuilder withEnrichers(Collection en * by the cube controller. Callers must use this callback to register anything necesary for the controller to work * and also if they want to keep an instance of the created cube. * - * @param cubeCreatedCallback - * consumer that will be called when the cube instance is created - * + * @param cubeCreatedCallback consumer that will be called when the cube instance is created * @return the current builder instance */ public DockerContainerObjectBuilder onCubeCreated(Consumer cubeCreatedCallback) { @@ -307,13 +296,9 @@ public DockerContainerObjectBuilder onCubeCreated(Consumer cubeCr * container object, creates the container object and returns it * * @return the created container object - * - * @throws IllegalAccessException - * if there is an error accessing the container object fields - * @throws IOException - * if there is an I/O error while preparing the docker build - * @throws InvocationTargetException - * if there is an error while calling the DockerFile archive creation + * @throws IllegalAccessException if there is an error accessing the container object fields + * @throws IOException if there is an I/O error while preparing the docker build + * @throws InvocationTargetException if there is an error while calling the DockerFile archive creation */ public T build() throws IllegalAccessException, IOException, InvocationTargetException { generatedConfigutation = new CubeContainer(); @@ -519,6 +504,8 @@ private void initializeCube() { } cubeController.create(containerName); cubeController.start(containerName); + logger.log(Level.INFO, "Started container:\n" + + dockerClientExecutor.getDockerClient().inspectContainerCmd(containerName).exec().toString()); } } @@ -534,7 +521,7 @@ private void enrichContainerObjectWithCube() throws IllegalAccessException { } private void enrichAnnotatedPortBuildingFields(Class annotationType, - BiFunction fieldEnricher) throws IllegalAccessException { + BiFunction fieldEnricher) throws IllegalAccessException { final List annotatedFields = ReflectionUtil.getFieldsWithAnnotation(containerObjectClass, annotationType); if (annotatedFields.isEmpty()) return; diff --git a/docker/docker/src/main/java/org/arquillian/cube/docker/impl/util/Ping.java b/docker/docker/src/main/java/org/arquillian/cube/docker/impl/util/Ping.java index 67c227b04..2c484fc0c 100644 --- a/docker/docker/src/main/java/org/arquillian/cube/docker/impl/util/Ping.java +++ b/docker/docker/src/main/java/org/arquillian/cube/docker/impl/util/Ping.java @@ -1,12 +1,13 @@ package org.arquillian.cube.docker.impl.util; +import org.arquillian.cube.docker.impl.docker.DockerClientExecutor; +import org.arquillian.cube.spi.CubeOutput; + import java.io.IOException; import java.net.Socket; import java.net.UnknownHostException; import java.util.Arrays; import java.util.concurrent.TimeUnit; -import org.arquillian.cube.docker.impl.docker.DockerClientExecutor; -import org.arquillian.cube.spi.CubeOutput; public final class Ping { @@ -17,19 +18,23 @@ private Ping() { } public static boolean ping(int totalIterations, long sleep, TimeUnit timeUnit, PingCommand command) { - boolean result = false; + boolean result; + boolean loop; int iteration = 0; do { result = command.call(); - if (!result) { - iteration++; + iteration++; + loop = !result && iteration < totalIterations; + if (loop) { try { timeUnit.sleep(sleep); - } catch (InterruptedException e) { + } catch (InterruptedException ignore) { + break; } } - } while (!result && iteration < totalIterations); + + } while (loop); return result; } diff --git a/docker/docker/src/test/java/org/arquillian/cube/docker/impl/client/CubeConfiguratorTest.java b/docker/docker/src/test/java/org/arquillian/cube/docker/impl/client/CubeConfiguratorTest.java index 83207fad0..1e144734d 100644 --- a/docker/docker/src/test/java/org/arquillian/cube/docker/impl/client/CubeConfiguratorTest.java +++ b/docker/docker/src/test/java/org/arquillian/cube/docker/impl/client/CubeConfiguratorTest.java @@ -1,10 +1,17 @@ package org.arquillian.cube.docker.impl.client; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.PrintStream; +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import org.apache.commons.lang.SystemUtils; import org.arquillian.cube.docker.impl.util.Boot2Docker; import org.arquillian.cube.docker.impl.util.CommandLineExecutor; import org.arquillian.cube.docker.impl.util.DockerMachine; -import org.arquillian.cube.docker.impl.util.OperatingSystem; import org.arquillian.cube.docker.impl.util.OperatingSystemFamily; import org.arquillian.cube.docker.impl.util.OperatingSystemFamilyInterface; import org.arquillian.cube.docker.impl.util.OperatingSystemInterface; @@ -15,7 +22,6 @@ import org.hamcrest.core.StringEndsWith; import org.jboss.arquillian.config.descriptor.api.ArquillianDescriptor; import org.jboss.arquillian.config.descriptor.api.ExtensionDef; -import org.jboss.arquillian.core.api.InstanceProducer; import org.jboss.arquillian.core.api.annotation.ApplicationScoped; import org.jboss.arquillian.core.test.AbstractManagerTestBase; import org.junit.Assume; @@ -25,20 +31,16 @@ import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; -import java.io.ByteArrayOutputStream; -import java.io.PrintStream; -import java.nio.file.Paths; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static org.hamcrest.CoreMatchers.*; +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.collection.IsMapContaining.hasEntry; import static org.hamcrest.collection.IsMapContaining.hasKey; import static org.junit.Assert.assertThat; import static org.junit.Assume.assumeThat; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) public class CubeConfiguratorTest extends AbstractManagerTestBase { @@ -57,11 +59,11 @@ public class CubeConfiguratorTest extends AbstractManagerTestBase { Top top; private static Matcher defaultDockerMachineCertPath() { - return containsString(".docker/machine/machines"); + return containsString(".docker" + File.separator + "machine" + File.separator + "machines"); } private static Matcher defaultBootToDockerCertPath() { - return containsString(".boot2docker/certs"); + return containsString(".boot2docker" + File.separator + "certs"); } private static Matcher pathEndsWith(String suffix) { diff --git a/docker/docker/src/test/java/org/arquillian/cube/docker/impl/client/CubeDockerConfigurationResolverTest.java b/docker/docker/src/test/java/org/arquillian/cube/docker/impl/client/CubeDockerConfigurationResolverTest.java index 2d89e049d..2df3200b6 100644 --- a/docker/docker/src/test/java/org/arquillian/cube/docker/impl/client/CubeDockerConfigurationResolverTest.java +++ b/docker/docker/src/test/java/org/arquillian/cube/docker/impl/client/CubeDockerConfigurationResolverTest.java @@ -1,17 +1,21 @@ package org.arquillian.cube.docker.impl.client; +import javax.ws.rs.ProcessingException; +import java.net.URL; +import java.util.HashMap; +import java.util.Map; import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.command.InfoCmd; import com.github.dockerjava.api.model.Info; -import javax.ws.rs.ProcessingException; -import org.arquillian.cube.docker.impl.docker.DockerClientExecutor; import org.arquillian.cube.docker.impl.util.Boot2Docker; import org.arquillian.cube.docker.impl.util.CommandLineExecutor; import org.arquillian.cube.docker.impl.util.DefaultDocker; import org.arquillian.cube.docker.impl.util.DockerMachine; import org.arquillian.cube.docker.impl.util.OperatingSystem; +import org.arquillian.cube.docker.impl.util.OperatingSystemFamily; import org.arquillian.cube.docker.impl.util.OperatingSystemFamilyInterface; import org.arquillian.cube.docker.impl.util.OperatingSystemInterface; +import org.arquillian.cube.docker.impl.util.OperatingSystemResolver; import org.arquillian.cube.docker.impl.util.Top; import org.junit.Test; import org.junit.runner.RunWith; @@ -19,11 +23,6 @@ import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; -import java.net.URL; -import java.util.HashMap; -import java.util.Map; - -import static org.hamcrest.CoreMatchers.any; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.nullValue; import static org.junit.Assert.assertThat; @@ -73,9 +72,14 @@ public void shouldDetectsValidDockerDefault() throws Exception { when(info.getName()).thenReturn("docker-ce"); when(info.getServerVersion()).thenReturn("arquillian-test"); when(info.getKernelVersion()).thenReturn("0.0.0"); - URL sockURL = this.getClass().getClassLoader().getResource("docker.sock"); + final URL sockURL = this.getClass().getClassLoader().getResource("docker.sock"); + + boolean isWindows = new OperatingSystemResolver().currentOperatingSystem().getFamily() == OperatingSystemFamily.WINDOWS; + + //file:/C:/Users/kt26ph/GitHub/arquillian/arquillian-cube-pxc/docker/docker/target/test-classes/docker.sock + - String sockUri = "unix://" + sockURL; + String sockUri = isWindows ?sockURL.toExternalForm().replace("file:/", "") : "unix://" + sockURL.toExternalForm(); when(defaultOperatingSystemFamilyInterface.getServerUri()).thenReturn(sockUri); when(operatingSystemInterface.getDefaultFamily()).thenReturn(defaultOperatingSystemFamilyInterface); when(operatingSystemInterface.getFamily()).thenReturn(OperatingSystem.MAC_OSX.getFamily()); @@ -84,8 +88,11 @@ public void shouldDetectsValidDockerDefault() throws Exception { Map resolvedConfig = resolver.resolve(config); - assertThat(Boolean.valueOf(resolvedConfig.get(CubeDockerConfiguration.TLS_VERIFY)), is(false)); - assertThat(resolvedConfig.get(CubeDockerConfiguration.CERT_PATH), is(nullValue())); + if(!isWindows){ + assertThat(Boolean.valueOf(resolvedConfig.get(CubeDockerConfiguration.TLS_VERIFY)), is(false)); + assertThat(resolvedConfig.get(CubeDockerConfiguration.CERT_PATH), is(nullValue())); + } + assertThat(resolvedConfig.get(CubeDockerConfiguration.DOCKER_URI), is(sockUri)); } diff --git a/docker/drone/src/test/java/org/arquillian/cube/docker/graphene/location/CubeDockerCustomizableURLResourceProviderTest.java b/docker/drone/src/test/java/org/arquillian/cube/docker/graphene/location/CubeDockerCustomizableURLResourceProviderTest.java index 0a0233638..396dfb883 100644 --- a/docker/drone/src/test/java/org/arquillian/cube/docker/graphene/location/CubeDockerCustomizableURLResourceProviderTest.java +++ b/docker/drone/src/test/java/org/arquillian/cube/docker/graphene/location/CubeDockerCustomizableURLResourceProviderTest.java @@ -1,7 +1,6 @@ package org.arquillian.cube.docker.graphene.location; import java.net.URL; -import org.arquillian.cube.docker.drone.SeleniumContainers; import org.arquillian.cube.docker.impl.client.CubeDockerConfiguration; import org.arquillian.cube.docker.impl.client.config.DockerCompositions; import org.arquillian.cube.docker.impl.util.ConfigUtil; diff --git a/docker/ftest-boot2docker/src/test/java/org/arquillian/cube/persistence/UserRepositoryTest.java b/docker/ftest-boot2docker/src/test/java/org/arquillian/cube/persistence/UserRepositoryTest.java index b3ae1e7f8..dd1d1cb96 100644 --- a/docker/ftest-boot2docker/src/test/java/org/arquillian/cube/persistence/UserRepositoryTest.java +++ b/docker/ftest-boot2docker/src/test/java/org/arquillian/cube/persistence/UserRepositoryTest.java @@ -1,7 +1,8 @@ package org.arquillian.cube.persistence; -import java.io.IOException; import javax.inject.Inject; +import java.io.IOException; +import org.arquillian.cube.remote.requirement.RequiresRemoteResource; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.junit.Arquillian; import org.jboss.shrinkwrap.api.ShrinkWrap; @@ -9,9 +10,11 @@ import org.jboss.shrinkwrap.api.asset.StringAsset; import org.jboss.shrinkwrap.api.spec.WebArchive; import org.junit.Test; +import org.junit.experimental.categories.Category; import org.junit.runner.RunWith; @RunWith(Arquillian.class) +@Category({RequiresRemoteResource.class}) public class UserRepositoryTest { @Inject diff --git a/docker/ftest-docker-junit5/pom.xml b/docker/ftest-docker-junit5/pom.xml index 86354c7bb..9d7d6d8cc 100644 --- a/docker/ftest-docker-junit5/pom.xml +++ b/docker/ftest-docker-junit5/pom.xml @@ -26,12 +26,11 @@ maven-surefire-plugin - 2.19.1 org.junit.platform junit-platform-surefire-provider - 1.0.2 + 1.3.2 diff --git a/docker/ftest-system-properties/src/test/java/org/arquillian/cube/docker/systemproperties/SystemPropertiesJUnitRuleIT.java b/docker/ftest-system-properties/src/test/java/org/arquillian/cube/docker/systemproperties/SystemPropertiesJUnitRuleIT.java index 7d92168ae..c54374c55 100644 --- a/docker/ftest-system-properties/src/test/java/org/arquillian/cube/docker/systemproperties/SystemPropertiesJUnitRuleIT.java +++ b/docker/ftest-system-properties/src/test/java/org/arquillian/cube/docker/systemproperties/SystemPropertiesJUnitRuleIT.java @@ -4,13 +4,11 @@ import org.arquillian.cube.docker.impl.requirement.RequiresDocker; import org.arquillian.cube.docker.impl.requirement.RequiresDockerMachine; import org.arquillian.cube.docker.junit.rule.ContainerDslRule; -import org.arquillian.cube.requirement.ArquillianConditionalRunner; import org.arquillian.cube.requirement.RequirementRule; import org.junit.ClassRule; import org.junit.Rule; import org.junit.Test; import org.junit.experimental.categories.Category; -import org.junit.runner.RunWith; import static org.assertj.core.api.Assertions.assertThat; diff --git a/docker/ftest/src/test/java/org/arquillian/cube/persistence/UserRepositoryTest.java b/docker/ftest/src/test/java/org/arquillian/cube/persistence/UserRepositoryTest.java index b3ae1e7f8..15def19f0 100644 --- a/docker/ftest/src/test/java/org/arquillian/cube/persistence/UserRepositoryTest.java +++ b/docker/ftest/src/test/java/org/arquillian/cube/persistence/UserRepositoryTest.java @@ -2,6 +2,7 @@ import java.io.IOException; import javax.inject.Inject; +import org.arquillian.cube.remote.requirement.RequiresRemoteResource; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.junit.Arquillian; import org.jboss.shrinkwrap.api.ShrinkWrap; @@ -9,9 +10,11 @@ import org.jboss.shrinkwrap.api.asset.StringAsset; import org.jboss.shrinkwrap.api.spec.WebArchive; import org.junit.Test; +import org.junit.experimental.categories.Category; import org.junit.runner.RunWith; @RunWith(Arquillian.class) +@Category({RequiresRemoteResource.class}) public class UserRepositoryTest { @Inject diff --git a/docker/junit5/pom.xml b/docker/junit5/pom.xml index a4012d2b3..25fa12a1b 100644 --- a/docker/junit5/pom.xml +++ b/docker/junit5/pom.xml @@ -39,12 +39,11 @@ maven-surefire-plugin - 2.19.1 org.junit.platform junit-platform-surefire-provider - 1.0.2 + 1.3.2 diff --git a/docker/reporter/src/main/java/org/arquillian/cube/docker/impl/client/reporter/TakeDockerEnvironment.java b/docker/reporter/src/main/java/org/arquillian/cube/docker/impl/client/reporter/TakeDockerEnvironment.java index 1045f7e72..2d43b7be7 100644 --- a/docker/reporter/src/main/java/org/arquillian/cube/docker/impl/client/reporter/TakeDockerEnvironment.java +++ b/docker/reporter/src/main/java/org/arquillian/cube/docker/impl/client/reporter/TakeDockerEnvironment.java @@ -1,5 +1,21 @@ package org.arquillian.cube.docker.impl.client.reporter; +import javax.imageio.ImageIO; +import javax.swing.*; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.logging.Level; +import java.util.logging.Logger; import com.github.dockerjava.api.command.InspectContainerResponse; import com.github.dockerjava.api.model.Version; import com.mxgraph.layout.hierarchical.mxHierarchicalLayout; @@ -27,24 +43,16 @@ import org.jboss.arquillian.test.spi.event.suite.After; import org.jboss.arquillian.test.spi.event.suite.Before; -import javax.imageio.ImageIO; -import javax.swing.*; -import java.awt.*; -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.logging.Level; -import java.util.logging.Logger; - -import static org.arquillian.cube.docker.impl.client.reporter.DockerEnvironmentReportKey.*; +import static org.arquillian.cube.docker.impl.client.reporter.DockerEnvironmentReportKey.DOCKER_API_VERSION; +import static org.arquillian.cube.docker.impl.client.reporter.DockerEnvironmentReportKey.DOCKER_ARCH; +import static org.arquillian.cube.docker.impl.client.reporter.DockerEnvironmentReportKey.DOCKER_COMPOSITION_SCHEMA; +import static org.arquillian.cube.docker.impl.client.reporter.DockerEnvironmentReportKey.DOCKER_ENVIRONMENT; +import static org.arquillian.cube.docker.impl.client.reporter.DockerEnvironmentReportKey.DOCKER_HOST_INFORMATION; +import static org.arquillian.cube.docker.impl.client.reporter.DockerEnvironmentReportKey.DOCKER_KERNEL; +import static org.arquillian.cube.docker.impl.client.reporter.DockerEnvironmentReportKey.DOCKER_OS; +import static org.arquillian.cube.docker.impl.client.reporter.DockerEnvironmentReportKey.DOCKER_VERSION; +import static org.arquillian.cube.docker.impl.client.reporter.DockerEnvironmentReportKey.LOG_PATH; +import static org.arquillian.cube.docker.impl.client.reporter.DockerEnvironmentReportKey.NETWORK_TOPOLOGY_SCHEMA; /** * Class that reports generic Docker information like orchestration or docker version. diff --git a/docker/reporter/src/test/java/org/arquillian/cube/docker/impl/client/reporter/TakeDockerEnvironmentTest.java b/docker/reporter/src/test/java/org/arquillian/cube/docker/impl/client/reporter/TakeDockerEnvironmentTest.java index f91264b3d..7bf2dc7a2 100644 --- a/docker/reporter/src/test/java/org/arquillian/cube/docker/impl/client/reporter/TakeDockerEnvironmentTest.java +++ b/docker/reporter/src/test/java/org/arquillian/cube/docker/impl/client/reporter/TakeDockerEnvironmentTest.java @@ -1,11 +1,19 @@ package org.arquillian.cube.docker.impl.client.reporter; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; import com.github.dockerjava.api.model.Statistics; import com.github.dockerjava.api.model.Version; import org.arquillian.cube.docker.impl.client.CubeDockerConfiguration; import org.arquillian.cube.docker.impl.client.DefinitionFormat; import org.arquillian.cube.docker.impl.docker.DockerClientExecutor; import org.arquillian.cube.impl.model.LocalCubeRegistry; +import org.arquillian.cube.remote.requirement.RequiresRemoteResource; import org.arquillian.cube.spi.Cube; import org.arquillian.cube.spi.CubeRegistry; import org.arquillian.cube.spi.event.lifecycle.AfterAutoStart; @@ -21,30 +29,38 @@ import org.jboss.arquillian.core.api.Event; import org.junit.Before; import org.junit.Test; +import org.junit.experimental.categories.Category; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; -import java.io.IOException; -import java.util.*; - -import static org.arquillian.cube.docker.impl.client.reporter.DockerEnvironmentReportKey.*; +import static org.arquillian.cube.docker.impl.client.reporter.DockerEnvironmentReportKey.DOCKER_API_VERSION; +import static org.arquillian.cube.docker.impl.client.reporter.DockerEnvironmentReportKey.DOCKER_ARCH; +import static org.arquillian.cube.docker.impl.client.reporter.DockerEnvironmentReportKey.DOCKER_COMPOSITION_SCHEMA; +import static org.arquillian.cube.docker.impl.client.reporter.DockerEnvironmentReportKey.DOCKER_ENVIRONMENT; +import static org.arquillian.cube.docker.impl.client.reporter.DockerEnvironmentReportKey.DOCKER_HOST_INFORMATION; +import static org.arquillian.cube.docker.impl.client.reporter.DockerEnvironmentReportKey.DOCKER_KERNEL; +import static org.arquillian.cube.docker.impl.client.reporter.DockerEnvironmentReportKey.DOCKER_OS; +import static org.arquillian.cube.docker.impl.client.reporter.DockerEnvironmentReportKey.DOCKER_VERSION; +import static org.arquillian.cube.docker.impl.client.reporter.DockerEnvironmentReportKey.LOG_PATH; +import static org.arquillian.cube.docker.impl.client.reporter.DockerEnvironmentReportKey.NETWORK_TOPOLOGY_SCHEMA; import static org.arquillian.reporter.impl.asserts.ReportAssert.assertThatReport; import static org.arquillian.reporter.impl.asserts.SectionAssert.assertThatSection; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) +@Category({RequiresRemoteResource.class}) public class TakeDockerEnvironmentTest { private static final String MULTIPLE_PORT_BINDING_SCENARIO = - "helloworld:\n" + - " image: dockercloud/hello-world\n" + - " exposedPorts: [8089/tcp]\n" + - " networkMode: host\n" + - " portBindings: [8080->80/tcp, 8081->81/tcp]"; + "helloworld:\n" + + " image: dockercloud/hello-world\n" + + " exposedPorts: [8089/tcp]\n" + + " networkMode: host\n" + + " portBindings: [8080->80/tcp, 8081->81/tcp]"; private static final String CUBE_ID = "tomcat"; @@ -71,6 +87,7 @@ public class TakeDockerEnvironmentTest { @Before public void setUpCubeDockerExecutorAndBuilder() throws IOException { + when(dockerClientExecutor.isDockerInsideDockerResolution()).thenReturn(true); configureDockerExecutor(); configureCube(); BuilderLoader.load(); @@ -115,21 +132,21 @@ public void should_report_docker_info() { final SectionEvent sectionEvent = reportEventArgumentCaptor.getValue(); assertThatSection(sectionEvent) - .hasSectionId(Standalone.getStandaloneId()) - .hasReportOfTypeThatIsAssignableFrom(BasicReport.class); + .hasSectionId(Standalone.getStandaloneId()) + .hasReportOfTypeThatIsAssignableFrom(BasicReport.class); final Report report = sectionEvent.getReport(); final List subReports = report.getSubReports(); assertThatReport(subReports.get(0)) - .hasName(DOCKER_HOST_INFORMATION) - .hasNumberOfEntries(5) - .hasEntriesContaining( - new KeyValueEntry(DOCKER_VERSION, "1.1.0"), - new KeyValueEntry(DOCKER_OS, "linux"), - new KeyValueEntry(DOCKER_KERNEL, "3.1.0"), - new KeyValueEntry(DOCKER_API_VERSION, "1.12"), - new KeyValueEntry(DOCKER_ARCH, "x86")); + .hasName(DOCKER_HOST_INFORMATION) + .hasNumberOfEntries(5) + .hasEntriesContaining( + new KeyValueEntry(DOCKER_VERSION, "1.1.0"), + new KeyValueEntry(DOCKER_OS, "linux"), + new KeyValueEntry(DOCKER_KERNEL, "3.1.0"), + new KeyValueEntry(DOCKER_API_VERSION, "1.12"), + new KeyValueEntry(DOCKER_ARCH, "x86")); } @@ -142,17 +159,17 @@ public void should_report_schema_of_docker_composition_and_network_topology() { final SectionEvent sectionEvent = reportEventArgumentCaptor.getValue(); assertThatSection(sectionEvent) - .hasSectionId(Standalone.getStandaloneId()) - .hasReportOfTypeThatIsAssignableFrom(BasicReport.class); + .hasSectionId(Standalone.getStandaloneId()) + .hasReportOfTypeThatIsAssignableFrom(BasicReport.class); final Report report = sectionEvent.getReport(); assertThatReport(report) - .hasName(DOCKER_ENVIRONMENT) - .hasNumberOfSubReports(1) - .hasEntriesContaining( - new KeyValueEntry(DOCKER_COMPOSITION_SCHEMA, new FileEntry("reports/schemas/docker_composition.png")), - new KeyValueEntry(NETWORK_TOPOLOGY_SCHEMA, new FileEntry("reports/networks/docker_network_topology.png"))); + .hasName(DOCKER_ENVIRONMENT) + .hasNumberOfSubReports(1) + .hasEntriesContaining( + new KeyValueEntry(DOCKER_COMPOSITION_SCHEMA, new FileEntry("reports" + File.separatorChar + "schemas" + File.separatorChar + "docker_composition.png")), + new KeyValueEntry(NETWORK_TOPOLOGY_SCHEMA, new FileEntry("reports" + File.separatorChar + "networks" + File.separatorChar + "docker_network_topology.png"))); } @Test @@ -166,14 +183,14 @@ public void should_report_log_file() throws IOException { final SectionEvent sectionEvent = reportEventArgumentCaptor.getValue(); assertThatSection(sectionEvent) - .hasSectionId(CUBE_ID) - .hasReportOfTypeThatIsAssignableFrom(BasicReport.class); + .hasSectionId(CUBE_ID) + .hasReportOfTypeThatIsAssignableFrom(BasicReport.class); final Report report = sectionEvent.getReport(); assertThatReport(report) - .hasNumberOfEntries(1) - .hasEntriesContaining(new KeyValueEntry(LOG_PATH, new FileEntry("reports/logs/tomcat.log"))); + .hasNumberOfEntries(1) + .hasEntriesContaining(new KeyValueEntry(LOG_PATH, new FileEntry("reports" + File.separatorChar + "logs" + File.separatorChar + "tomcat.log"))); } /* @Test diff --git a/docker/reporter/src/test/java/org/arquillian/cube/docker/impl/client/reporter/TakeVncDroneVideoTest.java b/docker/reporter/src/test/java/org/arquillian/cube/docker/impl/client/reporter/TakeVncDroneVideoTest.java index bf2c23127..fe6350d0a 100644 --- a/docker/reporter/src/test/java/org/arquillian/cube/docker/impl/client/reporter/TakeVncDroneVideoTest.java +++ b/docker/reporter/src/test/java/org/arquillian/cube/docker/impl/client/reporter/TakeVncDroneVideoTest.java @@ -1,5 +1,9 @@ package org.arquillian.cube.docker.impl.client.reporter; +import java.io.File; +import java.lang.reflect.Method; +import java.nio.file.Paths; +import java.util.LinkedHashMap; import org.arquillian.cube.docker.drone.event.AfterVideoRecorded; import org.arquillian.reporter.api.builder.BuilderLoader; import org.arquillian.reporter.api.event.SectionEvent; @@ -18,10 +22,6 @@ import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; -import java.lang.reflect.Method; -import java.nio.file.Paths; -import java.util.LinkedHashMap; - import static org.arquillian.reporter.impl.asserts.ReportAssert.assertThatReport; import static org.arquillian.reporter.impl.asserts.SectionAssert.assertThatSection; import static org.mockito.Mockito.verify; @@ -97,7 +97,7 @@ public void should_create_video_from_surefire_report_directory() throws NoSuchMe assertThatReport(report) .hasName(methodName) .hasNumberOfEntries(1) - .hasEntriesContaining(new KeyValueEntry(DockerEnvironmentReportKey.VIDEO_PATH, new FileEntry("surefire-report/myvideo.mp4"))); + .hasEntriesContaining(new KeyValueEntry(DockerEnvironmentReportKey.VIDEO_PATH, new FileEntry("surefire-report" + File.separatorChar + "myvideo.mp4"))); } private ReporterConfiguration getReporterConfiguration() { diff --git a/docs/enrichers.adoc b/docs/enrichers.adoc index c21b36a67..57f656d2f 100644 --- a/docs/enrichers.adoc +++ b/docs/enrichers.adoc @@ -110,8 +110,8 @@ URL will be `http://:/` === Docker Inside Docker / Docker On Docker -If you are running your tests inside your continuous integration/delivery server (for example in Jenkins) and at the same time the server is running inside Docker. Then the docker containers started for Cube are run inside a Docker container. -So you effectively face the Docker inside Docker problem. +If you are running your tests on your continuous integration/delivery server (for example on Jenkins or GitLab runners) and at the same time the server is running inside Docker. Then the docker containers started for Cube are run inside a Docker container. +So you effectively face the Docker inside Docker problem - DockerHost is **not** the machine where your test is running. From Arquillian Cube perspective we cannot do a lot of things, more then adapting to this situation by changing the `serverUri`. Basically it ignores any `SERVER_URI`, `Boot2Docker` or `docker-machine` properties and sets the `serverUri` to `unix:///var/run/docker.sock`. diff --git a/fabric8-maven-plugin-build/src/test/java/org/fabric8/maven/plugin/build/ResourceGeneratorBuilderIT.java b/fabric8-maven-plugin-build/src/test/java/org/fabric8/maven/plugin/build/ResourceGeneratorBuilderIT.java index 95a217291..9332fe393 100644 --- a/fabric8-maven-plugin-build/src/test/java/org/fabric8/maven/plugin/build/ResourceGeneratorBuilderIT.java +++ b/fabric8-maven-plugin-build/src/test/java/org/fabric8/maven/plugin/build/ResourceGeneratorBuilderIT.java @@ -1,7 +1,5 @@ package org.fabric8.maven.plugin.build; -import io.fabric8.kubernetes.client.DefaultKubernetesClient; -import io.fabric8.kubernetes.client.KubernetesClient; import java.io.File; import java.io.IOException; import java.nio.file.Files; @@ -9,7 +7,10 @@ import java.nio.file.Paths; import java.util.List; import java.util.stream.Collectors; +import io.fabric8.kubernetes.client.DefaultKubernetesClient; +import io.fabric8.kubernetes.client.KubernetesClient; import org.arquillian.cube.openshift.impl.requirement.RequiresOpenshift; +import org.arquillian.cube.remote.requirement.RequiresRemoteResource; import org.junit.After; import org.junit.Before; import org.junit.Rule; @@ -22,7 +23,7 @@ // If you want to run it from the IDE against latest code changes you have to set system property `arquillian-cube.version` with latest project.version. -@Category(RequiresOpenshift.class) +@Category({RequiresOpenshift.class, RequiresRemoteResource.class}) @RequiresOpenshift public class ResourceGeneratorBuilderIT { diff --git a/kubernetes/kubernetes/src/test/java/org/arquillian/cube/kubernetes/impl/DefaultConfigurationTest.java b/kubernetes/kubernetes/src/test/java/org/arquillian/cube/kubernetes/impl/DefaultConfigurationTest.java index 7f3919f17..5cc6f6e3e 100644 --- a/kubernetes/kubernetes/src/test/java/org/arquillian/cube/kubernetes/impl/DefaultConfigurationTest.java +++ b/kubernetes/kubernetes/src/test/java/org/arquillian/cube/kubernetes/impl/DefaultConfigurationTest.java @@ -1,11 +1,9 @@ package org.arquillian.cube.kubernetes.impl; -import org.junit.Test; - -import java.util.HashMap; import java.util.Map; +import org.junit.Test; -import static org.assertj.core.api.Assertions.*; +import static org.assertj.core.api.Assertions.assertThat; public class DefaultConfigurationTest { diff --git a/kubernetes/kubernetes/src/test/java/org/arquillian/cube/kubernetes/impl/PodInjection.java b/kubernetes/kubernetes/src/test/java/org/arquillian/cube/kubernetes/impl/PodInjection.java index c0bc40052..333b20b15 100644 --- a/kubernetes/kubernetes/src/test/java/org/arquillian/cube/kubernetes/impl/PodInjection.java +++ b/kubernetes/kubernetes/src/test/java/org/arquillian/cube/kubernetes/impl/PodInjection.java @@ -19,15 +19,18 @@ import io.fabric8.kubernetes.api.model.PodList; import io.fabric8.kubernetes.client.KubernetesClient; import org.arquillian.cube.kubernetes.annotations.Named; +import org.arquillian.cube.kubernetes.impl.requirement.RequiresKubernetes; import org.jboss.arquillian.junit.Arquillian; import org.jboss.arquillian.test.api.ArquillianResource; import org.junit.Test; +import org.junit.experimental.categories.Category; import org.junit.runner.RunWith; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @RunWith(Arquillian.class) +@Category({RequiresKubernetes.class}) public class PodInjection { @ArquillianResource diff --git a/kubernetes/kubernetes/src/test/java/org/arquillian/cube/kubernetes/impl/ReplicationControllerInjection.java b/kubernetes/kubernetes/src/test/java/org/arquillian/cube/kubernetes/impl/ReplicationControllerInjection.java index 752dc1fe3..ff08a5c1f 100644 --- a/kubernetes/kubernetes/src/test/java/org/arquillian/cube/kubernetes/impl/ReplicationControllerInjection.java +++ b/kubernetes/kubernetes/src/test/java/org/arquillian/cube/kubernetes/impl/ReplicationControllerInjection.java @@ -19,15 +19,18 @@ import io.fabric8.kubernetes.api.model.ReplicationControllerList; import io.fabric8.kubernetes.client.KubernetesClient; import org.arquillian.cube.kubernetes.annotations.Named; +import org.arquillian.cube.kubernetes.impl.requirement.RequiresKubernetes; import org.jboss.arquillian.junit.Arquillian; import org.jboss.arquillian.test.api.ArquillianResource; import org.junit.Test; +import org.junit.experimental.categories.Category; import org.junit.runner.RunWith; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @RunWith(Arquillian.class) +@Category({RequiresKubernetes.class}) public class ReplicationControllerInjection { @ArquillianResource diff --git a/kubernetes/kubernetes/src/test/java/org/arquillian/cube/kubernetes/impl/ServiceInjection.java b/kubernetes/kubernetes/src/test/java/org/arquillian/cube/kubernetes/impl/ServiceInjection.java index fd2d160af..693436622 100644 --- a/kubernetes/kubernetes/src/test/java/org/arquillian/cube/kubernetes/impl/ServiceInjection.java +++ b/kubernetes/kubernetes/src/test/java/org/arquillian/cube/kubernetes/impl/ServiceInjection.java @@ -19,15 +19,18 @@ import io.fabric8.kubernetes.api.model.ServiceList; import io.fabric8.kubernetes.client.KubernetesClient; import org.arquillian.cube.kubernetes.annotations.Named; +import org.arquillian.cube.kubernetes.impl.requirement.RequiresKubernetes; import org.jboss.arquillian.junit.Arquillian; import org.jboss.arquillian.test.api.ArquillianResource; import org.junit.Test; +import org.junit.experimental.categories.Category; import org.junit.runner.RunWith; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @RunWith(Arquillian.class) +@Category({RequiresKubernetes.class}) public class ServiceInjection { @ArquillianResource diff --git a/openshift/ftest/src/test/java/org/arquillian/cube/openshift/ftest/HelloPodDeploymentOpenShiftITCase.java b/openshift/ftest/src/test/java/org/arquillian/cube/openshift/ftest/HelloPodDeploymentOpenShiftITCase.java index 721be1665..9fb1f4721 100644 --- a/openshift/ftest/src/test/java/org/arquillian/cube/openshift/ftest/HelloPodDeploymentOpenShiftITCase.java +++ b/openshift/ftest/src/test/java/org/arquillian/cube/openshift/ftest/HelloPodDeploymentOpenShiftITCase.java @@ -2,6 +2,7 @@ import java.net.URL; import org.arquillian.cube.openshift.impl.requirement.RequiresOpenshift; +import org.arquillian.cube.remote.requirement.RequiresRemoteResource; import org.arquillian.cube.requirement.ArquillianConditionalRunner; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.test.api.ArquillianResource; @@ -13,7 +14,7 @@ import org.junit.experimental.categories.Category; import org.junit.runner.RunWith; -@Category(RequiresOpenshift.class) +@Category({RequiresOpenshift.class, RequiresRemoteResource.class}) @RequiresOpenshift @RunWith(ArquillianConditionalRunner.class) public class HelloPodDeploymentOpenShiftITCase { diff --git a/requirement-spi/src/main/java/org/arquillian/cube/remote/requirement/RequiresRemoteResource.java b/requirement-spi/src/main/java/org/arquillian/cube/remote/requirement/RequiresRemoteResource.java new file mode 100644 index 000000000..9956811d4 --- /dev/null +++ b/requirement-spi/src/main/java/org/arquillian/cube/remote/requirement/RequiresRemoteResource.java @@ -0,0 +1,16 @@ +package org.arquillian.cube.remote.requirement; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import org.arquillian.cube.spi.requirement.Constraint; +import org.arquillian.cube.spi.requirement.Requires; + +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE, ElementType.METHOD}) +@Requires(Constraint.class) +public @interface RequiresRemoteResource { + + String name() default ""; +} From 09016e4d56714c2d164a393f3dbee9d66bcc5d65 Mon Sep 17 00:00:00 2001 From: AndyGee Date: Sun, 12 May 2019 10:18:51 +0200 Subject: [PATCH 2/7] Remove mocked method for now. --- .../docker/impl/client/reporter/TakeDockerEnvironmentTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/docker/reporter/src/test/java/org/arquillian/cube/docker/impl/client/reporter/TakeDockerEnvironmentTest.java b/docker/reporter/src/test/java/org/arquillian/cube/docker/impl/client/reporter/TakeDockerEnvironmentTest.java index 7bf2dc7a2..cf9796983 100644 --- a/docker/reporter/src/test/java/org/arquillian/cube/docker/impl/client/reporter/TakeDockerEnvironmentTest.java +++ b/docker/reporter/src/test/java/org/arquillian/cube/docker/impl/client/reporter/TakeDockerEnvironmentTest.java @@ -87,7 +87,6 @@ public class TakeDockerEnvironmentTest { @Before public void setUpCubeDockerExecutorAndBuilder() throws IOException { - when(dockerClientExecutor.isDockerInsideDockerResolution()).thenReturn(true); configureDockerExecutor(); configureCube(); BuilderLoader.load(); From fc6790e2557d27ac91209d887f140da6d46bee17 Mon Sep 17 00:00:00 2001 From: AndyGee Date: Sun, 12 May 2019 11:16:14 +0200 Subject: [PATCH 3/7] Ensure the docker client attempts to remove networks that is created Log errors. Expose dind --- .../impl/docker/DockerClientExecutor.java | 112 ++++++++++-------- 1 file changed, 65 insertions(+), 47 deletions(-) diff --git a/docker/docker/src/main/java/org/arquillian/cube/docker/impl/docker/DockerClientExecutor.java b/docker/docker/src/main/java/org/arquillian/cube/docker/impl/docker/DockerClientExecutor.java index 25175627e..020a9e328 100644 --- a/docker/docker/src/main/java/org/arquillian/cube/docker/impl/docker/DockerClientExecutor.java +++ b/docker/docker/src/main/java/org/arquillian/cube/docker/impl/docker/DockerClientExecutor.java @@ -1,5 +1,33 @@ package org.arquillian.cube.docker.impl.docker; +import javax.ws.rs.ProcessingException; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.ConnectException; +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URL; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.ReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.command.BuildImageCmd; import com.github.dockerjava.api.command.CreateContainerCmd; @@ -15,6 +43,7 @@ import com.github.dockerjava.api.command.StatsCmd; import com.github.dockerjava.api.command.TopContainerResponse; import com.github.dockerjava.api.exception.ConflictException; +import com.github.dockerjava.api.exception.DockerException; import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.exception.NotModifiedException; import com.github.dockerjava.api.model.AuthConfig; @@ -58,35 +87,6 @@ import org.arquillian.cube.docker.impl.util.HomeResolverUtil; import org.arquillian.cube.spi.CubeOutput; -import javax.ws.rs.ProcessingException; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.ConnectException; -import java.net.MalformedURLException; -import java.net.URI; -import java.net.URL; -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.locks.ReadWriteLock; -import java.util.concurrent.locks.ReentrantReadWriteLock; -import java.util.logging.Level; -import java.util.logging.Logger; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - public class DockerClientExecutor { public static final String PATH_IN_CONTAINER = "pathInContainer"; @@ -142,6 +142,7 @@ public class DockerClientExecutor { private static final Pattern IMAGEID_PATTERN = Pattern.compile(".*Successfully built\\s(\\p{XDigit}+)"); private final URI dockerUri; private final String dockerServerIp; + private final boolean isDockerInsideDockerResolution; private DockerClient dockerClient; private CubeDockerConfiguration cubeConfiguration; private DockerClientConfig dockerClientConfig; @@ -150,16 +151,16 @@ public class DockerClientExecutor { // It seems to be a problem with go and should be fixed in go 1.6 (and maybe in Docker 1.11.0). #320 private ReadWriteLock readWriteLock = new ReentrantReadWriteLock(); - public DockerClientExecutor(CubeDockerConfiguration cubeConfiguration) { + public DockerClientExecutor(CubeDockerConfiguration cdc) { - final DefaultDockerClientConfig.Builder configBuilder = DefaultDockerClientConfig - .createDefaultConfigBuilder(); + this.cubeConfiguration = cdc; + this.isDockerInsideDockerResolution = cubeConfiguration.isDockerInsideDockerResolution(); - String dockerServerUri = cubeConfiguration.getDockerServerUri(); - - dockerUri = URI.create(dockerServerUri); - dockerServerIp = cubeConfiguration.getDockerServerIp(); + this.dockerUri = URI.create(cubeConfiguration.getDockerServerUri()); + this.dockerServerIp = cubeConfiguration.getDockerServerIp(); + final DefaultDockerClientConfig.Builder configBuilder = DefaultDockerClientConfig + .createDefaultConfigBuilder(); configBuilder.withApiVersion(cubeConfiguration.getDockerServerVersion()) .withDockerHost(dockerUri.toString()); @@ -186,9 +187,21 @@ public DockerClientExecutor(CubeDockerConfiguration cubeConfiguration) { configBuilder.withDockerTlsVerify(cubeConfiguration.getTlsVerify()); this.dockerClientConfig = configBuilder.build(); - this.cubeConfiguration = cubeConfiguration; this.dockerClient = buildDockerClient(); + + + //There needs to be this guarantee that we always try and remove networks + Runtime.getRuntime().addShutdownHook(new Thread(() -> { + final List networks = DockerClientExecutor.this.getNetworks(); + for (final com.github.dockerjava.api.model.Network network : networks) { + try { + DockerClientExecutor.this.removeNetwork(network.getId()); + } catch (final Exception ignore) { + //no-op + } + } + })); } public static String getImageId(String fullLog) { @@ -563,7 +576,7 @@ private List resolveDockerServerIpInList(Collection envs) { } private Set resolveExposedPorts(CubeContainer containerConfiguration, - CreateContainerCmd createContainerCmd) { + CreateContainerCmd createContainerCmd) { Set allExposedPorts = new HashSet<>(); if (containerConfiguration.getPortBindings() != null) { for (PortBinding binding : containerConfiguration.getPortBindings()) { @@ -788,12 +801,12 @@ private void configureBuildCommand(Map params, BuildImageCmd bui if (params.containsKey(DOCKERFILE_NAME)) { buildImageCmd.withDockerfile(new File((String) params.get(DOCKERFILE_NAME))); } - - if(this.dockerClientConfig.getRegistryUsername() != null && this.dockerClientConfig.getRegistryPassword() != null){ + + if (this.dockerClientConfig.getRegistryUsername() != null && this.dockerClientConfig.getRegistryPassword() != null) { AuthConfig buildAuthConfig = new AuthConfig().withUsername(this.dockerClientConfig.getRegistryUsername()) - .withPassword(this.dockerClientConfig.getRegistryPassword()) - .withEmail(this.dockerClientConfig.getRegistryEmail()) - .withRegistryAddress(this.dockerClientConfig.getRegistryUrl()); + .withPassword(this.dockerClientConfig.getRegistryPassword()) + .withEmail(this.dockerClientConfig.getRegistryEmail()) + .withRegistryAddress(this.dockerClientConfig.getRegistryUrl()); final AuthConfigurations authConfigurations = new AuthConfigurations(); authConfigurations.addConfig(buildAuthConfig); buildImageCmd.withBuildAuthConfigs(authConfigurations); @@ -861,7 +874,7 @@ public LogContainerTestCallback(boolean collectFrames) { @Override public void onNext(Frame frame) { - if(collectFrames) collectedFrames.add(frame); + if (collectFrames) collectedFrames.add(frame); log.append(new String(frame.getPayload())); } @@ -922,8 +935,7 @@ public void execStartDetached(String containerId, String... commands) { * EXecutes command to given container returning the inspection object as well. This method does 3 calls to * dockerhost. Create, Start and Inspect. * - * @param containerId - * to execute command. + * @param containerId to execute command. */ public ExecInspection execStartVerbose(String containerId, String... commands) { this.readWriteLock.readLock().lock(); @@ -1038,7 +1050,7 @@ public void connectToNetwork(String networkId, String containerID) { } public void copyLog(String containerId, boolean follow, boolean stdout, boolean stderr, boolean timestamps, int tail, - OutputStream outputStream) throws IOException { + OutputStream outputStream) throws IOException { this.readWriteLock.readLock().lock(); try { LogContainerCmd logContainerCmd = @@ -1123,6 +1135,8 @@ public void removeNetwork(String id) { this.readWriteLock.readLock().lock(); try { this.dockerClient.removeNetworkCmd(id).exec(); + } catch (final DockerException de) { + log.warning("Failed to remove docker network: " + id); } finally { this.readWriteLock.readLock().unlock(); } @@ -1168,6 +1182,10 @@ public URI getDockerUri() { return dockerUri; } + public boolean isDockerInsideDockerResolution() { + return isDockerInsideDockerResolution; + } + public DockerClient getDockerClient() { return this.dockerClient; } From d817c714773cc8240a9ad49630b198c42d40fa40 Mon Sep 17 00:00:00 2001 From: AndyGee Date: Sun, 12 May 2019 11:20:30 +0200 Subject: [PATCH 4/7] Mocked dind --- .../docker/impl/client/reporter/TakeDockerEnvironmentTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/docker/reporter/src/test/java/org/arquillian/cube/docker/impl/client/reporter/TakeDockerEnvironmentTest.java b/docker/reporter/src/test/java/org/arquillian/cube/docker/impl/client/reporter/TakeDockerEnvironmentTest.java index cf9796983..c58e75fc3 100644 --- a/docker/reporter/src/test/java/org/arquillian/cube/docker/impl/client/reporter/TakeDockerEnvironmentTest.java +++ b/docker/reporter/src/test/java/org/arquillian/cube/docker/impl/client/reporter/TakeDockerEnvironmentTest.java @@ -99,6 +99,7 @@ private void configureDockerExecutor() { when(version.getApiVersion()).thenReturn("1.12"); when(version.getArch()).thenReturn("x86"); when(dockerClientExecutor.dockerHostVersion()).thenReturn(version); + when(dockerClientExecutor.isDockerInsideDockerResolution()).thenReturn(true); } private void configureCube() throws IOException { From cb93aa96d841cc779562a5fc58f2554d891c3ff3 Mon Sep 17 00:00:00 2001 From: AndyGee Date: Sun, 12 May 2019 11:22:02 +0200 Subject: [PATCH 5/7] Deep mock --- .../DockerContainerObjectBuilderTest.java | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/docker/docker/src/test/java/org/arquillian/cube/docker/impl/client/containerobject/DockerContainerObjectBuilderTest.java b/docker/docker/src/test/java/org/arquillian/cube/docker/impl/client/containerobject/DockerContainerObjectBuilderTest.java index ec68deb0f..f3b1f0bf4 100644 --- a/docker/docker/src/test/java/org/arquillian/cube/docker/impl/client/containerobject/DockerContainerObjectBuilderTest.java +++ b/docker/docker/src/test/java/org/arquillian/cube/docker/impl/client/containerobject/DockerContainerObjectBuilderTest.java @@ -1,18 +1,5 @@ package org.arquillian.cube.docker.impl.client.containerobject; -import static org.hamcrest.Matchers.hasItem; -import static org.hamcrest.Matchers.hasItems; -import static org.hamcrest.Matchers.notNullValue; -import static org.hamcrest.Matchers.nullValue; -import static org.hamcrest.core.Is.is; -import static org.junit.Assert.fail; -import static org.junit.Assert.assertThat; -import static org.mockito.Matchers.any; -import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; - import java.io.File; import java.io.IOException; import java.lang.reflect.Field; @@ -23,7 +10,7 @@ import java.util.Collections; import java.util.Map; import java.util.concurrent.atomic.AtomicReference; - +import com.github.dockerjava.api.DockerClient; import org.apache.commons.io.FileUtils; import org.arquillian.cube.CubeController; import org.arquillian.cube.CubeIp; @@ -53,6 +40,21 @@ import org.junit.Test; import org.mockito.invocation.InvocationOnMock; +import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.hasItems; +import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.Matchers.nullValue; +import static org.hamcrest.core.Is.is; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.fail; +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.RETURNS_DEEP_STUBS; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + public class DockerContainerObjectBuilderTest { public static final String BASE_IMAGE = "tomee:8-jre-1.7.2-webprofile"; @@ -67,6 +69,8 @@ public class DockerContainerObjectBuilderTest { public void initMocks() { cubeController = mock(CubeController.class); dockerClientExecutor = mock(DockerClientExecutor.class); + when(dockerClientExecutor.isDockerInsideDockerResolution()).thenReturn(true); + when(dockerClientExecutor.getDockerClient()).thenReturn(mock(DockerClient.class, RETURNS_DEEP_STUBS)); cubeRegistry = mock(CubeRegistry.class); cubeContainerObjectTestEnricher = mock(CubeContainerObjectTestEnricher.class); doAnswer(DockerContainerObjectBuilderTest::objectContainerEnricherMockEnrich) From 5471a99e17d72e986d3d5d2970ef3676978c5ad1 Mon Sep 17 00:00:00 2001 From: AndyGee Date: Sun, 12 May 2019 12:05:24 +0200 Subject: [PATCH 6/7] If available return container details --- .../DockerContainerObjectBuilder.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/docker/docker/src/main/java/org/arquillian/cube/docker/impl/client/containerobject/DockerContainerObjectBuilder.java b/docker/docker/src/main/java/org/arquillian/cube/docker/impl/client/containerobject/DockerContainerObjectBuilder.java index f85e4aba5..8e357e729 100644 --- a/docker/docker/src/main/java/org/arquillian/cube/docker/impl/client/containerobject/DockerContainerObjectBuilder.java +++ b/docker/docker/src/main/java/org/arquillian/cube/docker/impl/client/containerobject/DockerContainerObjectBuilder.java @@ -17,6 +17,8 @@ import java.util.logging.Level; import java.util.logging.Logger; import java.util.stream.Collectors; + +import com.github.dockerjava.api.exception.NotFoundException; import org.apache.commons.lang3.ArrayUtils; import org.arquillian.cube.ContainerObjectConfiguration; import org.arquillian.cube.CubeController; @@ -504,8 +506,16 @@ private void initializeCube() { } cubeController.create(containerName); cubeController.start(containerName); - logger.log(Level.INFO, "Started container:\n" + - dockerClientExecutor.getDockerClient().inspectContainerCmd(containerName).exec().toString()); + logger.log(Level.INFO, "Started container: " + getContainerInfo(containerName)); + } + } + + private String getContainerInfo(final String containerName) { + try { + final String detail = dockerClientExecutor.getDockerClient().inspectContainerCmd(containerName).exec().toString(); + return null != detail ? detail : containerName; + } catch (Exception e) { + return containerName; } } From 1c0e4ffa738163a174b913438c0f0ac0c67479db Mon Sep 17 00:00:00 2001 From: AndyGee Date: Sun, 12 May 2019 12:06:41 +0200 Subject: [PATCH 7/7] Check for null & return deep mock --- .../CubeContainerObjectTestEnricherTest.java | 52 +++++++++++-------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/docker/docker/src/test/java/org/arquillian/cube/docker/impl/client/containerobject/CubeContainerObjectTestEnricherTest.java b/docker/docker/src/test/java/org/arquillian/cube/docker/impl/client/containerobject/CubeContainerObjectTestEnricherTest.java index c5740f001..bb88086c4 100644 --- a/docker/docker/src/test/java/org/arquillian/cube/docker/impl/client/containerobject/CubeContainerObjectTestEnricherTest.java +++ b/docker/docker/src/test/java/org/arquillian/cube/docker/impl/client/containerobject/CubeContainerObjectTestEnricherTest.java @@ -1,22 +1,11 @@ package org.arquillian.cube.docker.impl.client.containerobject; -import static org.hamcrest.CoreMatchers.hasItem; -import static org.hamcrest.CoreMatchers.hasItems; -import static org.hamcrest.CoreMatchers.notNullValue; -import static org.hamcrest.core.Is.is; -import static org.junit.Assert.assertThat; -import static org.mockito.Matchers.any; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - import java.io.File; import java.io.IOException; import java.util.Arrays; import java.util.Collection; import java.util.Collections; - +import com.github.dockerjava.api.DockerClient; import org.apache.commons.io.FileUtils; import org.arquillian.cube.CubeController; import org.arquillian.cube.containerobject.Cube; @@ -43,6 +32,19 @@ import org.junit.Before; import org.junit.Test; +import static org.hamcrest.CoreMatchers.hasItem; +import static org.hamcrest.CoreMatchers.hasItems; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.core.Is.is; +import static org.junit.Assert.assertThat; +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.RETURNS_DEEP_STUBS; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@SuppressWarnings("unchecked") public class CubeContainerObjectTestEnricherTest { private CubeRegistry cubeRegistry; @@ -63,9 +65,11 @@ public void init() { dockerContainerObjectFactory = new DockerContainerObjectFactory(); cubeController = mock(CubeController.class); dockerClientExecutor = mock(DockerClientExecutor.class); + when(dockerClientExecutor.isDockerInsideDockerResolution()).thenReturn(true); injector = mock(Injector.class); serviceLoader = mock(ServiceLoader.class); when(serviceLoader.all(any(Class.class))).thenReturn(Collections.emptyList()); + when(dockerClientExecutor.getDockerClient()).thenReturn(mock(DockerClient.class, RETURNS_DEEP_STUBS)); dockerContainerObjectFactory.serviceLoaderInstance = () -> serviceLoader; dockerContainerObjectFactory.dockerClientExecutorInstance = () -> dockerClientExecutor; @@ -73,7 +77,7 @@ public void init() { dockerContainerObjectFactory.cubeControllerInstance = () -> cubeController; dockerContainerObjectFactory.injectorInstance = () -> injector; - //We asure that there is no previous executions there. + //We ensure that there is no previous executions there. deleteTestDirectory(); } @@ -343,11 +347,13 @@ public static Archive createDockerfile() { private static void deleteTestDirectory() { File tempDirectory = new File(System.getProperty("java.io.tmpdir")); final File[] testsDirectories = tempDirectory.listFiles(CubeContainerObjectTestEnricherTest::testDirectoryFilter); - for (File testDirectory: testsDirectories) { - try { - FileUtils.deleteDirectory(testDirectory); - } catch (IOException e) { - // ignore + if (testsDirectories != null) { + for (File testDirectory: testsDirectories) { + try { + FileUtils.deleteDirectory(testDirectory); + } catch (IOException e) { + // ignore + } } } } @@ -355,11 +361,13 @@ private static void deleteTestDirectory() { private static File findGeneratedDirectory() { File tempDirectory = new File(System.getProperty("java.io.tmpdir")); final File[] testsDirectories = tempDirectory.listFiles(CubeContainerObjectTestEnricherTest::testDirectoryFilter); - if (testsDirectories.length > 0) { - return testsDirectories[0]; - } else { - return null; + if (testsDirectories != null) { + if (testsDirectories.length > 0) { + return testsDirectories[0]; + } } + + return null; } private static boolean testDirectoryFilter(File dir, String name) {