Skip to content

Commit

Permalink
Naive tests for copy goal when lookup for existing containers happens.
Browse files Browse the repository at this point in the history
Signed-off-by: Marat Abrarov <abrarov@gmail.com>
  • Loading branch information
mabrarov committed Dec 15, 2020
1 parent 013c230 commit 5b6329e
Show file tree
Hide file tree
Showing 2 changed files with 215 additions and 6 deletions.
19 changes: 15 additions & 4 deletions src/test/java/io/fabric8/maven/docker/BaseMojoTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import io.fabric8.maven.docker.config.BuildImageConfiguration;
import io.fabric8.maven.docker.config.CopyConfiguration;
import io.fabric8.maven.docker.config.ImageConfiguration;
import io.fabric8.maven.docker.config.ImageConfiguration.Builder;
import io.fabric8.maven.docker.config.RunImageConfiguration;
import io.fabric8.maven.docker.log.LogDispatcher;
import io.fabric8.maven.docker.service.ArchiveService;
Expand Down Expand Up @@ -137,14 +138,20 @@ protected ImageConfiguration singleImageWithRun() {
}

protected ImageConfiguration singleImageWithCopy(List<CopyConfiguration.Entry> entries) {
return singleImageWithCopyNamePatternAndCopyEntries(null, entries);
}

protected ImageConfiguration singleImageWithCopyNamePatternAndCopyEntries(String copyNamePattern,
List<CopyConfiguration.Entry> entries) {
final CopyConfiguration.Builder copyConfigBuilder = new CopyConfiguration.Builder();
if (entries != null) {
copyConfigBuilder.entries(entries);
}
return new ImageConfiguration.Builder()
.name("example:latest")
.copyConfig(copyConfigBuilder.build())
.build();
final Builder builder = new Builder().name("example:latest");
if (copyNamePattern != null) {
builder.copyNamePattern(copyNamePattern);
}
return builder.copyConfig(copyConfigBuilder.build()).build();
}

