Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<parent>
<groupId>org.jenkins-ci.plugins</groupId>
<artifactId>plugin</artifactId>
<version>5.18</version>
<version>5.27</version>
<relativePath/>
</parent>
<artifactId>docker-workflow</artifactId>
Expand Down Expand Up @@ -35,6 +35,8 @@
<jenkins.version>${jenkins.baseline}.3</jenkins.version>
<useBeta>true</useBeta>
<gitHubRepo>jenkinsci/${project.artifactId}-plugin</gitHubRepo>
<!-- can be enabled when last tests are migrated -->
<ban-junit4-imports.skip>true</ban-junit4-imports.skip>
</properties>
<repositories>
<repository>
Expand Down
496 changes: 250 additions & 246 deletions src/test/java/org/jenkinsci/plugins/docker/workflow/DockerDSLTest.java

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,9 @@
import hudson.Launcher;
import hudson.util.StreamTaskListener;
import hudson.util.VersionNumber;
import org.junit.Assume;

import java.io.ByteArrayOutputStream;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;
Expand All @@ -41,15 +41,21 @@
import java.util.regex.Pattern;

import org.jenkinsci.plugins.docker.commons.tools.DockerTool;
import org.junit.AssumptionViolatedException;
import org.opentest4j.TestAbortedException;

import static org.junit.jupiter.api.Assumptions.assumeFalse;
import static org.junit.jupiter.api.Assumptions.assumeTrue;

