package org.testcontainers.utility;
import com.github.dockerjava.api.command.InspectContainerResponse;
import org.junit.Test;
import org.mockito.Mockito;
import java.time.Duration;
import java.time.Instant;
import java.time.format.DateTimeFormatter;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.when;
/**
*
*/
public class DockerStatusTest {
private static Instant now = Instant.now();
private static InspectContainerResponse.ContainerState running =
buildState(true, false, buildTimestamp(now.minusMillis(30)), DockerStatus.DOCKER_TIMESTAMP_ZERO);
private static InspectContainerResponse.ContainerState runningVariant =
buildState(true, false, buildTimestamp(now.minusMillis(30)), "");
private static InspectContainerResponse.ContainerState shortRunning =
buildState(true, false, buildTimestamp(now.minusMillis(10)), DockerStatus.DOCKER_TIMESTAMP_ZERO);
private static InspectContainerResponse.ContainerState created =
buildState(false, false, DockerStatus.DOCKER_TIMESTAMP_ZERO, DockerStatus.DOCKER_TIMESTAMP_ZERO);
// a container in the "created" state is not running, and has both startedAt and finishedAt empty.
private static InspectContainerResponse.ContainerState createdVariant =
buildState(false, false, null, null);
private static InspectContainerResponse.ContainerState exited =
buildState(false, false, buildTimestamp(now.minusMillis(100)), buildTimestamp(now.minusMillis(90)));
private static InspectContainerResponse.ContainerState paused =
buildState(false, true, buildTimestamp(now.minusMillis(100)), DockerStatus.DOCKER_TIMESTAMP_ZERO);
private static Duration minimumDuration = Duration.ofMillis(20);
@Test
public void testRunning() throws Exception {
assertTrue(DockerStatus.isContainerRunning(running, minimumDuration, now));
assertTrue(DockerStatus.isContainerRunning(runningVariant, minimumDuration, now));
assertFalse(DockerStatus.isContainerRunning(shortRunning, minimumDuration, now));
assertFalse(DockerStatus.isContainerRunning(created, minimumDuration, now));
assertFalse(DockerStatus.isContainerRunning(createdVariant, minimumDuration, now));
assertFalse(DockerStatus.isContainerRunning(exited, minimumDuration, now));
assertFalse(DockerStatus.isContainerRunning(paused, minimumDuration, now));
}
@Test
public void testStopped() throws Exception {
assertFalse(DockerStatus.isContainerStopped(running));
assertFalse(DockerStatus.isContainerStopped(runningVariant));
assertFalse(DockerStatus.isContainerStopped(shortRunning));
assertFalse(DockerStatus.isContainerStopped(created));
assertFalse(DockerStatus.isContainerStopped(createdVariant));
assertTrue(DockerStatus.isContainerStopped(exited));
assertFalse(DockerStatus.isContainerStopped(paused));
}
private static String buildTimestamp(Instant instant) {
return DateTimeFormatter.ISO_INSTANT.format(instant);
}
// ContainerState is a non-static inner class, with private member variables, in a different package.
// It's simpler to mock it that to try to create one.
private static InspectContainerResponse.ContainerState buildState(boolean running, boolean paused,
String startedAt, String finishedAt) {
InspectContainerResponse.ContainerState state = Mockito.mock(InspectContainerResponse.ContainerState.class);
when(state.getRunning()).thenReturn(running);
when(state.getPaused()).thenReturn(paused);
when(state.getStartedAt()).thenReturn(startedAt);
when(state.getFinishedAt()).thenReturn(finishedAt);
return state;
}
}