protected List<ImageConfiguration> twoImagesWithBuild() {
Expand Down Expand Up @@ -207,6 +214,10 @@ protected void givenPluginContext(AbstractDockerMojo mojo, Object key, Object va
mojo.getPluginContext().put(key, value);
}

protected void givenCopyAll(AbstractDockerMojo mojo) {
Deencapsulation.setField(mojo, "copyAll", true);
}

protected File resolveMavenProjectPath(String path) {
if (path == null) {
return null;
Expand Down
202 changes: 200 additions & 2 deletions src/test/java/io/fabric8/maven/docker/CopyMojoTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,13 @@

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import org.apache.maven.plugin.MojoExecutionException;
Expand All @@ -25,6 +29,7 @@
import io.fabric8.maven.docker.util.GavLabel;

import static io.fabric8.maven.docker.AbstractDockerMojo.CONTEXT_KEY_START_CALLED;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
Expand All @@ -33,6 +38,8 @@

public class CopyMojoTest extends BaseMojoTest {

private static final String ANY_CONTAINER_NAME_PATTERN = "%regex[.*]";

@Tested
private CopyMojo copyMojo;

Expand Down Expand Up @@ -314,6 +321,80 @@ public void copyWithStartGoalInvoked() throws IOException, MojoExecutionExceptio
thenContainerPathIsCopied(trackedContainerId, containerPath, new File(projectBaseDirectory));
}

@Test
public void copyWithUndefinedCopyNamePattern() throws IOException, MojoExecutionException {
final String containerPath = "/container/test/path";
final String hostDirectory = "project-base-dir-relative-host-directory";
final ImageConfiguration image = singleImageWithCopy(singleCopyEntry(containerPath, hostDirectory));
final String containerId = "test-container-id";

givenProjectWithResolvedImage(image);
givenMatchingLatestContainer(singleContainer(image, new Date().getTime(), containerId, false));

whenMojoExecutes();

thenNoContainerIsCreated();
thenContainerPathIsCopied(containerId, containerPath, new File(projectBaseDirectory, hostDirectory));
}

@Test
public void copyFromTheLatestContainer() throws IOException, MojoExecutionException {
final String containerPath = "/container/test/path";
final String hostDirectory = "project-base-dir-relative-host-directory";
final ImageConfiguration image = singleImageWithCopyNamePatternAndCopyEntries(ANY_CONTAINER_NAME_PATTERN,
singleCopyEntry(containerPath, hostDirectory));
final String containerId = "latest-container-id";

givenProjectWithResolvedImage(image);
givenMatchingLatestContainer(singleContainer(image, 1, containerId, false));

whenMojoExecutes();

thenNoContainerIsCreated();
thenContainerPathIsCopied(containerId, containerPath, new File(projectBaseDirectory, hostDirectory));
}

@Test
public void copyAllWithUndefinedCopyNamePattern() throws IOException, MojoExecutionException {
final String containerPath = "/container/test/path";
final String hostDirectory = "project-base-dir-relative-host-directory";
final ImageConfiguration image = singleImageWithCopy(singleCopyEntry(containerPath, hostDirectory));
final String container1Id = "test-container1-id";
final String container2Id = "test-container2-id";

givenProjectWithCopyAll(image);
givenMatchingContainers(Arrays.asList(
singleContainer(image, 1, container1Id, false),
singleContainer(image, 1, container2Id, false)));

whenMojoExecutes();

thenNoContainerIsCreated();
thenContainersPathIsCopied(Arrays.asList(container1Id, container2Id), containerPath,
new File(projectBaseDirectory, hostDirectory));
}

@Test
public void copyAll() throws IOException, MojoExecutionException {
final String containerPath = "/container/test/path";
final String hostDirectory = "project-base-dir-relative-host-directory";
final ImageConfiguration image = singleImageWithCopyNamePatternAndCopyEntries(ANY_CONTAINER_NAME_PATTERN,
singleCopyEntry(containerPath, hostDirectory));
final String container1Id = "test-container1-id";
final String container2Id = "test-container2-id";

givenProjectWithCopyAll(image);
givenMatchingContainers(Arrays.asList(
singleContainer(image, 1, container1Id, false),
singleContainer(image, 1, container2Id, false)));

whenMojoExecutes();

thenNoContainerIsCreated();
thenContainersPathIsCopied(Arrays.asList(container1Id, container2Id), containerPath,
new File(projectBaseDirectory, hostDirectory));
}

private void givenMavenProject() {
givenMavenProject(copyMojo);
}
Expand All @@ -323,6 +404,12 @@ private void givenProjectWithStartGoalInvoked() {
givenPluginContext(copyMojo, CONTEXT_KEY_START_CALLED, true);
}

private void givenProjectWithCopyAll(ImageConfiguration image) {
givenMavenProject();
givenResolvedImages(copyMojo, Collections.singletonList(image));
givenCopyAll(copyMojo);
}

private void givenProjectWithResolvedImage(ImageConfiguration image) {
givenMavenProject();
givenResolvedImages(copyMojo, Collections.singletonList(image));
Expand Down Expand Up @@ -398,11 +485,93 @@ private void givenNoContainerFound() throws DockerAccessException {
}};
}

private ContainerDescriptor singleContainerDescriptor(ImageConfiguration imageConfiguration,
final String containerId) {
private void givenMatchingContainers(List<Container> containers) throws DockerAccessException {
new Expectations() {{
queryService.getContainersForImage(anyString, anyBoolean);
minTimes = 0;
result = containers;
queryService.listContainers(anyBoolean);
minTimes = 0;
result = containers;
}};
}

private void givenMatchingLatestContainer(Container container) throws DockerAccessException {
givenMatchingContainers(Collections.singletonList(container));
new Expectations() {{
queryService.getLatestContainerForImage(anyString, anyBoolean);
minTimes = 0;
result = container;
queryService.getLatestContainer((List) any);
minTimes = 0;
result = container;
}};
}

private ContainerDescriptor singleContainerDescriptor(ImageConfiguration imageConfiguration, String containerId) {
return new ContainerDescriptor(containerId, imageConfiguration);
}

private Container singleContainer(ImageConfiguration imageConfiguration, long created, String containerId,
boolean running) {
return new Container() {
@Override
public long getCreated() {
return created;
}

@Override
public String getId() {
return containerId;
}

@Override
public String getImage() {
return imageConfiguration.getName();
}

@Override
public Map<String, String> getLabels() {
return Collections.emptyMap();
}

@Override
public String getName() {
return containerId;
}

@Override
public String getNetworkMode() {
return null;
}

@Override
public Map<String, PortBinding> getPortBindings() {
return Collections.emptyMap();
}

@Override
public boolean isRunning() {
return running;
}

@Override
public String getIPAddress() {
return null;
}

@Override
public Map<String, String> getCustomNetworkIpAddresses() {
return Collections.emptyMap();
}

@Override
public Integer getExitCode() {
return null;
}
};
}

private void whenMojoExecutes() throws IOException, MojoExecutionException {
copyMojo.executeInternal(serviceHub);
}
Expand Down Expand Up @@ -505,6 +674,35 @@ private void thenContainerPathIsCopied(String containerId, String containerPath,
}};
}

private void thenContainersPathIsCopied(List<String> containerIds, String containerPath, File targetDirectory)
throws DockerAccessException, MojoExecutionException {
new Verifications() {{
final List<String> copiedContainerIds = new ArrayList<>();
final List<File> copiedArchives = new ArrayList<>();
dockerAccess.copyArchiveFromContainer(withCapture(copiedContainerIds), containerPath,
withCapture(copiedArchives));
times = containerIds.size();
assertArrayEquals(containerIds.toArray(), copiedContainerIds.toArray());

final List<File> archives = new ArrayList<>();
final List<File> destinations = new ArrayList<>();
archiveService.extractDockerCopyArchive(withCapture(archives), withCapture(destinations));
times = containerIds.size();

assertEquals(copiedArchives.size(), archives.size());
final Iterator<File> expectedArchiveIterator = copiedArchives.iterator();
for (File archive : archives) {
assertAbsolutePathEquals(expectedArchiveIterator.next(), archive);
assertFalse(archive.exists());
}

assertEquals(containerIds.size(), destinations.size());
for (File destination : destinations) {
assertAbsolutePathEquals(targetDirectory, destination);
}
}};
}

private void thenContainerIsRemoved(String containerId) throws DockerAccessException {
new Verifications() {{
final String removedContainerId;
Expand Down

0 comments on commit 5b6329e

Please sign in to comment.