/**
* @author <a href="mailto:tom.fennelly@gmail.com">tom.fennelly@gmail.com</a>
*/
public class DockerTestUtil {
public static String DEFAULT_MINIMUM_VERSION = "1.3";

public static final String DEFAULT_MINIMUM_VERSION = "1.3";

// Major Windows kernel versions. See https://hub.docker.com/r/microsoft/windows-nanoserver
private static List<String> MAJOR_WINDOWS_KERNEL_VERSIONS = Arrays.asList(
private static final List<String> MAJOR_WINDOWS_KERNEL_VERSIONS = Arrays.asList(
"10.0.17763.6659", // 1809
"10.0.18363.1556", // 1909
"10.0.19041.1415", // 2004
Expand All @@ -63,6 +69,14 @@ public enum DockerOsMode {
WINDOWS
}

public static void assumeDockerJUnit4() throws Exception {
try {
assumeDocker();
} catch (TestAbortedException ex) {
throw new AssumptionViolatedException(ex.getMessage());
}
}

public static void assumeDocker() throws Exception {
assumeDocker(DockerOsMode.LINUX, new VersionNumber(DEFAULT_MINIMUM_VERSION));
}
Expand All @@ -79,7 +93,7 @@ public static void assumeDocker(DockerOsMode osMode, VersionNumber minimumVersio
.cmds(DockerTool.getExecutable(null, null, null, null), "ps")
.start()
.joinWithTimeout(DockerClient.CLIENT_TIMEOUT, TimeUnit.SECONDS, localLauncher.getListener());
Assume.assumeTrue("Docker working", status == 0);
assumeTrue(status == 0, "Docker working");
ByteArrayOutputStream out = new ByteArrayOutputStream();
status = localLauncher
.launch()
Expand All @@ -88,25 +102,25 @@ public static void assumeDocker(DockerOsMode osMode, VersionNumber minimumVersio
.start()
.joinWithTimeout(DockerClient.CLIENT_TIMEOUT, TimeUnit.SECONDS, localLauncher.getListener());
DockerOsMode cmdOsMode = DockerOsMode.valueOf(out.toString().trim().toUpperCase());
Assume.assumeTrue("Docker working", status == 0);
Assume.assumeTrue("Docker os mode " + osMode, osMode == cmdOsMode);
assumeTrue(status == 0, "Docker working");
assumeTrue(osMode == cmdOsMode, "Docker os mode " + osMode);
} catch (IOException x) {
Assume.assumeNoException("have Docker installed", x);
assumeTrue(false, "have Docker installed: " + x);
}
DockerClient dockerClient = new DockerClient(localLauncher, null, null);
Assume.assumeFalse("Docker version not < " + minimumVersion.toString(), dockerClient.version().isOlderThan(minimumVersion));
assumeFalse(dockerClient.version().isOlderThan(minimumVersion), "Docker version not < " + minimumVersion.toString());
}

public static void assumeWindows() throws Exception {
Assume.assumeTrue(System.getProperty("os.name").toLowerCase().contains("windows"));
public static void assumeWindows() {
assumeTrue(System.getProperty("os.name").toLowerCase().contains("windows"));
}

public static void assumeNotWindows() throws Exception {
Assume.assumeFalse(System.getProperty("os.name").toLowerCase().contains("windows"));
public static void assumeNotWindows() {
assumeFalse(System.getProperty("os.name").toLowerCase().contains("windows"));
}

public static void assumeDrive(char drive) throws Exception {
Assume.assumeTrue(new File(drive + ":/").exists());
public static void assumeDrive(char drive) {
assumeTrue(new File(drive + ":/").exists());
}

public static String getWindowsKernelVersion() throws Exception {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,23 +24,23 @@
package org.jenkinsci.plugins.docker.workflow;

import hudson.FilePath;
import org.hamcrest.collection.IsCollectionWithSize;
import org.hamcrest.core.IsCollectionContaining;
import org.hamcrest.core.IsEqual;
import org.junit.Assert;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.jupiter.api.Test;

import java.io.File;
import java.io.IOException;
import java.util.Map;

public class DockerUtilsTest {
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.hasItems;
import static org.hamcrest.Matchers.hasSize;
import static org.junit.jupiter.api.Assertions.assertThrows;

@Rule public final ExpectedException exception = ExpectedException.none();
class DockerUtilsTest {

@Test public void parseBuildArgs() throws IOException, InterruptedException {
@Test
void parseBuildArgs() throws Exception {

FilePath dockerfilePath = new FilePath(new File("src/test/resources/Dockerfile-withArgs"));
Dockerfile dockerfile = new Dockerfile(dockerfilePath);
Expand All @@ -50,12 +50,13 @@ public class DockerUtilsTest {
final String commandLine = "docker build -t hello-world --build-arg "+key+"="+imageToUpdate;
Map<String, String> buildArgs = DockerUtils.parseBuildArgs(dockerfile, commandLine);

Assert.assertThat(buildArgs.keySet(), IsCollectionWithSize.hasSize(1));
Assert.assertThat(buildArgs.keySet(), IsCollectionContaining.hasItems(key));
Assert.assertThat(buildArgs.get(key), IsEqual.equalTo(imageToUpdate));
assertThat(buildArgs.keySet(), hasSize(1));
assertThat(buildArgs.keySet(), hasItems(key));
assertThat(buildArgs.get(key), equalTo(imageToUpdate));
}

@Test public void parseBuildArgsWithDefaults() throws IOException, InterruptedException {
@Test
void parseBuildArgsWithDefaults() throws Exception {

Dockerfile dockerfile = getDockerfileDefaultArgs();

Expand All @@ -65,13 +66,14 @@ public class DockerUtilsTest {
final String commandLine = "docker build -t hello-world";
Map<String, String> buildArgs = DockerUtils.parseBuildArgs(dockerfile, commandLine);

Assert.assertThat(buildArgs.keySet(), IsCollectionWithSize.hasSize(2));
Assert.assertThat(buildArgs.keySet(), IsCollectionContaining.hasItems(key_registry, key_tag));
Assert.assertThat(buildArgs.get(key_registry), IsEqual.equalTo(registry));
Assert.assertThat(buildArgs.get(key_tag), IsEqual.equalTo("latest"));
assertThat(buildArgs.keySet(), hasSize(2));
assertThat(buildArgs.keySet(), hasItems(key_registry, key_tag));
assertThat(buildArgs.get(key_registry), equalTo(registry));
assertThat(buildArgs.get(key_tag), equalTo("latest"));
}

@Test public void parseBuildArgsOverridingDefaults() throws IOException, InterruptedException {
@Test
void parseBuildArgsOverridingDefaults() throws Exception {

Dockerfile dockerfile = getDockerfileDefaultArgs();

Expand All @@ -83,37 +85,40 @@ public class DockerUtilsTest {
" --build-arg "+key_registry+"="+registry;
Map<String, String> buildArgs = DockerUtils.parseBuildArgs(dockerfile, commandLine);

Assert.assertThat(buildArgs.keySet(), IsCollectionWithSize.hasSize(2));
Assert.assertThat(buildArgs.keySet(), IsCollectionContaining.hasItems(key_registry, key_tag));
Assert.assertThat(buildArgs.get(key_registry), IsEqual.equalTo(registry));
Assert.assertThat(buildArgs.get(key_tag), IsEqual.equalTo(tag));
assertThat(buildArgs.keySet(), hasSize(2));
assertThat(buildArgs.keySet(), hasItems(key_registry, key_tag));
assertThat(buildArgs.get(key_registry), equalTo(registry));
assertThat(buildArgs.get(key_tag), IsEqual.equalTo(tag));
}

@Test public void parseBuildArgWithKeyAndEqual() throws IOException, InterruptedException {
@Test
void parseBuildArgWithKeyAndEqual() {
final String commandLine = "docker build -t hello-world --build-arg key=";

Map<String, String> buildArgs = DockerUtils.parseBuildArgs(null, commandLine);

Assert.assertThat(buildArgs.keySet(), IsCollectionWithSize.hasSize(1));
Assert.assertThat(buildArgs.keySet(), IsCollectionContaining.hasItems("key"));
Assert.assertThat(buildArgs.get("key"), IsEqual.equalTo(""));
assertThat(buildArgs.keySet(), hasSize(1));
assertThat(buildArgs.keySet(), hasItems("key"));
assertThat(buildArgs.get("key"), equalTo(""));
}

@Test public void parseInvalidBuildArg() throws IOException, InterruptedException {
@Test
void parseInvalidBuildArg() {
final String commandLine = "docker build -t hello-world --build-arg";

exception.expect(IllegalArgumentException.class);
DockerUtils.parseBuildArgs(null, commandLine);
assertThrows(IllegalArgumentException.class, () ->
DockerUtils.parseBuildArgs(null, commandLine));
}

@Test public void parseInvalidBuildArgWithKeyOnly() throws IOException, InterruptedException {
@Test
void parseInvalidBuildArgWithKeyOnly() {
final String commandLine = "docker build -t hello-world --build-arg key";

exception.expect(IllegalArgumentException.class);
DockerUtils.parseBuildArgs(null, commandLine);
assertThrows(IllegalArgumentException.class, () ->
DockerUtils.parseBuildArgs(null, commandLine));
}

private Dockerfile getDockerfileDefaultArgs() throws IOException, InterruptedException {
private Dockerfile getDockerfileDefaultArgs() throws Exception {
FilePath dockerfilePath = new FilePath(new File("src/test/resources/Dockerfile-defaultArgs"));
return new Dockerfile(dockerfilePath);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,30 +24,33 @@
package org.jenkinsci.plugins.docker.workflow;

import hudson.FilePath;
import org.hamcrest.collection.IsCollectionWithSize;
import org.hamcrest.core.IsCollectionContaining;
import org.hamcrest.core.IsEqual;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import java.io.File;
import java.io.IOException;

public class DockerfileTest {
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.hasItems;
import static org.hamcrest.Matchers.hasSize;

class DockerfileTest {

private FilePath dockerfilePath;

@Before public void setUp() {
@BeforeEach
void setUp() {
dockerfilePath = new FilePath(new File("src/test/resources/Dockerfile-defaultArgs"));
}

@Test public void parseDockerfile() throws IOException, InterruptedException {
@Test
void parseDockerfile() throws Exception {
Dockerfile dockerfile = new Dockerfile(dockerfilePath);
Assert.assertThat(dockerfile.getFroms(), IsCollectionWithSize.hasSize(1));
Assert.assertThat(dockerfile.getFroms().getLast(), IsEqual.equalTo("${REGISTRY_URL}hello-world:${TAG}"));
Assert.assertThat(dockerfile.getArgs().keySet(), IsCollectionWithSize.hasSize(2));
Assert.assertThat(dockerfile.getArgs().keySet(), IsCollectionContaining.hasItems("REGISTRY_URL", "TAG"));
assertThat(dockerfile.getFroms(), hasSize(1));
assertThat(dockerfile.getFroms().getLast(), equalTo("${REGISTRY_URL}hello-world:${TAG}"));
assertThat(dockerfile.getArgs().keySet(), hasSize(2));
assertThat(dockerfile.getArgs().keySet(), hasItems("REGISTRY_URL", "TAG"));
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,20 +33,22 @@
import org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition;
import org.jenkinsci.plugins.workflow.job.WorkflowJob;
import org.jenkinsci.plugins.workflow.job.WorkflowRun;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runners.model.Statement;
import org.jvnet.hudson.test.RestartableJenkinsRule;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
import org.jvnet.hudson.test.junit.jupiter.JenkinsSessionExtension;

import static org.jenkinsci.plugins.docker.workflow.DockerTestUtil.assumeDocker;
import static org.junit.Assert.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNotNull;

public class FromFingerprintStepTest {
@Rule public RestartableJenkinsRule story = new RestartableJenkinsRule();
class FromFingerprintStepTest {

@RegisterExtension
private final JenkinsSessionExtension story = new JenkinsSessionExtension();

private static final String BUSYBOX_IMAGE = "quay.io/prometheus/busybox:latest";

@Test public void build() throws Exception {
@Test
void build() throws Throwable {
String dockerFile = "" +
"FROM "+ BUSYBOX_IMAGE +"\\n" +
"RUN echo 1";
Expand All @@ -64,24 +66,22 @@ public class FromFingerprintStepTest {
assertBuild("build", script, BUSYBOX_IMAGE);
}

private void assertBuild(final String projectName, final String pipelineCode, final String fromImage) throws Exception {
story.addStep(new Statement() {
@Override
public void evaluate() throws Throwable {
private void assertBuild(final String projectName, final String pipelineCode, final String fromImage) throws Throwable {
story.then(r -> {
assumeDocker();

WorkflowJob p = story.j.jenkins.createProject(WorkflowJob.class, projectName);
WorkflowJob p = r.jenkins.createProject(WorkflowJob.class, projectName);
p.setDefinition(new CpsFlowDefinition(pipelineCode, true));
WorkflowRun b = story.j.assertBuildStatusSuccess(p.scheduleBuild2(0));
WorkflowRun b = r.assertBuildStatusSuccess(p.scheduleBuild2(0));
DockerClient client = new DockerClient(new LocalLauncher(StreamTaskListener.NULL), null, null);
String ancestorImageId = client.inspect(new EnvVars(), fromImage, ".Id");
story.j.assertLogContains(ancestorImageId.replaceFirst("^sha256:", "").substring(0, 12), b);
r.assertLogContains(ancestorImageId.replaceFirst("^sha256:", "").substring(0, 12), b);
Fingerprint f = DockerFingerprints.of(ancestorImageId);
assertNotNull(f);
DockerDescendantFingerprintFacet descendantFacet = f.getFacet(DockerDescendantFingerprintFacet.class);
assertNotNull(descendantFacet);
}
});
);
}

}
Loading
Loading