From c4527c36f55f575f2151260ea314bc9ed56b34fb Mon Sep 17 00:00:00 2001 From: novy Date: Sat, 31 Dec 2016 15:45:39 +0100 Subject: [PATCH 01/32] Maven module setup --- modules/chaostesting/pom.xml | 38 ++++++++++++++++++++++++++++++++++++ pom.xml | 1 + 2 files changed, 39 insertions(+) create mode 100644 modules/chaostesting/pom.xml diff --git a/modules/chaostesting/pom.xml b/modules/chaostesting/pom.xml new file mode 100644 index 00000000000..cbc9dc99626 --- /dev/null +++ b/modules/chaostesting/pom.xml @@ -0,0 +1,38 @@ + + + + testcontainers-parent + org.testcontainers + 1.1.8-SNAPSHOT + ../../pom.xml + + 4.0.0 + + chaostesting + TestContainers :: chaostesting + + + + ${project.groupId} + testcontainers + ${project.version} + + + + com.jayway.awaitility + awaitility + 1.7.0 + test + + + + org.assertj + assertj-core + 3.6.1 + test + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 3b2f4d6a9db..d8734ec4571 100644 --- a/pom.xml +++ b/pom.xml @@ -169,6 +169,7 @@ modules/nginx modules/mariadb modules/jdbc-test + modules/chaostesting From 9bc319f761480e3b9de325c18843c357c52146da Mon Sep 17 00:00:00 2001 From: novy Date: Sun, 1 Jan 2017 14:51:51 +0100 Subject: [PATCH 02/32] Basic support for stopping and pausing containers --- modules/chaostesting/pom.xml | 5 +- .../java/org/testcontainers/PumbaActions.java | 24 ++++++ .../java/org/testcontainers/PumbaCommand.java | 32 ++++++++ .../org/testcontainers/PumbaCommandPart.java | 13 ++++ .../org/testcontainers/PumbaContainer.java | 47 +++++++++++ .../org/testcontainers/PumbaSchedules.java | 18 +++++ .../java/org/testcontainers/PumbaTargets.java | 22 ++++++ .../org/testcontainers/SupportedTimeUnit.java | 30 ++++++++ .../org/testcontainers/TimeExpression.java | 18 +++++ .../org/testcontainers/DockerEnvironment.java | 57 ++++++++++++++ .../testcontainers/KillingContainersTest.java | 77 +++++++++++++++++++ .../testcontainers/PausingContainersTest.java | 59 ++++++++++++++ .../src/test/resources/logback-test.xml | 23 ++++++ 13 files changed, 423 insertions(+), 2 deletions(-) create mode 100644 modules/chaostesting/src/main/java/org/testcontainers/PumbaActions.java create mode 100644 modules/chaostesting/src/main/java/org/testcontainers/PumbaCommand.java create mode 100644 modules/chaostesting/src/main/java/org/testcontainers/PumbaCommandPart.java create mode 100644 modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java create mode 100644 modules/chaostesting/src/main/java/org/testcontainers/PumbaSchedules.java create mode 100644 modules/chaostesting/src/main/java/org/testcontainers/PumbaTargets.java create mode 100644 modules/chaostesting/src/main/java/org/testcontainers/SupportedTimeUnit.java create mode 100644 modules/chaostesting/src/main/java/org/testcontainers/TimeExpression.java create mode 100644 modules/chaostesting/src/test/java/org/testcontainers/DockerEnvironment.java create mode 100644 modules/chaostesting/src/test/java/org/testcontainers/KillingContainersTest.java create mode 100644 modules/chaostesting/src/test/java/org/testcontainers/PausingContainersTest.java create mode 100644 modules/chaostesting/src/test/resources/logback-test.xml diff --git a/modules/chaostesting/pom.xml b/modules/chaostesting/pom.xml index cbc9dc99626..b4322e82826 100644 --- a/modules/chaostesting/pom.xml +++ b/modules/chaostesting/pom.xml @@ -14,10 +14,11 @@ TestContainers :: chaostesting + - ${project.groupId} + org.testcontainers testcontainers - ${project.version} + 1.1.7 diff --git a/modules/chaostesting/src/main/java/org/testcontainers/PumbaActions.java b/modules/chaostesting/src/main/java/org/testcontainers/PumbaActions.java new file mode 100644 index 00000000000..ec37aba9ee5 --- /dev/null +++ b/modules/chaostesting/src/main/java/org/testcontainers/PumbaActions.java @@ -0,0 +1,24 @@ +package org.testcontainers; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +/** + * Created by novy on 31.12.16. + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class PumbaActions { + + public static PumbaAction killContainers() { + return () -> "kill"; + } + + public static PumbaAction pauseContainersFor(int time, SupportedTimeUnit unit) { + final PumbaCommandPart timePart = TimeExpression.of(time, unit); + + return () -> String.format("pause -d %s", timePart.evaluate()); + } + + public interface PumbaAction extends PumbaCommandPart { + } +} diff --git a/modules/chaostesting/src/main/java/org/testcontainers/PumbaCommand.java b/modules/chaostesting/src/main/java/org/testcontainers/PumbaCommand.java new file mode 100644 index 00000000000..24cf92c22cb --- /dev/null +++ b/modules/chaostesting/src/main/java/org/testcontainers/PumbaCommand.java @@ -0,0 +1,32 @@ +package org.testcontainers; + +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import org.testcontainers.PumbaActions.PumbaAction; +import org.testcontainers.PumbaSchedules.PumbaSchedule; +import org.testcontainers.PumbaTargets.PumbaTarget; + +/** + * Created by novy on 01.01.17. + */ + +@RequiredArgsConstructor(access = AccessLevel.PACKAGE) +class PumbaCommand { + + private final PumbaAction action; + private final PumbaSchedule schedule; + private final PumbaTarget target; + + String evaluate() { + return commandPrefix() + .append(action) + .append(schedule) + .append(target) + .evaluate(); + } + + private PumbaCommandPart commandPrefix() { + // todo fixme + return () -> "pumba --host tcp://192.168.1.106:2375"; + } +} diff --git a/modules/chaostesting/src/main/java/org/testcontainers/PumbaCommandPart.java b/modules/chaostesting/src/main/java/org/testcontainers/PumbaCommandPart.java new file mode 100644 index 00000000000..281288da173 --- /dev/null +++ b/modules/chaostesting/src/main/java/org/testcontainers/PumbaCommandPart.java @@ -0,0 +1,13 @@ +package org.testcontainers; + +/** + * Created by novy on 01.01.17. + */ +interface PumbaCommandPart { + + String evaluate(); + + default PumbaCommandPart append(PumbaCommandPart other) { + return () -> evaluate() + " " + other.evaluate(); + } +} diff --git a/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java b/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java new file mode 100644 index 00000000000..ac799cfe6fe --- /dev/null +++ b/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java @@ -0,0 +1,47 @@ +package org.testcontainers; + +import org.testcontainers.PumbaActions.PumbaAction; +import org.testcontainers.PumbaSchedules.PumbaSchedule; +import org.testcontainers.PumbaTargets.PumbaTarget; +import org.testcontainers.containers.GenericContainer; + +/** + * Created by novy on 31.12.16. + */ + +public class PumbaContainer extends GenericContainer { + + private PumbaAction action = PumbaActions.killContainers(); + private PumbaSchedule schedule = PumbaSchedules.onlyOnce(); + private PumbaTarget target = PumbaTargets.allContainers(); + + private PumbaContainer() { + super("gaiaadm/pumba:latest"); + } + + @Override + public void start() { + final PumbaCommand command = new PumbaCommand(action, schedule, target); + setCommand(command.evaluate()); + super.start(); + } + + public static PumbaContainer newPumba() { + return new PumbaContainer(); + } + + public PumbaContainer affectingContainers(PumbaTarget target) { + this.target = target; + return this; + } + + public PumbaContainer performingAction(PumbaAction action) { + this.action = action; + return this; + } + + public PumbaContainer scheduled(PumbaSchedule schedule) { + this.schedule = schedule; + return this; + } +} diff --git a/modules/chaostesting/src/main/java/org/testcontainers/PumbaSchedules.java b/modules/chaostesting/src/main/java/org/testcontainers/PumbaSchedules.java new file mode 100644 index 00000000000..2cfeb0c7fd9 --- /dev/null +++ b/modules/chaostesting/src/main/java/org/testcontainers/PumbaSchedules.java @@ -0,0 +1,18 @@ +package org.testcontainers; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +/** + * Created by novy on 01.01.17. + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class PumbaSchedules { + + public static PumbaSchedule onlyOnce() { + return () -> ""; + } + + public interface PumbaSchedule extends PumbaCommandPart { + } +} diff --git a/modules/chaostesting/src/main/java/org/testcontainers/PumbaTargets.java b/modules/chaostesting/src/main/java/org/testcontainers/PumbaTargets.java new file mode 100644 index 00000000000..4069ca9f525 --- /dev/null +++ b/modules/chaostesting/src/main/java/org/testcontainers/PumbaTargets.java @@ -0,0 +1,22 @@ +package org.testcontainers; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +/** + * Created by novy on 01.01.17. + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class PumbaTargets { + + public static PumbaTarget singleContainer(String containerName) { + return () -> containerName; + } + + public static PumbaTarget allContainers() { + return () -> ""; + } + + public interface PumbaTarget extends PumbaCommandPart { + } +} diff --git a/modules/chaostesting/src/main/java/org/testcontainers/SupportedTimeUnit.java b/modules/chaostesting/src/main/java/org/testcontainers/SupportedTimeUnit.java new file mode 100644 index 00000000000..8ecea496d9c --- /dev/null +++ b/modules/chaostesting/src/main/java/org/testcontainers/SupportedTimeUnit.java @@ -0,0 +1,30 @@ +package org.testcontainers; + +/** + * Created by novy on 01.01.17. + */ +public enum SupportedTimeUnit { + MILLISECONDS { + @Override + String abbreviation() { + return "ms"; + } + }, SECONDS { + @Override + String abbreviation() { + return "s"; + } + }, MINUTES { + @Override + String abbreviation() { + return "m"; + } + }, HOURS { + @Override + String abbreviation() { + return "h"; + } + }; + + abstract String abbreviation(); +} diff --git a/modules/chaostesting/src/main/java/org/testcontainers/TimeExpression.java b/modules/chaostesting/src/main/java/org/testcontainers/TimeExpression.java new file mode 100644 index 00000000000..38b654b7513 --- /dev/null +++ b/modules/chaostesting/src/main/java/org/testcontainers/TimeExpression.java @@ -0,0 +1,18 @@ +package org.testcontainers; + +import lombok.RequiredArgsConstructor; + +/** + * Created by novy on 01.01.17. + */ +@RequiredArgsConstructor(staticName = "of") +class TimeExpression implements PumbaCommandPart { + + private final int value; + private final SupportedTimeUnit unit; + + @Override + public String evaluate() { + return value + unit.abbreviation(); + } +} diff --git a/modules/chaostesting/src/test/java/org/testcontainers/DockerEnvironment.java b/modules/chaostesting/src/test/java/org/testcontainers/DockerEnvironment.java new file mode 100644 index 00000000000..c9919ef8f8b --- /dev/null +++ b/modules/chaostesting/src/test/java/org/testcontainers/DockerEnvironment.java @@ -0,0 +1,57 @@ +package org.testcontainers; + +import org.testcontainers.shaded.com.github.dockerjava.api.DockerClient; +import org.testcontainers.shaded.com.github.dockerjava.api.command.InspectContainerResponse; +import org.testcontainers.shaded.com.github.dockerjava.api.model.Container; + +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * Created by novy on 31.12.16. + */ +class DockerEnvironment { + + private final DockerClient delegate; + + DockerEnvironment() { + this.delegate = DockerClientFactory.instance().client(); + } + + Collection namesOfRunningContainers() { + final List runningContainers = delegate.listContainersCmd().exec(); + + return runningContainers.stream() + .map(Container::getNames) + .flatMap(Stream::of) + .collect(Collectors.toSet()); + } + + ContainerDetails containerDetails(String byId) { + final InspectContainerResponse inspectResponse = delegate.inspectContainerCmd(byId).exec(); + return new ContainerDetails(inspectResponse); + } + + + static class ContainerDetails { + private final InspectContainerResponse response; + + ContainerDetails(InspectContainerResponse response) { + this.response = response; + } + + String name() { + return response.getName(); + } + + boolean isRunning() { + return response.getState().getRunning(); + } + + boolean isPaused() { + return response.getState().getPaused(); + } + } +} diff --git a/modules/chaostesting/src/test/java/org/testcontainers/KillingContainersTest.java b/modules/chaostesting/src/test/java/org/testcontainers/KillingContainersTest.java new file mode 100644 index 00000000000..b2d77874f64 --- /dev/null +++ b/modules/chaostesting/src/test/java/org/testcontainers/KillingContainersTest.java @@ -0,0 +1,77 @@ +package org.testcontainers; + +import org.junit.Before; +import org.junit.Test; +import org.testcontainers.containers.GenericContainer; + +import java.util.Collection; + +import static com.jayway.awaitility.Awaitility.await; +import static org.assertj.core.api.Assertions.assertThat; +import static org.testcontainers.PumbaActions.killContainers; +import static org.testcontainers.PumbaSchedules.onlyOnce; +import static org.testcontainers.PumbaTargets.allContainers; +import static org.testcontainers.PumbaTargets.singleContainer; + +/** + * Created by novy on 31.12.16. + */ +public class KillingContainersTest { + + private DockerEnvironment environment; + + @Before + public void setUp() throws Exception { + environment = new DockerEnvironment(); + } + + @Test + public void should_kill_all_containers() throws Exception { + // given + startedContainer(); + startedContainer(); + + final PumbaContainer pumba = PumbaContainer.newPumba() + .affectingContainers(allContainers()) + .performingAction(killContainers()) + .scheduled(onlyOnce()); + + // when + pumba.start(); + + // then + await().until(() -> assertThat(environment.namesOfRunningContainers()).isEmpty()); + } + + @Test + public void should_kill_single_container() throws Exception { + // given + final GenericContainer containerToKill = startedContainer(); + final GenericContainer containerThatShouldSurvive = startedContainer(); + + final PumbaContainer pumba = PumbaContainer.newPumba() + .affectingContainers(singleContainer(containerToKill.getContainerName())) + .performingAction(killContainers()) + .scheduled(onlyOnce()); + + // when + pumba.start(); + + // then + await().until(() -> { + final Collection namesOfRunningContainers = environment.namesOfRunningContainers(); + assertThat(namesOfRunningContainers).doesNotContain(containerToKill.getContainerName()); + assertThat(namesOfRunningContainers).contains(containerThatShouldSurvive.getContainerName()); + }); + } + + + private GenericContainer startedContainer() { + final GenericContainer aContainer = new GenericContainer<>("ubuntu:latest") + .withCommand("bash", "-c", "while true; do echo something; sleep 1; done"); + aContainer.start(); + return aContainer; + } + + +} \ No newline at end of file diff --git a/modules/chaostesting/src/test/java/org/testcontainers/PausingContainersTest.java b/modules/chaostesting/src/test/java/org/testcontainers/PausingContainersTest.java new file mode 100644 index 00000000000..ad595722930 --- /dev/null +++ b/modules/chaostesting/src/test/java/org/testcontainers/PausingContainersTest.java @@ -0,0 +1,59 @@ +package org.testcontainers; + +import org.junit.Before; +import org.junit.Test; +import org.testcontainers.DockerEnvironment.ContainerDetails; +import org.testcontainers.containers.GenericContainer; + +import java.util.concurrent.TimeUnit; + +import static com.jayway.awaitility.Awaitility.await; +import static org.assertj.core.api.Assertions.assertThat; +import static org.testcontainers.PumbaActions.pauseContainersFor; +import static org.testcontainers.PumbaSchedules.onlyOnce; +import static org.testcontainers.PumbaTargets.singleContainer; + +/** + * Created by novy on 31.12.16. + */ +public class PausingContainersTest { + + private DockerEnvironment environment; + + @Before + public void setUp() throws Exception { + environment = new DockerEnvironment(); + } + + @Test + public void should_pause_single_container() throws Exception { + // given + final GenericContainer containerToPause = startedContainer(); + + final PumbaContainer pumba = PumbaContainer.newPumba() + .affectingContainers(singleContainer(containerToPause.getContainerName())) + .performingAction(pauseContainersFor(10, SupportedTimeUnit.SECONDS)) + .scheduled(onlyOnce()); + + // when + pumba.start(); + + // then + await().until(() -> { + final ContainerDetails container = environment.containerDetails(containerToPause.getContainerId()); + assertThat(container.isPaused()).isTrue(); + }); + + await().atMost(15, TimeUnit.SECONDS).until(() -> { + final ContainerDetails container = environment.containerDetails(containerToPause.getContainerId()); + assertThat(container.isPaused()).isFalse(); + }); + } + + private GenericContainer startedContainer() { + final GenericContainer aContainer = new GenericContainer<>("ubuntu:latest") + .withCommand("bash", "-c", "while true; do echo something; sleep 1; done"); + aContainer.start(); + return aContainer; + } +} \ No newline at end of file diff --git a/modules/chaostesting/src/test/resources/logback-test.xml b/modules/chaostesting/src/test/resources/logback-test.xml new file mode 100644 index 00000000000..8a4f5cf7033 --- /dev/null +++ b/modules/chaostesting/src/test/resources/logback-test.xml @@ -0,0 +1,23 @@ + + + + + + %d{HH:mm:ss.SSS} %-5level %logger - %msg%n + + + + + + + + + + + + + PROFILER + DENY + + \ No newline at end of file From cef9e7d608d0e313f9a347af867d053fe10444f9 Mon Sep 17 00:00:00 2001 From: novy Date: Sun, 1 Jan 2017 21:30:51 +0100 Subject: [PATCH 03/32] Added possibility to kill more than 1 container at once --- .../java/org/testcontainers/PumbaCommand.java | 2 +- .../org/testcontainers/PumbaContainer.java | 3 +- .../java/org/testcontainers/PumbaTargets.java | 21 +++++ .../CanSpawnExampleContainers.java | 39 +++++++++ .../testcontainers/KillingContainersTest.java | 84 ++++++++++++++----- .../testcontainers/PausingContainersTest.java | 13 +-- 6 files changed, 130 insertions(+), 32 deletions(-) create mode 100644 modules/chaostesting/src/test/java/org/testcontainers/CanSpawnExampleContainers.java diff --git a/modules/chaostesting/src/main/java/org/testcontainers/PumbaCommand.java b/modules/chaostesting/src/main/java/org/testcontainers/PumbaCommand.java index 24cf92c22cb..84d495c2383 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/PumbaCommand.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/PumbaCommand.java @@ -27,6 +27,6 @@ String evaluate() { private PumbaCommandPart commandPrefix() { // todo fixme - return () -> "pumba --host tcp://192.168.1.106:2375"; + return () -> "pumba --debug --host tcp://192.168.1.106:2375"; } } diff --git a/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java b/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java index ac799cfe6fe..0b266a85652 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java @@ -22,7 +22,8 @@ private PumbaContainer() { @Override public void start() { final PumbaCommand command = new PumbaCommand(action, schedule, target); - setCommand(command.evaluate()); + // todo fix + setCommand(command.evaluate().replaceAll(" ", " ")); super.start(); } diff --git a/modules/chaostesting/src/main/java/org/testcontainers/PumbaTargets.java b/modules/chaostesting/src/main/java/org/testcontainers/PumbaTargets.java index 4069ca9f525..da553692943 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/PumbaTargets.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/PumbaTargets.java @@ -3,6 +3,11 @@ import lombok.AccessLevel; import lombok.NoArgsConstructor; +import java.util.Arrays; +import java.util.Collection; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + /** * Created by novy on 01.01.17. */ @@ -13,6 +18,22 @@ public static PumbaTarget singleContainer(String containerName) { return () -> containerName; } + public static PumbaTarget containers(String... containerNames) { + return containers(Arrays.asList(containerNames)); + } + + public static PumbaTarget containers(Collection containerNames) { + return () -> containerNames.stream().collect(Collectors.joining(" ")); + } + + public static PumbaTarget containersMatchingRegexp(String regex) { + return () -> "re2:" + regex; + } + + public static PumbaTarget containersMatchingRegexp(Pattern regex) { + return containersMatchingRegexp(regex.pattern()); + } + public static PumbaTarget allContainers() { return () -> ""; } diff --git a/modules/chaostesting/src/test/java/org/testcontainers/CanSpawnExampleContainers.java b/modules/chaostesting/src/test/java/org/testcontainers/CanSpawnExampleContainers.java new file mode 100644 index 00000000000..195bb07c507 --- /dev/null +++ b/modules/chaostesting/src/test/java/org/testcontainers/CanSpawnExampleContainers.java @@ -0,0 +1,39 @@ +package org.testcontainers; + +import lombok.SneakyThrows; +import org.apache.commons.io.FileUtils; +import org.junit.runner.Description; +import org.testcontainers.containers.DockerComposeContainer; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.shaded.com.google.common.collect.ImmutableList; + +import java.io.File; + +/** + * Created by novy on 01.01.17. + */ +interface CanSpawnExampleContainers { + + default GenericContainer startedContainer() { + final GenericContainer aContainer = new GenericContainer<>("ubuntu:latest") + .withCommand("bash", "-c", "while true; do echo something; sleep 1; done"); + aContainer.start(); + return aContainer; + } + + @SneakyThrows + default void startContainerWithNameContaining(String partOfContainerName) { + final File temporaryFile = File.createTempFile("temp-compose", ".yml"); + final ImmutableList composeContent = ImmutableList.of( + partOfContainerName + ":", + " image: ubuntu:latest", + " command: [bash, -c, \"while true; do echo something; sleep 1; done\"]" + ); + FileUtils.writeLines( + temporaryFile, composeContent + ); + + final DockerComposeContainer composeContainer = new DockerComposeContainer<>(temporaryFile); + composeContainer.starting(Description.EMPTY); + } +} diff --git a/modules/chaostesting/src/test/java/org/testcontainers/KillingContainersTest.java b/modules/chaostesting/src/test/java/org/testcontainers/KillingContainersTest.java index b2d77874f64..c76060522f9 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/KillingContainersTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/KillingContainersTest.java @@ -5,18 +5,19 @@ import org.testcontainers.containers.GenericContainer; import java.util.Collection; +import java.util.function.Predicate; +import java.util.regex.Pattern; import static com.jayway.awaitility.Awaitility.await; import static org.assertj.core.api.Assertions.assertThat; import static org.testcontainers.PumbaActions.killContainers; import static org.testcontainers.PumbaSchedules.onlyOnce; -import static org.testcontainers.PumbaTargets.allContainers; -import static org.testcontainers.PumbaTargets.singleContainer; +import static org.testcontainers.PumbaTargets.*; /** * Created by novy on 31.12.16. */ -public class KillingContainersTest { +public class KillingContainersTest implements CanSpawnExampleContainers { private DockerEnvironment environment; @@ -26,13 +27,13 @@ public void setUp() throws Exception { } @Test - public void should_kill_all_containers() throws Exception { + public void should_kill_single_container() throws Exception { // given - startedContainer(); - startedContainer(); + final GenericContainer containerToKill = startedContainer(); + final GenericContainer containerThatShouldSurvive = startedContainer(); final PumbaContainer pumba = PumbaContainer.newPumba() - .affectingContainers(allContainers()) + .affectingContainers(containers(containerToKill.getContainerName())) .performingAction(killContainers()) .scheduled(onlyOnce()); @@ -40,17 +41,23 @@ public void should_kill_all_containers() throws Exception { pumba.start(); // then - await().until(() -> assertThat(environment.namesOfRunningContainers()).isEmpty()); + await().until(() -> { + final Collection namesOfRunningContainers = environment.namesOfRunningContainers(); + + assertThat(namesOfRunningContainers).doesNotContain(containerToKill.getContainerName()); + assertThat(namesOfRunningContainers).contains(containerThatShouldSurvive.getContainerName()); + }); } @Test - public void should_kill_single_container() throws Exception { + public void should_kill_more_than_one_containers() throws Exception { // given - final GenericContainer containerToKill = startedContainer(); - final GenericContainer containerThatShouldSurvive = startedContainer(); + final GenericContainer firstVictim = startedContainer(); + final GenericContainer secondVictim = startedContainer(); + final GenericContainer survivor = startedContainer(); final PumbaContainer pumba = PumbaContainer.newPumba() - .affectingContainers(singleContainer(containerToKill.getContainerName())) + .affectingContainers(containers(firstVictim.getContainerName(), secondVictim.getContainerName())) .performingAction(killContainers()) .scheduled(onlyOnce()); @@ -60,18 +67,55 @@ public void should_kill_single_container() throws Exception { // then await().until(() -> { final Collection namesOfRunningContainers = environment.namesOfRunningContainers(); - assertThat(namesOfRunningContainers).doesNotContain(containerToKill.getContainerName()); - assertThat(namesOfRunningContainers).contains(containerThatShouldSurvive.getContainerName()); + + assertThat(namesOfRunningContainers).doesNotContain(firstVictim.getContainerName(), secondVictim.getContainerName()); + assertThat(namesOfRunningContainers).contains(survivor.getContainerName()); }); } + @Test + public void should_kill_containers_matching_regular_expression() throws Exception { + // given + startContainerWithNameContaining("foobar"); + startContainerWithNameContaining("foobar"); + startContainerWithNameContaining("barbaz"); + + final PumbaContainer pumba = PumbaContainer.newPumba() + .affectingContainers(containersMatchingRegexp(".*foobar.*")) + .performingAction(killContainers()) + .scheduled(onlyOnce()); + + // when + pumba.start(); + + // then + await().until(() -> { + final Collection namesOfRunningContainers = environment.namesOfRunningContainers(); - private GenericContainer startedContainer() { - final GenericContainer aContainer = new GenericContainer<>("ubuntu:latest") - .withCommand("bash", "-c", "while true; do echo something; sleep 1; done"); - aContainer.start(); - return aContainer; + assertThat(namesOfRunningContainers).filteredOn(matchesRegexp(".*foobar.*")).isEmpty(); + assertThat(namesOfRunningContainers).filteredOn(matchesRegexp(".*barbaz.*")).isNotEmpty(); + }); } + @Test + public void should_kill_all_containers() throws Exception { + // given + startedContainer(); + startedContainer(); + + final PumbaContainer pumba = PumbaContainer.newPumba() + .affectingContainers(allContainers()) + .performingAction(killContainers()) + .scheduled(onlyOnce()); -} \ No newline at end of file + // when + pumba.start(); + + // then + await().until(() -> assertThat(environment.namesOfRunningContainers()).isEmpty()); + } + + private Predicate matchesRegexp(String regexp) { + return Pattern.compile(regexp).asPredicate(); + } +} diff --git a/modules/chaostesting/src/test/java/org/testcontainers/PausingContainersTest.java b/modules/chaostesting/src/test/java/org/testcontainers/PausingContainersTest.java index ad595722930..3003dc4edab 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/PausingContainersTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/PausingContainersTest.java @@ -11,12 +11,12 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.testcontainers.PumbaActions.pauseContainersFor; import static org.testcontainers.PumbaSchedules.onlyOnce; -import static org.testcontainers.PumbaTargets.singleContainer; +import static org.testcontainers.PumbaTargets.containers; /** * Created by novy on 31.12.16. */ -public class PausingContainersTest { +public class PausingContainersTest implements CanSpawnExampleContainers { private DockerEnvironment environment; @@ -31,7 +31,7 @@ public void should_pause_single_container() throws Exception { final GenericContainer containerToPause = startedContainer(); final PumbaContainer pumba = PumbaContainer.newPumba() - .affectingContainers(singleContainer(containerToPause.getContainerName())) + .affectingContainers(containers(containerToPause.getContainerName())) .performingAction(pauseContainersFor(10, SupportedTimeUnit.SECONDS)) .scheduled(onlyOnce()); @@ -49,11 +49,4 @@ public void should_pause_single_container() throws Exception { assertThat(container.isPaused()).isFalse(); }); } - - private GenericContainer startedContainer() { - final GenericContainer aContainer = new GenericContainer<>("ubuntu:latest") - .withCommand("bash", "-c", "while true; do echo something; sleep 1; done"); - aContainer.start(); - return aContainer; - } } \ No newline at end of file From 71ba7b4226f8ebe5830081f34d5c4d4b5702f80b Mon Sep 17 00:00:00 2001 From: novy Date: Mon, 2 Jan 2017 00:50:48 +0100 Subject: [PATCH 04/32] Fixed whitespace separation issues --- .../java/org/testcontainers/PumbaCommand.java | 6 +-- .../org/testcontainers/PumbaCommandPart.java | 2 +- .../org/testcontainers/PumbaContainer.java | 11 ++--- .../testcontainers/PumbaExecutionModes.java | 48 +++++++++++++++++++ .../org/testcontainers/PumbaSchedules.java | 18 ------- .../testcontainers/KillingContainersTest.java | 26 +++++----- .../testcontainers/PausingContainersTest.java | 8 ++-- 7 files changed, 74 insertions(+), 45 deletions(-) create mode 100644 modules/chaostesting/src/main/java/org/testcontainers/PumbaExecutionModes.java delete mode 100644 modules/chaostesting/src/main/java/org/testcontainers/PumbaSchedules.java diff --git a/modules/chaostesting/src/main/java/org/testcontainers/PumbaCommand.java b/modules/chaostesting/src/main/java/org/testcontainers/PumbaCommand.java index 84d495c2383..e8c0eb93d77 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/PumbaCommand.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/PumbaCommand.java @@ -3,7 +3,7 @@ import lombok.AccessLevel; import lombok.RequiredArgsConstructor; import org.testcontainers.PumbaActions.PumbaAction; -import org.testcontainers.PumbaSchedules.PumbaSchedule; +import org.testcontainers.PumbaExecutionModes.PumbaExecutionMode; import org.testcontainers.PumbaTargets.PumbaTarget; /** @@ -14,13 +14,13 @@ class PumbaCommand { private final PumbaAction action; - private final PumbaSchedule schedule; + private final PumbaExecutionMode executionMode; private final PumbaTarget target; String evaluate() { return commandPrefix() + .append(executionMode) .append(action) - .append(schedule) .append(target) .evaluate(); } diff --git a/modules/chaostesting/src/main/java/org/testcontainers/PumbaCommandPart.java b/modules/chaostesting/src/main/java/org/testcontainers/PumbaCommandPart.java index 281288da173..7a5019db8f1 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/PumbaCommandPart.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/PumbaCommandPart.java @@ -8,6 +8,6 @@ interface PumbaCommandPart { String evaluate(); default PumbaCommandPart append(PumbaCommandPart other) { - return () -> evaluate() + " " + other.evaluate(); + return () -> (evaluate() + " " + other.evaluate()).trim(); } } diff --git a/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java b/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java index 0b266a85652..6adb534e225 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java @@ -1,7 +1,7 @@ package org.testcontainers; import org.testcontainers.PumbaActions.PumbaAction; -import org.testcontainers.PumbaSchedules.PumbaSchedule; +import org.testcontainers.PumbaExecutionModes.PumbaExecutionMode; import org.testcontainers.PumbaTargets.PumbaTarget; import org.testcontainers.containers.GenericContainer; @@ -12,7 +12,7 @@ public class PumbaContainer extends GenericContainer { private PumbaAction action = PumbaActions.killContainers(); - private PumbaSchedule schedule = PumbaSchedules.onlyOnce(); + private PumbaExecutionMode schedule = PumbaExecutionModes.onlyOnce().withAllContainersAtOnce(); private PumbaTarget target = PumbaTargets.allContainers(); private PumbaContainer() { @@ -22,7 +22,6 @@ private PumbaContainer() { @Override public void start() { final PumbaCommand command = new PumbaCommand(action, schedule, target); - // todo fix setCommand(command.evaluate().replaceAll(" ", " ")); super.start(); } @@ -31,17 +30,17 @@ public static PumbaContainer newPumba() { return new PumbaContainer(); } - public PumbaContainer affectingContainers(PumbaTarget target) { + public PumbaContainer on(PumbaTarget target) { this.target = target; return this; } - public PumbaContainer performingAction(PumbaAction action) { + public PumbaContainer performAction(PumbaAction action) { this.action = action; return this; } - public PumbaContainer scheduled(PumbaSchedule schedule) { + public PumbaContainer schedule(PumbaExecutionMode schedule) { this.schedule = schedule; return this; } diff --git a/modules/chaostesting/src/main/java/org/testcontainers/PumbaExecutionModes.java b/modules/chaostesting/src/main/java/org/testcontainers/PumbaExecutionModes.java new file mode 100644 index 00000000000..6e9577195a0 --- /dev/null +++ b/modules/chaostesting/src/main/java/org/testcontainers/PumbaExecutionModes.java @@ -0,0 +1,48 @@ +package org.testcontainers; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import lombok.RequiredArgsConstructor; + +/** + * Created by novy on 01.01.17. + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class PumbaExecutionModes { + + public static WithSchedule onlyOnce() { + return new WithSchedule( + () -> "" + ); + } + + public static WithSchedule recurrently(int time, SupportedTimeUnit unit) { + return new WithSchedule( + () -> "--interval" + TimeExpression.of(time, unit).evaluate() + ); + } + + @RequiredArgsConstructor(access = AccessLevel.PRIVATE) + public static class WithSchedule { + private final PumbaCommandPart schedule; + + public PumbaExecutionMode withAllContainersAtOnce() { + return new PumbaExecutionMode(schedule, () -> ""); + } + + public PumbaExecutionMode withOneContainerAtTime() { + return new PumbaExecutionMode(schedule, () -> "--random"); + } + } + + @RequiredArgsConstructor(access = AccessLevel.PRIVATE) + public static final class PumbaExecutionMode implements PumbaCommandPart { + private final PumbaCommandPart schedulePart; + private final PumbaCommandPart containersToAffect; + + @Override + public String evaluate() { + return schedulePart.append(containersToAffect).evaluate(); + } + } +} diff --git a/modules/chaostesting/src/main/java/org/testcontainers/PumbaSchedules.java b/modules/chaostesting/src/main/java/org/testcontainers/PumbaSchedules.java deleted file mode 100644 index 2cfeb0c7fd9..00000000000 --- a/modules/chaostesting/src/main/java/org/testcontainers/PumbaSchedules.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.testcontainers; - -import lombok.AccessLevel; -import lombok.NoArgsConstructor; - -/** - * Created by novy on 01.01.17. - */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public final class PumbaSchedules { - - public static PumbaSchedule onlyOnce() { - return () -> ""; - } - - public interface PumbaSchedule extends PumbaCommandPart { - } -} diff --git a/modules/chaostesting/src/test/java/org/testcontainers/KillingContainersTest.java b/modules/chaostesting/src/test/java/org/testcontainers/KillingContainersTest.java index c76060522f9..d18bb6c4a32 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/KillingContainersTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/KillingContainersTest.java @@ -11,7 +11,7 @@ import static com.jayway.awaitility.Awaitility.await; import static org.assertj.core.api.Assertions.assertThat; import static org.testcontainers.PumbaActions.killContainers; -import static org.testcontainers.PumbaSchedules.onlyOnce; +import static org.testcontainers.PumbaExecutionModes.onlyOnce; import static org.testcontainers.PumbaTargets.*; /** @@ -33,9 +33,9 @@ public void should_kill_single_container() throws Exception { final GenericContainer containerThatShouldSurvive = startedContainer(); final PumbaContainer pumba = PumbaContainer.newPumba() - .affectingContainers(containers(containerToKill.getContainerName())) - .performingAction(killContainers()) - .scheduled(onlyOnce()); + .performAction(killContainers()) + .on(containers(containerToKill.getContainerName())) + .schedule(onlyOnce().withAllContainersAtOnce()); // when pumba.start(); @@ -57,9 +57,9 @@ public void should_kill_more_than_one_containers() throws Exception { final GenericContainer survivor = startedContainer(); final PumbaContainer pumba = PumbaContainer.newPumba() - .affectingContainers(containers(firstVictim.getContainerName(), secondVictim.getContainerName())) - .performingAction(killContainers()) - .scheduled(onlyOnce()); + .on(containers(firstVictim.getContainerName(), secondVictim.getContainerName())) + .performAction(killContainers()) + .schedule(onlyOnce().withAllContainersAtOnce()); // when pumba.start(); @@ -81,9 +81,9 @@ public void should_kill_containers_matching_regular_expression() throws Exceptio startContainerWithNameContaining("barbaz"); final PumbaContainer pumba = PumbaContainer.newPumba() - .affectingContainers(containersMatchingRegexp(".*foobar.*")) - .performingAction(killContainers()) - .scheduled(onlyOnce()); + .on(containersMatchingRegexp(".*foobar.*")) + .performAction(killContainers()) + .schedule(onlyOnce().withAllContainersAtOnce()); // when pumba.start(); @@ -104,9 +104,9 @@ public void should_kill_all_containers() throws Exception { startedContainer(); final PumbaContainer pumba = PumbaContainer.newPumba() - .affectingContainers(allContainers()) - .performingAction(killContainers()) - .scheduled(onlyOnce()); + .on(allContainers()) + .performAction(killContainers()) + .schedule(onlyOnce().withAllContainersAtOnce()); // when pumba.start(); diff --git a/modules/chaostesting/src/test/java/org/testcontainers/PausingContainersTest.java b/modules/chaostesting/src/test/java/org/testcontainers/PausingContainersTest.java index 3003dc4edab..aabda788452 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/PausingContainersTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/PausingContainersTest.java @@ -10,7 +10,7 @@ import static com.jayway.awaitility.Awaitility.await; import static org.assertj.core.api.Assertions.assertThat; import static org.testcontainers.PumbaActions.pauseContainersFor; -import static org.testcontainers.PumbaSchedules.onlyOnce; +import static org.testcontainers.PumbaExecutionModes.onlyOnce; import static org.testcontainers.PumbaTargets.containers; /** @@ -31,9 +31,9 @@ public void should_pause_single_container() throws Exception { final GenericContainer containerToPause = startedContainer(); final PumbaContainer pumba = PumbaContainer.newPumba() - .affectingContainers(containers(containerToPause.getContainerName())) - .performingAction(pauseContainersFor(10, SupportedTimeUnit.SECONDS)) - .scheduled(onlyOnce()); + .on(containers(containerToPause.getContainerName())) + .performAction(pauseContainersFor(10, SupportedTimeUnit.SECONDS)) + .schedule(onlyOnce().withAllContainersAtOnce()); // when pumba.start(); From 2dd495597974145b7e003cad71e760f2f39fbc79 Mon Sep 17 00:00:00 2001 From: novy Date: Mon, 2 Jan 2017 01:07:50 +0100 Subject: [PATCH 05/32] Added support for recurrent tasks --- .../testcontainers/PumbaExecutionModes.java | 2 +- .../testcontainers/KillingContainersTest.java | 31 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/modules/chaostesting/src/main/java/org/testcontainers/PumbaExecutionModes.java b/modules/chaostesting/src/main/java/org/testcontainers/PumbaExecutionModes.java index 6e9577195a0..b1e85ba62d9 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/PumbaExecutionModes.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/PumbaExecutionModes.java @@ -18,7 +18,7 @@ public static WithSchedule onlyOnce() { public static WithSchedule recurrently(int time, SupportedTimeUnit unit) { return new WithSchedule( - () -> "--interval" + TimeExpression.of(time, unit).evaluate() + () -> "--interval " + TimeExpression.of(time, unit).evaluate() ); } diff --git a/modules/chaostesting/src/test/java/org/testcontainers/KillingContainersTest.java b/modules/chaostesting/src/test/java/org/testcontainers/KillingContainersTest.java index d18bb6c4a32..e3098862c4a 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/KillingContainersTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/KillingContainersTest.java @@ -5,6 +5,7 @@ import org.testcontainers.containers.GenericContainer; import java.util.Collection; +import java.util.concurrent.TimeUnit; import java.util.function.Predicate; import java.util.regex.Pattern; @@ -12,6 +13,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.testcontainers.PumbaActions.killContainers; import static org.testcontainers.PumbaExecutionModes.onlyOnce; +import static org.testcontainers.PumbaExecutionModes.recurrently; import static org.testcontainers.PumbaTargets.*; /** @@ -115,6 +117,35 @@ public void should_kill_all_containers() throws Exception { await().until(() -> assertThat(environment.namesOfRunningContainers()).isEmpty()); } + @Test + public void should_kill_one_random_container_periodically() throws Exception { + // given + startContainerWithNameContaining("foobar"); + startContainerWithNameContaining("foobar"); + + final PumbaContainer pumba = PumbaContainer.newPumba() + .on(containersMatchingRegexp(".*foobar.*")) + .performAction(killContainers()) + .schedule(recurrently(5, SupportedTimeUnit.SECONDS).withOneContainerAtTime()); + + // when + pumba.start(); + + // then + await().atMost(8, TimeUnit.SECONDS).until(() -> + assertThat(environment.namesOfRunningContainers()) + .filteredOn(matchesRegexp(".*foobar.*")) + .hasSize(1) + ); + + // and + await().atMost(8, TimeUnit.SECONDS).until(() -> + assertThat(environment.namesOfRunningContainers()) + .filteredOn(matchesRegexp(".*foobar.*")) + .isEmpty() + ); + } + private Predicate matchesRegexp(String regexp) { return Pattern.compile(regexp).asPredicate(); } From 08d8994614be6c2132299947b577945afe06bb34 Mon Sep 17 00:00:00 2001 From: novy Date: Mon, 2 Jan 2017 11:53:52 +0100 Subject: [PATCH 06/32] Stopping containers support, basic support for removing containers - not working properly due to pumba issues --- .../java/org/testcontainers/PumbaActions.java | 11 +++ .../CanSpawnExampleContainers.java | 7 ++ .../org/testcontainers/DockerEnvironment.java | 10 ++- .../testcontainers/RemovingContainerTest.java | 71 +++++++++++++++++++ .../testcontainers/StoppingContainerTest.java | 47 ++++++++++++ 5 files changed, 145 insertions(+), 1 deletion(-) create mode 100644 modules/chaostesting/src/test/java/org/testcontainers/RemovingContainerTest.java create mode 100644 modules/chaostesting/src/test/java/org/testcontainers/StoppingContainerTest.java diff --git a/modules/chaostesting/src/main/java/org/testcontainers/PumbaActions.java b/modules/chaostesting/src/main/java/org/testcontainers/PumbaActions.java index ec37aba9ee5..e15f2b20454 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/PumbaActions.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/PumbaActions.java @@ -10,6 +10,7 @@ public final class PumbaActions { public static PumbaAction killContainers() { + // todo implement singal choosing return () -> "kill"; } @@ -19,6 +20,16 @@ public static PumbaAction pauseContainersFor(int time, SupportedTimeUnit unit) { return () -> String.format("pause -d %s", timePart.evaluate()); } + public static PumbaAction stopContainers() { + // todo implement choosing grace period + return () -> "stop"; + } + + public static PumbaAction removeContainers() { + // todo reimplement + return () -> "rm --force --links --volumes"; + } + public interface PumbaAction extends PumbaCommandPart { } } diff --git a/modules/chaostesting/src/test/java/org/testcontainers/CanSpawnExampleContainers.java b/modules/chaostesting/src/test/java/org/testcontainers/CanSpawnExampleContainers.java index 195bb07c507..aba937e85a5 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/CanSpawnExampleContainers.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/CanSpawnExampleContainers.java @@ -21,6 +21,13 @@ default GenericContainer startedContainer() { return aContainer; } + default GenericContainer stoppedContainer() { + final GenericContainer aContainer = startedContainer(); + // this is to avoid running Resource reaper + aContainer.getDockerClient().stopContainerCmd(aContainer.getContainerId()).exec(); + return aContainer; + } + @SneakyThrows default void startContainerWithNameContaining(String partOfContainerName) { final File temporaryFile = File.createTempFile("temp-compose", ".yml"); diff --git a/modules/chaostesting/src/test/java/org/testcontainers/DockerEnvironment.java b/modules/chaostesting/src/test/java/org/testcontainers/DockerEnvironment.java index c9919ef8f8b..5b35b4563bb 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/DockerEnvironment.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/DockerEnvironment.java @@ -22,8 +22,16 @@ class DockerEnvironment { Collection namesOfRunningContainers() { final List runningContainers = delegate.listContainersCmd().exec(); + return namesOf(runningContainers); + } + + Collection namesOfAllContainers() { + final List runningContainers = delegate.listContainersCmd().withShowAll(true).exec(); + return namesOf(runningContainers); + } - return runningContainers.stream() + private Collection namesOf(Collection containers) { + return containers.stream() .map(Container::getNames) .flatMap(Stream::of) .collect(Collectors.toSet()); diff --git a/modules/chaostesting/src/test/java/org/testcontainers/RemovingContainerTest.java b/modules/chaostesting/src/test/java/org/testcontainers/RemovingContainerTest.java new file mode 100644 index 00000000000..810b1cbffce --- /dev/null +++ b/modules/chaostesting/src/test/java/org/testcontainers/RemovingContainerTest.java @@ -0,0 +1,71 @@ +package org.testcontainers; + +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Test; +import org.testcontainers.containers.GenericContainer; + +import static com.jayway.awaitility.Awaitility.await; +import static org.assertj.core.api.Assertions.assertThat; +import static org.testcontainers.PumbaActions.removeContainers; +import static org.testcontainers.PumbaExecutionModes.onlyOnce; +import static org.testcontainers.PumbaTargets.containers; + +/** + * Created by novy on 31.12.16. + */ + +@Ignore +// todo: there are some issues on pumba side, mentioned in every test case +public class RemovingContainerTest implements CanSpawnExampleContainers { + + private DockerEnvironment environment; + + @Before + public void setUp() throws Exception { + environment = new DockerEnvironment(); + } + + @Test + // todo https://github.com/gaia-adm/pumba/issues/30 + public void should_remove_stopped_container() throws Exception { + // given + final GenericContainer stoppedContainerToRemove = stoppedContainer(); + + final PumbaContainer pumba = PumbaContainer.newPumba() + .on(containers(stoppedContainerToRemove.getContainerName())) + .performAction(removeContainers()) + .schedule(onlyOnce().withAllContainersAtOnce()); + + // when + pumba.start(); + + // then + await().until(() -> + assertThat(environment.namesOfAllContainers()) + .doesNotContain(stoppedContainerToRemove.getContainerName()) + ); + + } + + @Test + // todo https://github.com/gaia-adm/pumba/issues/31 + public void should_remove_running_container() throws Exception { + // given + final GenericContainer containerToRemove = startedContainer(); + + final PumbaContainer pumba = PumbaContainer.newPumba() + .on(containers(containerToRemove.getContainerName())) + .performAction(removeContainers()) + .schedule(onlyOnce().withAllContainersAtOnce()); + + // when + pumba.start(); + + // then + await().until(() -> + assertThat(environment.namesOfAllContainers()) + .doesNotContain(containerToRemove.getContainerName()) + ); + } +} \ No newline at end of file diff --git a/modules/chaostesting/src/test/java/org/testcontainers/StoppingContainerTest.java b/modules/chaostesting/src/test/java/org/testcontainers/StoppingContainerTest.java new file mode 100644 index 00000000000..863ebc3b249 --- /dev/null +++ b/modules/chaostesting/src/test/java/org/testcontainers/StoppingContainerTest.java @@ -0,0 +1,47 @@ +package org.testcontainers; + +import org.junit.Before; +import org.junit.Test; +import org.testcontainers.DockerEnvironment.ContainerDetails; +import org.testcontainers.containers.GenericContainer; + +import java.util.concurrent.TimeUnit; + +import static com.jayway.awaitility.Awaitility.await; +import static org.assertj.core.api.Assertions.assertThat; +import static org.testcontainers.PumbaActions.stopContainers; +import static org.testcontainers.PumbaExecutionModes.onlyOnce; +import static org.testcontainers.PumbaTargets.containers; + +/** + * Created by novy on 31.12.16. + */ +public class StoppingContainerTest implements CanSpawnExampleContainers { + + private DockerEnvironment environment; + + @Before + public void setUp() throws Exception { + environment = new DockerEnvironment(); + } + + @Test + public void should_stop_single_container() throws Exception { + // given + final GenericContainer containerToStop = startedContainer(); + + final PumbaContainer pumba = PumbaContainer.newPumba() + .on(containers(containerToStop.getContainerName())) + .performAction(stopContainers()) + .schedule(onlyOnce().withAllContainersAtOnce()); + + // when + pumba.start(); + + // then + await().atMost(20, TimeUnit.SECONDS).until(() -> { + final ContainerDetails container = environment.containerDetails(containerToStop.getContainerId()); + assertThat(container.isRunning()).isFalse(); + }); + } +} \ No newline at end of file From 34af99ef9acf6cfe7969241ee199e8c1d94f577e Mon Sep 17 00:00:00 2001 From: novy Date: Tue, 10 Jan 2017 14:05:29 +0100 Subject: [PATCH 07/32] Always mount docker.sock for pumba (should work regardless of environment (i.e. docker-machine, boot2docker)) --- .../startupcheck/StartupCheckStrategy.java | 13 ++++--- modules/chaostesting/pom.xml | 5 ++- .../java/org/testcontainers/PumbaCommand.java | 3 +- .../org/testcontainers/PumbaContainer.java | 36 ++++++++++++++++--- .../CanSpawnExampleContainers.java | 34 ++++++------------ .../testcontainers/KillingContainersTest.java | 29 ++++++++------- .../testcontainers/PausingContainersTest.java | 4 +-- 7 files changed, 71 insertions(+), 53 deletions(-) diff --git a/core/src/main/java/org/testcontainers/containers/startupcheck/StartupCheckStrategy.java b/core/src/main/java/org/testcontainers/containers/startupcheck/StartupCheckStrategy.java index f592411b4fb..3260f1e1193 100644 --- a/core/src/main/java/org/testcontainers/containers/startupcheck/StartupCheckStrategy.java +++ b/core/src/main/java/org/testcontainers/containers/startupcheck/StartupCheckStrategy.java @@ -28,11 +28,14 @@ public boolean waitUntilStartupSuccessful(DockerClient dockerClient, String cont return DOCKER_CLIENT_RATE_LIMITER.getWhenReady(() -> { StartupStatus state = checkStartupState(dockerClient, containerId); switch (state) { - case SUCCESSFUL: startedOK[0] = true; - return true; - case FAILED: startedOK[0] = false; - return true; - default: return false; + case SUCCESSFUL: + startedOK[0] = true; + return true; + case FAILED: + startedOK[0] = false; + return true; + default: + return false; } }); }); diff --git a/modules/chaostesting/pom.xml b/modules/chaostesting/pom.xml index b4322e82826..265ceb4badf 100644 --- a/modules/chaostesting/pom.xml +++ b/modules/chaostesting/pom.xml @@ -14,11 +14,10 @@ TestContainers :: chaostesting - org.testcontainers testcontainers - 1.1.7 + 1.1.8-SNAPSHOT @@ -36,4 +35,4 @@ - \ No newline at end of file + diff --git a/modules/chaostesting/src/main/java/org/testcontainers/PumbaCommand.java b/modules/chaostesting/src/main/java/org/testcontainers/PumbaCommand.java index e8c0eb93d77..fc158add21d 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/PumbaCommand.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/PumbaCommand.java @@ -26,7 +26,6 @@ String evaluate() { } private PumbaCommandPart commandPrefix() { - // todo fixme - return () -> "pumba --debug --host tcp://192.168.1.106:2375"; + return () -> "pumba --debug"; } } diff --git a/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java b/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java index 6adb534e225..a753be148a7 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java @@ -4,25 +4,44 @@ import org.testcontainers.PumbaExecutionModes.PumbaExecutionMode; import org.testcontainers.PumbaTargets.PumbaTarget; import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.output.Slf4jLogConsumer; +import org.testcontainers.containers.startupcheck.StartupCheckStrategy; +import org.testcontainers.shaded.com.github.dockerjava.api.DockerClient; + +import static org.testcontainers.containers.BindMode.READ_WRITE; /** * Created by novy on 31.12.16. */ -public class PumbaContainer extends GenericContainer { +public final class PumbaContainer extends GenericContainer { - private PumbaAction action = PumbaActions.killContainers(); - private PumbaExecutionMode schedule = PumbaExecutionModes.onlyOnce().withAllContainersAtOnce(); - private PumbaTarget target = PumbaTargets.allContainers(); + private PumbaAction action; + private PumbaExecutionMode schedule; + private PumbaTarget target; private PumbaContainer() { super("gaiaadm/pumba:latest"); + doNotWaitForStartupAtAll(); + mountDockerSocket(); + + this.action = PumbaActions.killContainers(); + this.schedule = PumbaExecutionModes.onlyOnce().withAllContainersAtOnce(); + this.target = PumbaTargets.allContainers(); + } + + private void doNotWaitForStartupAtAll() { + setStartupCheckStrategy(new DoNotCheckStartup()); + } + + private void mountDockerSocket() { + addFileSystemBind("/var/run/docker.sock", "/var/run/docker.sock", READ_WRITE); } @Override public void start() { final PumbaCommand command = new PumbaCommand(action, schedule, target); - setCommand(command.evaluate().replaceAll(" ", " ")); + setCommand(command.evaluate()); super.start(); } @@ -44,4 +63,11 @@ public PumbaContainer schedule(PumbaExecutionMode schedule) { this.schedule = schedule; return this; } + + private static class DoNotCheckStartup extends StartupCheckStrategy { + @Override + public StartupStatus checkStartupState(DockerClient dockerClient, String s) { + return StartupStatus.SUCCESSFUL; + } + } } diff --git a/modules/chaostesting/src/test/java/org/testcontainers/CanSpawnExampleContainers.java b/modules/chaostesting/src/test/java/org/testcontainers/CanSpawnExampleContainers.java index aba937e85a5..4a48e88e7b3 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/CanSpawnExampleContainers.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/CanSpawnExampleContainers.java @@ -1,13 +1,7 @@ package org.testcontainers; -import lombok.SneakyThrows; -import org.apache.commons.io.FileUtils; -import org.junit.runner.Description; -import org.testcontainers.containers.DockerComposeContainer; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.shaded.com.google.common.collect.ImmutableList; - -import java.io.File; +import org.testcontainers.shaded.com.github.dockerjava.api.DockerClient; /** * Created by novy on 01.01.17. @@ -15,8 +9,8 @@ interface CanSpawnExampleContainers { default GenericContainer startedContainer() { - final GenericContainer aContainer = new GenericContainer<>("ubuntu:latest") - .withCommand("bash", "-c", "while true; do echo something; sleep 1; done"); + final GenericContainer aContainer = new GenericContainer<>("alpine:latest") + .withCommand("ping", "www.example.com"); aContainer.start(); return aContainer; } @@ -24,23 +18,15 @@ default GenericContainer startedContainer() { default GenericContainer stoppedContainer() { final GenericContainer aContainer = startedContainer(); // this is to avoid running Resource reaper - aContainer.getDockerClient().stopContainerCmd(aContainer.getContainerId()).exec(); + final DockerClient client = DockerClientFactory.instance().client(); + client.stopContainerCmd(aContainer.getContainerId()).exec(); return aContainer; } - @SneakyThrows - default void startContainerWithNameContaining(String partOfContainerName) { - final File temporaryFile = File.createTempFile("temp-compose", ".yml"); - final ImmutableList composeContent = ImmutableList.of( - partOfContainerName + ":", - " image: ubuntu:latest", - " command: [bash, -c, \"while true; do echo something; sleep 1; done\"]" - ); - FileUtils.writeLines( - temporaryFile, composeContent - ); - - final DockerComposeContainer composeContainer = new DockerComposeContainer<>(temporaryFile); - composeContainer.starting(Description.EMPTY); + default GenericContainer startedContainerWithName(String containerName) { + final GenericContainer containerToRename = startedContainer(); + final DockerClient client = DockerClientFactory.instance().client(); + client.renameContainerCmd(containerToRename.getContainerId()).withName(containerName).exec(); + return containerToRename; } } diff --git a/modules/chaostesting/src/test/java/org/testcontainers/KillingContainersTest.java b/modules/chaostesting/src/test/java/org/testcontainers/KillingContainersTest.java index e3098862c4a..f21d8349980 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/KillingContainersTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/KillingContainersTest.java @@ -5,6 +5,7 @@ import org.testcontainers.containers.GenericContainer; import java.util.Collection; +import java.util.UUID; import java.util.concurrent.TimeUnit; import java.util.function.Predicate; import java.util.regex.Pattern; @@ -78,12 +79,12 @@ public void should_kill_more_than_one_containers() throws Exception { @Test public void should_kill_containers_matching_regular_expression() throws Exception { // given - startContainerWithNameContaining("foobar"); - startContainerWithNameContaining("foobar"); - startContainerWithNameContaining("barbaz"); + startedContainerWithName(containerNameStartingWith("foobar")); + startedContainerWithName(containerNameStartingWith("foobar")); + startedContainerWithName(containerNameStartingWith("barbaz")); final PumbaContainer pumba = PumbaContainer.newPumba() - .on(containersMatchingRegexp(".*foobar.*")) + .on(containersMatchingRegexp("foobar.*")) .performAction(killContainers()) .schedule(onlyOnce().withAllContainersAtOnce()); @@ -94,8 +95,8 @@ public void should_kill_containers_matching_regular_expression() throws Exceptio await().until(() -> { final Collection namesOfRunningContainers = environment.namesOfRunningContainers(); - assertThat(namesOfRunningContainers).filteredOn(matchesRegexp(".*foobar.*")).isEmpty(); - assertThat(namesOfRunningContainers).filteredOn(matchesRegexp(".*barbaz.*")).isNotEmpty(); + assertThat(namesOfRunningContainers).filteredOn(matchesRegexp("foobar.*")).isEmpty(); + assertThat(namesOfRunningContainers).filteredOn(matchesRegexp("barbaz.*")).isNotEmpty(); }); } @@ -114,17 +115,17 @@ public void should_kill_all_containers() throws Exception { pumba.start(); // then - await().until(() -> assertThat(environment.namesOfRunningContainers()).isEmpty()); + await().atMost(20, TimeUnit.SECONDS).until(() -> assertThat(environment.namesOfRunningContainers()).isEmpty()); } @Test public void should_kill_one_random_container_periodically() throws Exception { // given - startContainerWithNameContaining("foobar"); - startContainerWithNameContaining("foobar"); + startedContainerWithName(containerNameStartingWith("foobar")); + startedContainerWithName(containerNameStartingWith("foobar")); final PumbaContainer pumba = PumbaContainer.newPumba() - .on(containersMatchingRegexp(".*foobar.*")) + .on(containersMatchingRegexp("foobar.*")) .performAction(killContainers()) .schedule(recurrently(5, SupportedTimeUnit.SECONDS).withOneContainerAtTime()); @@ -134,14 +135,14 @@ public void should_kill_one_random_container_periodically() throws Exception { // then await().atMost(8, TimeUnit.SECONDS).until(() -> assertThat(environment.namesOfRunningContainers()) - .filteredOn(matchesRegexp(".*foobar.*")) + .filteredOn(matchesRegexp("foobar.*")) .hasSize(1) ); // and await().atMost(8, TimeUnit.SECONDS).until(() -> assertThat(environment.namesOfRunningContainers()) - .filteredOn(matchesRegexp(".*foobar.*")) + .filteredOn(matchesRegexp("foobar.*")) .isEmpty() ); } @@ -149,4 +150,8 @@ public void should_kill_one_random_container_periodically() throws Exception { private Predicate matchesRegexp(String regexp) { return Pattern.compile(regexp).asPredicate(); } + + private String containerNameStartingWith(String prefix) { + return prefix + "_" + UUID.randomUUID().toString(); + } } diff --git a/modules/chaostesting/src/test/java/org/testcontainers/PausingContainersTest.java b/modules/chaostesting/src/test/java/org/testcontainers/PausingContainersTest.java index aabda788452..bb721f4e05e 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/PausingContainersTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/PausingContainersTest.java @@ -39,7 +39,7 @@ public void should_pause_single_container() throws Exception { pumba.start(); // then - await().until(() -> { + await().atMost(20, TimeUnit.SECONDS).until(() -> { final ContainerDetails container = environment.containerDetails(containerToPause.getContainerId()); assertThat(container.isPaused()).isTrue(); }); @@ -49,4 +49,4 @@ public void should_pause_single_container() throws Exception { assertThat(container.isPaused()).isFalse(); }); } -} \ No newline at end of file +} From c4222f0ecffc7d95dd243ba80a0bbee414d68a84 Mon Sep 17 00:00:00 2001 From: novy Date: Sat, 14 Jan 2017 19:34:53 +0100 Subject: [PATCH 08/32] Support for netem delay, refactor towards better DSL --- ...umbaActions.java => ContainerActions.java} | 12 +-- .../org/testcontainers/NetworkActions.java | 69 +++++++++++++ .../testcontainers/NetworkSubCommands.java | 97 +++++++++++++++++++ .../java/org/testcontainers/PumbaAction.java | 7 ++ .../java/org/testcontainers/PumbaCommand.java | 7 +- .../org/testcontainers/PumbaContainer.java | 65 ++++++++----- .../java/org/testcontainers/PumbaDSL.java | 27 ++++++ .../testcontainers/PumbaExecutionModes.java | 4 +- .../java/org/testcontainers/PumbaTargets.java | 4 - .../org/testcontainers/SupportedTimeUnit.java | 22 +++++ .../org/testcontainers/TimeExpression.java | 17 +++- .../{ => test}/CanSpawnExampleContainers.java | 3 +- .../test/DelayingOutgoingPacketsTest.java | 47 +++++++++ .../{ => test}/DockerEnvironment.java | 3 +- .../{ => test}/KillingContainersTest.java | 46 ++++----- .../java/org/testcontainers/test/Network.java | 55 +++++++++++ .../{ => test}/PausingContainersTest.java | 16 +-- .../{ => test}/RemovingContainerTest.java | 23 ++--- .../{ => test}/StoppingContainerTest.java | 17 ++-- 19 files changed, 446 insertions(+), 95 deletions(-) rename modules/chaostesting/src/main/java/org/testcontainers/{PumbaActions.java => ContainerActions.java} (63%) create mode 100644 modules/chaostesting/src/main/java/org/testcontainers/NetworkActions.java create mode 100644 modules/chaostesting/src/main/java/org/testcontainers/NetworkSubCommands.java create mode 100644 modules/chaostesting/src/main/java/org/testcontainers/PumbaAction.java create mode 100644 modules/chaostesting/src/main/java/org/testcontainers/PumbaDSL.java rename modules/chaostesting/src/test/java/org/testcontainers/{ => test}/CanSpawnExampleContainers.java (93%) create mode 100644 modules/chaostesting/src/test/java/org/testcontainers/test/DelayingOutgoingPacketsTest.java rename modules/chaostesting/src/test/java/org/testcontainers/{ => test}/DockerEnvironment.java (95%) rename modules/chaostesting/src/test/java/org/testcontainers/{ => test}/KillingContainersTest.java (73%) create mode 100644 modules/chaostesting/src/test/java/org/testcontainers/test/Network.java rename modules/chaostesting/src/test/java/org/testcontainers/{ => test}/PausingContainersTest.java (70%) rename modules/chaostesting/src/test/java/org/testcontainers/{ => test}/RemovingContainerTest.java (70%) rename modules/chaostesting/src/test/java/org/testcontainers/{ => test}/StoppingContainerTest.java (69%) diff --git a/modules/chaostesting/src/main/java/org/testcontainers/PumbaActions.java b/modules/chaostesting/src/main/java/org/testcontainers/ContainerActions.java similarity index 63% rename from modules/chaostesting/src/main/java/org/testcontainers/PumbaActions.java rename to modules/chaostesting/src/main/java/org/testcontainers/ContainerActions.java index e15f2b20454..f6ad3e4974a 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/PumbaActions.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/ContainerActions.java @@ -7,29 +7,29 @@ * Created by novy on 31.12.16. */ @NoArgsConstructor(access = AccessLevel.PRIVATE) -public final class PumbaActions { +public final class ContainerActions { - public static PumbaAction killContainers() { + public static ContainerAction killContainers() { // todo implement singal choosing return () -> "kill"; } - public static PumbaAction pauseContainersFor(int time, SupportedTimeUnit unit) { + public static ContainerAction pauseContainersFor(int time, SupportedTimeUnit unit) { final PumbaCommandPart timePart = TimeExpression.of(time, unit); return () -> String.format("pause -d %s", timePart.evaluate()); } - public static PumbaAction stopContainers() { + public static ContainerAction stopContainers() { // todo implement choosing grace period return () -> "stop"; } - public static PumbaAction removeContainers() { + public static ContainerAction removeContainers() { // todo reimplement return () -> "rm --force --links --volumes"; } - public interface PumbaAction extends PumbaCommandPart { + public interface ContainerAction extends PumbaAction { } } diff --git a/modules/chaostesting/src/main/java/org/testcontainers/NetworkActions.java b/modules/chaostesting/src/main/java/org/testcontainers/NetworkActions.java new file mode 100644 index 00000000000..a7dd5a738bb --- /dev/null +++ b/modules/chaostesting/src/main/java/org/testcontainers/NetworkActions.java @@ -0,0 +1,69 @@ +package org.testcontainers; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +import java.util.Optional; + +import static org.testcontainers.NetworkSubCommands.NetworkSubCommand; + +/** + * Created by novy on 14.01.17. + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class NetworkActions { + + public static NetworkActionWithSubCommand anAction() { + return new NetworkActionWithSubCommand(); + } + + interface NetworkAction extends PumbaAction { + } + + public static class NetworkActionWithSubCommand { + + private TimeExpression duration = TimeExpression.of(1, SupportedTimeUnit.MINUTES); + private String networkInterface = "eth0"; + private String targetIP; + + public NetworkActionWithSubCommand lastingFor(int time, SupportedTimeUnit unit) { + this.duration = TimeExpression.of(time, unit); + return this; + } + + public NetworkActionWithSubCommand onNetworkInterface(String networkInterface) { + this.networkInterface = networkInterface; + return this; + } + + public NetworkActionWithSubCommand onTrafficTo(String targetIP) { + this.targetIP = targetIP; + return this; + } + + public NetworkAction executeSubCommand(NetworkSubCommand subCommand) { + return () -> netemPart() + .append(durationPart()) + .append(interfacePart()) + .append(trafficFilterPart()) + .append(subCommand) + .evaluate(); + } + + private PumbaCommandPart netemPart() { + return () -> "netem --tc-image gaiadocker/iproute2"; + } + + private PumbaCommandPart durationPart() { + return () -> "--duration " + duration.evaluate(); + } + + private PumbaCommandPart interfacePart() { + return () -> "--interface " + networkInterface; + } + + private PumbaCommandPart trafficFilterPart() { + return () -> Optional.ofNullable(targetIP).map(t -> "--target " + t).orElse(""); + } + } +} diff --git a/modules/chaostesting/src/main/java/org/testcontainers/NetworkSubCommands.java b/modules/chaostesting/src/main/java/org/testcontainers/NetworkSubCommands.java new file mode 100644 index 00000000000..3989921f3c0 --- /dev/null +++ b/modules/chaostesting/src/main/java/org/testcontainers/NetworkSubCommands.java @@ -0,0 +1,97 @@ +package org.testcontainers; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +import java.util.Optional; + +/** + * Created by novy on 14.01.17. + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class NetworkSubCommands { + + public static DelayOutgoingPackets delayOutgoingPackets() { + return new DelayOutgoingPackets(); + } + + + interface NetworkSubCommand extends PumbaCommandPart { + } + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class DelayOutgoingPackets implements NetworkSubCommand { + private TimeExpression delayTime = TimeExpression.of(100, SupportedTimeUnit.MILLISECONDS); + private TimeExpression jitter = TimeExpression.of(10, SupportedTimeUnit.MILLISECONDS); + private int correlation = 20; + private Distribution distribution = Distribution.NO_DISTRIBUTION; + + public DelayOutgoingPackets delayFor(int time, SupportedTimeUnit unit) { + this.delayTime = TimeExpression.of(time, unit); + return this; + } + + public DelayOutgoingPackets withJitter(int time, SupportedTimeUnit unit) { + this.jitter = TimeExpression.of(time, unit); + return this; + } + + public DelayOutgoingPackets withCorreltaion(int correlation) { + this.correlation = correlation; + return this; + } + + public DelayOutgoingPackets withDistribution(Distribution distribution) { + this.distribution = distribution; + return this; + } + + private PumbaCommandPart delayCommandPart() { + return () -> "delay"; + } + + private PumbaCommandPart delayTimePart() { + return () -> "--time " + delayTime.asMilliseconds(); + } + + private PumbaCommandPart jitterPart() { + return () -> "--jitter " + jitter.asMilliseconds(); + } + + private PumbaCommandPart correlationPart() { + return () -> "--correlation " + correlation; + } + + private PumbaCommandPart distributionPart() { + return () -> distribution.asCommandPart().map(d -> "--distribution " + d).orElse(""); + } + + + @Override + public String evaluate() { + return delayCommandPart() + .append(delayTimePart()) + .append(jitterPart()) + .append(correlationPart()) + .append(distributionPart()) + .evaluate(); + } + + public enum Distribution { + NO_DISTRIBUTION { + @Override + protected Optional asCommandPart() { + return Optional.empty(); + } + }, + UNIFORM, + NORMAL, + PARETO, + PARETONORMAL; + + protected Optional asCommandPart() { + return Optional.of(name().toLowerCase()); + } + } + } +} diff --git a/modules/chaostesting/src/main/java/org/testcontainers/PumbaAction.java b/modules/chaostesting/src/main/java/org/testcontainers/PumbaAction.java new file mode 100644 index 00000000000..3a6ade986f5 --- /dev/null +++ b/modules/chaostesting/src/main/java/org/testcontainers/PumbaAction.java @@ -0,0 +1,7 @@ +package org.testcontainers; + +/** + * Created by novy on 14.01.17. + */ +interface PumbaAction extends PumbaCommandPart { +} diff --git a/modules/chaostesting/src/main/java/org/testcontainers/PumbaCommand.java b/modules/chaostesting/src/main/java/org/testcontainers/PumbaCommand.java index fc158add21d..aa1aa7d5e81 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/PumbaCommand.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/PumbaCommand.java @@ -2,9 +2,6 @@ import lombok.AccessLevel; import lombok.RequiredArgsConstructor; -import org.testcontainers.PumbaActions.PumbaAction; -import org.testcontainers.PumbaExecutionModes.PumbaExecutionMode; -import org.testcontainers.PumbaTargets.PumbaTarget; /** * Created by novy on 01.01.17. @@ -14,8 +11,8 @@ class PumbaCommand { private final PumbaAction action; - private final PumbaExecutionMode executionMode; - private final PumbaTarget target; + private final PumbaExecutionModes.PumbaExecutionMode executionMode; + private final PumbaTargets.PumbaTarget target; String evaluate() { return commandPrefix() diff --git a/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java b/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java index a753be148a7..bb807d3fdc8 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java @@ -1,33 +1,29 @@ package org.testcontainers; -import org.testcontainers.PumbaActions.PumbaAction; -import org.testcontainers.PumbaExecutionModes.PumbaExecutionMode; -import org.testcontainers.PumbaTargets.PumbaTarget; +import lombok.SneakyThrows; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.output.Slf4jLogConsumer; import org.testcontainers.containers.startupcheck.StartupCheckStrategy; +import org.testcontainers.images.RemoteDockerImage; import org.testcontainers.shaded.com.github.dockerjava.api.DockerClient; +import java.util.function.Supplier; + import static org.testcontainers.containers.BindMode.READ_WRITE; /** * Created by novy on 31.12.16. */ -public final class PumbaContainer extends GenericContainer { +public final class PumbaContainer extends GenericContainer implements PumbaDSL.ProvidesAction, PumbaDSL.ProvidesTarget, PumbaDSL.ProvidesExecutionMode { - private PumbaAction action; - private PumbaExecutionMode schedule; - private PumbaTarget target; + private Supplier action; + private Supplier executionMode; + private Supplier target; private PumbaContainer() { super("gaiaadm/pumba:latest"); doNotWaitForStartupAtAll(); mountDockerSocket(); - - this.action = PumbaActions.killContainers(); - this.schedule = PumbaExecutionModes.onlyOnce().withAllContainersAtOnce(); - this.target = PumbaTargets.allContainers(); } private void doNotWaitForStartupAtAll() { @@ -38,36 +34,53 @@ private void mountDockerSocket() { addFileSystemBind("/var/run/docker.sock", "/var/run/docker.sock", READ_WRITE); } - @Override - public void start() { - final PumbaCommand command = new PumbaCommand(action, schedule, target); - setCommand(command.evaluate()); - super.start(); + public static PumbaDSL.ProvidesAction newPumba() { + return new PumbaContainer(); } - public static PumbaContainer newPumba() { - return new PumbaContainer(); + @Override + public PumbaDSL.ProvidesTarget performContainerChaos(ContainerActions.ContainerAction containerAction) { + this.action = () -> containerAction; + return this; } - public PumbaContainer on(PumbaTarget target) { - this.target = target; + @Override + public PumbaDSL.ProvidesTarget performNetworkChaos(NetworkActions.NetworkAction networkAction) { + this.action = () -> { + fetchIPRouteImage(); + return networkAction; + }; return this; } - public PumbaContainer performAction(PumbaAction action) { - this.action = action; + @SneakyThrows + private void fetchIPRouteImage() { + new RemoteDockerImage("gaiadocker/iproute2:latest").get(); + } + + @Override + public PumbaDSL.ProvidesExecutionMode affect(PumbaTargets.PumbaTarget target) { + this.target = () -> target; return this; } - public PumbaContainer schedule(PumbaExecutionMode schedule) { - this.schedule = schedule; + @Override + public GenericContainer execute(PumbaExecutionModes.PumbaExecutionMode executionMode) { + this.executionMode = () -> executionMode; return this; } + @Override + public void start() { + final PumbaCommand command = new PumbaCommand(action.get(), executionMode.get(), target.get()); + setCommand(command.evaluate()); + super.start(); + } + private static class DoNotCheckStartup extends StartupCheckStrategy { @Override public StartupStatus checkStartupState(DockerClient dockerClient, String s) { - return StartupStatus.SUCCESSFUL; + return StartupCheckStrategy.StartupStatus.SUCCESSFUL; } } } diff --git a/modules/chaostesting/src/main/java/org/testcontainers/PumbaDSL.java b/modules/chaostesting/src/main/java/org/testcontainers/PumbaDSL.java new file mode 100644 index 00000000000..75e2d47fe78 --- /dev/null +++ b/modules/chaostesting/src/main/java/org/testcontainers/PumbaDSL.java @@ -0,0 +1,27 @@ +package org.testcontainers; + + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.testcontainers.containers.GenericContainer; + +/** + * Created by novy on 14.01.17. + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +class PumbaDSL { + + public interface ProvidesAction { + ProvidesTarget performContainerChaos(ContainerActions.ContainerAction containerAction); + + ProvidesTarget performNetworkChaos(NetworkActions.NetworkAction networkAction); + } + + public interface ProvidesTarget { + ProvidesExecutionMode affect(PumbaTargets.PumbaTarget target); + } + + public interface ProvidesExecutionMode { + GenericContainer execute(PumbaExecutionModes.PumbaExecutionMode executionMode); + } +} diff --git a/modules/chaostesting/src/main/java/org/testcontainers/PumbaExecutionModes.java b/modules/chaostesting/src/main/java/org/testcontainers/PumbaExecutionModes.java index b1e85ba62d9..495d812a9ae 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/PumbaExecutionModes.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/PumbaExecutionModes.java @@ -26,11 +26,11 @@ public static WithSchedule recurrently(int time, SupportedTimeUnit unit) { public static class WithSchedule { private final PumbaCommandPart schedule; - public PumbaExecutionMode withAllContainersAtOnce() { + public PumbaExecutionMode onAllChosenContainers() { return new PumbaExecutionMode(schedule, () -> ""); } - public PumbaExecutionMode withOneContainerAtTime() { + public PumbaExecutionMode onRandomlyChosenContainer() { return new PumbaExecutionMode(schedule, () -> "--random"); } } diff --git a/modules/chaostesting/src/main/java/org/testcontainers/PumbaTargets.java b/modules/chaostesting/src/main/java/org/testcontainers/PumbaTargets.java index da553692943..e7aabd5ad7d 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/PumbaTargets.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/PumbaTargets.java @@ -14,10 +14,6 @@ @NoArgsConstructor(access = AccessLevel.PRIVATE) public final class PumbaTargets { - public static PumbaTarget singleContainer(String containerName) { - return () -> containerName; - } - public static PumbaTarget containers(String... containerNames) { return containers(Arrays.asList(containerNames)); } diff --git a/modules/chaostesting/src/main/java/org/testcontainers/SupportedTimeUnit.java b/modules/chaostesting/src/main/java/org/testcontainers/SupportedTimeUnit.java index 8ecea496d9c..8e62b98bc64 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/SupportedTimeUnit.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/SupportedTimeUnit.java @@ -9,22 +9,44 @@ public enum SupportedTimeUnit { String abbreviation() { return "ms"; } + + @Override + long millisecondsMultiplier() { + return 1; + } }, SECONDS { @Override String abbreviation() { return "s"; } + + @Override + long millisecondsMultiplier() { + return 1000; + } }, MINUTES { @Override String abbreviation() { return "m"; } + + @Override + long millisecondsMultiplier() { + return 60_000; + } }, HOURS { @Override String abbreviation() { return "h"; } + + @Override + long millisecondsMultiplier() { + return 3_600_000; + } }; abstract String abbreviation(); + + abstract long millisecondsMultiplier(); } diff --git a/modules/chaostesting/src/main/java/org/testcontainers/TimeExpression.java b/modules/chaostesting/src/main/java/org/testcontainers/TimeExpression.java index 38b654b7513..695b5ad1ea1 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/TimeExpression.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/TimeExpression.java @@ -1,18 +1,31 @@ package org.testcontainers; +import lombok.AccessLevel; import lombok.RequiredArgsConstructor; /** * Created by novy on 01.01.17. */ -@RequiredArgsConstructor(staticName = "of") +@RequiredArgsConstructor(access = AccessLevel.PRIVATE) class TimeExpression implements PumbaCommandPart { - private final int value; + private final long value; private final SupportedTimeUnit unit; + static TimeExpression of(int value, SupportedTimeUnit unit) { + return new TimeExpression(value, unit); + } + + static TimeExpression of(long value, SupportedTimeUnit unit) { + return new TimeExpression(value, unit); + } + @Override public String evaluate() { return value + unit.abbreviation(); } + + long asMilliseconds() { + return value * unit.millisecondsMultiplier(); + } } diff --git a/modules/chaostesting/src/test/java/org/testcontainers/CanSpawnExampleContainers.java b/modules/chaostesting/src/test/java/org/testcontainers/test/CanSpawnExampleContainers.java similarity index 93% rename from modules/chaostesting/src/test/java/org/testcontainers/CanSpawnExampleContainers.java rename to modules/chaostesting/src/test/java/org/testcontainers/test/CanSpawnExampleContainers.java index 4a48e88e7b3..305d91ea539 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/CanSpawnExampleContainers.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/CanSpawnExampleContainers.java @@ -1,5 +1,6 @@ -package org.testcontainers; +package org.testcontainers.test; +import org.testcontainers.DockerClientFactory; import org.testcontainers.containers.GenericContainer; import org.testcontainers.shaded.com.github.dockerjava.api.DockerClient; diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/DelayingOutgoingPacketsTest.java b/modules/chaostesting/src/test/java/org/testcontainers/test/DelayingOutgoingPacketsTest.java new file mode 100644 index 00000000000..d6b4f1a48e8 --- /dev/null +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/DelayingOutgoingPacketsTest.java @@ -0,0 +1,47 @@ +package org.testcontainers.test; + +import org.junit.Test; +import org.testcontainers.PumbaContainer; +import org.testcontainers.SupportedTimeUnit; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.test.Network.CanPingContainers; +import org.testcontainers.test.Network.PingResponse; + +import static com.jayway.awaitility.Awaitility.await; +import static org.assertj.core.api.Assertions.assertThat; +import static org.testcontainers.NetworkActions.anAction; +import static org.testcontainers.NetworkSubCommands.delayOutgoingPackets; +import static org.testcontainers.PumbaExecutionModes.onlyOnce; +import static org.testcontainers.PumbaTargets.containers; + +/** + * Created by novy on 14.01.17. + */ +public class DelayingOutgoingPacketsTest implements CanSpawnExampleContainers, CanPingContainers { + + @Test + public void should_be_able_to_delay_outgoing_packets_from_container() throws Exception { + // given + final GenericContainer aContainer = startedContainer(); + + final GenericContainer pumba = PumbaContainer.newPumba() + .performNetworkChaos(anAction() + .lastingFor(1, SupportedTimeUnit.MINUTES) + .executeSubCommand( + delayOutgoingPackets() + .delayFor(1000, SupportedTimeUnit.MILLISECONDS) + ) + ) + .affect(containers(aContainer.getContainerName())) + .execute(onlyOnce().onAllChosenContainers()); + + // when + pumba.start(); + + // then + await().until(() -> { + final PingResponse ping = ping(aContainer); + assertThat(ping.latencyInMilliseconds()).isGreaterThan(900); + }); + } +} diff --git a/modules/chaostesting/src/test/java/org/testcontainers/DockerEnvironment.java b/modules/chaostesting/src/test/java/org/testcontainers/test/DockerEnvironment.java similarity index 95% rename from modules/chaostesting/src/test/java/org/testcontainers/DockerEnvironment.java rename to modules/chaostesting/src/test/java/org/testcontainers/test/DockerEnvironment.java index 5b35b4563bb..3f7465a3e3d 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/DockerEnvironment.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/DockerEnvironment.java @@ -1,5 +1,6 @@ -package org.testcontainers; +package org.testcontainers.test; +import org.testcontainers.DockerClientFactory; import org.testcontainers.shaded.com.github.dockerjava.api.DockerClient; import org.testcontainers.shaded.com.github.dockerjava.api.command.InspectContainerResponse; import org.testcontainers.shaded.com.github.dockerjava.api.model.Container; diff --git a/modules/chaostesting/src/test/java/org/testcontainers/KillingContainersTest.java b/modules/chaostesting/src/test/java/org/testcontainers/test/KillingContainersTest.java similarity index 73% rename from modules/chaostesting/src/test/java/org/testcontainers/KillingContainersTest.java rename to modules/chaostesting/src/test/java/org/testcontainers/test/KillingContainersTest.java index f21d8349980..ec25566f746 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/KillingContainersTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/KillingContainersTest.java @@ -1,7 +1,9 @@ -package org.testcontainers; +package org.testcontainers.test; import org.junit.Before; import org.junit.Test; +import org.testcontainers.PumbaContainer; +import org.testcontainers.SupportedTimeUnit; import org.testcontainers.containers.GenericContainer; import java.util.Collection; @@ -12,7 +14,7 @@ import static com.jayway.awaitility.Awaitility.await; import static org.assertj.core.api.Assertions.assertThat; -import static org.testcontainers.PumbaActions.killContainers; +import static org.testcontainers.ContainerActions.killContainers; import static org.testcontainers.PumbaExecutionModes.onlyOnce; import static org.testcontainers.PumbaExecutionModes.recurrently; import static org.testcontainers.PumbaTargets.*; @@ -35,10 +37,10 @@ public void should_kill_single_container() throws Exception { final GenericContainer containerToKill = startedContainer(); final GenericContainer containerThatShouldSurvive = startedContainer(); - final PumbaContainer pumba = PumbaContainer.newPumba() - .performAction(killContainers()) - .on(containers(containerToKill.getContainerName())) - .schedule(onlyOnce().withAllContainersAtOnce()); + final GenericContainer pumba = PumbaContainer.newPumba() + .performContainerChaos(killContainers()) + .affect(containers(containerToKill.getContainerName())) + .execute(onlyOnce().onAllChosenContainers()); // when pumba.start(); @@ -59,10 +61,10 @@ public void should_kill_more_than_one_containers() throws Exception { final GenericContainer secondVictim = startedContainer(); final GenericContainer survivor = startedContainer(); - final PumbaContainer pumba = PumbaContainer.newPumba() - .on(containers(firstVictim.getContainerName(), secondVictim.getContainerName())) - .performAction(killContainers()) - .schedule(onlyOnce().withAllContainersAtOnce()); + final GenericContainer pumba = PumbaContainer.newPumba() + .performContainerChaos(killContainers()) + .affect(containers(firstVictim.getContainerName(), secondVictim.getContainerName())) + .execute(onlyOnce().onAllChosenContainers()); // when pumba.start(); @@ -83,10 +85,10 @@ public void should_kill_containers_matching_regular_expression() throws Exceptio startedContainerWithName(containerNameStartingWith("foobar")); startedContainerWithName(containerNameStartingWith("barbaz")); - final PumbaContainer pumba = PumbaContainer.newPumba() - .on(containersMatchingRegexp("foobar.*")) - .performAction(killContainers()) - .schedule(onlyOnce().withAllContainersAtOnce()); + final GenericContainer pumba = PumbaContainer.newPumba() + .performContainerChaos(killContainers()) + .affect(containersMatchingRegexp("foobar.*")) + .execute(onlyOnce().onAllChosenContainers()); // when pumba.start(); @@ -106,10 +108,10 @@ public void should_kill_all_containers() throws Exception { startedContainer(); startedContainer(); - final PumbaContainer pumba = PumbaContainer.newPumba() - .on(allContainers()) - .performAction(killContainers()) - .schedule(onlyOnce().withAllContainersAtOnce()); + final GenericContainer pumba = PumbaContainer.newPumba() + .performContainerChaos(killContainers()) + .affect(allContainers()) + .execute(onlyOnce().onAllChosenContainers()); // when pumba.start(); @@ -124,10 +126,10 @@ public void should_kill_one_random_container_periodically() throws Exception { startedContainerWithName(containerNameStartingWith("foobar")); startedContainerWithName(containerNameStartingWith("foobar")); - final PumbaContainer pumba = PumbaContainer.newPumba() - .on(containersMatchingRegexp("foobar.*")) - .performAction(killContainers()) - .schedule(recurrently(5, SupportedTimeUnit.SECONDS).withOneContainerAtTime()); + final GenericContainer pumba = PumbaContainer.newPumba() + .performContainerChaos(killContainers()) + .affect(containersMatchingRegexp("foobar.*")) + .execute(recurrently(5, SupportedTimeUnit.SECONDS).onRandomlyChosenContainer()); // when pumba.start(); diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/Network.java b/modules/chaostesting/src/test/java/org/testcontainers/test/Network.java new file mode 100644 index 00000000000..60cf8225a1f --- /dev/null +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/Network.java @@ -0,0 +1,55 @@ +package org.testcontainers.test; + +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import org.testcontainers.DockerClientFactory; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.shaded.com.github.dockerjava.api.DockerClient; +import org.testcontainers.shaded.com.github.dockerjava.api.command.InspectContainerResponse; + +/** + * Created by novy on 14.01.17. + */ + +class Network { + + interface CanPingContainers { + default PingResponse ping(GenericContainer container) { + final String containerIP = Network.ipAddressOf(container); + try { + final long start = System.currentTimeMillis(); + Network.ping(containerIP); + final long end = System.currentTimeMillis(); + return new PingResponse(true, end - start); + } catch (Exception ignored) { + return new PingResponse(false, -1); + } + } + } + + @RequiredArgsConstructor(access = AccessLevel.PRIVATE) + static class PingResponse { + private final boolean successful; + private final long latency; + + boolean wasSuccessful() { + return successful; + } + + long latencyInMilliseconds() { + return latency; + } + } + + static String ipAddressOf(GenericContainer container) { + final DockerClient client = DockerClientFactory.instance().client(); + final InspectContainerResponse inspected = client.inspectContainerCmd(container.getContainerId()).exec(); + return inspected.getNetworkSettings().getNetworks().get("bridge").getIpAddress(); + } + + static void ping(String address) throws Exception { + Runtime.getRuntime().exec("ping " + address + " -c 1").waitFor(); + } +} + + diff --git a/modules/chaostesting/src/test/java/org/testcontainers/PausingContainersTest.java b/modules/chaostesting/src/test/java/org/testcontainers/test/PausingContainersTest.java similarity index 70% rename from modules/chaostesting/src/test/java/org/testcontainers/PausingContainersTest.java rename to modules/chaostesting/src/test/java/org/testcontainers/test/PausingContainersTest.java index bb721f4e05e..e6e0a935c87 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/PausingContainersTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/PausingContainersTest.java @@ -1,15 +1,17 @@ -package org.testcontainers; +package org.testcontainers.test; import org.junit.Before; import org.junit.Test; -import org.testcontainers.DockerEnvironment.ContainerDetails; +import org.testcontainers.PumbaContainer; +import org.testcontainers.SupportedTimeUnit; import org.testcontainers.containers.GenericContainer; +import org.testcontainers.test.DockerEnvironment.ContainerDetails; import java.util.concurrent.TimeUnit; import static com.jayway.awaitility.Awaitility.await; import static org.assertj.core.api.Assertions.assertThat; -import static org.testcontainers.PumbaActions.pauseContainersFor; +import static org.testcontainers.ContainerActions.pauseContainersFor; import static org.testcontainers.PumbaExecutionModes.onlyOnce; import static org.testcontainers.PumbaTargets.containers; @@ -30,10 +32,10 @@ public void should_pause_single_container() throws Exception { // given final GenericContainer containerToPause = startedContainer(); - final PumbaContainer pumba = PumbaContainer.newPumba() - .on(containers(containerToPause.getContainerName())) - .performAction(pauseContainersFor(10, SupportedTimeUnit.SECONDS)) - .schedule(onlyOnce().withAllContainersAtOnce()); + final GenericContainer pumba = PumbaContainer.newPumba() + .performContainerChaos(pauseContainersFor(10, SupportedTimeUnit.SECONDS)) + .affect(containers(containerToPause.getContainerName())) + .execute(onlyOnce().onAllChosenContainers()); // when pumba.start(); diff --git a/modules/chaostesting/src/test/java/org/testcontainers/RemovingContainerTest.java b/modules/chaostesting/src/test/java/org/testcontainers/test/RemovingContainerTest.java similarity index 70% rename from modules/chaostesting/src/test/java/org/testcontainers/RemovingContainerTest.java rename to modules/chaostesting/src/test/java/org/testcontainers/test/RemovingContainerTest.java index 810b1cbffce..c4f7882eae4 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/RemovingContainerTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/RemovingContainerTest.java @@ -1,13 +1,14 @@ -package org.testcontainers; +package org.testcontainers.test; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; +import org.testcontainers.PumbaContainer; import org.testcontainers.containers.GenericContainer; import static com.jayway.awaitility.Awaitility.await; import static org.assertj.core.api.Assertions.assertThat; -import static org.testcontainers.PumbaActions.removeContainers; +import static org.testcontainers.ContainerActions.removeContainers; import static org.testcontainers.PumbaExecutionModes.onlyOnce; import static org.testcontainers.PumbaTargets.containers; @@ -32,10 +33,10 @@ public void should_remove_stopped_container() throws Exception { // given final GenericContainer stoppedContainerToRemove = stoppedContainer(); - final PumbaContainer pumba = PumbaContainer.newPumba() - .on(containers(stoppedContainerToRemove.getContainerName())) - .performAction(removeContainers()) - .schedule(onlyOnce().withAllContainersAtOnce()); + final GenericContainer pumba = PumbaContainer.newPumba() + .performContainerChaos(removeContainers()) + .affect(containers(stoppedContainerToRemove.getContainerName())) + .execute(onlyOnce().onAllChosenContainers()); // when pumba.start(); @@ -54,10 +55,10 @@ public void should_remove_running_container() throws Exception { // given final GenericContainer containerToRemove = startedContainer(); - final PumbaContainer pumba = PumbaContainer.newPumba() - .on(containers(containerToRemove.getContainerName())) - .performAction(removeContainers()) - .schedule(onlyOnce().withAllContainersAtOnce()); + final GenericContainer pumba = PumbaContainer.newPumba() + .performContainerChaos(removeContainers()) + .affect(containers(containerToRemove.getContainerName())) + .execute(onlyOnce().onAllChosenContainers()); // when pumba.start(); @@ -68,4 +69,4 @@ public void should_remove_running_container() throws Exception { .doesNotContain(containerToRemove.getContainerName()) ); } -} \ No newline at end of file +} diff --git a/modules/chaostesting/src/test/java/org/testcontainers/StoppingContainerTest.java b/modules/chaostesting/src/test/java/org/testcontainers/test/StoppingContainerTest.java similarity index 69% rename from modules/chaostesting/src/test/java/org/testcontainers/StoppingContainerTest.java rename to modules/chaostesting/src/test/java/org/testcontainers/test/StoppingContainerTest.java index 863ebc3b249..9da73045e36 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/StoppingContainerTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/StoppingContainerTest.java @@ -1,15 +1,16 @@ -package org.testcontainers; +package org.testcontainers.test; import org.junit.Before; import org.junit.Test; -import org.testcontainers.DockerEnvironment.ContainerDetails; +import org.testcontainers.ContainerActions; +import org.testcontainers.PumbaContainer; import org.testcontainers.containers.GenericContainer; +import org.testcontainers.test.DockerEnvironment.ContainerDetails; import java.util.concurrent.TimeUnit; import static com.jayway.awaitility.Awaitility.await; import static org.assertj.core.api.Assertions.assertThat; -import static org.testcontainers.PumbaActions.stopContainers; import static org.testcontainers.PumbaExecutionModes.onlyOnce; import static org.testcontainers.PumbaTargets.containers; @@ -30,10 +31,10 @@ public void should_stop_single_container() throws Exception { // given final GenericContainer containerToStop = startedContainer(); - final PumbaContainer pumba = PumbaContainer.newPumba() - .on(containers(containerToStop.getContainerName())) - .performAction(stopContainers()) - .schedule(onlyOnce().withAllContainersAtOnce()); + final GenericContainer pumba = PumbaContainer.newPumba() + .performContainerChaos(ContainerActions.stopContainers()) + .affect(containers(containerToStop.getContainerName())) + .execute(onlyOnce().onAllChosenContainers()); // when pumba.start(); @@ -44,4 +45,4 @@ public void should_stop_single_container() throws Exception { assertThat(container.isRunning()).isFalse(); }); } -} \ No newline at end of file +} From fd66cbba6150822f367c1a16035066be27fed4c5 Mon Sep 17 00:00:00 2001 From: novy Date: Sun, 15 Jan 2017 13:33:32 +0100 Subject: [PATCH 09/32] Support for rate limiting outgoing traffic --- .../testcontainers/DelayOutgoingPackets.java | 85 ++++++++++++ .../testcontainers/NetworkSubCommands.java | 80 +----------- .../RateLimitOutgoingTraffic.java | 123 ++++++++++++++++++ .../test/CanSpawnExampleContainers.java | 2 +- .../java/org/testcontainers/test/Network.java | 11 +- .../test/RateLimitingOutgoingPacketsTest.java | 48 +++++++ 6 files changed, 268 insertions(+), 81 deletions(-) create mode 100644 modules/chaostesting/src/main/java/org/testcontainers/DelayOutgoingPackets.java create mode 100644 modules/chaostesting/src/main/java/org/testcontainers/RateLimitOutgoingTraffic.java create mode 100644 modules/chaostesting/src/test/java/org/testcontainers/test/RateLimitingOutgoingPacketsTest.java diff --git a/modules/chaostesting/src/main/java/org/testcontainers/DelayOutgoingPackets.java b/modules/chaostesting/src/main/java/org/testcontainers/DelayOutgoingPackets.java new file mode 100644 index 00000000000..2f5fb93cae8 --- /dev/null +++ b/modules/chaostesting/src/main/java/org/testcontainers/DelayOutgoingPackets.java @@ -0,0 +1,85 @@ +package org.testcontainers; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +import java.util.Optional; + +/** + * Created by novy on 15.01.17. + */ +@NoArgsConstructor(access = AccessLevel.PACKAGE) +public class DelayOutgoingPackets implements NetworkSubCommands.NetworkSubCommand { + private TimeExpression delayTime = TimeExpression.of(100, SupportedTimeUnit.MILLISECONDS); + private TimeExpression jitter = TimeExpression.of(10, SupportedTimeUnit.MILLISECONDS); + private int correlation = 20; + private Distribution distribution = Distribution.NO_DISTRIBUTION; + + public DelayOutgoingPackets delayFor(int time, SupportedTimeUnit unit) { + this.delayTime = TimeExpression.of(time, unit); + return this; + } + + public DelayOutgoingPackets withJitter(int time, SupportedTimeUnit unit) { + this.jitter = TimeExpression.of(time, unit); + return this; + } + + public DelayOutgoingPackets withCorreltaion(int correlation) { + this.correlation = correlation; + return this; + } + + public DelayOutgoingPackets withDistribution(Distribution distribution) { + this.distribution = distribution; + return this; + } + + private PumbaCommandPart delayCommandPart() { + return () -> "delay"; + } + + private PumbaCommandPart delayTimePart() { + return () -> "--time " + delayTime.asMilliseconds(); + } + + private PumbaCommandPart jitterPart() { + return () -> "--jitter " + jitter.asMilliseconds(); + } + + private PumbaCommandPart correlationPart() { + return () -> "--correlation " + correlation; + } + + private PumbaCommandPart distributionPart() { + return () -> distribution.asCommandPart().map(d -> "--distribution " + d).orElse(""); + } + + + @Override + public String evaluate() { + return delayCommandPart() + .append(delayTimePart()) + .append(jitterPart()) + .append(correlationPart()) + .append(distributionPart()) + .evaluate(); + } + + public enum Distribution { + NO_DISTRIBUTION { + @Override + protected Optional asCommandPart() { + return Optional.empty(); + } + }, + UNIFORM, + NORMAL, + PARETO, + PARETONORMAL; + + protected Optional asCommandPart() { + return Optional.of(name().toLowerCase()); + } + } +} diff --git a/modules/chaostesting/src/main/java/org/testcontainers/NetworkSubCommands.java b/modules/chaostesting/src/main/java/org/testcontainers/NetworkSubCommands.java index 3989921f3c0..a123a7aecf9 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/NetworkSubCommands.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/NetworkSubCommands.java @@ -3,8 +3,6 @@ import lombok.AccessLevel; import lombok.NoArgsConstructor; -import java.util.Optional; - /** * Created by novy on 14.01.17. */ @@ -15,83 +13,11 @@ public static DelayOutgoingPackets delayOutgoingPackets() { return new DelayOutgoingPackets(); } - - interface NetworkSubCommand extends PumbaCommandPart { + public static RateLimitOutgoingTraffic rateLimitOutgoingTraffic() { + return new RateLimitOutgoingTraffic(); } - @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class DelayOutgoingPackets implements NetworkSubCommand { - private TimeExpression delayTime = TimeExpression.of(100, SupportedTimeUnit.MILLISECONDS); - private TimeExpression jitter = TimeExpression.of(10, SupportedTimeUnit.MILLISECONDS); - private int correlation = 20; - private Distribution distribution = Distribution.NO_DISTRIBUTION; - - public DelayOutgoingPackets delayFor(int time, SupportedTimeUnit unit) { - this.delayTime = TimeExpression.of(time, unit); - return this; - } - - public DelayOutgoingPackets withJitter(int time, SupportedTimeUnit unit) { - this.jitter = TimeExpression.of(time, unit); - return this; - } - - public DelayOutgoingPackets withCorreltaion(int correlation) { - this.correlation = correlation; - return this; - } - - public DelayOutgoingPackets withDistribution(Distribution distribution) { - this.distribution = distribution; - return this; - } - - private PumbaCommandPart delayCommandPart() { - return () -> "delay"; - } - private PumbaCommandPart delayTimePart() { - return () -> "--time " + delayTime.asMilliseconds(); - } - - private PumbaCommandPart jitterPart() { - return () -> "--jitter " + jitter.asMilliseconds(); - } - - private PumbaCommandPart correlationPart() { - return () -> "--correlation " + correlation; - } - - private PumbaCommandPart distributionPart() { - return () -> distribution.asCommandPart().map(d -> "--distribution " + d).orElse(""); - } - - - @Override - public String evaluate() { - return delayCommandPart() - .append(delayTimePart()) - .append(jitterPart()) - .append(correlationPart()) - .append(distributionPart()) - .evaluate(); - } - - public enum Distribution { - NO_DISTRIBUTION { - @Override - protected Optional asCommandPart() { - return Optional.empty(); - } - }, - UNIFORM, - NORMAL, - PARETO, - PARETONORMAL; - - protected Optional asCommandPart() { - return Optional.of(name().toLowerCase()); - } - } + interface NetworkSubCommand extends PumbaCommandPart { } } diff --git a/modules/chaostesting/src/main/java/org/testcontainers/RateLimitOutgoingTraffic.java b/modules/chaostesting/src/main/java/org/testcontainers/RateLimitOutgoingTraffic.java new file mode 100644 index 00000000000..d9a31014add --- /dev/null +++ b/modules/chaostesting/src/main/java/org/testcontainers/RateLimitOutgoingTraffic.java @@ -0,0 +1,123 @@ +package org.testcontainers; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; + +/** + * Created by novy on 15.01.17. + */ + +@NoArgsConstructor(access = AccessLevel.PACKAGE) +public class RateLimitOutgoingTraffic implements NetworkSubCommands.NetworkSubCommand { + private RateExpression rate = new RateExpression(100, RateUnit.KILOBITS_PER_SECOND); + private SizeExpression packetOverhead = SizeExpression.ZERO; + private SizeExpression cellSize = SizeExpression.ZERO; + private SizeExpression cellOverhead = SizeExpression.ZERO; + + public RateLimitOutgoingTraffic to(long value, RateUnit unit) { + this.rate = new RateExpression(value, unit); + return this; + } + + public RateLimitOutgoingTraffic withPacketOverhead(long value, SizeUnit unit) { + this.packetOverhead = new SizeExpression(value, unit); + return this; + } + + public RateLimitOutgoingTraffic withCellSize(long value, SizeUnit unit) { + this.cellSize = new SizeExpression(value, unit); + return this; + } + + public RateLimitOutgoingTraffic withCellOverhead(long value, SizeUnit unit) { + this.cellOverhead = new SizeExpression(value, unit); + return this; + } + + private PumbaCommandPart rateCommandPart() { + return () -> "rate"; + } + + private PumbaCommandPart rateValuePart() { + return () -> "--rate " + rate.evaluate(); + } + + private PumbaCommandPart packetOverheadPart() { + return () -> "--packetoverhead " + packetOverhead.toBytes(); + } + + private PumbaCommandPart cellSizePart() { + return () -> "--cellsize " + cellSize.toBytes(); + } + + private PumbaCommandPart cellOverheadPart() { + return () -> "--celloverhead " + cellOverhead.toBytes(); + } + + @Override + public String evaluate() { + return rateCommandPart() + .append(rateValuePart()) + .append(packetOverheadPart()) + .append(cellSizePart()) + .append(cellOverheadPart()) + .evaluate(); + } + + @AllArgsConstructor(access = AccessLevel.PRIVATE) + private static class RateExpression { + private final long value; + private final RateUnit unit; + + private String evaluate() { + return value + unit.abbreviation(); + } + } + + public enum RateUnit { + KILOBITS_PER_SECOND { + @Override + String abbreviation() { + return "kbit"; + } + }, + MEGABITS_PER_SECOND { + @Override + String abbreviation() { + return "mbit"; + } + }; + + abstract String abbreviation(); + } + + @AllArgsConstructor(access = AccessLevel.PRIVATE) + private static class SizeExpression { + private final long value; + private final SizeUnit unit; + + private static final SizeExpression ZERO = new SizeExpression(0, SizeUnit.BYTES); + + private long toBytes() { + return value * unit.toBytesMultiplier(); + } + } + + public enum SizeUnit { + BYTES { + @Override + long toBytesMultiplier() { + return 1; + } + }, + KILOBYTES { + @Override + long toBytesMultiplier() { + return 1000; + } + }; + + abstract long toBytesMultiplier(); + } +} diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/CanSpawnExampleContainers.java b/modules/chaostesting/src/test/java/org/testcontainers/test/CanSpawnExampleContainers.java index 305d91ea539..c5227a1d2c5 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/CanSpawnExampleContainers.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/CanSpawnExampleContainers.java @@ -11,7 +11,7 @@ interface CanSpawnExampleContainers { default GenericContainer startedContainer() { final GenericContainer aContainer = new GenericContainer<>("alpine:latest") - .withCommand("ping", "www.example.com"); + .withCommand("sh", "-c", "while true; do echo something; sleep 1; done"); aContainer.start(); return aContainer; } diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/Network.java b/modules/chaostesting/src/test/java/org/testcontainers/test/Network.java index 60cf8225a1f..bd70f83fab9 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/Network.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/Network.java @@ -14,11 +14,16 @@ class Network { interface CanPingContainers { + default PingResponse ping(GenericContainer container) { + return ping(container, 56); + } + + default PingResponse ping(GenericContainer container, long packetSizeInBytes) { final String containerIP = Network.ipAddressOf(container); try { final long start = System.currentTimeMillis(); - Network.ping(containerIP); + Network.ping(containerIP, packetSizeInBytes); final long end = System.currentTimeMillis(); return new PingResponse(true, end - start); } catch (Exception ignored) { @@ -47,8 +52,8 @@ static String ipAddressOf(GenericContainer container) { return inspected.getNetworkSettings().getNetworks().get("bridge").getIpAddress(); } - static void ping(String address) throws Exception { - Runtime.getRuntime().exec("ping " + address + " -c 1").waitFor(); + static void ping(String address, long packetSizeInBytes) throws Exception { + Runtime.getRuntime().exec(String.format("ping %s -c 1 -s %d", address, packetSizeInBytes)).waitFor(); } } diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/RateLimitingOutgoingPacketsTest.java b/modules/chaostesting/src/test/java/org/testcontainers/test/RateLimitingOutgoingPacketsTest.java new file mode 100644 index 00000000000..72a951f5a41 --- /dev/null +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/RateLimitingOutgoingPacketsTest.java @@ -0,0 +1,48 @@ +package org.testcontainers.test; + +import org.junit.Test; +import org.testcontainers.PumbaContainer; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.test.Network.CanPingContainers; +import org.testcontainers.test.Network.PingResponse; + +import static com.jayway.awaitility.Awaitility.await; +import static org.assertj.core.api.Assertions.assertThat; +import static org.testcontainers.NetworkActions.anAction; +import static org.testcontainers.NetworkSubCommands.rateLimitOutgoingTraffic; +import static org.testcontainers.PumbaExecutionModes.onlyOnce; +import static org.testcontainers.PumbaTargets.containers; +import static org.testcontainers.RateLimitOutgoingTraffic.RateUnit.KILOBITS_PER_SECOND; +import static org.testcontainers.SupportedTimeUnit.MINUTES; + +/** + * Created by novy on 15.01.17. + */ +public class RateLimitingOutgoingPacketsTest implements CanSpawnExampleContainers, CanPingContainers { + + @Test + public void should_be_able_to_rate_limit_outgoing_packets_from_container() throws Exception { + // given + final GenericContainer containerToRateLimit = startedContainer(); + + final GenericContainer pumba = PumbaContainer.newPumba() + .performNetworkChaos( + anAction() + .lastingFor(1, MINUTES) + .executeSubCommand( + rateLimitOutgoingTraffic().to(1, KILOBITS_PER_SECOND) + ) + ) + .affect(containers(containerToRateLimit.getContainerName())) + .execute(onlyOnce().onAllChosenContainers()); + + // when + pumba.start(); + + // then + await().until(() -> { + final PingResponse pingResponse = ping(containerToRateLimit, 117); + assertThat(pingResponse.latencyInMilliseconds()).isGreaterThan(1000); + }); + } +} From 738dc3fcd160326d96712831d22ce3e073289d4f Mon Sep 17 00:00:00 2001 From: novy Date: Mon, 16 Jan 2017 21:35:23 +0100 Subject: [PATCH 10/32] Specific docker images instead of 'latest' --- .../src/main/java/org/testcontainers/PumbaContainer.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java b/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java index bb807d3fdc8..cdfd430a9a2 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java @@ -16,12 +16,15 @@ public final class PumbaContainer extends GenericContainer implements PumbaDSL.ProvidesAction, PumbaDSL.ProvidesTarget, PumbaDSL.ProvidesExecutionMode { + private static final String PUMBA_DOCKER_IMAGE = "gaiaadm/pumba:204-master"; + private static final String IP_ROUTE_DOCKER_IMAGE = "gaiadocker/iproute2:3.3"; + private Supplier action; private Supplier executionMode; private Supplier target; private PumbaContainer() { - super("gaiaadm/pumba:latest"); + super(PUMBA_DOCKER_IMAGE); doNotWaitForStartupAtAll(); mountDockerSocket(); } @@ -55,7 +58,7 @@ public PumbaDSL.ProvidesTarget performNetworkChaos(NetworkActions.NetworkAction @SneakyThrows private void fetchIPRouteImage() { - new RemoteDockerImage("gaiadocker/iproute2:latest").get(); + new RemoteDockerImage(IP_ROUTE_DOCKER_IMAGE).get(); } @Override From 436c14b88f9e5b135d84e09d7107f107693f0b34 Mon Sep 17 00:00:00 2001 From: novy Date: Tue, 17 Jan 2017 00:34:54 +0100 Subject: [PATCH 11/32] Implemented missing params for container chaos --- .../org/testcontainers/ContainerActions.java | 21 +++--- .../org/testcontainers/KillContainers.java | 65 +++++++++++++++++++ .../org/testcontainers/PauseContainers.java | 33 ++++++++++ .../org/testcontainers/RemoveContainers.java | 55 ++++++++++++++++ .../org/testcontainers/StopContainers.java | 33 ++++++++++ .../test/DelayingOutgoingPacketsTest.java | 3 +- .../test/PausingContainersTest.java | 4 +- .../test/RateLimitingOutgoingPacketsTest.java | 5 +- 8 files changed, 202 insertions(+), 17 deletions(-) create mode 100644 modules/chaostesting/src/main/java/org/testcontainers/KillContainers.java create mode 100644 modules/chaostesting/src/main/java/org/testcontainers/PauseContainers.java create mode 100644 modules/chaostesting/src/main/java/org/testcontainers/RemoveContainers.java create mode 100644 modules/chaostesting/src/main/java/org/testcontainers/StopContainers.java diff --git a/modules/chaostesting/src/main/java/org/testcontainers/ContainerActions.java b/modules/chaostesting/src/main/java/org/testcontainers/ContainerActions.java index f6ad3e4974a..945b0def096 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/ContainerActions.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/ContainerActions.java @@ -9,25 +9,20 @@ @NoArgsConstructor(access = AccessLevel.PRIVATE) public final class ContainerActions { - public static ContainerAction killContainers() { - // todo implement singal choosing - return () -> "kill"; + public static KillContainers killContainers() { + return new KillContainers(); } - public static ContainerAction pauseContainersFor(int time, SupportedTimeUnit unit) { - final PumbaCommandPart timePart = TimeExpression.of(time, unit); - - return () -> String.format("pause -d %s", timePart.evaluate()); + public static PauseContainers pauseContainers() { + return new PauseContainers(); } - public static ContainerAction stopContainers() { - // todo implement choosing grace period - return () -> "stop"; + public static StopContainers stopContainers() { + return new StopContainers(); } - public static ContainerAction removeContainers() { - // todo reimplement - return () -> "rm --force --links --volumes"; + public static RemoveContainers removeContainers() { + return new RemoveContainers(); } public interface ContainerAction extends PumbaAction { diff --git a/modules/chaostesting/src/main/java/org/testcontainers/KillContainers.java b/modules/chaostesting/src/main/java/org/testcontainers/KillContainers.java new file mode 100644 index 00000000000..defdb51deca --- /dev/null +++ b/modules/chaostesting/src/main/java/org/testcontainers/KillContainers.java @@ -0,0 +1,65 @@ +package org.testcontainers; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +/** + * Created by novy on 16.01.17. + */ +@NoArgsConstructor(access = AccessLevel.PACKAGE) +public class KillContainers implements ContainerActions.ContainerAction { + private KillSignal signal = KillSignal.SIGKILL; + + public KillContainers withSignal(KillSignal signal) { + this.signal = signal; + return this; + } + + @Override + public String evaluate() { + return killCommandPart() + .append(signalPart()) + .evaluate(); + } + + private PumbaCommandPart killCommandPart() { + return () -> "kill"; + } + + private PumbaCommandPart signalPart() { + return () -> "--signal " + signal.name(); + } + + public enum KillSignal { + SIGHUP, + SIGINT, + SIGQUIT, + SIGILL, + SIGTRAP, + SIGIOT, + SIGBUS, + SIGFPE, + SIGKILL, + SIGUSR1, + SIGSEGV, + SIGUSR2, + SIGPIPE, + SIGALRM, + SIGTERM, + SIGSTKFLT, + SIGCHLD, + SIGCONT, + SIGSTOP, + SIGTSTP, + SIGTTIN, + SIGTTOU, + SIGURG, + SIGXCPU, + SIGXFSZ, + SIGVTALRM, + SIGPROF, + SIGWINCH, + SIGIO, + SIGPWR; + } +} diff --git a/modules/chaostesting/src/main/java/org/testcontainers/PauseContainers.java b/modules/chaostesting/src/main/java/org/testcontainers/PauseContainers.java new file mode 100644 index 00000000000..1d7507a2862 --- /dev/null +++ b/modules/chaostesting/src/main/java/org/testcontainers/PauseContainers.java @@ -0,0 +1,33 @@ +package org.testcontainers; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +/** + * Created by novy on 17.01.17. + */ + +@NoArgsConstructor(access = AccessLevel.PACKAGE) +public class PauseContainers implements ContainerActions.ContainerAction { + private TimeExpression duration = TimeExpression.of(15, SupportedTimeUnit.SECONDS); + + public PauseContainers forDuration(long duration, SupportedTimeUnit unit) { + this.duration = TimeExpression.of(duration, unit); + return this; + } + + @Override + public String evaluate() { + return pauseCommandPart() + .append(durationPart()) + .evaluate(); + } + + private PumbaCommandPart pauseCommandPart() { + return () -> "pause"; + } + + private PumbaCommandPart durationPart() { + return () -> "--duration " + duration.evaluate(); + } +} diff --git a/modules/chaostesting/src/main/java/org/testcontainers/RemoveContainers.java b/modules/chaostesting/src/main/java/org/testcontainers/RemoveContainers.java new file mode 100644 index 00000000000..c964168d79e --- /dev/null +++ b/modules/chaostesting/src/main/java/org/testcontainers/RemoveContainers.java @@ -0,0 +1,55 @@ +package org.testcontainers; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +/** + * Created by novy on 17.01.17. + */ + +@NoArgsConstructor(access = AccessLevel.PACKAGE) +public class RemoveContainers implements ContainerActions.ContainerAction { + private boolean force = false; + private boolean links = false; + private boolean volumes = false; + + public RemoveContainers forced() { + this.force = true; + return this; + } + + public RemoveContainers withAssociatedLinks() { + this.links = true; + return this; + } + + public RemoveContainers withAssociatedVolumes() { + this.volumes = true; + return this; + } + + @Override + public String evaluate() { + return removeContainersPart() + .append(forcePart()) + .append(linksPart()) + .append(volumesPart()) + .evaluate(); + } + + private PumbaCommandPart removeContainersPart() { + return () -> "rm"; + } + + private PumbaCommandPart forcePart() { + return () -> force ? "--force" : ""; + } + + private PumbaCommandPart linksPart() { + return () -> links ? "--links" : ""; + } + + private PumbaCommandPart volumesPart() { + return () -> volumes ? "--volumes" : ""; + } +} diff --git a/modules/chaostesting/src/main/java/org/testcontainers/StopContainers.java b/modules/chaostesting/src/main/java/org/testcontainers/StopContainers.java new file mode 100644 index 00000000000..b8a90c69aca --- /dev/null +++ b/modules/chaostesting/src/main/java/org/testcontainers/StopContainers.java @@ -0,0 +1,33 @@ +package org.testcontainers; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +/** + * Created by novy on 17.01.17. + */ + +@NoArgsConstructor(access = AccessLevel.PACKAGE) +public class StopContainers implements ContainerActions.ContainerAction { + private long gracePeriod = 10; + + public StopContainers withSecondsToWaitBeforeKilling(long seconds) { + this.gracePeriod = seconds; + return this; + } + + @Override + public String evaluate() { + return stopCommandPart() + .append(gracePeriodPart()) + .evaluate(); + } + + private PumbaCommandPart stopCommandPart() { + return () -> "stop"; + } + + private PumbaCommandPart gracePeriodPart() { + return () -> "--time " + gracePeriod; + } +} diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/DelayingOutgoingPacketsTest.java b/modules/chaostesting/src/test/java/org/testcontainers/test/DelayingOutgoingPacketsTest.java index d6b4f1a48e8..53b05db033f 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/DelayingOutgoingPacketsTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/DelayingOutgoingPacketsTest.java @@ -8,6 +8,7 @@ import org.testcontainers.test.Network.PingResponse; import static com.jayway.awaitility.Awaitility.await; +import static java.util.concurrent.TimeUnit.SECONDS; import static org.assertj.core.api.Assertions.assertThat; import static org.testcontainers.NetworkActions.anAction; import static org.testcontainers.NetworkSubCommands.delayOutgoingPackets; @@ -39,7 +40,7 @@ public void should_be_able_to_delay_outgoing_packets_from_container() throws Exc pumba.start(); // then - await().until(() -> { + await().atMost(20, SECONDS).until(() -> { final PingResponse ping = ping(aContainer); assertThat(ping.latencyInMilliseconds()).isGreaterThan(900); }); diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/PausingContainersTest.java b/modules/chaostesting/src/test/java/org/testcontainers/test/PausingContainersTest.java index e6e0a935c87..45bfc57a04c 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/PausingContainersTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/PausingContainersTest.java @@ -11,7 +11,7 @@ import static com.jayway.awaitility.Awaitility.await; import static org.assertj.core.api.Assertions.assertThat; -import static org.testcontainers.ContainerActions.pauseContainersFor; +import static org.testcontainers.ContainerActions.pauseContainers; import static org.testcontainers.PumbaExecutionModes.onlyOnce; import static org.testcontainers.PumbaTargets.containers; @@ -33,7 +33,7 @@ public void should_pause_single_container() throws Exception { final GenericContainer containerToPause = startedContainer(); final GenericContainer pumba = PumbaContainer.newPumba() - .performContainerChaos(pauseContainersFor(10, SupportedTimeUnit.SECONDS)) + .performContainerChaos(pauseContainers().forDuration(10, SupportedTimeUnit.SECONDS)) .affect(containers(containerToPause.getContainerName())) .execute(onlyOnce().onAllChosenContainers()); diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/RateLimitingOutgoingPacketsTest.java b/modules/chaostesting/src/test/java/org/testcontainers/test/RateLimitingOutgoingPacketsTest.java index 72a951f5a41..4a7dae08d8f 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/RateLimitingOutgoingPacketsTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/RateLimitingOutgoingPacketsTest.java @@ -6,7 +6,10 @@ import org.testcontainers.test.Network.CanPingContainers; import org.testcontainers.test.Network.PingResponse; +import java.util.concurrent.TimeUnit; + import static com.jayway.awaitility.Awaitility.await; +import static java.util.concurrent.TimeUnit.SECONDS; import static org.assertj.core.api.Assertions.assertThat; import static org.testcontainers.NetworkActions.anAction; import static org.testcontainers.NetworkSubCommands.rateLimitOutgoingTraffic; @@ -40,7 +43,7 @@ public void should_be_able_to_rate_limit_outgoing_packets_from_container() throw pumba.start(); // then - await().until(() -> { + await().atMost(20, SECONDS).until(() -> { final PingResponse pingResponse = ping(containerToRateLimit, 117); assertThat(pingResponse.latencyInMilliseconds()).isGreaterThan(1000); }); From 64456aa31cc0d42faf9433703a74f46fd401d536 Mon Sep 17 00:00:00 2001 From: novy Date: Tue, 17 Jan 2017 16:32:14 +0100 Subject: [PATCH 12/32] Dropping packets - Bernoulli model; reimplemented pinging containers --- .../org/testcontainers/ContainerActions.java | 4 ++ .../org/testcontainers/DroppingPackets.java | 47 ++++++++++++++++ .../test/LosingPacketsTest.java | 46 ++++++++++++++++ .../java/org/testcontainers/test/Network.java | 53 +++++++++++++------ 4 files changed, 135 insertions(+), 15 deletions(-) create mode 100644 modules/chaostesting/src/main/java/org/testcontainers/DroppingPackets.java create mode 100644 modules/chaostesting/src/test/java/org/testcontainers/test/LosingPacketsTest.java diff --git a/modules/chaostesting/src/main/java/org/testcontainers/ContainerActions.java b/modules/chaostesting/src/main/java/org/testcontainers/ContainerActions.java index 945b0def096..69cea5b2be9 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/ContainerActions.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/ContainerActions.java @@ -25,6 +25,10 @@ public static RemoveContainers removeContainers() { return new RemoveContainers(); } + public static DroppingPackets.BernoulliModel dropOutgoingPackets() { + return new DroppingPackets.BernoulliModel(); + } + public interface ContainerAction extends PumbaAction { } } diff --git a/modules/chaostesting/src/main/java/org/testcontainers/DroppingPackets.java b/modules/chaostesting/src/main/java/org/testcontainers/DroppingPackets.java new file mode 100644 index 00000000000..9bf1d0721f2 --- /dev/null +++ b/modules/chaostesting/src/main/java/org/testcontainers/DroppingPackets.java @@ -0,0 +1,47 @@ +package org.testcontainers; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +/** + * Created by novy on 17.01.17. + */ + +public class DroppingPackets { + + @NoArgsConstructor(access = AccessLevel.PACKAGE) + public static class BernoulliModel implements NetworkSubCommands.NetworkSubCommand { + private double percentageLoss = 0; + private double correlation = 0; + + public BernoulliModel withPercentageProbability(double percentageLoss) { + this.percentageLoss = percentageLoss; + return this; + } + + public BernoulliModel withCorrelation(double correlation) { + this.correlation = correlation; + return this; + } + + @Override + public String evaluate() { + return commandPart() + .append(probabilityPart()) + .append(correlationPart()) + .evaluate(); + } + + private PumbaCommandPart commandPart() { + return () -> "loss"; + } + + private PumbaCommandPart probabilityPart() { + return () -> "--percent " + percentageLoss; + } + + private PumbaCommandPart correlationPart() { + return () -> "--correlation " + correlation; + } + } +} diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/LosingPacketsTest.java b/modules/chaostesting/src/test/java/org/testcontainers/test/LosingPacketsTest.java new file mode 100644 index 00000000000..5f5923d941a --- /dev/null +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/LosingPacketsTest.java @@ -0,0 +1,46 @@ +package org.testcontainers.test; + +import org.junit.Test; +import org.testcontainers.PumbaContainer; +import org.testcontainers.SupportedTimeUnit; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.test.Network.CanPingContainers; +import org.testcontainers.test.Network.PingResponse; + +import static com.jayway.awaitility.Awaitility.await; +import static java.util.concurrent.TimeUnit.SECONDS; +import static org.assertj.core.api.Assertions.assertThat; +import static org.testcontainers.ContainerActions.dropOutgoingPackets; +import static org.testcontainers.NetworkActions.anAction; +import static org.testcontainers.PumbaExecutionModes.onlyOnce; +import static org.testcontainers.PumbaTargets.containers; + +/** + * Created by novy on 17.01.17. + */ +public class LosingPacketsTest implements CanSpawnExampleContainers, CanPingContainers { + + @Test + public void should_be_able_to_drop_outgoing_packets() throws Exception { + // given + final GenericContainer aContainer = startedContainer(); + + final GenericContainer pumba = PumbaContainer.newPumba() + .performNetworkChaos( + anAction() + .lastingFor(1, SupportedTimeUnit.MINUTES) + .executeSubCommand(dropOutgoingPackets().withPercentageProbability(100)) + ) + .affect(containers(aContainer.getContainerName())) + .execute(onlyOnce().onAllChosenContainers()); + + // when + pumba.start(); + + // then + await().atMost(20, SECONDS).until(() -> { + final PingResponse pingResponse = ping(aContainer); + assertThat(pingResponse.wasSuccessful()).isFalse(); + }); + } +} diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/Network.java b/modules/chaostesting/src/test/java/org/testcontainers/test/Network.java index bd70f83fab9..a3408ac15a4 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/Network.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/Network.java @@ -2,11 +2,18 @@ import lombok.AccessLevel; import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import org.apache.commons.io.IOUtils; import org.testcontainers.DockerClientFactory; import org.testcontainers.containers.GenericContainer; import org.testcontainers.shaded.com.github.dockerjava.api.DockerClient; import org.testcontainers.shaded.com.github.dockerjava.api.command.InspectContainerResponse; +import java.util.Arrays; +import java.util.LinkedList; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + /** * Created by novy on 14.01.17. */ @@ -21,28 +28,40 @@ default PingResponse ping(GenericContainer container) { default PingResponse ping(GenericContainer container, long packetSizeInBytes) { final String containerIP = Network.ipAddressOf(container); - try { - final long start = System.currentTimeMillis(); - Network.ping(containerIP, packetSizeInBytes); - final long end = System.currentTimeMillis(); - return new PingResponse(true, end - start); - } catch (Exception ignored) { - return new PingResponse(false, -1); - } + return Network.ping(containerIP, packetSizeInBytes); } } @RequiredArgsConstructor(access = AccessLevel.PRIVATE) static class PingResponse { - private final boolean successful; - private final long latency; + private final String responseContent; boolean wasSuccessful() { - return successful; + return !unknownHost() && !packetLost(); + } + + private boolean unknownHost() { + return lastLineOfResponse().contains("ping: unknown host"); + } + + private boolean packetLost() { + return lastLineOfResponse().contains("100% packet loss"); + } + + double latencyInMilliseconds() { + return Double.parseDouble(extractResponseTimeAsString()); + } + + private String extractResponseTimeAsString() { + final Pattern minResponseTimePattern = Pattern.compile("rtt min/avg/max/mdev = ([+-]?([0-9]*[.])?[0-9]+)"); + final Matcher matcher = minResponseTimePattern.matcher(lastLineOfResponse()); + matcher.find(); + return matcher.group(1); } - long latencyInMilliseconds() { - return latency; + private String lastLineOfResponse() { + final String[] responseLines = responseContent.split("\n"); + return new LinkedList<>(Arrays.asList(responseLines)).getLast(); } } @@ -52,8 +71,12 @@ static String ipAddressOf(GenericContainer container) { return inspected.getNetworkSettings().getNetworks().get("bridge").getIpAddress(); } - static void ping(String address, long packetSizeInBytes) throws Exception { - Runtime.getRuntime().exec(String.format("ping %s -c 1 -s %d", address, packetSizeInBytes)).waitFor(); + @SneakyThrows + static PingResponse ping(String address, long packetSizeInBytes) { + final Process process = Runtime.getRuntime().exec(String.format("ping %s -c 1 -s %d", address, packetSizeInBytes)); + return new PingResponse( + IOUtils.toString(process.getInputStream(), "UTF-8") + ); } } From 9b0dce41990befdd34af8fd26aeb6a38accc9ed6 Mon Sep 17 00:00:00 2001 From: novy Date: Tue, 17 Jan 2017 23:45:22 +0100 Subject: [PATCH 13/32] Implemented 2 more loss models --- modules/chaostesting/pom.xml | 7 + .../org/testcontainers/ContainerActions.java | 4 - .../org/testcontainers/DroppingPackets.java | 47 ----- .../testcontainers/DroppingPacketsModels.java | 187 ++++++++++++++++++ .../testcontainers/NetworkSubCommands.java | 4 + .../test/LosingPacketsTest.java | 76 ++++++- .../java/org/testcontainers/test/Network.java | 4 +- 7 files changed, 270 insertions(+), 59 deletions(-) delete mode 100644 modules/chaostesting/src/main/java/org/testcontainers/DroppingPackets.java create mode 100644 modules/chaostesting/src/main/java/org/testcontainers/DroppingPacketsModels.java diff --git a/modules/chaostesting/pom.xml b/modules/chaostesting/pom.xml index 265ceb4badf..7cdc8a69efc 100644 --- a/modules/chaostesting/pom.xml +++ b/modules/chaostesting/pom.xml @@ -33,6 +33,13 @@ 3.6.1 test + + + com.google.guava + guava + 21.0 + test + diff --git a/modules/chaostesting/src/main/java/org/testcontainers/ContainerActions.java b/modules/chaostesting/src/main/java/org/testcontainers/ContainerActions.java index 69cea5b2be9..945b0def096 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/ContainerActions.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/ContainerActions.java @@ -25,10 +25,6 @@ public static RemoveContainers removeContainers() { return new RemoveContainers(); } - public static DroppingPackets.BernoulliModel dropOutgoingPackets() { - return new DroppingPackets.BernoulliModel(); - } - public interface ContainerAction extends PumbaAction { } } diff --git a/modules/chaostesting/src/main/java/org/testcontainers/DroppingPackets.java b/modules/chaostesting/src/main/java/org/testcontainers/DroppingPackets.java deleted file mode 100644 index 9bf1d0721f2..00000000000 --- a/modules/chaostesting/src/main/java/org/testcontainers/DroppingPackets.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.testcontainers; - -import lombok.AccessLevel; -import lombok.NoArgsConstructor; - -/** - * Created by novy on 17.01.17. - */ - -public class DroppingPackets { - - @NoArgsConstructor(access = AccessLevel.PACKAGE) - public static class BernoulliModel implements NetworkSubCommands.NetworkSubCommand { - private double percentageLoss = 0; - private double correlation = 0; - - public BernoulliModel withPercentageProbability(double percentageLoss) { - this.percentageLoss = percentageLoss; - return this; - } - - public BernoulliModel withCorrelation(double correlation) { - this.correlation = correlation; - return this; - } - - @Override - public String evaluate() { - return commandPart() - .append(probabilityPart()) - .append(correlationPart()) - .evaluate(); - } - - private PumbaCommandPart commandPart() { - return () -> "loss"; - } - - private PumbaCommandPart probabilityPart() { - return () -> "--percent " + percentageLoss; - } - - private PumbaCommandPart correlationPart() { - return () -> "--correlation " + correlation; - } - } -} diff --git a/modules/chaostesting/src/main/java/org/testcontainers/DroppingPacketsModels.java b/modules/chaostesting/src/main/java/org/testcontainers/DroppingPacketsModels.java new file mode 100644 index 00000000000..95fa526bf5c --- /dev/null +++ b/modules/chaostesting/src/main/java/org/testcontainers/DroppingPacketsModels.java @@ -0,0 +1,187 @@ +package org.testcontainers; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +/** + * Created by novy on 17.01.17. + */ + +@NoArgsConstructor(access = AccessLevel.PACKAGE) +public class DroppingPacketsModels { + + public BernoulliModel accordingToBernoulliModel() { + return new BernoulliModel(); + } + + public MarkovModel accordingToMarkovModel() { + return new MarkovModel(); + } + + public GilbertElliotModel accordingToGilbertElliotModel() { + return new GilbertElliotModel(); + } + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class BernoulliModel implements NetworkSubCommands.NetworkSubCommand { + private double percentageLoss = 0; + private double correlation = 0; + + public BernoulliModel withLossProbability(double percentageLoss) { + this.percentageLoss = percentageLoss; + return this; + } + + public BernoulliModel withCorrelation(double correlation) { + this.correlation = correlation; + return this; + } + + @Override + public String evaluate() { + return commandPart() + .append(probabilityPart()) + .append(correlationPart()) + .evaluate(); + } + + private PumbaCommandPart commandPart() { + return () -> "loss"; + } + + private PumbaCommandPart probabilityPart() { + return () -> "--percent " + percentageLoss; + } + + private PumbaCommandPart correlationPart() { + return () -> "--correlation " + correlation; + } + } + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class MarkovModel implements NetworkSubCommands.NetworkSubCommand { + private double p13Transition = 0; + private double p31Transition = 100; + private double p32Transition = 0; + private double p23Transition = 100; + private double p14Transition = 0; + + public MarkovModel withProbabilityOfTransitionFromFirstToThirdState(double probability) { + this.p13Transition = probability; + return this; + } + + public MarkovModel withProbabilityOfTransitionFromThirdToFirstState(double probability) { + this.p31Transition = probability; + return this; + } + + public MarkovModel withProbabilityOfTransitionFromThirdToSecondState(double probability) { + this.p32Transition = probability; + return this; + } + + public MarkovModel withProbabilityOfTransitionFromSecondToThirdState(double probability) { + this.p23Transition = probability; + return this; + } + + public MarkovModel withProbabilityOfTransitionFromFirstToForthState(double probability) { + this.p14Transition = probability; + return this; + } + + @Override + public String evaluate() { + return commandPart() + .append(p13Part()) + .append(p31Part()) + .append(p32Part()) + .append(p23Part()) + .append(p14Part()) + .evaluate(); + } + + private PumbaCommandPart commandPart() { + return () -> "loss-state"; + } + + private PumbaCommandPart p13Part() { + return () -> "--p13 " + p13Transition; + } + + private PumbaCommandPart p31Part() { + return () -> "--p31 " + p31Transition; + } + + private PumbaCommandPart p32Part() { + return () -> "--p32 " + p32Transition; + } + + private PumbaCommandPart p23Part() { + return () -> "--p23 " + p23Transition; + } + + private PumbaCommandPart p14Part() { + return () -> "--p14 " + p14Transition; + } + } + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class GilbertElliotModel implements NetworkSubCommands.NetworkSubCommand { + private double transitionToBadStateProbability = 0; + private double transitionToGoodStateProbability = 100; + private double lossProbabilityInBadState = 100; + private double lossProbabilityInGoodState = 0; + + public GilbertElliotModel withProbabilityOfTransitionToBadState(double probability) { + this.transitionToBadStateProbability = probability; + return this; + } + + public GilbertElliotModel withProbabilityOfTransitionToGoodState(double probability) { + this.transitionToGoodStateProbability = probability; + return this; + } + + public GilbertElliotModel withProbabilityOfPacketLossInBadState(double probability) { + this.lossProbabilityInBadState = probability; + return this; + } + + public GilbertElliotModel withProbabilityOfPacketLossInGoodState(double probability) { + this.lossProbabilityInBadState = probability; + return this; + } + + @Override + public String evaluate() { + return commandPart() + .append(transitionToBadStatePart()) + .append(lossInBadStatePart()) + .append(transitionToGoodStatePart()) + .append(lossInGoodStatePart()) + .evaluate(); + } + + private PumbaCommandPart commandPart() { + return () -> "loss-gemodel"; + } + + private PumbaCommandPart transitionToBadStatePart() { + return () -> "--pb " + transitionToBadStateProbability; + } + + private PumbaCommandPart transitionToGoodStatePart() { + return () -> "--pg " + transitionToGoodStateProbability; + } + + private PumbaCommandPart lossInBadStatePart() { + return () -> "--one-h " + lossProbabilityInBadState; + } + + private PumbaCommandPart lossInGoodStatePart() { + return () -> "--one-k " + lossProbabilityInGoodState; + } + } +} diff --git a/modules/chaostesting/src/main/java/org/testcontainers/NetworkSubCommands.java b/modules/chaostesting/src/main/java/org/testcontainers/NetworkSubCommands.java index a123a7aecf9..40777543fed 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/NetworkSubCommands.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/NetworkSubCommands.java @@ -17,6 +17,10 @@ public static RateLimitOutgoingTraffic rateLimitOutgoingTraffic() { return new RateLimitOutgoingTraffic(); } + public static DroppingPacketsModels lossOutgoingPackets() { + return new DroppingPacketsModels(); + } + interface NetworkSubCommand extends PumbaCommandPart { } diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/LosingPacketsTest.java b/modules/chaostesting/src/test/java/org/testcontainers/test/LosingPacketsTest.java index 5f5923d941a..bcc002eb33d 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/LosingPacketsTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/LosingPacketsTest.java @@ -2,7 +2,6 @@ import org.junit.Test; import org.testcontainers.PumbaContainer; -import org.testcontainers.SupportedTimeUnit; import org.testcontainers.containers.GenericContainer; import org.testcontainers.test.Network.CanPingContainers; import org.testcontainers.test.Network.PingResponse; @@ -10,10 +9,11 @@ import static com.jayway.awaitility.Awaitility.await; import static java.util.concurrent.TimeUnit.SECONDS; import static org.assertj.core.api.Assertions.assertThat; -import static org.testcontainers.ContainerActions.dropOutgoingPackets; import static org.testcontainers.NetworkActions.anAction; +import static org.testcontainers.NetworkSubCommands.lossOutgoingPackets; import static org.testcontainers.PumbaExecutionModes.onlyOnce; import static org.testcontainers.PumbaTargets.containers; +import static org.testcontainers.SupportedTimeUnit.MINUTES; /** * Created by novy on 17.01.17. @@ -21,15 +21,77 @@ public class LosingPacketsTest implements CanSpawnExampleContainers, CanPingContainers { @Test - public void should_be_able_to_drop_outgoing_packets() throws Exception { + public void should_be_able_to_drop_outgoing_packets_with_bernoulli_model() throws Exception { // given final GenericContainer aContainer = startedContainer(); final GenericContainer pumba = PumbaContainer.newPumba() - .performNetworkChaos( - anAction() - .lastingFor(1, SupportedTimeUnit.MINUTES) - .executeSubCommand(dropOutgoingPackets().withPercentageProbability(100)) + .performNetworkChaos(anAction() + .lastingFor(1, MINUTES) + .executeSubCommand( + lossOutgoingPackets() + .accordingToBernoulliModel() + .withLossProbability(100) + ) + ) + .affect(containers(aContainer.getContainerName())) + .execute(onlyOnce().onAllChosenContainers()); + + // when + pumba.start(); + + // then + await().atMost(20, SECONDS).until(() -> { + final PingResponse pingResponse = ping(aContainer); + assertThat(pingResponse.wasSuccessful()).isFalse(); + }); + } + + @Test + public void should_be_able_to_drop_outgoing_packets_with_markov_model() throws Exception { + // given + final GenericContainer aContainer = startedContainer(); + + final GenericContainer pumba = PumbaContainer.newPumba() + .performNetworkChaos(anAction() + .lastingFor(1, MINUTES) + .executeSubCommand( + lossOutgoingPackets() + .accordingToMarkovModel() + .withProbabilityOfTransitionFromFirstToThirdState(100) + .withProbabilityOfTransitionFromThirdToFirstState(0) + .withProbabilityOfTransitionFromThirdToSecondState(0) + .withProbabilityOfTransitionFromSecondToThirdState(0) + .withProbabilityOfTransitionFromFirstToForthState(0) + ) + ) + .affect(containers(aContainer.getContainerName())) + .execute(onlyOnce().onAllChosenContainers()); + + // when + pumba.start(); + + // then + await().atMost(20, SECONDS).until(() -> { + final PingResponse pingResponse = ping(aContainer); + assertThat(pingResponse.wasSuccessful()).isFalse(); + }); + } + + @Test + public void should_be_able_to_drop_outgoing_packets_with_gilbert_elliot_model() throws Exception { + // given + final GenericContainer aContainer = startedContainer(); + + final GenericContainer pumba = PumbaContainer.newPumba() + .performNetworkChaos(anAction() + .lastingFor(1, MINUTES) + .executeSubCommand( + lossOutgoingPackets() + .accordingToGilbertElliotModel() + .withProbabilityOfPacketLossInBadState(100) + .withProbabilityOfTransitionToBadState(100) + ) ) .affect(containers(aContainer.getContainerName())) .execute(onlyOnce().onAllChosenContainers()); diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/Network.java b/modules/chaostesting/src/test/java/org/testcontainers/test/Network.java index a3408ac15a4..3c931f8bb4b 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/Network.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/Network.java @@ -1,5 +1,6 @@ package org.testcontainers.test; +import com.google.common.base.Preconditions; import lombok.AccessLevel; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; @@ -53,9 +54,10 @@ private boolean packetLost() { } private String extractResponseTimeAsString() { + Preconditions.checkArgument(wasSuccessful(), "Trying to extract latency from unsuccessful response"); final Pattern minResponseTimePattern = Pattern.compile("rtt min/avg/max/mdev = ([+-]?([0-9]*[.])?[0-9]+)"); final Matcher matcher = minResponseTimePattern.matcher(lastLineOfResponse()); - matcher.find(); + Preconditions.checkArgument(matcher.find(), "Latency pattern not found in response"); return matcher.group(1); } From 216a4378601c7412bc6f769265a1505c15192e8b Mon Sep 17 00:00:00 2001 From: Slawomir Nowak Date: Fri, 2 Jun 2017 22:14:27 +0200 Subject: [PATCH 14/32] Fixed tests --- modules/chaostesting/pom.xml | 4 +- .../org/testcontainers/PumbaContainer.java | 11 +++-- .../test/CanSpawnExampleContainers.java | 15 +++--- .../test/DelayingOutgoingPacketsTest.java | 2 +- .../test/DockerEnvironment.java | 5 +- .../test/HasAccessToDockerClient.java | 11 +++++ .../test/KillingContainersTest.java | 12 +++-- .../test/LosingPacketsTest.java | 14 +++--- .../java/org/testcontainers/test/Network.java | 46 ++++++++++--------- .../test/PausingContainersTest.java | 2 +- .../test/RateLimitingOutgoingPacketsTest.java | 4 +- .../test/RemovingContainerTest.java | 2 +- .../test/ShutdownsOrphanedContainers.java | 12 +++++ .../test/StoppingContainerTest.java | 4 +- 14 files changed, 89 insertions(+), 55 deletions(-) create mode 100644 modules/chaostesting/src/test/java/org/testcontainers/test/HasAccessToDockerClient.java create mode 100644 modules/chaostesting/src/test/java/org/testcontainers/test/ShutdownsOrphanedContainers.java diff --git a/modules/chaostesting/pom.xml b/modules/chaostesting/pom.xml index 7cdc8a69efc..ebc3f1b6fab 100644 --- a/modules/chaostesting/pom.xml +++ b/modules/chaostesting/pom.xml @@ -5,7 +5,7 @@ testcontainers-parent org.testcontainers - 1.1.8-SNAPSHOT + 1.2.2-SNAPSHOT ../../pom.xml 4.0.0 @@ -17,7 +17,7 @@ org.testcontainers testcontainers - 1.1.8-SNAPSHOT + 1.2.1 diff --git a/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java b/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java index cdfd430a9a2..384d02272eb 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java @@ -1,6 +1,7 @@ package org.testcontainers; import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.startupcheck.StartupCheckStrategy; import org.testcontainers.images.RemoteDockerImage; @@ -13,11 +14,11 @@ /** * Created by novy on 31.12.16. */ - +@Slf4j public final class PumbaContainer extends GenericContainer implements PumbaDSL.ProvidesAction, PumbaDSL.ProvidesTarget, PumbaDSL.ProvidesExecutionMode { - private static final String PUMBA_DOCKER_IMAGE = "gaiaadm/pumba:204-master"; - private static final String IP_ROUTE_DOCKER_IMAGE = "gaiadocker/iproute2:3.3"; + private static final String PUMBA_DOCKER_IMAGE = "gaiaadm/pumba:master"; + private static final String IP_ROUTE_DOCKER_IMAGE = "gaiadocker/iproute2:latest"; private Supplier action; private Supplier executionMode; @@ -76,7 +77,9 @@ public GenericContainer execute(PumbaExecutionModes.PumbaExecuti @Override public void start() { final PumbaCommand command = new PumbaCommand(action.get(), executionMode.get(), target.get()); - setCommand(command.evaluate()); + final String evaluatedCommand = command.evaluate(); + setCommand(evaluatedCommand); + log.info("Executing pumba container with command \"{}\"", evaluatedCommand); super.start(); } diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/CanSpawnExampleContainers.java b/modules/chaostesting/src/test/java/org/testcontainers/test/CanSpawnExampleContainers.java index c5227a1d2c5..458872f813a 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/CanSpawnExampleContainers.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/CanSpawnExampleContainers.java @@ -7,15 +7,19 @@ /** * Created by novy on 01.01.17. */ -interface CanSpawnExampleContainers { +interface CanSpawnExampleContainers extends HasAccessToDockerClient { - default GenericContainer startedContainer() { - final GenericContainer aContainer = new GenericContainer<>("alpine:latest") - .withCommand("sh", "-c", "while true; do echo something; sleep 1; done"); + default GenericContainer startedContainerWithCommand(String command) { + final GenericContainer aContainer = new GenericContainer<>("alpine:3.6") + .withCommand("sh", "-c", command); aContainer.start(); return aContainer; } + default GenericContainer startedContainer() { + return startedContainerWithCommand("while true; do echo something; sleep 1; done"); + } + default GenericContainer stoppedContainer() { final GenericContainer aContainer = startedContainer(); // this is to avoid running Resource reaper @@ -26,8 +30,7 @@ default GenericContainer stoppedContainer() { default GenericContainer startedContainerWithName(String containerName) { final GenericContainer containerToRename = startedContainer(); - final DockerClient client = DockerClientFactory.instance().client(); - client.renameContainerCmd(containerToRename.getContainerId()).withName(containerName).exec(); + dockerClient().renameContainerCmd(containerToRename.getContainerId()).withName(containerName).exec(); return containerToRename; } } diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/DelayingOutgoingPacketsTest.java b/modules/chaostesting/src/test/java/org/testcontainers/test/DelayingOutgoingPacketsTest.java index 53b05db033f..feb6ca3b4c1 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/DelayingOutgoingPacketsTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/DelayingOutgoingPacketsTest.java @@ -18,7 +18,7 @@ /** * Created by novy on 14.01.17. */ -public class DelayingOutgoingPacketsTest implements CanSpawnExampleContainers, CanPingContainers { +public class DelayingOutgoingPacketsTest extends ShutdownsOrphanedContainers implements CanSpawnExampleContainers, CanPingContainers { @Test public void should_be_able_to_delay_outgoing_packets_from_container() throws Exception { diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/DockerEnvironment.java b/modules/chaostesting/src/test/java/org/testcontainers/test/DockerEnvironment.java index 3f7465a3e3d..908c58b30cb 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/DockerEnvironment.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/DockerEnvironment.java @@ -1,6 +1,5 @@ package org.testcontainers.test; -import org.testcontainers.DockerClientFactory; import org.testcontainers.shaded.com.github.dockerjava.api.DockerClient; import org.testcontainers.shaded.com.github.dockerjava.api.command.InspectContainerResponse; import org.testcontainers.shaded.com.github.dockerjava.api.model.Container; @@ -13,12 +12,12 @@ /** * Created by novy on 31.12.16. */ -class DockerEnvironment { +class DockerEnvironment implements HasAccessToDockerClient { private final DockerClient delegate; DockerEnvironment() { - this.delegate = DockerClientFactory.instance().client(); + this.delegate = dockerClient(); } Collection namesOfRunningContainers() { diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/HasAccessToDockerClient.java b/modules/chaostesting/src/test/java/org/testcontainers/test/HasAccessToDockerClient.java new file mode 100644 index 00000000000..580b86f8f7d --- /dev/null +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/HasAccessToDockerClient.java @@ -0,0 +1,11 @@ +package org.testcontainers.test; + +import org.testcontainers.DockerClientFactory; +import org.testcontainers.shaded.com.github.dockerjava.api.DockerClient; + +interface HasAccessToDockerClient { + + default DockerClient dockerClient() { + return DockerClientFactory.instance().client(); + } +} diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/KillingContainersTest.java b/modules/chaostesting/src/test/java/org/testcontainers/test/KillingContainersTest.java index ec25566f746..7599f81b42c 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/KillingContainersTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/KillingContainersTest.java @@ -22,7 +22,7 @@ /** * Created by novy on 31.12.16. */ -public class KillingContainersTest implements CanSpawnExampleContainers { +public class KillingContainersTest extends ShutdownsOrphanedContainers implements CanSpawnExampleContainers { private DockerEnvironment environment; @@ -46,7 +46,7 @@ public void should_kill_single_container() throws Exception { pumba.start(); // then - await().until(() -> { + await().atMost(30, TimeUnit.SECONDS).until(() -> { final Collection namesOfRunningContainers = environment.namesOfRunningContainers(); assertThat(namesOfRunningContainers).doesNotContain(containerToKill.getContainerName()); @@ -70,7 +70,7 @@ public void should_kill_more_than_one_containers() throws Exception { pumba.start(); // then - await().until(() -> { + await().atMost(30, TimeUnit.SECONDS).until(() -> { final Collection namesOfRunningContainers = environment.namesOfRunningContainers(); assertThat(namesOfRunningContainers).doesNotContain(firstVictim.getContainerName(), secondVictim.getContainerName()); @@ -94,7 +94,7 @@ public void should_kill_containers_matching_regular_expression() throws Exceptio pumba.start(); // then - await().until(() -> { + await().atMost(30, TimeUnit.SECONDS).until(() -> { final Collection namesOfRunningContainers = environment.namesOfRunningContainers(); assertThat(namesOfRunningContainers).filteredOn(matchesRegexp("foobar.*")).isEmpty(); @@ -117,7 +117,9 @@ public void should_kill_all_containers() throws Exception { pumba.start(); // then - await().atMost(20, TimeUnit.SECONDS).until(() -> assertThat(environment.namesOfRunningContainers()).isEmpty()); + await().atMost(30, TimeUnit.SECONDS).until(() -> + assertThat(environment.namesOfRunningContainers()).isEmpty() + ); } @Test diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/LosingPacketsTest.java b/modules/chaostesting/src/test/java/org/testcontainers/test/LosingPacketsTest.java index bcc002eb33d..9841fc1d59f 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/LosingPacketsTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/LosingPacketsTest.java @@ -18,7 +18,7 @@ /** * Created by novy on 17.01.17. */ -public class LosingPacketsTest implements CanSpawnExampleContainers, CanPingContainers { +public class LosingPacketsTest extends ShutdownsOrphanedContainers implements CanSpawnExampleContainers, CanPingContainers { @Test public void should_be_able_to_drop_outgoing_packets_with_bernoulli_model() throws Exception { @@ -41,9 +41,9 @@ public void should_be_able_to_drop_outgoing_packets_with_bernoulli_model() throw pumba.start(); // then - await().atMost(20, SECONDS).until(() -> { + await().atMost(30, SECONDS).until(() -> { final PingResponse pingResponse = ping(aContainer); - assertThat(pingResponse.wasSuccessful()).isFalse(); + assertThat(pingResponse.packetLost()).isTrue(); }); } @@ -72,9 +72,9 @@ public void should_be_able_to_drop_outgoing_packets_with_markov_model() throws E pumba.start(); // then - await().atMost(20, SECONDS).until(() -> { + await().atMost(30, SECONDS).until(() -> { final PingResponse pingResponse = ping(aContainer); - assertThat(pingResponse.wasSuccessful()).isFalse(); + assertThat(pingResponse.packetLost()).isTrue(); }); } @@ -100,9 +100,9 @@ public void should_be_able_to_drop_outgoing_packets_with_gilbert_elliot_model() pumba.start(); // then - await().atMost(20, SECONDS).until(() -> { + await().atMost(30, SECONDS).until(() -> { final PingResponse pingResponse = ping(aContainer); - assertThat(pingResponse.wasSuccessful()).isFalse(); + assertThat(pingResponse.packetLost()).isTrue(); }); } } diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/Network.java b/modules/chaostesting/src/test/java/org/testcontainers/test/Network.java index 3c931f8bb4b..e4136f0cde8 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/Network.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/Network.java @@ -2,13 +2,15 @@ import com.google.common.base.Preconditions; import lombok.AccessLevel; +import lombok.NoArgsConstructor; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import org.apache.commons.io.IOUtils; -import org.testcontainers.DockerClientFactory; +import org.testcontainers.containers.Container; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.shaded.com.github.dockerjava.api.DockerClient; +import org.testcontainers.shaded.com.github.dockerjava.api.async.ResultCallback; import org.testcontainers.shaded.com.github.dockerjava.api.command.InspectContainerResponse; +import org.testcontainers.shaded.com.github.dockerjava.api.model.Frame; import java.util.Arrays; import java.util.LinkedList; @@ -19,7 +21,8 @@ * Created by novy on 14.01.17. */ -class Network { +@NoArgsConstructor(access = AccessLevel.PRIVATE) +class Network implements CanSpawnExampleContainers { interface CanPingContainers { @@ -28,8 +31,7 @@ default PingResponse ping(GenericContainer container) { } default PingResponse ping(GenericContainer container, long packetSizeInBytes) { - final String containerIP = Network.ipAddressOf(container); - return Network.ping(containerIP, packetSizeInBytes); + return new Network().ping(container, packetSizeInBytes); } } @@ -37,7 +39,11 @@ default PingResponse ping(GenericContainer container, long packetSizeInBytes) { static class PingResponse { private final String responseContent; - boolean wasSuccessful() { + boolean packetLost() { + return lastLineOfResponse().contains("100% packet loss"); + } + + private boolean wasSuccessful() { return !unknownHost() && !packetLost(); } @@ -45,17 +51,15 @@ private boolean unknownHost() { return lastLineOfResponse().contains("ping: unknown host"); } - private boolean packetLost() { - return lastLineOfResponse().contains("100% packet loss"); - } - double latencyInMilliseconds() { return Double.parseDouble(extractResponseTimeAsString()); } private String extractResponseTimeAsString() { Preconditions.checkArgument(wasSuccessful(), "Trying to extract latency from unsuccessful response"); - final Pattern minResponseTimePattern = Pattern.compile("rtt min/avg/max/mdev = ([+-]?([0-9]*[.])?[0-9]+)"); + final Pattern minResponseTimePattern = Pattern.compile( + "round-trip min/avg/max = [0-9]*[.]?[0-9]+/([0-9]*[.]?[0-9]+)/[0-9]*[.]?[0-9]+ ms" + ); final Matcher matcher = minResponseTimePattern.matcher(lastLineOfResponse()); Preconditions.checkArgument(matcher.find(), "Latency pattern not found in response"); return matcher.group(1); @@ -67,18 +71,18 @@ private String lastLineOfResponse() { } } - static String ipAddressOf(GenericContainer container) { - final DockerClient client = DockerClientFactory.instance().client(); - final InspectContainerResponse inspected = client.inspectContainerCmd(container.getContainerId()).exec(); - return inspected.getNetworkSettings().getNetworks().get("bridge").getIpAddress(); - } - @SneakyThrows - static PingResponse ping(String address, long packetSizeInBytes) { - final Process process = Runtime.getRuntime().exec(String.format("ping %s -c 1 -s %d", address, packetSizeInBytes)); - return new PingResponse( - IOUtils.toString(process.getInputStream(), "UTF-8") + PingResponse ping(GenericContainer container, long packetSizeInBytes) { + final GenericContainer pinger = startedContainer(); + final Container.ExecResult pingResponse = pinger.execInContainer( + "sh", "-c", String.format("ping %s -c 1 -s %d", ipAddressOf(container), packetSizeInBytes) ); + return new PingResponse(pingResponse.getStdout()); + } + + private String ipAddressOf(GenericContainer container) { + final InspectContainerResponse inspected = dockerClient().inspectContainerCmd(container.getContainerId()).exec(); + return inspected.getNetworkSettings().getNetworks().get("bridge").getIpAddress(); } } diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/PausingContainersTest.java b/modules/chaostesting/src/test/java/org/testcontainers/test/PausingContainersTest.java index 45bfc57a04c..49097fdc3f4 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/PausingContainersTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/PausingContainersTest.java @@ -18,7 +18,7 @@ /** * Created by novy on 31.12.16. */ -public class PausingContainersTest implements CanSpawnExampleContainers { +public class PausingContainersTest extends ShutdownsOrphanedContainers implements CanSpawnExampleContainers { private DockerEnvironment environment; diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/RateLimitingOutgoingPacketsTest.java b/modules/chaostesting/src/test/java/org/testcontainers/test/RateLimitingOutgoingPacketsTest.java index 4a7dae08d8f..8dcc0faf739 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/RateLimitingOutgoingPacketsTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/RateLimitingOutgoingPacketsTest.java @@ -21,7 +21,7 @@ /** * Created by novy on 15.01.17. */ -public class RateLimitingOutgoingPacketsTest implements CanSpawnExampleContainers, CanPingContainers { +public class RateLimitingOutgoingPacketsTest extends ShutdownsOrphanedContainers implements CanSpawnExampleContainers, CanPingContainers { @Test public void should_be_able_to_rate_limit_outgoing_packets_from_container() throws Exception { @@ -43,7 +43,7 @@ public void should_be_able_to_rate_limit_outgoing_packets_from_container() throw pumba.start(); // then - await().atMost(20, SECONDS).until(() -> { + await().atMost(30, SECONDS).until(() -> { final PingResponse pingResponse = ping(containerToRateLimit, 117); assertThat(pingResponse.latencyInMilliseconds()).isGreaterThan(1000); }); diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/RemovingContainerTest.java b/modules/chaostesting/src/test/java/org/testcontainers/test/RemovingContainerTest.java index c4f7882eae4..032d1c3baa8 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/RemovingContainerTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/RemovingContainerTest.java @@ -18,7 +18,7 @@ @Ignore // todo: there are some issues on pumba side, mentioned in every test case -public class RemovingContainerTest implements CanSpawnExampleContainers { +public class RemovingContainerTest extends ShutdownsOrphanedContainers implements CanSpawnExampleContainers { private DockerEnvironment environment; diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/ShutdownsOrphanedContainers.java b/modules/chaostesting/src/test/java/org/testcontainers/test/ShutdownsOrphanedContainers.java new file mode 100644 index 00000000000..c28322d565c --- /dev/null +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/ShutdownsOrphanedContainers.java @@ -0,0 +1,12 @@ +package org.testcontainers.test; + +import org.junit.After; +import org.testcontainers.utility.ResourceReaper; + +abstract class ShutdownsOrphanedContainers { + + @After + public void tearDown() throws Exception { + ResourceReaper.instance().performCleanup(); + } +} diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/StoppingContainerTest.java b/modules/chaostesting/src/test/java/org/testcontainers/test/StoppingContainerTest.java index 9da73045e36..a45461c6863 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/StoppingContainerTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/StoppingContainerTest.java @@ -17,7 +17,7 @@ /** * Created by novy on 31.12.16. */ -public class StoppingContainerTest implements CanSpawnExampleContainers { +public class StoppingContainerTest extends ShutdownsOrphanedContainers implements CanSpawnExampleContainers { private DockerEnvironment environment; @@ -40,7 +40,7 @@ public void should_stop_single_container() throws Exception { pumba.start(); // then - await().atMost(20, TimeUnit.SECONDS).until(() -> { + await().atMost(30, TimeUnit.SECONDS).until(() -> { final ContainerDetails container = environment.containerDetails(containerToStop.getContainerId()); assertThat(container.isRunning()).isFalse(); }); From 0ee543982179c9ce8c38a04d6c0a8a1c09bb7894 Mon Sep 17 00:00:00 2001 From: novy Date: Sat, 3 Jun 2017 11:06:05 +0200 Subject: [PATCH 15/32] Increased pumba version, removing container --- .../org/testcontainers/PumbaContainer.java | 2 +- .../java/org/testcontainers/test/Network.java | 2 +- .../test/RemovingContainerTest.java | 29 ++----------------- 3 files changed, 5 insertions(+), 28 deletions(-) diff --git a/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java b/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java index 384d02272eb..27eede82983 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java @@ -17,7 +17,7 @@ @Slf4j public final class PumbaContainer extends GenericContainer implements PumbaDSL.ProvidesAction, PumbaDSL.ProvidesTarget, PumbaDSL.ProvidesExecutionMode { - private static final String PUMBA_DOCKER_IMAGE = "gaiaadm/pumba:master"; + private static final String PUMBA_DOCKER_IMAGE = "gaiaadm/pumba:275-229940dc50ca9973d5a2504ddcc30b7762fb0c00"; private static final String IP_ROUTE_DOCKER_IMAGE = "gaiadocker/iproute2:latest"; private Supplier action; diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/Network.java b/modules/chaostesting/src/test/java/org/testcontainers/test/Network.java index e4136f0cde8..a65f01bb08c 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/Network.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/Network.java @@ -58,7 +58,7 @@ private boolean unknownHost() { private String extractResponseTimeAsString() { Preconditions.checkArgument(wasSuccessful(), "Trying to extract latency from unsuccessful response"); final Pattern minResponseTimePattern = Pattern.compile( - "round-trip min/avg/max = [0-9]*[.]?[0-9]+/([0-9]*[.]?[0-9]+)/[0-9]*[.]?[0-9]+ ms" + "round-trip min/avg/max = ([0-9]*[.]?[0-9]+)/[0-9]*[.]?[0-9]+/[0-9]*[.]?[0-9]+ ms" ); final Matcher matcher = minResponseTimePattern.matcher(lastLineOfResponse()); Preconditions.checkArgument(matcher.find(), "Latency pattern not found in response"); diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/RemovingContainerTest.java b/modules/chaostesting/src/test/java/org/testcontainers/test/RemovingContainerTest.java index 032d1c3baa8..5920e94d9c6 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/RemovingContainerTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/RemovingContainerTest.java @@ -6,6 +6,8 @@ import org.testcontainers.PumbaContainer; import org.testcontainers.containers.GenericContainer; +import java.util.concurrent.TimeUnit; + import static com.jayway.awaitility.Awaitility.await; import static org.assertj.core.api.Assertions.assertThat; import static org.testcontainers.ContainerActions.removeContainers; @@ -16,8 +18,6 @@ * Created by novy on 31.12.16. */ -@Ignore -// todo: there are some issues on pumba side, mentioned in every test case public class RemovingContainerTest extends ShutdownsOrphanedContainers implements CanSpawnExampleContainers { private DockerEnvironment environment; @@ -28,29 +28,6 @@ public void setUp() throws Exception { } @Test - // todo https://github.com/gaia-adm/pumba/issues/30 - public void should_remove_stopped_container() throws Exception { - // given - final GenericContainer stoppedContainerToRemove = stoppedContainer(); - - final GenericContainer pumba = PumbaContainer.newPumba() - .performContainerChaos(removeContainers()) - .affect(containers(stoppedContainerToRemove.getContainerName())) - .execute(onlyOnce().onAllChosenContainers()); - - // when - pumba.start(); - - // then - await().until(() -> - assertThat(environment.namesOfAllContainers()) - .doesNotContain(stoppedContainerToRemove.getContainerName()) - ); - - } - - @Test - // todo https://github.com/gaia-adm/pumba/issues/31 public void should_remove_running_container() throws Exception { // given final GenericContainer containerToRemove = startedContainer(); @@ -64,7 +41,7 @@ public void should_remove_running_container() throws Exception { pumba.start(); // then - await().until(() -> + await().atMost(30, TimeUnit.SECONDS).until(() -> assertThat(environment.namesOfAllContainers()) .doesNotContain(containerToRemove.getContainerName()) ); From e86bd3abbd1fd955fc77ed7a48571a805c54fd8f Mon Sep 17 00:00:00 2001 From: novy Date: Sat, 3 Jun 2017 13:24:10 +0200 Subject: [PATCH 16/32] Decoupled pumba client from testcontainers, repackaging (everything public so far :() --- .../java/org/testcontainers/PumbaAction.java | 7 --- .../java/org/testcontainers/PumbaCommand.java | 28 --------- .../org/testcontainers/PumbaContainer.java | 57 +++++-------------- .../java/org/testcontainers/PumbaDSL.java | 27 --------- .../org/testcontainers/PumbaExecutables.java | 13 +++++ .../testcontainers/client/PumbaClient.java | 50 ++++++++++++++++ .../testcontainers/client/PumbaCommand.java | 32 +++++++++++ .../org/testcontainers/client/PumbaDSL.java | 30 ++++++++++ .../client/PumbaExecutable.java | 9 +++ .../client/actions/PumbaAction.java | 9 +++ .../containeractions/ContainerAction.java | 9 +++ .../containeractions}/ContainerActions.java | 5 +- .../containeractions}/KillContainers.java | 5 +- .../containeractions}/PauseContainers.java | 7 ++- .../containeractions}/RemoveContainers.java | 5 +- .../containeractions}/StopContainers.java | 5 +- .../networkactions}/DelayOutgoingPackets.java | 5 +- .../DroppingPacketsModels.java | 3 +- .../actions/networkactions/NetworkAction.java | 9 +++ .../networkactions}/NetworkActions.java | 14 ++--- .../networkactions}/NetworkSubCommands.java | 3 +- .../RateLimitOutgoingTraffic.java | 3 +- .../commandparts}/PumbaCommandPart.java | 4 +- .../commandparts}/SupportedTimeUnit.java | 2 +- .../commandparts}/TimeExpression.java | 10 ++-- .../executionmodes/PumbaExecutionMode.java | 19 +++++++ .../executionmodes}/PumbaExecutionModes.java | 15 ++--- .../client/targets/PumbaTarget.java | 9 +++ .../{ => client/targets}/PumbaTargets.java | 4 +- .../test/CanSpawnExampleContainers.java | 18 +----- .../test/DelayingOutgoingPacketsTest.java | 29 ++++++---- .../test/DockerEnvironment.java | 1 - ...ketsTest.java => DroppingPacketsTest.java} | 41 ++++++------- .../test/KillingContainersTest.java | 54 +++++++++--------- .../java/org/testcontainers/test/Network.java | 16 +++--- .../test/PausingContainersTest.java | 21 +++---- .../test/RateLimitingOutgoingPacketsTest.java | 33 ++++++----- .../test/RemovingContainerTest.java | 20 +++---- .../test/ShutdownsOrphanedContainers.java | 12 ---- .../test/StoppingContainerTest.java | 19 ++++--- 40 files changed, 374 insertions(+), 288 deletions(-) delete mode 100644 modules/chaostesting/src/main/java/org/testcontainers/PumbaAction.java delete mode 100644 modules/chaostesting/src/main/java/org/testcontainers/PumbaCommand.java delete mode 100644 modules/chaostesting/src/main/java/org/testcontainers/PumbaDSL.java create mode 100644 modules/chaostesting/src/main/java/org/testcontainers/PumbaExecutables.java create mode 100644 modules/chaostesting/src/main/java/org/testcontainers/client/PumbaClient.java create mode 100644 modules/chaostesting/src/main/java/org/testcontainers/client/PumbaCommand.java create mode 100644 modules/chaostesting/src/main/java/org/testcontainers/client/PumbaDSL.java create mode 100644 modules/chaostesting/src/main/java/org/testcontainers/client/PumbaExecutable.java create mode 100644 modules/chaostesting/src/main/java/org/testcontainers/client/actions/PumbaAction.java create mode 100644 modules/chaostesting/src/main/java/org/testcontainers/client/actions/containeractions/ContainerAction.java rename modules/chaostesting/src/main/java/org/testcontainers/{ => client/actions/containeractions}/ContainerActions.java (83%) rename modules/chaostesting/src/main/java/org/testcontainers/{ => client/actions/containeractions}/KillContainers.java (86%) rename modules/chaostesting/src/main/java/org/testcontainers/{ => client/actions/containeractions}/PauseContainers.java (71%) rename modules/chaostesting/src/main/java/org/testcontainers/{ => client/actions/containeractions}/RemoveContainers.java (86%) rename modules/chaostesting/src/main/java/org/testcontainers/{ => client/actions/containeractions}/StopContainers.java (78%) rename modules/chaostesting/src/main/java/org/testcontainers/{ => client/actions/networkactions}/DelayOutgoingPackets.java (90%) rename modules/chaostesting/src/main/java/org/testcontainers/{ => client/actions/networkactions}/DroppingPacketsModels.java (97%) create mode 100644 modules/chaostesting/src/main/java/org/testcontainers/client/actions/networkactions/NetworkAction.java rename modules/chaostesting/src/main/java/org/testcontainers/{ => client/actions/networkactions}/NetworkActions.java (84%) rename modules/chaostesting/src/main/java/org/testcontainers/{ => client/actions/networkactions}/NetworkSubCommands.java (83%) rename modules/chaostesting/src/main/java/org/testcontainers/{ => client/actions/networkactions}/RateLimitOutgoingTraffic.java (96%) rename modules/chaostesting/src/main/java/org/testcontainers/{ => client/commandparts}/PumbaCommandPart.java (70%) rename modules/chaostesting/src/main/java/org/testcontainers/{ => client/commandparts}/SupportedTimeUnit.java (95%) rename modules/chaostesting/src/main/java/org/testcontainers/{ => client/commandparts}/TimeExpression.java (63%) create mode 100644 modules/chaostesting/src/main/java/org/testcontainers/client/executionmodes/PumbaExecutionMode.java rename modules/chaostesting/src/main/java/org/testcontainers/{ => client/executionmodes}/PumbaExecutionModes.java (70%) create mode 100644 modules/chaostesting/src/main/java/org/testcontainers/client/targets/PumbaTarget.java rename modules/chaostesting/src/main/java/org/testcontainers/{ => client/targets}/PumbaTargets.java (90%) rename modules/chaostesting/src/test/java/org/testcontainers/test/{LosingPacketsTest.java => DroppingPacketsTest.java} (81%) delete mode 100644 modules/chaostesting/src/test/java/org/testcontainers/test/ShutdownsOrphanedContainers.java diff --git a/modules/chaostesting/src/main/java/org/testcontainers/PumbaAction.java b/modules/chaostesting/src/main/java/org/testcontainers/PumbaAction.java deleted file mode 100644 index 3a6ade986f5..00000000000 --- a/modules/chaostesting/src/main/java/org/testcontainers/PumbaAction.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.testcontainers; - -/** - * Created by novy on 14.01.17. - */ -interface PumbaAction extends PumbaCommandPart { -} diff --git a/modules/chaostesting/src/main/java/org/testcontainers/PumbaCommand.java b/modules/chaostesting/src/main/java/org/testcontainers/PumbaCommand.java deleted file mode 100644 index aa1aa7d5e81..00000000000 --- a/modules/chaostesting/src/main/java/org/testcontainers/PumbaCommand.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.testcontainers; - -import lombok.AccessLevel; -import lombok.RequiredArgsConstructor; - -/** - * Created by novy on 01.01.17. - */ - -@RequiredArgsConstructor(access = AccessLevel.PACKAGE) -class PumbaCommand { - - private final PumbaAction action; - private final PumbaExecutionModes.PumbaExecutionMode executionMode; - private final PumbaTargets.PumbaTarget target; - - String evaluate() { - return commandPrefix() - .append(executionMode) - .append(action) - .append(target) - .evaluate(); - } - - private PumbaCommandPart commandPrefix() { - return () -> "pumba --debug"; - } -} diff --git a/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java b/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java index 27eede82983..f768af43eb8 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java @@ -2,32 +2,34 @@ import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; +import org.testcontainers.client.*; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.startupcheck.StartupCheckStrategy; import org.testcontainers.images.RemoteDockerImage; import org.testcontainers.shaded.com.github.dockerjava.api.DockerClient; -import java.util.function.Supplier; - import static org.testcontainers.containers.BindMode.READ_WRITE; /** * Created by novy on 31.12.16. */ @Slf4j -public final class PumbaContainer extends GenericContainer implements PumbaDSL.ProvidesAction, PumbaDSL.ProvidesTarget, PumbaDSL.ProvidesExecutionMode { +class PumbaContainer extends GenericContainer implements PumbaExecutable { private static final String PUMBA_DOCKER_IMAGE = "gaiaadm/pumba:275-229940dc50ca9973d5a2504ddcc30b7762fb0c00"; - private static final String IP_ROUTE_DOCKER_IMAGE = "gaiadocker/iproute2:latest"; - - private Supplier action; - private Supplier executionMode; - private Supplier target; + private static final String IP_ROUTE_DOCKER_IMAGE = "gaiadocker/iproute2:3.3"; - private PumbaContainer() { + PumbaContainer() { super(PUMBA_DOCKER_IMAGE); + } + + @Override + public void execute(PumbaCommand command) { doNotWaitForStartupAtAll(); mountDockerSocket(); + fetchIPRouteImage(); + + executeCommand(command); } private void doNotWaitForStartupAtAll() { @@ -38,45 +40,12 @@ private void mountDockerSocket() { addFileSystemBind("/var/run/docker.sock", "/var/run/docker.sock", READ_WRITE); } - public static PumbaDSL.ProvidesAction newPumba() { - return new PumbaContainer(); - } - - @Override - public PumbaDSL.ProvidesTarget performContainerChaos(ContainerActions.ContainerAction containerAction) { - this.action = () -> containerAction; - return this; - } - - @Override - public PumbaDSL.ProvidesTarget performNetworkChaos(NetworkActions.NetworkAction networkAction) { - this.action = () -> { - fetchIPRouteImage(); - return networkAction; - }; - return this; - } - @SneakyThrows private void fetchIPRouteImage() { new RemoteDockerImage(IP_ROUTE_DOCKER_IMAGE).get(); } - @Override - public PumbaDSL.ProvidesExecutionMode affect(PumbaTargets.PumbaTarget target) { - this.target = () -> target; - return this; - } - - @Override - public GenericContainer execute(PumbaExecutionModes.PumbaExecutionMode executionMode) { - this.executionMode = () -> executionMode; - return this; - } - - @Override - public void start() { - final PumbaCommand command = new PumbaCommand(action.get(), executionMode.get(), target.get()); + private void executeCommand(PumbaCommand command) { final String evaluatedCommand = command.evaluate(); setCommand(evaluatedCommand); log.info("Executing pumba container with command \"{}\"", evaluatedCommand); @@ -86,7 +55,7 @@ public void start() { private static class DoNotCheckStartup extends StartupCheckStrategy { @Override public StartupStatus checkStartupState(DockerClient dockerClient, String s) { - return StartupCheckStrategy.StartupStatus.SUCCESSFUL; + return StartupStatus.SUCCESSFUL; } } } diff --git a/modules/chaostesting/src/main/java/org/testcontainers/PumbaDSL.java b/modules/chaostesting/src/main/java/org/testcontainers/PumbaDSL.java deleted file mode 100644 index 75e2d47fe78..00000000000 --- a/modules/chaostesting/src/main/java/org/testcontainers/PumbaDSL.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.testcontainers; - - -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import org.testcontainers.containers.GenericContainer; - -/** - * Created by novy on 14.01.17. - */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -class PumbaDSL { - - public interface ProvidesAction { - ProvidesTarget performContainerChaos(ContainerActions.ContainerAction containerAction); - - ProvidesTarget performNetworkChaos(NetworkActions.NetworkAction networkAction); - } - - public interface ProvidesTarget { - ProvidesExecutionMode affect(PumbaTargets.PumbaTarget target); - } - - public interface ProvidesExecutionMode { - GenericContainer execute(PumbaExecutionModes.PumbaExecutionMode executionMode); - } -} diff --git a/modules/chaostesting/src/main/java/org/testcontainers/PumbaExecutables.java b/modules/chaostesting/src/main/java/org/testcontainers/PumbaExecutables.java new file mode 100644 index 00000000000..cc105ca8b62 --- /dev/null +++ b/modules/chaostesting/src/main/java/org/testcontainers/PumbaExecutables.java @@ -0,0 +1,13 @@ +package org.testcontainers; + +import org.testcontainers.client.PumbaExecutable; + +/** + * Created by novy on 03.06.17. + */ +public class PumbaExecutables { + + public static PumbaExecutable dockerized() { + return new PumbaContainer(); + } +} diff --git a/modules/chaostesting/src/main/java/org/testcontainers/client/PumbaClient.java b/modules/chaostesting/src/main/java/org/testcontainers/client/PumbaClient.java new file mode 100644 index 00000000000..aa5b4bee637 --- /dev/null +++ b/modules/chaostesting/src/main/java/org/testcontainers/client/PumbaClient.java @@ -0,0 +1,50 @@ +package org.testcontainers.client; + +import lombok.RequiredArgsConstructor; +import org.testcontainers.client.actions.PumbaAction; +import org.testcontainers.client.actions.containeractions.ContainerAction; +import org.testcontainers.client.actions.networkactions.NetworkAction; +import org.testcontainers.client.executionmodes.PumbaExecutionMode; +import org.testcontainers.client.targets.PumbaTarget; + +/** + * Created by novy on 03.06.17. + */ +@RequiredArgsConstructor +public final class PumbaClient implements PumbaDSL.ChooseAction, PumbaDSL.ChooseTarget, PumbaDSL.ChooseExecutionMode { + + private final PumbaExecutable executable; + + private PumbaAction action; + private PumbaExecutionMode executionMode; + private PumbaTarget target; + + @Override + public PumbaDSL.ChooseTarget performContainerChaos(ContainerAction containerAction) { + this.action = containerAction; + return this; + } + + @Override + public PumbaDSL.ChooseTarget performNetworkChaos(NetworkAction networkAction) { + this.action = networkAction; + return this; + } + + @Override + public PumbaDSL.ChooseExecutionMode affect(PumbaTarget target) { + this.target = target; + return this; + } + + @Override + public void execute(PumbaExecutionMode executionMode) { + this.executionMode = executionMode; + buildAndExecuteCommand(); + } + + private void buildAndExecuteCommand() { + PumbaCommand commandToExecute = PumbaCommand.of(action, executionMode, target); + executable.execute(commandToExecute); + } +} diff --git a/modules/chaostesting/src/main/java/org/testcontainers/client/PumbaCommand.java b/modules/chaostesting/src/main/java/org/testcontainers/client/PumbaCommand.java new file mode 100644 index 00000000000..2754c091678 --- /dev/null +++ b/modules/chaostesting/src/main/java/org/testcontainers/client/PumbaCommand.java @@ -0,0 +1,32 @@ +package org.testcontainers.client; + +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import org.testcontainers.client.actions.PumbaAction; +import org.testcontainers.client.commandparts.PumbaCommandPart; +import org.testcontainers.client.executionmodes.PumbaExecutionMode; +import org.testcontainers.client.targets.PumbaTarget; + +/** + * Created by novy on 01.01.17. + */ + +@RequiredArgsConstructor(access = AccessLevel.PACKAGE, staticName = "of") +public final class PumbaCommand { + + private final PumbaAction action; + private final PumbaExecutionMode executionMode; + private final PumbaTarget target; + + public String evaluate() { + return commandPrefix() + .append(executionMode) + .append(action) + .append(target) + .evaluate(); + } + + private PumbaCommandPart commandPrefix() { + return () -> "pumba --debug"; + } +} diff --git a/modules/chaostesting/src/main/java/org/testcontainers/client/PumbaDSL.java b/modules/chaostesting/src/main/java/org/testcontainers/client/PumbaDSL.java new file mode 100644 index 00000000000..35520861372 --- /dev/null +++ b/modules/chaostesting/src/main/java/org/testcontainers/client/PumbaDSL.java @@ -0,0 +1,30 @@ +package org.testcontainers.client; + + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.testcontainers.client.actions.containeractions.ContainerAction; +import org.testcontainers.client.actions.networkactions.NetworkAction; +import org.testcontainers.client.executionmodes.PumbaExecutionMode; +import org.testcontainers.client.targets.PumbaTarget; + +/** + * Created by novy on 14.01.17. + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class PumbaDSL { + + public interface ChooseAction { + ChooseTarget performContainerChaos(ContainerAction containerAction); + + ChooseTarget performNetworkChaos(NetworkAction networkAction); + } + + public interface ChooseTarget { + ChooseExecutionMode affect(PumbaTarget target); + } + + public interface ChooseExecutionMode { + void execute(PumbaExecutionMode executionMode); + } +} diff --git a/modules/chaostesting/src/main/java/org/testcontainers/client/PumbaExecutable.java b/modules/chaostesting/src/main/java/org/testcontainers/client/PumbaExecutable.java new file mode 100644 index 00000000000..48a5d4d347b --- /dev/null +++ b/modules/chaostesting/src/main/java/org/testcontainers/client/PumbaExecutable.java @@ -0,0 +1,9 @@ +package org.testcontainers.client; + +/** + * Created by novy on 03.06.17. + */ +public interface PumbaExecutable { + + void execute(PumbaCommand command); +} diff --git a/modules/chaostesting/src/main/java/org/testcontainers/client/actions/PumbaAction.java b/modules/chaostesting/src/main/java/org/testcontainers/client/actions/PumbaAction.java new file mode 100644 index 00000000000..bbcfefe3e6f --- /dev/null +++ b/modules/chaostesting/src/main/java/org/testcontainers/client/actions/PumbaAction.java @@ -0,0 +1,9 @@ +package org.testcontainers.client.actions; + +import org.testcontainers.client.commandparts.PumbaCommandPart; + +/** + * Created by novy on 14.01.17. + */ +public interface PumbaAction extends PumbaCommandPart { +} diff --git a/modules/chaostesting/src/main/java/org/testcontainers/client/actions/containeractions/ContainerAction.java b/modules/chaostesting/src/main/java/org/testcontainers/client/actions/containeractions/ContainerAction.java new file mode 100644 index 00000000000..c89b0f1823c --- /dev/null +++ b/modules/chaostesting/src/main/java/org/testcontainers/client/actions/containeractions/ContainerAction.java @@ -0,0 +1,9 @@ +package org.testcontainers.client.actions.containeractions; + +import org.testcontainers.client.actions.PumbaAction; + +/** + * Created by novy on 03.06.17. + */ +public interface ContainerAction extends PumbaAction { +} diff --git a/modules/chaostesting/src/main/java/org/testcontainers/ContainerActions.java b/modules/chaostesting/src/main/java/org/testcontainers/client/actions/containeractions/ContainerActions.java similarity index 83% rename from modules/chaostesting/src/main/java/org/testcontainers/ContainerActions.java rename to modules/chaostesting/src/main/java/org/testcontainers/client/actions/containeractions/ContainerActions.java index 945b0def096..36088672a51 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/ContainerActions.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/client/actions/containeractions/ContainerActions.java @@ -1,7 +1,8 @@ -package org.testcontainers; +package org.testcontainers.client.actions.containeractions; import lombok.AccessLevel; import lombok.NoArgsConstructor; +import org.testcontainers.client.actions.PumbaAction; /** * Created by novy on 31.12.16. @@ -25,6 +26,4 @@ public static RemoveContainers removeContainers() { return new RemoveContainers(); } - public interface ContainerAction extends PumbaAction { - } } diff --git a/modules/chaostesting/src/main/java/org/testcontainers/KillContainers.java b/modules/chaostesting/src/main/java/org/testcontainers/client/actions/containeractions/KillContainers.java similarity index 86% rename from modules/chaostesting/src/main/java/org/testcontainers/KillContainers.java rename to modules/chaostesting/src/main/java/org/testcontainers/client/actions/containeractions/KillContainers.java index defdb51deca..539f2017a56 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/KillContainers.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/client/actions/containeractions/KillContainers.java @@ -1,13 +1,14 @@ -package org.testcontainers; +package org.testcontainers.client.actions.containeractions; import lombok.AccessLevel; import lombok.NoArgsConstructor; +import org.testcontainers.client.commandparts.PumbaCommandPart; /** * Created by novy on 16.01.17. */ @NoArgsConstructor(access = AccessLevel.PACKAGE) -public class KillContainers implements ContainerActions.ContainerAction { +public class KillContainers implements ContainerAction { private KillSignal signal = KillSignal.SIGKILL; public KillContainers withSignal(KillSignal signal) { diff --git a/modules/chaostesting/src/main/java/org/testcontainers/PauseContainers.java b/modules/chaostesting/src/main/java/org/testcontainers/client/actions/containeractions/PauseContainers.java similarity index 71% rename from modules/chaostesting/src/main/java/org/testcontainers/PauseContainers.java rename to modules/chaostesting/src/main/java/org/testcontainers/client/actions/containeractions/PauseContainers.java index 1d7507a2862..07e873b7d44 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/PauseContainers.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/client/actions/containeractions/PauseContainers.java @@ -1,14 +1,17 @@ -package org.testcontainers; +package org.testcontainers.client.actions.containeractions; import lombok.AccessLevel; import lombok.NoArgsConstructor; +import org.testcontainers.client.commandparts.PumbaCommandPart; +import org.testcontainers.client.commandparts.SupportedTimeUnit; +import org.testcontainers.client.commandparts.TimeExpression; /** * Created by novy on 17.01.17. */ @NoArgsConstructor(access = AccessLevel.PACKAGE) -public class PauseContainers implements ContainerActions.ContainerAction { +public class PauseContainers implements ContainerAction { private TimeExpression duration = TimeExpression.of(15, SupportedTimeUnit.SECONDS); public PauseContainers forDuration(long duration, SupportedTimeUnit unit) { diff --git a/modules/chaostesting/src/main/java/org/testcontainers/RemoveContainers.java b/modules/chaostesting/src/main/java/org/testcontainers/client/actions/containeractions/RemoveContainers.java similarity index 86% rename from modules/chaostesting/src/main/java/org/testcontainers/RemoveContainers.java rename to modules/chaostesting/src/main/java/org/testcontainers/client/actions/containeractions/RemoveContainers.java index c964168d79e..84d5a317a7c 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/RemoveContainers.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/client/actions/containeractions/RemoveContainers.java @@ -1,14 +1,15 @@ -package org.testcontainers; +package org.testcontainers.client.actions.containeractions; import lombok.AccessLevel; import lombok.NoArgsConstructor; +import org.testcontainers.client.commandparts.PumbaCommandPart; /** * Created by novy on 17.01.17. */ @NoArgsConstructor(access = AccessLevel.PACKAGE) -public class RemoveContainers implements ContainerActions.ContainerAction { +public class RemoveContainers implements ContainerAction { private boolean force = false; private boolean links = false; private boolean volumes = false; diff --git a/modules/chaostesting/src/main/java/org/testcontainers/StopContainers.java b/modules/chaostesting/src/main/java/org/testcontainers/client/actions/containeractions/StopContainers.java similarity index 78% rename from modules/chaostesting/src/main/java/org/testcontainers/StopContainers.java rename to modules/chaostesting/src/main/java/org/testcontainers/client/actions/containeractions/StopContainers.java index b8a90c69aca..e861c4df87a 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/StopContainers.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/client/actions/containeractions/StopContainers.java @@ -1,14 +1,15 @@ -package org.testcontainers; +package org.testcontainers.client.actions.containeractions; import lombok.AccessLevel; import lombok.NoArgsConstructor; +import org.testcontainers.client.commandparts.PumbaCommandPart; /** * Created by novy on 17.01.17. */ @NoArgsConstructor(access = AccessLevel.PACKAGE) -public class StopContainers implements ContainerActions.ContainerAction { +public class StopContainers implements ContainerAction { private long gracePeriod = 10; public StopContainers withSecondsToWaitBeforeKilling(long seconds) { diff --git a/modules/chaostesting/src/main/java/org/testcontainers/DelayOutgoingPackets.java b/modules/chaostesting/src/main/java/org/testcontainers/client/actions/networkactions/DelayOutgoingPackets.java similarity index 90% rename from modules/chaostesting/src/main/java/org/testcontainers/DelayOutgoingPackets.java rename to modules/chaostesting/src/main/java/org/testcontainers/client/actions/networkactions/DelayOutgoingPackets.java index 2f5fb93cae8..6be69864974 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/DelayOutgoingPackets.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/client/actions/networkactions/DelayOutgoingPackets.java @@ -1,7 +1,10 @@ -package org.testcontainers; +package org.testcontainers.client.actions.networkactions; import lombok.AccessLevel; import lombok.NoArgsConstructor; +import org.testcontainers.client.commandparts.PumbaCommandPart; +import org.testcontainers.client.commandparts.SupportedTimeUnit; +import org.testcontainers.client.commandparts.TimeExpression; import java.util.Optional; diff --git a/modules/chaostesting/src/main/java/org/testcontainers/DroppingPacketsModels.java b/modules/chaostesting/src/main/java/org/testcontainers/client/actions/networkactions/DroppingPacketsModels.java similarity index 97% rename from modules/chaostesting/src/main/java/org/testcontainers/DroppingPacketsModels.java rename to modules/chaostesting/src/main/java/org/testcontainers/client/actions/networkactions/DroppingPacketsModels.java index 95fa526bf5c..beca21a28f3 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/DroppingPacketsModels.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/client/actions/networkactions/DroppingPacketsModels.java @@ -1,7 +1,8 @@ -package org.testcontainers; +package org.testcontainers.client.actions.networkactions; import lombok.AccessLevel; import lombok.NoArgsConstructor; +import org.testcontainers.client.commandparts.PumbaCommandPart; /** * Created by novy on 17.01.17. diff --git a/modules/chaostesting/src/main/java/org/testcontainers/client/actions/networkactions/NetworkAction.java b/modules/chaostesting/src/main/java/org/testcontainers/client/actions/networkactions/NetworkAction.java new file mode 100644 index 00000000000..4b0c3651826 --- /dev/null +++ b/modules/chaostesting/src/main/java/org/testcontainers/client/actions/networkactions/NetworkAction.java @@ -0,0 +1,9 @@ +package org.testcontainers.client.actions.networkactions; + +import org.testcontainers.client.actions.PumbaAction; + +/** + * Created by novy on 03.06.17. + */ +public interface NetworkAction extends PumbaAction { +} diff --git a/modules/chaostesting/src/main/java/org/testcontainers/NetworkActions.java b/modules/chaostesting/src/main/java/org/testcontainers/client/actions/networkactions/NetworkActions.java similarity index 84% rename from modules/chaostesting/src/main/java/org/testcontainers/NetworkActions.java rename to modules/chaostesting/src/main/java/org/testcontainers/client/actions/networkactions/NetworkActions.java index a7dd5a738bb..c48af1f5dfb 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/NetworkActions.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/client/actions/networkactions/NetworkActions.java @@ -1,12 +1,13 @@ -package org.testcontainers; +package org.testcontainers.client.actions.networkactions; import lombok.AccessLevel; import lombok.NoArgsConstructor; +import org.testcontainers.client.commandparts.PumbaCommandPart; +import org.testcontainers.client.commandparts.SupportedTimeUnit; +import org.testcontainers.client.commandparts.TimeExpression; import java.util.Optional; -import static org.testcontainers.NetworkSubCommands.NetworkSubCommand; - /** * Created by novy on 14.01.17. */ @@ -17,9 +18,6 @@ public static NetworkActionWithSubCommand anAction() { return new NetworkActionWithSubCommand(); } - interface NetworkAction extends PumbaAction { - } - public static class NetworkActionWithSubCommand { private TimeExpression duration = TimeExpression.of(1, SupportedTimeUnit.MINUTES); @@ -41,7 +39,7 @@ public NetworkActionWithSubCommand onTrafficTo(String targetIP) { return this; } - public NetworkAction executeSubCommand(NetworkSubCommand subCommand) { + public NetworkAction executeSubCommand(NetworkSubCommands.NetworkSubCommand subCommand) { return () -> netemPart() .append(durationPart()) .append(interfacePart()) @@ -51,7 +49,7 @@ public NetworkAction executeSubCommand(NetworkSubCommand subCommand) { } private PumbaCommandPart netemPart() { - return () -> "netem --tc-image gaiadocker/iproute2"; + return () -> "netem --tc-image gaiadocker/iproute2:3.3"; } private PumbaCommandPart durationPart() { diff --git a/modules/chaostesting/src/main/java/org/testcontainers/NetworkSubCommands.java b/modules/chaostesting/src/main/java/org/testcontainers/client/actions/networkactions/NetworkSubCommands.java similarity index 83% rename from modules/chaostesting/src/main/java/org/testcontainers/NetworkSubCommands.java rename to modules/chaostesting/src/main/java/org/testcontainers/client/actions/networkactions/NetworkSubCommands.java index 40777543fed..178c517a210 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/NetworkSubCommands.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/client/actions/networkactions/NetworkSubCommands.java @@ -1,7 +1,8 @@ -package org.testcontainers; +package org.testcontainers.client.actions.networkactions; import lombok.AccessLevel; import lombok.NoArgsConstructor; +import org.testcontainers.client.commandparts.PumbaCommandPart; /** * Created by novy on 14.01.17. diff --git a/modules/chaostesting/src/main/java/org/testcontainers/RateLimitOutgoingTraffic.java b/modules/chaostesting/src/main/java/org/testcontainers/client/actions/networkactions/RateLimitOutgoingTraffic.java similarity index 96% rename from modules/chaostesting/src/main/java/org/testcontainers/RateLimitOutgoingTraffic.java rename to modules/chaostesting/src/main/java/org/testcontainers/client/actions/networkactions/RateLimitOutgoingTraffic.java index d9a31014add..3d7efaa4865 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/RateLimitOutgoingTraffic.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/client/actions/networkactions/RateLimitOutgoingTraffic.java @@ -1,8 +1,9 @@ -package org.testcontainers; +package org.testcontainers.client.actions.networkactions; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; +import org.testcontainers.client.commandparts.PumbaCommandPart; /** * Created by novy on 15.01.17. diff --git a/modules/chaostesting/src/main/java/org/testcontainers/PumbaCommandPart.java b/modules/chaostesting/src/main/java/org/testcontainers/client/commandparts/PumbaCommandPart.java similarity index 70% rename from modules/chaostesting/src/main/java/org/testcontainers/PumbaCommandPart.java rename to modules/chaostesting/src/main/java/org/testcontainers/client/commandparts/PumbaCommandPart.java index 7a5019db8f1..cec279effc9 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/PumbaCommandPart.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/client/commandparts/PumbaCommandPart.java @@ -1,9 +1,9 @@ -package org.testcontainers; +package org.testcontainers.client.commandparts; /** * Created by novy on 01.01.17. */ -interface PumbaCommandPart { +public interface PumbaCommandPart { String evaluate(); diff --git a/modules/chaostesting/src/main/java/org/testcontainers/SupportedTimeUnit.java b/modules/chaostesting/src/main/java/org/testcontainers/client/commandparts/SupportedTimeUnit.java similarity index 95% rename from modules/chaostesting/src/main/java/org/testcontainers/SupportedTimeUnit.java rename to modules/chaostesting/src/main/java/org/testcontainers/client/commandparts/SupportedTimeUnit.java index 8e62b98bc64..dd311e228f3 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/SupportedTimeUnit.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/client/commandparts/SupportedTimeUnit.java @@ -1,4 +1,4 @@ -package org.testcontainers; +package org.testcontainers.client.commandparts; /** * Created by novy on 01.01.17. diff --git a/modules/chaostesting/src/main/java/org/testcontainers/TimeExpression.java b/modules/chaostesting/src/main/java/org/testcontainers/client/commandparts/TimeExpression.java similarity index 63% rename from modules/chaostesting/src/main/java/org/testcontainers/TimeExpression.java rename to modules/chaostesting/src/main/java/org/testcontainers/client/commandparts/TimeExpression.java index 695b5ad1ea1..7c7b6f98e8d 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/TimeExpression.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/client/commandparts/TimeExpression.java @@ -1,4 +1,4 @@ -package org.testcontainers; +package org.testcontainers.client.commandparts; import lombok.AccessLevel; import lombok.RequiredArgsConstructor; @@ -7,16 +7,16 @@ * Created by novy on 01.01.17. */ @RequiredArgsConstructor(access = AccessLevel.PRIVATE) -class TimeExpression implements PumbaCommandPart { +public class TimeExpression implements PumbaCommandPart { private final long value; private final SupportedTimeUnit unit; - static TimeExpression of(int value, SupportedTimeUnit unit) { + public static TimeExpression of(int value, SupportedTimeUnit unit) { return new TimeExpression(value, unit); } - static TimeExpression of(long value, SupportedTimeUnit unit) { + public static TimeExpression of(long value, SupportedTimeUnit unit) { return new TimeExpression(value, unit); } @@ -25,7 +25,7 @@ public String evaluate() { return value + unit.abbreviation(); } - long asMilliseconds() { + public long asMilliseconds() { return value * unit.millisecondsMultiplier(); } } diff --git a/modules/chaostesting/src/main/java/org/testcontainers/client/executionmodes/PumbaExecutionMode.java b/modules/chaostesting/src/main/java/org/testcontainers/client/executionmodes/PumbaExecutionMode.java new file mode 100644 index 00000000000..c6121be2958 --- /dev/null +++ b/modules/chaostesting/src/main/java/org/testcontainers/client/executionmodes/PumbaExecutionMode.java @@ -0,0 +1,19 @@ +package org.testcontainers.client.executionmodes; + +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import org.testcontainers.client.commandparts.PumbaCommandPart; + +/** + * Created by novy on 03.06.17. + */ +@RequiredArgsConstructor(access = AccessLevel.PACKAGE) +public final class PumbaExecutionMode implements PumbaCommandPart { + private final PumbaCommandPart schedulePart; + private final PumbaCommandPart containersToAffect; + + @Override + public String evaluate() { + return schedulePart.append(containersToAffect).evaluate(); + } +} diff --git a/modules/chaostesting/src/main/java/org/testcontainers/PumbaExecutionModes.java b/modules/chaostesting/src/main/java/org/testcontainers/client/executionmodes/PumbaExecutionModes.java similarity index 70% rename from modules/chaostesting/src/main/java/org/testcontainers/PumbaExecutionModes.java rename to modules/chaostesting/src/main/java/org/testcontainers/client/executionmodes/PumbaExecutionModes.java index 495d812a9ae..c3a626c3d00 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/PumbaExecutionModes.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/client/executionmodes/PumbaExecutionModes.java @@ -1,8 +1,11 @@ -package org.testcontainers; +package org.testcontainers.client.executionmodes; import lombok.AccessLevel; import lombok.NoArgsConstructor; import lombok.RequiredArgsConstructor; +import org.testcontainers.client.commandparts.PumbaCommandPart; +import org.testcontainers.client.commandparts.SupportedTimeUnit; +import org.testcontainers.client.commandparts.TimeExpression; /** * Created by novy on 01.01.17. @@ -35,14 +38,4 @@ public PumbaExecutionMode onRandomlyChosenContainer() { } } - @RequiredArgsConstructor(access = AccessLevel.PRIVATE) - public static final class PumbaExecutionMode implements PumbaCommandPart { - private final PumbaCommandPart schedulePart; - private final PumbaCommandPart containersToAffect; - - @Override - public String evaluate() { - return schedulePart.append(containersToAffect).evaluate(); - } - } } diff --git a/modules/chaostesting/src/main/java/org/testcontainers/client/targets/PumbaTarget.java b/modules/chaostesting/src/main/java/org/testcontainers/client/targets/PumbaTarget.java new file mode 100644 index 00000000000..1f3e2282b4f --- /dev/null +++ b/modules/chaostesting/src/main/java/org/testcontainers/client/targets/PumbaTarget.java @@ -0,0 +1,9 @@ +package org.testcontainers.client.targets; + +import org.testcontainers.client.commandparts.PumbaCommandPart; + +/** + * Created by novy on 03.06.17. + */ +public interface PumbaTarget extends PumbaCommandPart { +} diff --git a/modules/chaostesting/src/main/java/org/testcontainers/PumbaTargets.java b/modules/chaostesting/src/main/java/org/testcontainers/client/targets/PumbaTargets.java similarity index 90% rename from modules/chaostesting/src/main/java/org/testcontainers/PumbaTargets.java rename to modules/chaostesting/src/main/java/org/testcontainers/client/targets/PumbaTargets.java index e7aabd5ad7d..99a3146ec94 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/PumbaTargets.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/client/targets/PumbaTargets.java @@ -1,4 +1,4 @@ -package org.testcontainers; +package org.testcontainers.client.targets; import lombok.AccessLevel; import lombok.NoArgsConstructor; @@ -34,6 +34,4 @@ public static PumbaTarget allContainers() { return () -> ""; } - public interface PumbaTarget extends PumbaCommandPart { - } } diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/CanSpawnExampleContainers.java b/modules/chaostesting/src/test/java/org/testcontainers/test/CanSpawnExampleContainers.java index 458872f813a..1f24abacf19 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/CanSpawnExampleContainers.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/CanSpawnExampleContainers.java @@ -1,33 +1,19 @@ package org.testcontainers.test; -import org.testcontainers.DockerClientFactory; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.shaded.com.github.dockerjava.api.DockerClient; /** * Created by novy on 01.01.17. */ interface CanSpawnExampleContainers extends HasAccessToDockerClient { - default GenericContainer startedContainerWithCommand(String command) { + default GenericContainer startedContainer() { final GenericContainer aContainer = new GenericContainer<>("alpine:3.6") - .withCommand("sh", "-c", command); + .withCommand("sh", "-c", "while true; do echo something; sleep 1; done"); aContainer.start(); return aContainer; } - default GenericContainer startedContainer() { - return startedContainerWithCommand("while true; do echo something; sleep 1; done"); - } - - default GenericContainer stoppedContainer() { - final GenericContainer aContainer = startedContainer(); - // this is to avoid running Resource reaper - final DockerClient client = DockerClientFactory.instance().client(); - client.stopContainerCmd(aContainer.getContainerId()).exec(); - return aContainer; - } - default GenericContainer startedContainerWithName(String containerName) { final GenericContainer containerToRename = startedContainer(); dockerClient().renameContainerCmd(containerToRename.getContainerId()).withName(containerName).exec(); diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/DelayingOutgoingPacketsTest.java b/modules/chaostesting/src/test/java/org/testcontainers/test/DelayingOutgoingPacketsTest.java index feb6ca3b4c1..1004dd45be2 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/DelayingOutgoingPacketsTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/DelayingOutgoingPacketsTest.java @@ -1,8 +1,10 @@ package org.testcontainers.test; +import org.junit.Before; import org.junit.Test; -import org.testcontainers.PumbaContainer; -import org.testcontainers.SupportedTimeUnit; +import org.testcontainers.PumbaExecutables; +import org.testcontainers.client.PumbaClient; +import org.testcontainers.client.commandparts.SupportedTimeUnit; import org.testcontainers.containers.GenericContainer; import org.testcontainers.test.Network.CanPingContainers; import org.testcontainers.test.Network.PingResponse; @@ -10,22 +12,30 @@ import static com.jayway.awaitility.Awaitility.await; import static java.util.concurrent.TimeUnit.SECONDS; import static org.assertj.core.api.Assertions.assertThat; -import static org.testcontainers.NetworkActions.anAction; -import static org.testcontainers.NetworkSubCommands.delayOutgoingPackets; -import static org.testcontainers.PumbaExecutionModes.onlyOnce; -import static org.testcontainers.PumbaTargets.containers; +import static org.testcontainers.client.actions.networkactions.NetworkActions.anAction; +import static org.testcontainers.client.actions.networkactions.NetworkSubCommands.delayOutgoingPackets; +import static org.testcontainers.client.executionmodes.PumbaExecutionModes.onlyOnce; +import static org.testcontainers.client.targets.PumbaTargets.containers; /** * Created by novy on 14.01.17. */ -public class DelayingOutgoingPacketsTest extends ShutdownsOrphanedContainers implements CanSpawnExampleContainers, CanPingContainers { +public class DelayingOutgoingPacketsTest implements CanSpawnExampleContainers, CanPingContainers { + + private PumbaClient pumba; + + @Before + public void setUp() throws Exception { + pumba = new PumbaClient(PumbaExecutables.dockerized()); + } @Test public void should_be_able_to_delay_outgoing_packets_from_container() throws Exception { // given final GenericContainer aContainer = startedContainer(); - final GenericContainer pumba = PumbaContainer.newPumba() + // when + pumba .performNetworkChaos(anAction() .lastingFor(1, SupportedTimeUnit.MINUTES) .executeSubCommand( @@ -36,9 +46,6 @@ public void should_be_able_to_delay_outgoing_packets_from_container() throws Exc .affect(containers(aContainer.getContainerName())) .execute(onlyOnce().onAllChosenContainers()); - // when - pumba.start(); - // then await().atMost(20, SECONDS).until(() -> { final PingResponse ping = ping(aContainer); diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/DockerEnvironment.java b/modules/chaostesting/src/test/java/org/testcontainers/test/DockerEnvironment.java index 908c58b30cb..09b6323c171 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/DockerEnvironment.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/DockerEnvironment.java @@ -42,7 +42,6 @@ ContainerDetails containerDetails(String byId) { return new ContainerDetails(inspectResponse); } - static class ContainerDetails { private final InspectContainerResponse response; diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/LosingPacketsTest.java b/modules/chaostesting/src/test/java/org/testcontainers/test/DroppingPacketsTest.java similarity index 81% rename from modules/chaostesting/src/test/java/org/testcontainers/test/LosingPacketsTest.java rename to modules/chaostesting/src/test/java/org/testcontainers/test/DroppingPacketsTest.java index 9841fc1d59f..8757584cf12 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/LosingPacketsTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/DroppingPacketsTest.java @@ -1,7 +1,9 @@ package org.testcontainers.test; +import org.junit.Before; import org.junit.Test; -import org.testcontainers.PumbaContainer; +import org.testcontainers.PumbaExecutables; +import org.testcontainers.client.PumbaClient; import org.testcontainers.containers.GenericContainer; import org.testcontainers.test.Network.CanPingContainers; import org.testcontainers.test.Network.PingResponse; @@ -9,23 +11,31 @@ import static com.jayway.awaitility.Awaitility.await; import static java.util.concurrent.TimeUnit.SECONDS; import static org.assertj.core.api.Assertions.assertThat; -import static org.testcontainers.NetworkActions.anAction; -import static org.testcontainers.NetworkSubCommands.lossOutgoingPackets; -import static org.testcontainers.PumbaExecutionModes.onlyOnce; -import static org.testcontainers.PumbaTargets.containers; -import static org.testcontainers.SupportedTimeUnit.MINUTES; +import static org.testcontainers.client.actions.networkactions.NetworkActions.anAction; +import static org.testcontainers.client.actions.networkactions.NetworkSubCommands.lossOutgoingPackets; +import static org.testcontainers.client.commandparts.SupportedTimeUnit.MINUTES; +import static org.testcontainers.client.executionmodes.PumbaExecutionModes.onlyOnce; +import static org.testcontainers.client.targets.PumbaTargets.containers; /** * Created by novy on 17.01.17. */ -public class LosingPacketsTest extends ShutdownsOrphanedContainers implements CanSpawnExampleContainers, CanPingContainers { +public class DroppingPacketsTest implements CanSpawnExampleContainers, CanPingContainers { + + private PumbaClient pumba; + + @Before + public void setUp() throws Exception { + pumba = new PumbaClient(PumbaExecutables.dockerized()); + } @Test public void should_be_able_to_drop_outgoing_packets_with_bernoulli_model() throws Exception { // given final GenericContainer aContainer = startedContainer(); - final GenericContainer pumba = PumbaContainer.newPumba() + // when + pumba .performNetworkChaos(anAction() .lastingFor(1, MINUTES) .executeSubCommand( @@ -37,9 +47,6 @@ public void should_be_able_to_drop_outgoing_packets_with_bernoulli_model() throw .affect(containers(aContainer.getContainerName())) .execute(onlyOnce().onAllChosenContainers()); - // when - pumba.start(); - // then await().atMost(30, SECONDS).until(() -> { final PingResponse pingResponse = ping(aContainer); @@ -52,7 +59,8 @@ public void should_be_able_to_drop_outgoing_packets_with_markov_model() throws E // given final GenericContainer aContainer = startedContainer(); - final GenericContainer pumba = PumbaContainer.newPumba() + // when + pumba .performNetworkChaos(anAction() .lastingFor(1, MINUTES) .executeSubCommand( @@ -68,9 +76,6 @@ public void should_be_able_to_drop_outgoing_packets_with_markov_model() throws E .affect(containers(aContainer.getContainerName())) .execute(onlyOnce().onAllChosenContainers()); - // when - pumba.start(); - // then await().atMost(30, SECONDS).until(() -> { final PingResponse pingResponse = ping(aContainer); @@ -83,7 +88,8 @@ public void should_be_able_to_drop_outgoing_packets_with_gilbert_elliot_model() // given final GenericContainer aContainer = startedContainer(); - final GenericContainer pumba = PumbaContainer.newPumba() + // when + pumba .performNetworkChaos(anAction() .lastingFor(1, MINUTES) .executeSubCommand( @@ -96,9 +102,6 @@ public void should_be_able_to_drop_outgoing_packets_with_gilbert_elliot_model() .affect(containers(aContainer.getContainerName())) .execute(onlyOnce().onAllChosenContainers()); - // when - pumba.start(); - // then await().atMost(30, SECONDS).until(() -> { final PingResponse pingResponse = ping(aContainer); diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/KillingContainersTest.java b/modules/chaostesting/src/test/java/org/testcontainers/test/KillingContainersTest.java index 7599f81b42c..aae6f6d8ce0 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/KillingContainersTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/KillingContainersTest.java @@ -1,10 +1,13 @@ package org.testcontainers.test; +import org.junit.After; import org.junit.Before; import org.junit.Test; -import org.testcontainers.PumbaContainer; -import org.testcontainers.SupportedTimeUnit; +import org.testcontainers.PumbaExecutables; +import org.testcontainers.client.PumbaClient; +import org.testcontainers.client.commandparts.SupportedTimeUnit; import org.testcontainers.containers.GenericContainer; +import org.testcontainers.utility.ResourceReaper; import java.util.Collection; import java.util.UUID; @@ -14,21 +17,28 @@ import static com.jayway.awaitility.Awaitility.await; import static org.assertj.core.api.Assertions.assertThat; -import static org.testcontainers.ContainerActions.killContainers; -import static org.testcontainers.PumbaExecutionModes.onlyOnce; -import static org.testcontainers.PumbaExecutionModes.recurrently; -import static org.testcontainers.PumbaTargets.*; +import static org.testcontainers.client.actions.containeractions.ContainerActions.killContainers; +import static org.testcontainers.client.executionmodes.PumbaExecutionModes.onlyOnce; +import static org.testcontainers.client.executionmodes.PumbaExecutionModes.recurrently; +import static org.testcontainers.client.targets.PumbaTargets.*; /** * Created by novy on 31.12.16. */ -public class KillingContainersTest extends ShutdownsOrphanedContainers implements CanSpawnExampleContainers { +public class KillingContainersTest implements CanSpawnExampleContainers { private DockerEnvironment environment; + private PumbaClient pumba; @Before public void setUp() throws Exception { environment = new DockerEnvironment(); + pumba = new PumbaClient(PumbaExecutables.dockerized()); + } + + @After + public void tearDown() throws Exception { + ResourceReaper.instance().performCleanup(); } @Test @@ -37,14 +47,12 @@ public void should_kill_single_container() throws Exception { final GenericContainer containerToKill = startedContainer(); final GenericContainer containerThatShouldSurvive = startedContainer(); - final GenericContainer pumba = PumbaContainer.newPumba() + // when + pumba .performContainerChaos(killContainers()) .affect(containers(containerToKill.getContainerName())) .execute(onlyOnce().onAllChosenContainers()); - // when - pumba.start(); - // then await().atMost(30, TimeUnit.SECONDS).until(() -> { final Collection namesOfRunningContainers = environment.namesOfRunningContainers(); @@ -61,14 +69,12 @@ public void should_kill_more_than_one_containers() throws Exception { final GenericContainer secondVictim = startedContainer(); final GenericContainer survivor = startedContainer(); - final GenericContainer pumba = PumbaContainer.newPumba() + // when + pumba .performContainerChaos(killContainers()) .affect(containers(firstVictim.getContainerName(), secondVictim.getContainerName())) .execute(onlyOnce().onAllChosenContainers()); - // when - pumba.start(); - // then await().atMost(30, TimeUnit.SECONDS).until(() -> { final Collection namesOfRunningContainers = environment.namesOfRunningContainers(); @@ -85,14 +91,12 @@ public void should_kill_containers_matching_regular_expression() throws Exceptio startedContainerWithName(containerNameStartingWith("foobar")); startedContainerWithName(containerNameStartingWith("barbaz")); - final GenericContainer pumba = PumbaContainer.newPumba() + // when + pumba .performContainerChaos(killContainers()) .affect(containersMatchingRegexp("foobar.*")) .execute(onlyOnce().onAllChosenContainers()); - // when - pumba.start(); - // then await().atMost(30, TimeUnit.SECONDS).until(() -> { final Collection namesOfRunningContainers = environment.namesOfRunningContainers(); @@ -108,14 +112,12 @@ public void should_kill_all_containers() throws Exception { startedContainer(); startedContainer(); - final GenericContainer pumba = PumbaContainer.newPumba() + // when + pumba .performContainerChaos(killContainers()) .affect(allContainers()) .execute(onlyOnce().onAllChosenContainers()); - // when - pumba.start(); - // then await().atMost(30, TimeUnit.SECONDS).until(() -> assertThat(environment.namesOfRunningContainers()).isEmpty() @@ -128,14 +130,12 @@ public void should_kill_one_random_container_periodically() throws Exception { startedContainerWithName(containerNameStartingWith("foobar")); startedContainerWithName(containerNameStartingWith("foobar")); - final GenericContainer pumba = PumbaContainer.newPumba() + // when + pumba .performContainerChaos(killContainers()) .affect(containersMatchingRegexp("foobar.*")) .execute(recurrently(5, SupportedTimeUnit.SECONDS).onRandomlyChosenContainer()); - // when - pumba.start(); - // then await().atMost(8, TimeUnit.SECONDS).until(() -> assertThat(environment.namesOfRunningContainers()) diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/Network.java b/modules/chaostesting/src/test/java/org/testcontainers/test/Network.java index a65f01bb08c..91c34fa949d 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/Network.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/Network.java @@ -43,14 +43,6 @@ boolean packetLost() { return lastLineOfResponse().contains("100% packet loss"); } - private boolean wasSuccessful() { - return !unknownHost() && !packetLost(); - } - - private boolean unknownHost() { - return lastLineOfResponse().contains("ping: unknown host"); - } - double latencyInMilliseconds() { return Double.parseDouble(extractResponseTimeAsString()); } @@ -65,6 +57,14 @@ private String extractResponseTimeAsString() { return matcher.group(1); } + private boolean wasSuccessful() { + return !unknownHost() && !packetLost(); + } + + private boolean unknownHost() { + return lastLineOfResponse().contains("ping: unknown host"); + } + private String lastLineOfResponse() { final String[] responseLines = responseContent.split("\n"); return new LinkedList<>(Arrays.asList(responseLines)).getLast(); diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/PausingContainersTest.java b/modules/chaostesting/src/test/java/org/testcontainers/test/PausingContainersTest.java index 49097fdc3f4..8cfd6aae718 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/PausingContainersTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/PausingContainersTest.java @@ -2,8 +2,9 @@ import org.junit.Before; import org.junit.Test; -import org.testcontainers.PumbaContainer; -import org.testcontainers.SupportedTimeUnit; +import org.testcontainers.PumbaExecutables; +import org.testcontainers.client.PumbaClient; +import org.testcontainers.client.commandparts.SupportedTimeUnit; import org.testcontainers.containers.GenericContainer; import org.testcontainers.test.DockerEnvironment.ContainerDetails; @@ -11,20 +12,22 @@ import static com.jayway.awaitility.Awaitility.await; import static org.assertj.core.api.Assertions.assertThat; -import static org.testcontainers.ContainerActions.pauseContainers; -import static org.testcontainers.PumbaExecutionModes.onlyOnce; -import static org.testcontainers.PumbaTargets.containers; +import static org.testcontainers.client.actions.containeractions.ContainerActions.pauseContainers; +import static org.testcontainers.client.executionmodes.PumbaExecutionModes.onlyOnce; +import static org.testcontainers.client.targets.PumbaTargets.containers; /** * Created by novy on 31.12.16. */ -public class PausingContainersTest extends ShutdownsOrphanedContainers implements CanSpawnExampleContainers { +public class PausingContainersTest implements CanSpawnExampleContainers { private DockerEnvironment environment; + private PumbaClient pumba; @Before public void setUp() throws Exception { environment = new DockerEnvironment(); + pumba = new PumbaClient(PumbaExecutables.dockerized()); } @Test @@ -32,14 +35,12 @@ public void should_pause_single_container() throws Exception { // given final GenericContainer containerToPause = startedContainer(); - final GenericContainer pumba = PumbaContainer.newPumba() + // when + pumba .performContainerChaos(pauseContainers().forDuration(10, SupportedTimeUnit.SECONDS)) .affect(containers(containerToPause.getContainerName())) .execute(onlyOnce().onAllChosenContainers()); - // when - pumba.start(); - // then await().atMost(20, TimeUnit.SECONDS).until(() -> { final ContainerDetails container = environment.containerDetails(containerToPause.getContainerId()); diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/RateLimitingOutgoingPacketsTest.java b/modules/chaostesting/src/test/java/org/testcontainers/test/RateLimitingOutgoingPacketsTest.java index 8dcc0faf739..76b96ae3354 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/RateLimitingOutgoingPacketsTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/RateLimitingOutgoingPacketsTest.java @@ -1,34 +1,42 @@ package org.testcontainers.test; +import org.junit.Before; import org.junit.Test; -import org.testcontainers.PumbaContainer; +import org.testcontainers.PumbaExecutables; +import org.testcontainers.client.PumbaClient; import org.testcontainers.containers.GenericContainer; import org.testcontainers.test.Network.CanPingContainers; import org.testcontainers.test.Network.PingResponse; -import java.util.concurrent.TimeUnit; - import static com.jayway.awaitility.Awaitility.await; import static java.util.concurrent.TimeUnit.SECONDS; import static org.assertj.core.api.Assertions.assertThat; -import static org.testcontainers.NetworkActions.anAction; -import static org.testcontainers.NetworkSubCommands.rateLimitOutgoingTraffic; -import static org.testcontainers.PumbaExecutionModes.onlyOnce; -import static org.testcontainers.PumbaTargets.containers; -import static org.testcontainers.RateLimitOutgoingTraffic.RateUnit.KILOBITS_PER_SECOND; -import static org.testcontainers.SupportedTimeUnit.MINUTES; +import static org.testcontainers.client.actions.networkactions.NetworkActions.anAction; +import static org.testcontainers.client.actions.networkactions.NetworkSubCommands.rateLimitOutgoingTraffic; +import static org.testcontainers.client.executionmodes.PumbaExecutionModes.onlyOnce; +import static org.testcontainers.client.targets.PumbaTargets.containers; +import static org.testcontainers.client.actions.networkactions.RateLimitOutgoingTraffic.RateUnit.KILOBITS_PER_SECOND; +import static org.testcontainers.client.commandparts.SupportedTimeUnit.MINUTES; /** * Created by novy on 15.01.17. */ -public class RateLimitingOutgoingPacketsTest extends ShutdownsOrphanedContainers implements CanSpawnExampleContainers, CanPingContainers { +public class RateLimitingOutgoingPacketsTest implements CanSpawnExampleContainers, CanPingContainers { + + private PumbaClient pumba; + + @Before + public void setUp() throws Exception { + pumba = new PumbaClient(PumbaExecutables.dockerized()); + } @Test public void should_be_able_to_rate_limit_outgoing_packets_from_container() throws Exception { // given final GenericContainer containerToRateLimit = startedContainer(); - final GenericContainer pumba = PumbaContainer.newPumba() + // when + pumba .performNetworkChaos( anAction() .lastingFor(1, MINUTES) @@ -39,9 +47,6 @@ public void should_be_able_to_rate_limit_outgoing_packets_from_container() throw .affect(containers(containerToRateLimit.getContainerName())) .execute(onlyOnce().onAllChosenContainers()); - // when - pumba.start(); - // then await().atMost(30, SECONDS).until(() -> { final PingResponse pingResponse = ping(containerToRateLimit, 117); diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/RemovingContainerTest.java b/modules/chaostesting/src/test/java/org/testcontainers/test/RemovingContainerTest.java index 5920e94d9c6..3cbbb3341c8 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/RemovingContainerTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/RemovingContainerTest.java @@ -1,30 +1,32 @@ package org.testcontainers.test; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; -import org.testcontainers.PumbaContainer; +import org.testcontainers.PumbaExecutables; +import org.testcontainers.client.PumbaClient; import org.testcontainers.containers.GenericContainer; import java.util.concurrent.TimeUnit; import static com.jayway.awaitility.Awaitility.await; import static org.assertj.core.api.Assertions.assertThat; -import static org.testcontainers.ContainerActions.removeContainers; -import static org.testcontainers.PumbaExecutionModes.onlyOnce; -import static org.testcontainers.PumbaTargets.containers; +import static org.testcontainers.client.actions.containeractions.ContainerActions.removeContainers; +import static org.testcontainers.client.executionmodes.PumbaExecutionModes.onlyOnce; +import static org.testcontainers.client.targets.PumbaTargets.containers; /** * Created by novy on 31.12.16. */ -public class RemovingContainerTest extends ShutdownsOrphanedContainers implements CanSpawnExampleContainers { +public class RemovingContainerTest implements CanSpawnExampleContainers { private DockerEnvironment environment; + private PumbaClient pumba; @Before public void setUp() throws Exception { environment = new DockerEnvironment(); + pumba = new PumbaClient(PumbaExecutables.dockerized()); } @Test @@ -32,14 +34,12 @@ public void should_remove_running_container() throws Exception { // given final GenericContainer containerToRemove = startedContainer(); - final GenericContainer pumba = PumbaContainer.newPumba() + // when + pumba .performContainerChaos(removeContainers()) .affect(containers(containerToRemove.getContainerName())) .execute(onlyOnce().onAllChosenContainers()); - // when - pumba.start(); - // then await().atMost(30, TimeUnit.SECONDS).until(() -> assertThat(environment.namesOfAllContainers()) diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/ShutdownsOrphanedContainers.java b/modules/chaostesting/src/test/java/org/testcontainers/test/ShutdownsOrphanedContainers.java deleted file mode 100644 index c28322d565c..00000000000 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/ShutdownsOrphanedContainers.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.testcontainers.test; - -import org.junit.After; -import org.testcontainers.utility.ResourceReaper; - -abstract class ShutdownsOrphanedContainers { - - @After - public void tearDown() throws Exception { - ResourceReaper.instance().performCleanup(); - } -} diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/StoppingContainerTest.java b/modules/chaostesting/src/test/java/org/testcontainers/test/StoppingContainerTest.java index a45461c6863..c6edb60176d 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/StoppingContainerTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/StoppingContainerTest.java @@ -2,8 +2,9 @@ import org.junit.Before; import org.junit.Test; -import org.testcontainers.ContainerActions; -import org.testcontainers.PumbaContainer; +import org.testcontainers.PumbaExecutables; +import org.testcontainers.client.PumbaClient; +import org.testcontainers.client.actions.containeractions.ContainerActions; import org.testcontainers.containers.GenericContainer; import org.testcontainers.test.DockerEnvironment.ContainerDetails; @@ -11,19 +12,21 @@ import static com.jayway.awaitility.Awaitility.await; import static org.assertj.core.api.Assertions.assertThat; -import static org.testcontainers.PumbaExecutionModes.onlyOnce; -import static org.testcontainers.PumbaTargets.containers; +import static org.testcontainers.client.executionmodes.PumbaExecutionModes.onlyOnce; +import static org.testcontainers.client.targets.PumbaTargets.containers; /** * Created by novy on 31.12.16. */ -public class StoppingContainerTest extends ShutdownsOrphanedContainers implements CanSpawnExampleContainers { +public class StoppingContainerTest implements CanSpawnExampleContainers { private DockerEnvironment environment; + private PumbaClient pumba; @Before public void setUp() throws Exception { environment = new DockerEnvironment(); + pumba = new PumbaClient(PumbaExecutables.dockerized()); } @Test @@ -31,14 +34,12 @@ public void should_stop_single_container() throws Exception { // given final GenericContainer containerToStop = startedContainer(); - final GenericContainer pumba = PumbaContainer.newPumba() + // when + pumba .performContainerChaos(ContainerActions.stopContainers()) .affect(containers(containerToStop.getContainerName())) .execute(onlyOnce().onAllChosenContainers()); - // when - pumba.start(); - // then await().atMost(30, TimeUnit.SECONDS).until(() -> { final ContainerDetails container = environment.containerDetails(containerToStop.getContainerId()); From 56693a03c1eceb50840a13a31f7f196a9e0e41e4 Mon Sep 17 00:00:00 2001 From: Slawomir Nowak Date: Sat, 17 Jun 2017 21:36:42 +0200 Subject: [PATCH 17/32] Fixed typo --- .../client/actions/networkactions/DelayOutgoingPackets.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/chaostesting/src/main/java/org/testcontainers/client/actions/networkactions/DelayOutgoingPackets.java b/modules/chaostesting/src/main/java/org/testcontainers/client/actions/networkactions/DelayOutgoingPackets.java index 6be69864974..5edef207042 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/client/actions/networkactions/DelayOutgoingPackets.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/client/actions/networkactions/DelayOutgoingPackets.java @@ -28,7 +28,7 @@ public DelayOutgoingPackets withJitter(int time, SupportedTimeUnit unit) { return this; } - public DelayOutgoingPackets withCorreltaion(int correlation) { + public DelayOutgoingPackets withCorrelation(int correlation) { this.correlation = correlation; return this; } From 5b97dca2cc35bca836377654cbb6653cdc5b21c6 Mon Sep 17 00:00:00 2001 From: novy Date: Sat, 3 Feb 2018 16:40:39 +0100 Subject: [PATCH 18/32] Merge with latest master - project compiling --- modules/chaostesting/pom.xml | 11 ++++++----- .../main/java/org/testcontainers/PumbaContainer.java | 5 +++-- .../org/testcontainers/test/DockerEnvironment.java | 7 ++++--- .../testcontainers/test/HasAccessToDockerClient.java | 2 +- .../test/java/org/testcontainers/test/Network.java | 5 +---- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/modules/chaostesting/pom.xml b/modules/chaostesting/pom.xml index ebc3f1b6fab..beeee57a965 100644 --- a/modules/chaostesting/pom.xml +++ b/modules/chaostesting/pom.xml @@ -2,22 +2,23 @@ + 4.0.0 + - testcontainers-parent org.testcontainers - 1.2.2-SNAPSHOT + testcontainers-parent + 0-SNAPSHOT ../../pom.xml - 4.0.0 chaostesting TestContainers :: chaostesting - org.testcontainers + ${project.groupId} testcontainers - 1.2.1 + ${project.version} diff --git a/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java b/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java index f768af43eb8..383d99057af 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java @@ -1,12 +1,13 @@ package org.testcontainers; +import com.github.dockerjava.api.DockerClient; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; -import org.testcontainers.client.*; +import org.testcontainers.client.PumbaCommand; +import org.testcontainers.client.PumbaExecutable; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.startupcheck.StartupCheckStrategy; import org.testcontainers.images.RemoteDockerImage; -import org.testcontainers.shaded.com.github.dockerjava.api.DockerClient; import static org.testcontainers.containers.BindMode.READ_WRITE; diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/DockerEnvironment.java b/modules/chaostesting/src/test/java/org/testcontainers/test/DockerEnvironment.java index 09b6323c171..ff4370f694d 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/DockerEnvironment.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/DockerEnvironment.java @@ -1,8 +1,9 @@ package org.testcontainers.test; -import org.testcontainers.shaded.com.github.dockerjava.api.DockerClient; -import org.testcontainers.shaded.com.github.dockerjava.api.command.InspectContainerResponse; -import org.testcontainers.shaded.com.github.dockerjava.api.model.Container; + +import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.api.command.InspectContainerResponse; +import com.github.dockerjava.api.model.Container; import java.util.Collection; import java.util.List; diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/HasAccessToDockerClient.java b/modules/chaostesting/src/test/java/org/testcontainers/test/HasAccessToDockerClient.java index 580b86f8f7d..25658a428f2 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/HasAccessToDockerClient.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/HasAccessToDockerClient.java @@ -1,7 +1,7 @@ package org.testcontainers.test; +import com.github.dockerjava.api.DockerClient; import org.testcontainers.DockerClientFactory; -import org.testcontainers.shaded.com.github.dockerjava.api.DockerClient; interface HasAccessToDockerClient { diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/Network.java b/modules/chaostesting/src/test/java/org/testcontainers/test/Network.java index 91c34fa949d..0042d595cba 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/Network.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/Network.java @@ -1,16 +1,13 @@ package org.testcontainers.test; +import com.github.dockerjava.api.command.InspectContainerResponse; import com.google.common.base.Preconditions; import lombok.AccessLevel; import lombok.NoArgsConstructor; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; -import org.apache.commons.io.IOUtils; import org.testcontainers.containers.Container; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.shaded.com.github.dockerjava.api.async.ResultCallback; -import org.testcontainers.shaded.com.github.dockerjava.api.command.InspectContainerResponse; -import org.testcontainers.shaded.com.github.dockerjava.api.model.Frame; import java.util.Arrays; import java.util.LinkedList; From 91dd481a319f3f22445fd9bc195104ddea53eb43 Mon Sep 17 00:00:00 2001 From: novy Date: Sat, 3 Feb 2018 16:57:21 +0100 Subject: [PATCH 19/32] Trying to update dependencies --- modules/chaostesting/pom.xml | 4 ++-- .../src/main/java/org/testcontainers/PumbaContainer.java | 2 +- .../org/testcontainers/test/CanSpawnExampleContainers.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/chaostesting/pom.xml b/modules/chaostesting/pom.xml index beeee57a965..3ea71f94137 100644 --- a/modules/chaostesting/pom.xml +++ b/modules/chaostesting/pom.xml @@ -31,14 +31,14 @@ org.assertj assertj-core - 3.6.1 + 3.9.0 test com.google.guava guava - 21.0 + 23.6-jre test diff --git a/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java b/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java index 383d99057af..d8cf28084de 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java @@ -17,7 +17,7 @@ @Slf4j class PumbaContainer extends GenericContainer implements PumbaExecutable { - private static final String PUMBA_DOCKER_IMAGE = "gaiaadm/pumba:275-229940dc50ca9973d5a2504ddcc30b7762fb0c00"; + private static final String PUMBA_DOCKER_IMAGE = "gaiaadm/pumba:0.4.7"; private static final String IP_ROUTE_DOCKER_IMAGE = "gaiadocker/iproute2:3.3"; PumbaContainer() { diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/CanSpawnExampleContainers.java b/modules/chaostesting/src/test/java/org/testcontainers/test/CanSpawnExampleContainers.java index 1f24abacf19..2ec10b1930a 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/CanSpawnExampleContainers.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/CanSpawnExampleContainers.java @@ -8,7 +8,7 @@ interface CanSpawnExampleContainers extends HasAccessToDockerClient { default GenericContainer startedContainer() { - final GenericContainer aContainer = new GenericContainer<>("alpine:3.6") + final GenericContainer aContainer = new GenericContainer<>("alpine:3.7") .withCommand("sh", "-c", "while true; do echo something; sleep 1; done"); aContainer.start(); return aContainer; From 94851c1a40969212989f81b436d738c65e513197 Mon Sep 17 00:00:00 2001 From: novy Date: Sat, 3 Feb 2018 19:49:01 +0100 Subject: [PATCH 20/32] Disabled one test as it collides with reaper container --- .../org/testcontainers/test/KillingContainersTest.java | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/KillingContainersTest.java b/modules/chaostesting/src/test/java/org/testcontainers/test/KillingContainersTest.java index aae6f6d8ce0..e48c2244fa3 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/KillingContainersTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/KillingContainersTest.java @@ -1,13 +1,12 @@ package org.testcontainers.test; -import org.junit.After; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.testcontainers.PumbaExecutables; import org.testcontainers.client.PumbaClient; import org.testcontainers.client.commandparts.SupportedTimeUnit; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.utility.ResourceReaper; import java.util.Collection; import java.util.UUID; @@ -36,11 +35,6 @@ public void setUp() throws Exception { pumba = new PumbaClient(PumbaExecutables.dockerized()); } - @After - public void tearDown() throws Exception { - ResourceReaper.instance().performCleanup(); - } - @Test public void should_kill_single_container() throws Exception { // given @@ -106,6 +100,7 @@ public void should_kill_containers_matching_regular_expression() throws Exceptio }); } + @Ignore("collides with testcontainers-ryuk container") @Test public void should_kill_all_containers() throws Exception { // given From b8f748bbacc9ff36e1580bf3b34d007642db8c06 Mon Sep 17 00:00:00 2001 From: Slawomir Nowak Date: Sat, 3 Feb 2018 22:02:11 +0100 Subject: [PATCH 21/32] Trying to run build on CI server --- .../java/org/testcontainers/PumbaContainer.java | 13 ++++++++----- .../actions/networkactions/NetworkActions.java | 2 +- .../test/DelayingOutgoingPacketsTest.java | 4 ++-- .../testcontainers/test/DroppingPacketsTest.java | 8 ++++---- .../testcontainers/test/PausingContainersTest.java | 6 +++--- .../test/RateLimitingOutgoingPacketsTest.java | 4 ++-- 6 files changed, 20 insertions(+), 17 deletions(-) diff --git a/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java b/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java index d8cf28084de..8771f9a9d79 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java @@ -20,16 +20,18 @@ class PumbaContainer extends GenericContainer implements PumbaEx private static final String PUMBA_DOCKER_IMAGE = "gaiaadm/pumba:0.4.7"; private static final String IP_ROUTE_DOCKER_IMAGE = "gaiadocker/iproute2:3.3"; + private static final String DOCKER_SOCKET_HOST_PATH = "/var/run/docker.sock"; + private static final String DOCKER_SOCKET_CONTAINER_PATH = "/docker.sock"; + PumbaContainer() { super(PUMBA_DOCKER_IMAGE); - } - - @Override - public void execute(PumbaCommand command) { doNotWaitForStartupAtAll(); mountDockerSocket(); fetchIPRouteImage(); + } + @Override + public void execute(PumbaCommand command) { executeCommand(command); } @@ -38,7 +40,8 @@ private void doNotWaitForStartupAtAll() { } private void mountDockerSocket() { - addFileSystemBind("/var/run/docker.sock", "/var/run/docker.sock", READ_WRITE); + addFileSystemBind(DOCKER_SOCKET_HOST_PATH, DOCKER_SOCKET_CONTAINER_PATH, READ_WRITE); + addEnv("DOCKER_HOST", String.format("unix://%s", DOCKER_SOCKET_CONTAINER_PATH)); } @SneakyThrows diff --git a/modules/chaostesting/src/main/java/org/testcontainers/client/actions/networkactions/NetworkActions.java b/modules/chaostesting/src/main/java/org/testcontainers/client/actions/networkactions/NetworkActions.java index c48af1f5dfb..ec84e769d99 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/client/actions/networkactions/NetworkActions.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/client/actions/networkactions/NetworkActions.java @@ -14,7 +14,7 @@ @NoArgsConstructor(access = AccessLevel.PRIVATE) public final class NetworkActions { - public static NetworkActionWithSubCommand anAction() { + public static NetworkActionWithSubCommand networkAction() { return new NetworkActionWithSubCommand(); } diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/DelayingOutgoingPacketsTest.java b/modules/chaostesting/src/test/java/org/testcontainers/test/DelayingOutgoingPacketsTest.java index 1004dd45be2..4b673193995 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/DelayingOutgoingPacketsTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/DelayingOutgoingPacketsTest.java @@ -12,7 +12,7 @@ import static com.jayway.awaitility.Awaitility.await; import static java.util.concurrent.TimeUnit.SECONDS; import static org.assertj.core.api.Assertions.assertThat; -import static org.testcontainers.client.actions.networkactions.NetworkActions.anAction; +import static org.testcontainers.client.actions.networkactions.NetworkActions.networkAction; import static org.testcontainers.client.actions.networkactions.NetworkSubCommands.delayOutgoingPackets; import static org.testcontainers.client.executionmodes.PumbaExecutionModes.onlyOnce; import static org.testcontainers.client.targets.PumbaTargets.containers; @@ -36,7 +36,7 @@ public void should_be_able_to_delay_outgoing_packets_from_container() throws Exc // when pumba - .performNetworkChaos(anAction() + .performNetworkChaos(networkAction() .lastingFor(1, SupportedTimeUnit.MINUTES) .executeSubCommand( delayOutgoingPackets() diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/DroppingPacketsTest.java b/modules/chaostesting/src/test/java/org/testcontainers/test/DroppingPacketsTest.java index 8757584cf12..361336e8366 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/DroppingPacketsTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/DroppingPacketsTest.java @@ -11,7 +11,7 @@ import static com.jayway.awaitility.Awaitility.await; import static java.util.concurrent.TimeUnit.SECONDS; import static org.assertj.core.api.Assertions.assertThat; -import static org.testcontainers.client.actions.networkactions.NetworkActions.anAction; +import static org.testcontainers.client.actions.networkactions.NetworkActions.networkAction; import static org.testcontainers.client.actions.networkactions.NetworkSubCommands.lossOutgoingPackets; import static org.testcontainers.client.commandparts.SupportedTimeUnit.MINUTES; import static org.testcontainers.client.executionmodes.PumbaExecutionModes.onlyOnce; @@ -36,7 +36,7 @@ public void should_be_able_to_drop_outgoing_packets_with_bernoulli_model() throw // when pumba - .performNetworkChaos(anAction() + .performNetworkChaos(networkAction() .lastingFor(1, MINUTES) .executeSubCommand( lossOutgoingPackets() @@ -61,7 +61,7 @@ public void should_be_able_to_drop_outgoing_packets_with_markov_model() throws E // when pumba - .performNetworkChaos(anAction() + .performNetworkChaos(networkAction() .lastingFor(1, MINUTES) .executeSubCommand( lossOutgoingPackets() @@ -90,7 +90,7 @@ public void should_be_able_to_drop_outgoing_packets_with_gilbert_elliot_model() // when pumba - .performNetworkChaos(anAction() + .performNetworkChaos(networkAction() .lastingFor(1, MINUTES) .executeSubCommand( lossOutgoingPackets() diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/PausingContainersTest.java b/modules/chaostesting/src/test/java/org/testcontainers/test/PausingContainersTest.java index 8cfd6aae718..cf4e2c88767 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/PausingContainersTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/PausingContainersTest.java @@ -37,17 +37,17 @@ public void should_pause_single_container() throws Exception { // when pumba - .performContainerChaos(pauseContainers().forDuration(10, SupportedTimeUnit.SECONDS)) + .performContainerChaos(pauseContainers().forDuration(1, SupportedTimeUnit.SECONDS)) .affect(containers(containerToPause.getContainerName())) .execute(onlyOnce().onAllChosenContainers()); // then - await().atMost(20, TimeUnit.SECONDS).until(() -> { + await().atMost(1, TimeUnit.SECONDS).until(() -> { final ContainerDetails container = environment.containerDetails(containerToPause.getContainerId()); assertThat(container.isPaused()).isTrue(); }); - await().atMost(15, TimeUnit.SECONDS).until(() -> { + await().atMost(1, TimeUnit.SECONDS).until(() -> { final ContainerDetails container = environment.containerDetails(containerToPause.getContainerId()); assertThat(container.isPaused()).isFalse(); }); diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/RateLimitingOutgoingPacketsTest.java b/modules/chaostesting/src/test/java/org/testcontainers/test/RateLimitingOutgoingPacketsTest.java index 76b96ae3354..7aa4191bff7 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/RateLimitingOutgoingPacketsTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/RateLimitingOutgoingPacketsTest.java @@ -11,7 +11,7 @@ import static com.jayway.awaitility.Awaitility.await; import static java.util.concurrent.TimeUnit.SECONDS; import static org.assertj.core.api.Assertions.assertThat; -import static org.testcontainers.client.actions.networkactions.NetworkActions.anAction; +import static org.testcontainers.client.actions.networkactions.NetworkActions.networkAction; import static org.testcontainers.client.actions.networkactions.NetworkSubCommands.rateLimitOutgoingTraffic; import static org.testcontainers.client.executionmodes.PumbaExecutionModes.onlyOnce; import static org.testcontainers.client.targets.PumbaTargets.containers; @@ -38,7 +38,7 @@ public void should_be_able_to_rate_limit_outgoing_packets_from_container() throw // when pumba .performNetworkChaos( - anAction() + networkAction() .lastingFor(1, MINUTES) .executeSubCommand( rateLimitOutgoingTraffic().to(1, KILOBITS_PER_SECOND) From 2080b4362db057957c8387b91924edd8a104ccd4 Mon Sep 17 00:00:00 2001 From: novy Date: Sat, 3 Feb 2018 23:41:50 +0100 Subject: [PATCH 22/32] It's no longer possible to kill all containers --- .../client/targets/PumbaTargets.java | 5 ---- .../test/KillingContainersTest.java | 23 ++----------------- 2 files changed, 2 insertions(+), 26 deletions(-) diff --git a/modules/chaostesting/src/main/java/org/testcontainers/client/targets/PumbaTargets.java b/modules/chaostesting/src/main/java/org/testcontainers/client/targets/PumbaTargets.java index 99a3146ec94..bf687bf0896 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/client/targets/PumbaTargets.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/client/targets/PumbaTargets.java @@ -29,9 +29,4 @@ public static PumbaTarget containersMatchingRegexp(String regex) { public static PumbaTarget containersMatchingRegexp(Pattern regex) { return containersMatchingRegexp(regex.pattern()); } - - public static PumbaTarget allContainers() { - return () -> ""; - } - } diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/KillingContainersTest.java b/modules/chaostesting/src/test/java/org/testcontainers/test/KillingContainersTest.java index e48c2244fa3..ee1eb3dfe42 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/KillingContainersTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/KillingContainersTest.java @@ -1,7 +1,6 @@ package org.testcontainers.test; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.testcontainers.PumbaExecutables; import org.testcontainers.client.PumbaClient; @@ -19,7 +18,8 @@ import static org.testcontainers.client.actions.containeractions.ContainerActions.killContainers; import static org.testcontainers.client.executionmodes.PumbaExecutionModes.onlyOnce; import static org.testcontainers.client.executionmodes.PumbaExecutionModes.recurrently; -import static org.testcontainers.client.targets.PumbaTargets.*; +import static org.testcontainers.client.targets.PumbaTargets.containers; +import static org.testcontainers.client.targets.PumbaTargets.containersMatchingRegexp; /** * Created by novy on 31.12.16. @@ -100,25 +100,6 @@ public void should_kill_containers_matching_regular_expression() throws Exceptio }); } - @Ignore("collides with testcontainers-ryuk container") - @Test - public void should_kill_all_containers() throws Exception { - // given - startedContainer(); - startedContainer(); - - // when - pumba - .performContainerChaos(killContainers()) - .affect(allContainers()) - .execute(onlyOnce().onAllChosenContainers()); - - // then - await().atMost(30, TimeUnit.SECONDS).until(() -> - assertThat(environment.namesOfRunningContainers()).isEmpty() - ); - } - @Test public void should_kill_one_random_container_periodically() throws Exception { // given From afce134be1e1ceb00abdc5846b1cdb2a97b2f61b Mon Sep 17 00:00:00 2001 From: novy Date: Sun, 4 Feb 2018 00:08:50 +0100 Subject: [PATCH 23/32] Optimized imports --- .../client/actions/containeractions/ContainerActions.java | 1 - .../testcontainers/test/RateLimitingOutgoingPacketsTest.java | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/modules/chaostesting/src/main/java/org/testcontainers/client/actions/containeractions/ContainerActions.java b/modules/chaostesting/src/main/java/org/testcontainers/client/actions/containeractions/ContainerActions.java index 36088672a51..3eee3395543 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/client/actions/containeractions/ContainerActions.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/client/actions/containeractions/ContainerActions.java @@ -2,7 +2,6 @@ import lombok.AccessLevel; import lombok.NoArgsConstructor; -import org.testcontainers.client.actions.PumbaAction; /** * Created by novy on 31.12.16. diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/RateLimitingOutgoingPacketsTest.java b/modules/chaostesting/src/test/java/org/testcontainers/test/RateLimitingOutgoingPacketsTest.java index 7aa4191bff7..07c2c39e263 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/RateLimitingOutgoingPacketsTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/RateLimitingOutgoingPacketsTest.java @@ -13,10 +13,10 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.testcontainers.client.actions.networkactions.NetworkActions.networkAction; import static org.testcontainers.client.actions.networkactions.NetworkSubCommands.rateLimitOutgoingTraffic; -import static org.testcontainers.client.executionmodes.PumbaExecutionModes.onlyOnce; -import static org.testcontainers.client.targets.PumbaTargets.containers; import static org.testcontainers.client.actions.networkactions.RateLimitOutgoingTraffic.RateUnit.KILOBITS_PER_SECOND; import static org.testcontainers.client.commandparts.SupportedTimeUnit.MINUTES; +import static org.testcontainers.client.executionmodes.PumbaExecutionModes.onlyOnce; +import static org.testcontainers.client.targets.PumbaTargets.containers; /** * Created by novy on 15.01.17. From 73e0b974e9126a99103bb4f332dc800d5141214c Mon Sep 17 00:00:00 2001 From: novy Date: Sun, 4 Feb 2018 00:15:43 +0100 Subject: [PATCH 24/32] Added some logging --- .../src/main/java/org/testcontainers/PumbaContainer.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java b/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java index 8771f9a9d79..ef8a6b5cb85 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java @@ -28,6 +28,7 @@ class PumbaContainer extends GenericContainer implements PumbaEx doNotWaitForStartupAtAll(); mountDockerSocket(); fetchIPRouteImage(); + setupLogging(); } @Override @@ -49,6 +50,10 @@ private void fetchIPRouteImage() { new RemoteDockerImage(IP_ROUTE_DOCKER_IMAGE).get(); } + private void setupLogging() { + withLogConsumer(frame -> log.debug("Pumba container: \"{}\"", frame.getUtf8String())); + } + private void executeCommand(PumbaCommand command) { final String evaluatedCommand = command.evaluate(); setCommand(evaluatedCommand); From 8aba18c6b5452ef99a2c6df9ef516a57991312ae Mon Sep 17 00:00:00 2001 From: novy Date: Sun, 4 Feb 2018 11:55:14 +0100 Subject: [PATCH 25/32] Building custom docker image to make travis build passing (broken pumba entryfile) --- .../java/org/testcontainers/PumbaContainer.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java b/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java index ef8a6b5cb85..d111df2033b 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java @@ -8,6 +8,7 @@ import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.startupcheck.StartupCheckStrategy; import org.testcontainers.images.RemoteDockerImage; +import org.testcontainers.images.builder.ImageFromDockerfile; import static org.testcontainers.containers.BindMode.READ_WRITE; @@ -24,7 +25,7 @@ class PumbaContainer extends GenericContainer implements PumbaEx private static final String DOCKER_SOCKET_CONTAINER_PATH = "/docker.sock"; PumbaContainer() { - super(PUMBA_DOCKER_IMAGE); + super(buildPumbaDockerImage()); doNotWaitForStartupAtAll(); mountDockerSocket(); fetchIPRouteImage(); @@ -61,7 +62,18 @@ private void executeCommand(PumbaCommand command) { super.start(); } + private static ImageFromDockerfile buildPumbaDockerImage() { + return new ImageFromDockerfile() + .withDockerfileFromBuilder(builder -> builder + .from(PUMBA_DOCKER_IMAGE) + .run("echo -n > /docker_entrypoint.sh") + .run("echo '#!/bin/sh' >> /docker_entrypoint.sh") + .run("echo 'set -e' >> /docker_entrypoint.sh") + .run("echo 'exec gosu root:root \"$@\"' >> /docker_entrypoint.sh") + ); + } private static class DoNotCheckStartup extends StartupCheckStrategy { + @Override public StartupStatus checkStartupState(DockerClient dockerClient, String s) { return StartupStatus.SUCCESSFUL; From 55768a3f4bc0248b97a3bbb723bb6a051fff5087 Mon Sep 17 00:00:00 2001 From: novy Date: Sun, 4 Feb 2018 17:03:18 +0100 Subject: [PATCH 26/32] Fixed startupCheckStrategy --- .../org/testcontainers/PumbaContainer.java | 25 ++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java b/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java index d111df2033b..d5401d8f0ef 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java @@ -3,12 +3,14 @@ import com.github.dockerjava.api.DockerClient; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang.SystemUtils; import org.testcontainers.client.PumbaCommand; import org.testcontainers.client.PumbaExecutable; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.startupcheck.StartupCheckStrategy; import org.testcontainers.images.RemoteDockerImage; import org.testcontainers.images.builder.ImageFromDockerfile; +import org.testcontainers.utility.DockerStatus; import static org.testcontainers.containers.BindMode.READ_WRITE; @@ -38,11 +40,11 @@ public void execute(PumbaCommand command) { } private void doNotWaitForStartupAtAll() { - setStartupCheckStrategy(new DoNotCheckStartup()); + setStartupCheckStrategy(new FailOnlyOnErrorExitCode()); } private void mountDockerSocket() { - addFileSystemBind(DOCKER_SOCKET_HOST_PATH, DOCKER_SOCKET_CONTAINER_PATH, READ_WRITE); + addFileSystemBind(dockerSocketHostPath(), DOCKER_SOCKET_CONTAINER_PATH, READ_WRITE); addEnv("DOCKER_HOST", String.format("unix://%s", DOCKER_SOCKET_CONTAINER_PATH)); } @@ -63,7 +65,7 @@ private void executeCommand(PumbaCommand command) { } private static ImageFromDockerfile buildPumbaDockerImage() { - return new ImageFromDockerfile() + return new ImageFromDockerfile("testcontainers/pumba") .withDockerfileFromBuilder(builder -> builder .from(PUMBA_DOCKER_IMAGE) .run("echo -n > /docker_entrypoint.sh") @@ -72,11 +74,22 @@ private static ImageFromDockerfile buildPumbaDockerImage() { .run("echo 'exec gosu root:root \"$@\"' >> /docker_entrypoint.sh") ); } - private static class DoNotCheckStartup extends StartupCheckStrategy { + + private static String dockerSocketHostPath() { + return SystemUtils.IS_OS_WINDOWS ? "/" + DOCKER_SOCKET_HOST_PATH : DOCKER_SOCKET_HOST_PATH; + } + + private static class FailOnlyOnErrorExitCode extends StartupCheckStrategy { @Override - public StartupStatus checkStartupState(DockerClient dockerClient, String s) { - return StartupStatus.SUCCESSFUL; + public StartupStatus checkStartupState(DockerClient dockerClient, String containerId) { + return exitedWithError(dockerClient, containerId) ? + StartupStatus.FAILED : + StartupStatus.SUCCESSFUL; + } + + private boolean exitedWithError(DockerClient dockerClient, String containerId) { + return !DockerStatus.isContainerExitCodeSuccess(getCurrentState(dockerClient, containerId)); } } } From 98a66aba87a960b377a5ad35ed3f1fdda5a80cb8 Mon Sep 17 00:00:00 2001 From: novy Date: Sun, 4 Feb 2018 18:43:37 +0100 Subject: [PATCH 27/32] Reorganized tests a little bit --- .../test/CanSpawnContainers.java | 23 +++++++++ .../test/CanSpawnExampleContainers.java | 22 -------- .../org/testcontainers/test/Container.java | 22 ++++++++ .../test/DelayingOutgoingPacketsTest.java | 20 ++++---- .../test/DockerEnvironment.java | 5 +- .../test/DroppingPacketsTest.java | 28 +++++------ .../test/HasAccessToDockerClient.java | 11 ---- .../test/KillingContainersTest.java | 6 +-- .../test/PausingContainersTest.java | 2 +- .../test/{Network.java => Pinger.java} | 50 +++++++------------ .../test/RateLimitingOutgoingPacketsTest.java | 16 +++--- .../test/RemovingContainerTest.java | 2 +- .../test/StoppingContainerTest.java | 2 +- 13 files changed, 104 insertions(+), 105 deletions(-) create mode 100644 modules/chaostesting/src/test/java/org/testcontainers/test/CanSpawnContainers.java delete mode 100644 modules/chaostesting/src/test/java/org/testcontainers/test/CanSpawnExampleContainers.java create mode 100644 modules/chaostesting/src/test/java/org/testcontainers/test/Container.java delete mode 100644 modules/chaostesting/src/test/java/org/testcontainers/test/HasAccessToDockerClient.java rename modules/chaostesting/src/test/java/org/testcontainers/test/{Network.java => Pinger.java} (61%) diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/CanSpawnContainers.java b/modules/chaostesting/src/test/java/org/testcontainers/test/CanSpawnContainers.java new file mode 100644 index 00000000000..d20eff9f4a3 --- /dev/null +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/CanSpawnContainers.java @@ -0,0 +1,23 @@ +package org.testcontainers.test; + +/** + * Created by novy on 01.01.17. + */ +interface CanSpawnContainers { + + default Container startedContainer() { + final Container aContainer = new Container(); + aContainer.start(); + return aContainer; + } + + default Container startedContainerWithName(String containerName) { + return startedContainer().renameTo(containerName); + } + + default Pinger startedPinger() { + final Pinger pinger = new Pinger(); + pinger.start(); + return pinger; + } +} diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/CanSpawnExampleContainers.java b/modules/chaostesting/src/test/java/org/testcontainers/test/CanSpawnExampleContainers.java deleted file mode 100644 index 2ec10b1930a..00000000000 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/CanSpawnExampleContainers.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.testcontainers.test; - -import org.testcontainers.containers.GenericContainer; - -/** - * Created by novy on 01.01.17. - */ -interface CanSpawnExampleContainers extends HasAccessToDockerClient { - - default GenericContainer startedContainer() { - final GenericContainer aContainer = new GenericContainer<>("alpine:3.7") - .withCommand("sh", "-c", "while true; do echo something; sleep 1; done"); - aContainer.start(); - return aContainer; - } - - default GenericContainer startedContainerWithName(String containerName) { - final GenericContainer containerToRename = startedContainer(); - dockerClient().renameContainerCmd(containerToRename.getContainerId()).withName(containerName).exec(); - return containerToRename; - } -} diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/Container.java b/modules/chaostesting/src/test/java/org/testcontainers/test/Container.java new file mode 100644 index 00000000000..e581813f424 --- /dev/null +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/Container.java @@ -0,0 +1,22 @@ +package org.testcontainers.test; + +import com.github.dockerjava.api.command.InspectContainerResponse; +import org.testcontainers.containers.GenericContainer; + +class Container extends GenericContainer { + + Container() { + super("alpine:3.7"); + setCommand("sh", "-c", "while true; do echo something; sleep 1; done"); + } + + String ipAddress() { + final InspectContainerResponse inspected = getDockerClient().inspectContainerCmd(getContainerId()).exec(); + return inspected.getNetworkSettings().getNetworks().get("bridge").getIpAddress(); + } + + Container renameTo(String newName) { + getDockerClient().renameContainerCmd(containerId).withName(newName).exec(); + return this; + } +} diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/DelayingOutgoingPacketsTest.java b/modules/chaostesting/src/test/java/org/testcontainers/test/DelayingOutgoingPacketsTest.java index 4b673193995..70613d52e2f 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/DelayingOutgoingPacketsTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/DelayingOutgoingPacketsTest.java @@ -5,9 +5,7 @@ import org.testcontainers.PumbaExecutables; import org.testcontainers.client.PumbaClient; import org.testcontainers.client.commandparts.SupportedTimeUnit; -import org.testcontainers.containers.GenericContainer; -import org.testcontainers.test.Network.CanPingContainers; -import org.testcontainers.test.Network.PingResponse; +import org.testcontainers.test.Pinger.PingResponse; import static com.jayway.awaitility.Awaitility.await; import static java.util.concurrent.TimeUnit.SECONDS; @@ -20,36 +18,38 @@ /** * Created by novy on 14.01.17. */ -public class DelayingOutgoingPacketsTest implements CanSpawnExampleContainers, CanPingContainers { +public class DelayingOutgoingPacketsTest implements CanSpawnContainers { private PumbaClient pumba; + private Pinger pinger; @Before public void setUp() throws Exception { pumba = new PumbaClient(PumbaExecutables.dockerized()); + pinger = startedPinger(); } @Test public void should_be_able_to_delay_outgoing_packets_from_container() throws Exception { // given - final GenericContainer aContainer = startedContainer(); + final Container aContainer = startedContainer(); // when pumba .performNetworkChaos(networkAction() - .lastingFor(1, SupportedTimeUnit.MINUTES) + .lastingFor(30, SupportedTimeUnit.SECONDS) .executeSubCommand( delayOutgoingPackets() - .delayFor(1000, SupportedTimeUnit.MILLISECONDS) + .delayFor(500, SupportedTimeUnit.MILLISECONDS) ) ) .affect(containers(aContainer.getContainerName())) .execute(onlyOnce().onAllChosenContainers()); // then - await().atMost(20, SECONDS).until(() -> { - final PingResponse ping = ping(aContainer); - assertThat(ping.latencyInMilliseconds()).isGreaterThan(900); + await().atMost(30, SECONDS).until(() -> { + final PingResponse ping = pinger.ping(aContainer); + assertThat(ping.latencyInMilliseconds()).isGreaterThanOrEqualTo(450); }); } } diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/DockerEnvironment.java b/modules/chaostesting/src/test/java/org/testcontainers/test/DockerEnvironment.java index ff4370f694d..e459d72d8b4 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/DockerEnvironment.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/DockerEnvironment.java @@ -4,6 +4,7 @@ import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.command.InspectContainerResponse; import com.github.dockerjava.api.model.Container; +import org.testcontainers.DockerClientFactory; import java.util.Collection; import java.util.List; @@ -13,12 +14,12 @@ /** * Created by novy on 31.12.16. */ -class DockerEnvironment implements HasAccessToDockerClient { +class DockerEnvironment { private final DockerClient delegate; DockerEnvironment() { - this.delegate = dockerClient(); + this.delegate = DockerClientFactory.instance().client(); } Collection namesOfRunningContainers() { diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/DroppingPacketsTest.java b/modules/chaostesting/src/test/java/org/testcontainers/test/DroppingPacketsTest.java index 361336e8366..6dca6f39962 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/DroppingPacketsTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/DroppingPacketsTest.java @@ -4,40 +4,40 @@ import org.junit.Test; import org.testcontainers.PumbaExecutables; import org.testcontainers.client.PumbaClient; -import org.testcontainers.containers.GenericContainer; -import org.testcontainers.test.Network.CanPingContainers; -import org.testcontainers.test.Network.PingResponse; +import org.testcontainers.client.commandparts.SupportedTimeUnit; +import org.testcontainers.test.Pinger.PingResponse; import static com.jayway.awaitility.Awaitility.await; import static java.util.concurrent.TimeUnit.SECONDS; import static org.assertj.core.api.Assertions.assertThat; import static org.testcontainers.client.actions.networkactions.NetworkActions.networkAction; import static org.testcontainers.client.actions.networkactions.NetworkSubCommands.lossOutgoingPackets; -import static org.testcontainers.client.commandparts.SupportedTimeUnit.MINUTES; import static org.testcontainers.client.executionmodes.PumbaExecutionModes.onlyOnce; import static org.testcontainers.client.targets.PumbaTargets.containers; /** * Created by novy on 17.01.17. */ -public class DroppingPacketsTest implements CanSpawnExampleContainers, CanPingContainers { +public class DroppingPacketsTest implements CanSpawnContainers { private PumbaClient pumba; + private Pinger pinger; @Before public void setUp() throws Exception { pumba = new PumbaClient(PumbaExecutables.dockerized()); + pinger = startedPinger(); } @Test public void should_be_able_to_drop_outgoing_packets_with_bernoulli_model() throws Exception { // given - final GenericContainer aContainer = startedContainer(); + final Container aContainer = startedContainer(); // when pumba .performNetworkChaos(networkAction() - .lastingFor(1, MINUTES) + .lastingFor(30, SupportedTimeUnit.SECONDS) .executeSubCommand( lossOutgoingPackets() .accordingToBernoulliModel() @@ -49,7 +49,7 @@ public void should_be_able_to_drop_outgoing_packets_with_bernoulli_model() throw // then await().atMost(30, SECONDS).until(() -> { - final PingResponse pingResponse = ping(aContainer); + final PingResponse pingResponse = pinger.ping(aContainer); assertThat(pingResponse.packetLost()).isTrue(); }); } @@ -57,12 +57,12 @@ public void should_be_able_to_drop_outgoing_packets_with_bernoulli_model() throw @Test public void should_be_able_to_drop_outgoing_packets_with_markov_model() throws Exception { // given - final GenericContainer aContainer = startedContainer(); + final Container aContainer = startedContainer(); // when pumba .performNetworkChaos(networkAction() - .lastingFor(1, MINUTES) + .lastingFor(30, SupportedTimeUnit.SECONDS) .executeSubCommand( lossOutgoingPackets() .accordingToMarkovModel() @@ -78,7 +78,7 @@ public void should_be_able_to_drop_outgoing_packets_with_markov_model() throws E // then await().atMost(30, SECONDS).until(() -> { - final PingResponse pingResponse = ping(aContainer); + final PingResponse pingResponse = pinger.ping(aContainer); assertThat(pingResponse.packetLost()).isTrue(); }); } @@ -86,12 +86,12 @@ public void should_be_able_to_drop_outgoing_packets_with_markov_model() throws E @Test public void should_be_able_to_drop_outgoing_packets_with_gilbert_elliot_model() throws Exception { // given - final GenericContainer aContainer = startedContainer(); + final Container aContainer = startedContainer(); // when pumba .performNetworkChaos(networkAction() - .lastingFor(1, MINUTES) + .lastingFor(30, SupportedTimeUnit.SECONDS) .executeSubCommand( lossOutgoingPackets() .accordingToGilbertElliotModel() @@ -104,7 +104,7 @@ public void should_be_able_to_drop_outgoing_packets_with_gilbert_elliot_model() // then await().atMost(30, SECONDS).until(() -> { - final PingResponse pingResponse = ping(aContainer); + final PingResponse pingResponse = pinger.ping(aContainer); assertThat(pingResponse.packetLost()).isTrue(); }); } diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/HasAccessToDockerClient.java b/modules/chaostesting/src/test/java/org/testcontainers/test/HasAccessToDockerClient.java deleted file mode 100644 index 25658a428f2..00000000000 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/HasAccessToDockerClient.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.testcontainers.test; - -import com.github.dockerjava.api.DockerClient; -import org.testcontainers.DockerClientFactory; - -interface HasAccessToDockerClient { - - default DockerClient dockerClient() { - return DockerClientFactory.instance().client(); - } -} diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/KillingContainersTest.java b/modules/chaostesting/src/test/java/org/testcontainers/test/KillingContainersTest.java index ee1eb3dfe42..0176b2685cc 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/KillingContainersTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/KillingContainersTest.java @@ -24,7 +24,7 @@ /** * Created by novy on 31.12.16. */ -public class KillingContainersTest implements CanSpawnExampleContainers { +public class KillingContainersTest implements CanSpawnContainers { private DockerEnvironment environment; private PumbaClient pumba; @@ -113,14 +113,14 @@ public void should_kill_one_random_container_periodically() throws Exception { .execute(recurrently(5, SupportedTimeUnit.SECONDS).onRandomlyChosenContainer()); // then - await().atMost(8, TimeUnit.SECONDS).until(() -> + await().atMost(5, TimeUnit.SECONDS).until(() -> assertThat(environment.namesOfRunningContainers()) .filteredOn(matchesRegexp("foobar.*")) .hasSize(1) ); // and - await().atMost(8, TimeUnit.SECONDS).until(() -> + await().atMost(10, TimeUnit.SECONDS).until(() -> assertThat(environment.namesOfRunningContainers()) .filteredOn(matchesRegexp("foobar.*")) .isEmpty() diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/PausingContainersTest.java b/modules/chaostesting/src/test/java/org/testcontainers/test/PausingContainersTest.java index cf4e2c88767..33257b25eec 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/PausingContainersTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/PausingContainersTest.java @@ -19,7 +19,7 @@ /** * Created by novy on 31.12.16. */ -public class PausingContainersTest implements CanSpawnExampleContainers { +public class PausingContainersTest implements CanSpawnContainers { private DockerEnvironment environment; private PumbaClient pumba; diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/Network.java b/modules/chaostesting/src/test/java/org/testcontainers/test/Pinger.java similarity index 61% rename from modules/chaostesting/src/test/java/org/testcontainers/test/Network.java rename to modules/chaostesting/src/test/java/org/testcontainers/test/Pinger.java index 0042d595cba..f22c0de3965 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/Network.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/Pinger.java @@ -1,35 +1,37 @@ package org.testcontainers.test; -import com.github.dockerjava.api.command.InspectContainerResponse; import com.google.common.base.Preconditions; import lombok.AccessLevel; -import lombok.NoArgsConstructor; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; -import org.testcontainers.containers.Container; -import org.testcontainers.containers.GenericContainer; import java.util.Arrays; import java.util.LinkedList; import java.util.regex.Matcher; import java.util.regex.Pattern; -/** - * Created by novy on 14.01.17. - */ +class Pinger { -@NoArgsConstructor(access = AccessLevel.PRIVATE) -class Network implements CanSpawnExampleContainers { + private final Container delegate; - interface CanPingContainers { + Pinger() { + delegate = new Container(); + } - default PingResponse ping(GenericContainer container) { - return ping(container, 56); - } + void start() { + delegate.start(); + } - default PingResponse ping(GenericContainer container, long packetSizeInBytes) { - return new Network().ping(container, packetSizeInBytes); - } + PingResponse ping(Container container) { + return ping(container, 16); + } + + @SneakyThrows + PingResponse ping(Container container, long packetSizeInBytes) { + final org.testcontainers.containers.Container.ExecResult pingResponse = delegate.execInContainer( + "sh", "-c", String.format("ping %s -c 1 -s %d", container.ipAddress(), packetSizeInBytes) + ); + return new PingResponse(pingResponse.getStdout()); } @RequiredArgsConstructor(access = AccessLevel.PRIVATE) @@ -67,20 +69,4 @@ private String lastLineOfResponse() { return new LinkedList<>(Arrays.asList(responseLines)).getLast(); } } - - @SneakyThrows - PingResponse ping(GenericContainer container, long packetSizeInBytes) { - final GenericContainer pinger = startedContainer(); - final Container.ExecResult pingResponse = pinger.execInContainer( - "sh", "-c", String.format("ping %s -c 1 -s %d", ipAddressOf(container), packetSizeInBytes) - ); - return new PingResponse(pingResponse.getStdout()); - } - - private String ipAddressOf(GenericContainer container) { - final InspectContainerResponse inspected = dockerClient().inspectContainerCmd(container.getContainerId()).exec(); - return inspected.getNetworkSettings().getNetworks().get("bridge").getIpAddress(); - } } - - diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/RateLimitingOutgoingPacketsTest.java b/modules/chaostesting/src/test/java/org/testcontainers/test/RateLimitingOutgoingPacketsTest.java index 07c2c39e263..f812bca0209 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/RateLimitingOutgoingPacketsTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/RateLimitingOutgoingPacketsTest.java @@ -4,9 +4,8 @@ import org.junit.Test; import org.testcontainers.PumbaExecutables; import org.testcontainers.client.PumbaClient; -import org.testcontainers.containers.GenericContainer; -import org.testcontainers.test.Network.CanPingContainers; -import org.testcontainers.test.Network.PingResponse; +import org.testcontainers.client.commandparts.SupportedTimeUnit; +import org.testcontainers.test.Pinger.PingResponse; import static com.jayway.awaitility.Awaitility.await; import static java.util.concurrent.TimeUnit.SECONDS; @@ -14,32 +13,33 @@ import static org.testcontainers.client.actions.networkactions.NetworkActions.networkAction; import static org.testcontainers.client.actions.networkactions.NetworkSubCommands.rateLimitOutgoingTraffic; import static org.testcontainers.client.actions.networkactions.RateLimitOutgoingTraffic.RateUnit.KILOBITS_PER_SECOND; -import static org.testcontainers.client.commandparts.SupportedTimeUnit.MINUTES; import static org.testcontainers.client.executionmodes.PumbaExecutionModes.onlyOnce; import static org.testcontainers.client.targets.PumbaTargets.containers; /** * Created by novy on 15.01.17. */ -public class RateLimitingOutgoingPacketsTest implements CanSpawnExampleContainers, CanPingContainers { +public class RateLimitingOutgoingPacketsTest implements CanSpawnContainers { private PumbaClient pumba; + private Pinger pinger; @Before public void setUp() throws Exception { pumba = new PumbaClient(PumbaExecutables.dockerized()); + pinger = startedPinger(); } @Test public void should_be_able_to_rate_limit_outgoing_packets_from_container() throws Exception { // given - final GenericContainer containerToRateLimit = startedContainer(); + final Container containerToRateLimit = startedContainer(); // when pumba .performNetworkChaos( networkAction() - .lastingFor(1, MINUTES) + .lastingFor(30, SupportedTimeUnit.SECONDS) .executeSubCommand( rateLimitOutgoingTraffic().to(1, KILOBITS_PER_SECOND) ) @@ -49,7 +49,7 @@ public void should_be_able_to_rate_limit_outgoing_packets_from_container() throw // then await().atMost(30, SECONDS).until(() -> { - final PingResponse pingResponse = ping(containerToRateLimit, 117); + final PingResponse pingResponse = pinger.ping(containerToRateLimit, 117); assertThat(pingResponse.latencyInMilliseconds()).isGreaterThan(1000); }); } diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/RemovingContainerTest.java b/modules/chaostesting/src/test/java/org/testcontainers/test/RemovingContainerTest.java index 3cbbb3341c8..9a53f732883 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/RemovingContainerTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/RemovingContainerTest.java @@ -18,7 +18,7 @@ * Created by novy on 31.12.16. */ -public class RemovingContainerTest implements CanSpawnExampleContainers { +public class RemovingContainerTest implements CanSpawnContainers { private DockerEnvironment environment; private PumbaClient pumba; diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/StoppingContainerTest.java b/modules/chaostesting/src/test/java/org/testcontainers/test/StoppingContainerTest.java index c6edb60176d..63fbbb86f1d 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/StoppingContainerTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/StoppingContainerTest.java @@ -18,7 +18,7 @@ /** * Created by novy on 31.12.16. */ -public class StoppingContainerTest implements CanSpawnExampleContainers { +public class StoppingContainerTest implements CanSpawnContainers { private DockerEnvironment environment; private PumbaClient pumba; From 63a251d3781073870c977d61c83bd29bd07448df Mon Sep 17 00:00:00 2001 From: novy Date: Sun, 4 Feb 2018 19:23:59 +0100 Subject: [PATCH 28/32] Narrowed pumba entrypoint, small refactor --- .../client/InternalPumbaClient.java | 50 +++++++++++++++++++ .../testcontainers/client/PumbaClient.java | 48 +----------------- .../testcontainers/client/PumbaClients.java | 26 ++++++++++ .../org/testcontainers/client/PumbaDSL.java | 2 +- .../{ => executables}/PumbaContainer.java | 21 ++------ .../{ => executables}/PumbaExecutables.java | 4 +- .../executables/TestcontainersExecutable.java | 17 +++++++ .../test/DelayingOutgoingPacketsTest.java | 5 +- .../test/DroppingPacketsTest.java | 5 +- .../test/KillingContainersTest.java | 5 +- .../test/PausingContainersTest.java | 5 +- .../test/RateLimitingOutgoingPacketsTest.java | 5 +- .../test/RemovingContainerTest.java | 5 +- .../test/StoppingContainerTest.java | 5 +- 14 files changed, 122 insertions(+), 81 deletions(-) create mode 100644 modules/chaostesting/src/main/java/org/testcontainers/client/InternalPumbaClient.java create mode 100644 modules/chaostesting/src/main/java/org/testcontainers/client/PumbaClients.java rename modules/chaostesting/src/main/java/org/testcontainers/{ => executables}/PumbaContainer.java (82%) rename modules/chaostesting/src/main/java/org/testcontainers/{ => executables}/PumbaExecutables.java (67%) create mode 100644 modules/chaostesting/src/main/java/org/testcontainers/executables/TestcontainersExecutable.java diff --git a/modules/chaostesting/src/main/java/org/testcontainers/client/InternalPumbaClient.java b/modules/chaostesting/src/main/java/org/testcontainers/client/InternalPumbaClient.java new file mode 100644 index 00000000000..32c434229de --- /dev/null +++ b/modules/chaostesting/src/main/java/org/testcontainers/client/InternalPumbaClient.java @@ -0,0 +1,50 @@ +package org.testcontainers.client; + +import lombok.RequiredArgsConstructor; +import org.testcontainers.client.actions.PumbaAction; +import org.testcontainers.client.actions.containeractions.ContainerAction; +import org.testcontainers.client.actions.networkactions.NetworkAction; +import org.testcontainers.client.executionmodes.PumbaExecutionMode; +import org.testcontainers.client.targets.PumbaTarget; + +/** + * Created by novy on 03.06.17. + */ +@RequiredArgsConstructor +final class InternalPumbaClient implements PumbaDSL.ChooseAction, PumbaDSL.ChooseTarget, PumbaDSL.ChooseExecutionMode { + + private final PumbaExecutable executable; + + private PumbaAction action; + private PumbaExecutionMode executionMode; + private PumbaTarget target; + + @Override + public PumbaDSL.ChooseTarget performContainerChaos(ContainerAction containerAction) { + this.action = containerAction; + return this; + } + + @Override + public PumbaDSL.ChooseTarget performNetworkChaos(NetworkAction networkAction) { + this.action = networkAction; + return this; + } + + @Override + public PumbaDSL.ChooseExecutionMode affect(PumbaTarget target) { + this.target = target; + return this; + } + + @Override + public void execute(PumbaExecutionMode executionMode) { + this.executionMode = executionMode; + buildAndExecuteCommand(); + } + + private void buildAndExecuteCommand() { + PumbaCommand commandToExecute = PumbaCommand.of(action, executionMode, target); + executable.execute(commandToExecute); + } +} diff --git a/modules/chaostesting/src/main/java/org/testcontainers/client/PumbaClient.java b/modules/chaostesting/src/main/java/org/testcontainers/client/PumbaClient.java index aa5b4bee637..5af7c584f53 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/client/PumbaClient.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/client/PumbaClient.java @@ -1,50 +1,4 @@ package org.testcontainers.client; -import lombok.RequiredArgsConstructor; -import org.testcontainers.client.actions.PumbaAction; -import org.testcontainers.client.actions.containeractions.ContainerAction; -import org.testcontainers.client.actions.networkactions.NetworkAction; -import org.testcontainers.client.executionmodes.PumbaExecutionMode; -import org.testcontainers.client.targets.PumbaTarget; - -/** - * Created by novy on 03.06.17. - */ -@RequiredArgsConstructor -public final class PumbaClient implements PumbaDSL.ChooseAction, PumbaDSL.ChooseTarget, PumbaDSL.ChooseExecutionMode { - - private final PumbaExecutable executable; - - private PumbaAction action; - private PumbaExecutionMode executionMode; - private PumbaTarget target; - - @Override - public PumbaDSL.ChooseTarget performContainerChaos(ContainerAction containerAction) { - this.action = containerAction; - return this; - } - - @Override - public PumbaDSL.ChooseTarget performNetworkChaos(NetworkAction networkAction) { - this.action = networkAction; - return this; - } - - @Override - public PumbaDSL.ChooseExecutionMode affect(PumbaTarget target) { - this.target = target; - return this; - } - - @Override - public void execute(PumbaExecutionMode executionMode) { - this.executionMode = executionMode; - buildAndExecuteCommand(); - } - - private void buildAndExecuteCommand() { - PumbaCommand commandToExecute = PumbaCommand.of(action, executionMode, target); - executable.execute(commandToExecute); - } +public interface PumbaClient extends PumbaDSL.ChooseAction { } diff --git a/modules/chaostesting/src/main/java/org/testcontainers/client/PumbaClients.java b/modules/chaostesting/src/main/java/org/testcontainers/client/PumbaClients.java new file mode 100644 index 00000000000..f8ffdb90481 --- /dev/null +++ b/modules/chaostesting/src/main/java/org/testcontainers/client/PumbaClients.java @@ -0,0 +1,26 @@ +package org.testcontainers.client; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.testcontainers.client.actions.containeractions.ContainerAction; +import org.testcontainers.client.actions.networkactions.NetworkAction; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class PumbaClients { + + public static PumbaClient forExecutable(PumbaExecutable executable) { + final InternalPumbaClient internalClient = new InternalPumbaClient(executable); + + return new PumbaClient() { + @Override + public PumbaDSL.ChooseTarget performContainerChaos(ContainerAction containerAction) { + return internalClient.performContainerChaos(containerAction); + } + + @Override + public PumbaDSL.ChooseTarget performNetworkChaos(NetworkAction networkAction) { + return internalClient.performNetworkChaos(networkAction); + } + }; + } +} diff --git a/modules/chaostesting/src/main/java/org/testcontainers/client/PumbaDSL.java b/modules/chaostesting/src/main/java/org/testcontainers/client/PumbaDSL.java index 35520861372..fb5ae5fd0e3 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/client/PumbaDSL.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/client/PumbaDSL.java @@ -12,7 +12,7 @@ * Created by novy on 14.01.17. */ @NoArgsConstructor(access = AccessLevel.PRIVATE) -public final class PumbaDSL { +final class PumbaDSL { public interface ChooseAction { ChooseTarget performContainerChaos(ContainerAction containerAction); diff --git a/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java b/modules/chaostesting/src/main/java/org/testcontainers/executables/PumbaContainer.java similarity index 82% rename from modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java rename to modules/chaostesting/src/main/java/org/testcontainers/executables/PumbaContainer.java index d5401d8f0ef..37ec5af3c30 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/PumbaContainer.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/executables/PumbaContainer.java @@ -1,11 +1,9 @@ -package org.testcontainers; +package org.testcontainers.executables; import com.github.dockerjava.api.DockerClient; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.SystemUtils; -import org.testcontainers.client.PumbaCommand; -import org.testcontainers.client.PumbaExecutable; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.startupcheck.StartupCheckStrategy; import org.testcontainers.images.RemoteDockerImage; @@ -18,7 +16,7 @@ * Created by novy on 31.12.16. */ @Slf4j -class PumbaContainer extends GenericContainer implements PumbaExecutable { +class PumbaContainer extends GenericContainer { private static final String PUMBA_DOCKER_IMAGE = "gaiaadm/pumba:0.4.7"; private static final String IP_ROUTE_DOCKER_IMAGE = "gaiadocker/iproute2:3.3"; @@ -26,19 +24,15 @@ class PumbaContainer extends GenericContainer implements PumbaEx private static final String DOCKER_SOCKET_HOST_PATH = "/var/run/docker.sock"; private static final String DOCKER_SOCKET_CONTAINER_PATH = "/docker.sock"; - PumbaContainer() { + PumbaContainer(String pumbaCommandToExecute) { super(buildPumbaDockerImage()); + setCommand(pumbaCommandToExecute); doNotWaitForStartupAtAll(); mountDockerSocket(); fetchIPRouteImage(); setupLogging(); } - @Override - public void execute(PumbaCommand command) { - executeCommand(command); - } - private void doNotWaitForStartupAtAll() { setStartupCheckStrategy(new FailOnlyOnErrorExitCode()); } @@ -57,13 +51,6 @@ private void setupLogging() { withLogConsumer(frame -> log.debug("Pumba container: \"{}\"", frame.getUtf8String())); } - private void executeCommand(PumbaCommand command) { - final String evaluatedCommand = command.evaluate(); - setCommand(evaluatedCommand); - log.info("Executing pumba container with command \"{}\"", evaluatedCommand); - super.start(); - } - private static ImageFromDockerfile buildPumbaDockerImage() { return new ImageFromDockerfile("testcontainers/pumba") .withDockerfileFromBuilder(builder -> builder diff --git a/modules/chaostesting/src/main/java/org/testcontainers/PumbaExecutables.java b/modules/chaostesting/src/main/java/org/testcontainers/executables/PumbaExecutables.java similarity index 67% rename from modules/chaostesting/src/main/java/org/testcontainers/PumbaExecutables.java rename to modules/chaostesting/src/main/java/org/testcontainers/executables/PumbaExecutables.java index cc105ca8b62..163bc3ecf1d 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/PumbaExecutables.java +++ b/modules/chaostesting/src/main/java/org/testcontainers/executables/PumbaExecutables.java @@ -1,4 +1,4 @@ -package org.testcontainers; +package org.testcontainers.executables; import org.testcontainers.client.PumbaExecutable; @@ -8,6 +8,6 @@ public class PumbaExecutables { public static PumbaExecutable dockerized() { - return new PumbaContainer(); + return new TestcontainersExecutable(); } } diff --git a/modules/chaostesting/src/main/java/org/testcontainers/executables/TestcontainersExecutable.java b/modules/chaostesting/src/main/java/org/testcontainers/executables/TestcontainersExecutable.java new file mode 100644 index 00000000000..de6bf72b46b --- /dev/null +++ b/modules/chaostesting/src/main/java/org/testcontainers/executables/TestcontainersExecutable.java @@ -0,0 +1,17 @@ +package org.testcontainers.executables; + +import lombok.extern.slf4j.Slf4j; +import org.testcontainers.client.PumbaCommand; +import org.testcontainers.client.PumbaExecutable; + +@Slf4j +class TestcontainersExecutable implements PumbaExecutable { + + @Override + public void execute(PumbaCommand command) { + final String evaluatedCommand = command.evaluate(); + log.info("Executing pumba container with command \"{}\"", evaluatedCommand); + final PumbaContainer dockerizedPumba = new PumbaContainer(evaluatedCommand); + dockerizedPumba.start(); + } +} diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/DelayingOutgoingPacketsTest.java b/modules/chaostesting/src/test/java/org/testcontainers/test/DelayingOutgoingPacketsTest.java index 70613d52e2f..db25d35d941 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/DelayingOutgoingPacketsTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/DelayingOutgoingPacketsTest.java @@ -2,8 +2,9 @@ import org.junit.Before; import org.junit.Test; -import org.testcontainers.PumbaExecutables; +import org.testcontainers.executables.PumbaExecutables; import org.testcontainers.client.PumbaClient; +import org.testcontainers.client.PumbaClients; import org.testcontainers.client.commandparts.SupportedTimeUnit; import org.testcontainers.test.Pinger.PingResponse; @@ -25,7 +26,7 @@ public class DelayingOutgoingPacketsTest implements CanSpawnContainers { @Before public void setUp() throws Exception { - pumba = new PumbaClient(PumbaExecutables.dockerized()); + pumba = PumbaClients.forExecutable(PumbaExecutables.dockerized()); pinger = startedPinger(); } diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/DroppingPacketsTest.java b/modules/chaostesting/src/test/java/org/testcontainers/test/DroppingPacketsTest.java index 6dca6f39962..22190c11c62 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/DroppingPacketsTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/DroppingPacketsTest.java @@ -2,8 +2,9 @@ import org.junit.Before; import org.junit.Test; -import org.testcontainers.PumbaExecutables; +import org.testcontainers.executables.PumbaExecutables; import org.testcontainers.client.PumbaClient; +import org.testcontainers.client.PumbaClients; import org.testcontainers.client.commandparts.SupportedTimeUnit; import org.testcontainers.test.Pinger.PingResponse; @@ -25,7 +26,7 @@ public class DroppingPacketsTest implements CanSpawnContainers { @Before public void setUp() throws Exception { - pumba = new PumbaClient(PumbaExecutables.dockerized()); + pumba = PumbaClients.forExecutable(PumbaExecutables.dockerized()); pinger = startedPinger(); } diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/KillingContainersTest.java b/modules/chaostesting/src/test/java/org/testcontainers/test/KillingContainersTest.java index 0176b2685cc..1c871d2f277 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/KillingContainersTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/KillingContainersTest.java @@ -2,8 +2,9 @@ import org.junit.Before; import org.junit.Test; -import org.testcontainers.PumbaExecutables; +import org.testcontainers.executables.PumbaExecutables; import org.testcontainers.client.PumbaClient; +import org.testcontainers.client.PumbaClients; import org.testcontainers.client.commandparts.SupportedTimeUnit; import org.testcontainers.containers.GenericContainer; @@ -32,7 +33,7 @@ public class KillingContainersTest implements CanSpawnContainers { @Before public void setUp() throws Exception { environment = new DockerEnvironment(); - pumba = new PumbaClient(PumbaExecutables.dockerized()); + pumba = PumbaClients.forExecutable(PumbaExecutables.dockerized()); } @Test diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/PausingContainersTest.java b/modules/chaostesting/src/test/java/org/testcontainers/test/PausingContainersTest.java index 33257b25eec..fac9f991c3e 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/PausingContainersTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/PausingContainersTest.java @@ -2,8 +2,9 @@ import org.junit.Before; import org.junit.Test; -import org.testcontainers.PumbaExecutables; +import org.testcontainers.executables.PumbaExecutables; import org.testcontainers.client.PumbaClient; +import org.testcontainers.client.PumbaClients; import org.testcontainers.client.commandparts.SupportedTimeUnit; import org.testcontainers.containers.GenericContainer; import org.testcontainers.test.DockerEnvironment.ContainerDetails; @@ -27,7 +28,7 @@ public class PausingContainersTest implements CanSpawnContainers { @Before public void setUp() throws Exception { environment = new DockerEnvironment(); - pumba = new PumbaClient(PumbaExecutables.dockerized()); + pumba = PumbaClients.forExecutable(PumbaExecutables.dockerized()); } @Test diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/RateLimitingOutgoingPacketsTest.java b/modules/chaostesting/src/test/java/org/testcontainers/test/RateLimitingOutgoingPacketsTest.java index f812bca0209..8324e010813 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/RateLimitingOutgoingPacketsTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/RateLimitingOutgoingPacketsTest.java @@ -2,8 +2,9 @@ import org.junit.Before; import org.junit.Test; -import org.testcontainers.PumbaExecutables; +import org.testcontainers.executables.PumbaExecutables; import org.testcontainers.client.PumbaClient; +import org.testcontainers.client.PumbaClients; import org.testcontainers.client.commandparts.SupportedTimeUnit; import org.testcontainers.test.Pinger.PingResponse; @@ -26,7 +27,7 @@ public class RateLimitingOutgoingPacketsTest implements CanSpawnContainers { @Before public void setUp() throws Exception { - pumba = new PumbaClient(PumbaExecutables.dockerized()); + pumba = PumbaClients.forExecutable(PumbaExecutables.dockerized()); pinger = startedPinger(); } diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/RemovingContainerTest.java b/modules/chaostesting/src/test/java/org/testcontainers/test/RemovingContainerTest.java index 9a53f732883..4ecd1c7144e 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/RemovingContainerTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/RemovingContainerTest.java @@ -2,8 +2,9 @@ import org.junit.Before; import org.junit.Test; -import org.testcontainers.PumbaExecutables; +import org.testcontainers.executables.PumbaExecutables; import org.testcontainers.client.PumbaClient; +import org.testcontainers.client.PumbaClients; import org.testcontainers.containers.GenericContainer; import java.util.concurrent.TimeUnit; @@ -26,7 +27,7 @@ public class RemovingContainerTest implements CanSpawnContainers { @Before public void setUp() throws Exception { environment = new DockerEnvironment(); - pumba = new PumbaClient(PumbaExecutables.dockerized()); + pumba = PumbaClients.forExecutable(PumbaExecutables.dockerized()); } @Test diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/StoppingContainerTest.java b/modules/chaostesting/src/test/java/org/testcontainers/test/StoppingContainerTest.java index 63fbbb86f1d..84b4fed055c 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/StoppingContainerTest.java +++ b/modules/chaostesting/src/test/java/org/testcontainers/test/StoppingContainerTest.java @@ -2,8 +2,9 @@ import org.junit.Before; import org.junit.Test; -import org.testcontainers.PumbaExecutables; +import org.testcontainers.executables.PumbaExecutables; import org.testcontainers.client.PumbaClient; +import org.testcontainers.client.PumbaClients; import org.testcontainers.client.actions.containeractions.ContainerActions; import org.testcontainers.containers.GenericContainer; import org.testcontainers.test.DockerEnvironment.ContainerDetails; @@ -26,7 +27,7 @@ public class StoppingContainerTest implements CanSpawnContainers { @Before public void setUp() throws Exception { environment = new DockerEnvironment(); - pumba = new PumbaClient(PumbaExecutables.dockerized()); + pumba = PumbaClients.forExecutable(PumbaExecutables.dockerized()); } @Test From 4b726e2c658246d71f4c1ef714a68baf44546a12 Mon Sep 17 00:00:00 2001 From: Slawomir Nowak Date: Sat, 19 May 2018 15:56:04 +0200 Subject: [PATCH 29/32] PR comments - renamed module name, increased awaitality version, using Log4j consumer --- .gitignore | 1 + modules/{chaostesting => pumba}/build.gradle | 6 +++--- .../testcontainers/client/InternalPumbaClient.java | 0 .../org/testcontainers/client/PumbaClient.java | 0 .../org/testcontainers/client/PumbaClients.java | 0 .../org/testcontainers/client/PumbaCommand.java | 0 .../java/org/testcontainers/client/PumbaDSL.java | 0 .../org/testcontainers/client/PumbaExecutable.java | 0 .../testcontainers/client/actions/PumbaAction.java | 0 .../actions/containeractions/ContainerAction.java | 0 .../actions/containeractions/ContainerActions.java | 0 .../actions/containeractions/KillContainers.java | 0 .../actions/containeractions/PauseContainers.java | 0 .../actions/containeractions/RemoveContainers.java | 0 .../actions/containeractions/StopContainers.java | 0 .../networkactions/DelayOutgoingPackets.java | 0 .../networkactions/DroppingPacketsModels.java | 0 .../actions/networkactions/NetworkAction.java | 0 .../actions/networkactions/NetworkActions.java | 0 .../actions/networkactions/NetworkSubCommands.java | 0 .../networkactions/RateLimitOutgoingTraffic.java | 0 .../client/commandparts/PumbaCommandPart.java | 0 .../client/commandparts/SupportedTimeUnit.java | 0 .../client/commandparts/TimeExpression.java | 0 .../client/executionmodes/PumbaExecutionMode.java | 0 .../client/executionmodes/PumbaExecutionModes.java | 0 .../testcontainers/client/targets/PumbaTarget.java | 0 .../client/targets/PumbaTargets.java | 0 .../testcontainers/executables/PumbaContainer.java | 3 ++- .../executables/PumbaExecutables.java | 0 .../executables/TestcontainersExecutable.java | 0 .../testcontainers/test/CanSpawnContainers.java | 0 .../java/org/testcontainers/test/Container.java | 0 .../test/DelayingOutgoingPacketsTest.java | 6 +++--- .../org/testcontainers/test/DockerEnvironment.java | 0 .../testcontainers/test/DroppingPacketsTest.java | 10 +++++----- .../testcontainers/test/KillingContainersTest.java | 14 +++++++------- .../testcontainers/test/PausingContainersTest.java | 8 ++++---- .../test/java/org/testcontainers/test/Pinger.java | 0 .../test/RateLimitingOutgoingPacketsTest.java | 6 +++--- .../testcontainers/test/RemovingContainerTest.java | 6 +++--- .../testcontainers/test/StoppingContainerTest.java | 6 +++--- .../src/test/resources/logback-test.xml | 0 43 files changed, 34 insertions(+), 32 deletions(-) rename modules/{chaostesting => pumba}/build.gradle (59%) rename modules/{chaostesting => pumba}/src/main/java/org/testcontainers/client/InternalPumbaClient.java (100%) rename modules/{chaostesting => pumba}/src/main/java/org/testcontainers/client/PumbaClient.java (100%) rename modules/{chaostesting => pumba}/src/main/java/org/testcontainers/client/PumbaClients.java (100%) rename modules/{chaostesting => pumba}/src/main/java/org/testcontainers/client/PumbaCommand.java (100%) rename modules/{chaostesting => pumba}/src/main/java/org/testcontainers/client/PumbaDSL.java (100%) rename modules/{chaostesting => pumba}/src/main/java/org/testcontainers/client/PumbaExecutable.java (100%) rename modules/{chaostesting => pumba}/src/main/java/org/testcontainers/client/actions/PumbaAction.java (100%) rename modules/{chaostesting => pumba}/src/main/java/org/testcontainers/client/actions/containeractions/ContainerAction.java (100%) rename modules/{chaostesting => pumba}/src/main/java/org/testcontainers/client/actions/containeractions/ContainerActions.java (100%) rename modules/{chaostesting => pumba}/src/main/java/org/testcontainers/client/actions/containeractions/KillContainers.java (100%) rename modules/{chaostesting => pumba}/src/main/java/org/testcontainers/client/actions/containeractions/PauseContainers.java (100%) rename modules/{chaostesting => pumba}/src/main/java/org/testcontainers/client/actions/containeractions/RemoveContainers.java (100%) rename modules/{chaostesting => pumba}/src/main/java/org/testcontainers/client/actions/containeractions/StopContainers.java (100%) rename modules/{chaostesting => pumba}/src/main/java/org/testcontainers/client/actions/networkactions/DelayOutgoingPackets.java (100%) rename modules/{chaostesting => pumba}/src/main/java/org/testcontainers/client/actions/networkactions/DroppingPacketsModels.java (100%) rename modules/{chaostesting => pumba}/src/main/java/org/testcontainers/client/actions/networkactions/NetworkAction.java (100%) rename modules/{chaostesting => pumba}/src/main/java/org/testcontainers/client/actions/networkactions/NetworkActions.java (100%) rename modules/{chaostesting => pumba}/src/main/java/org/testcontainers/client/actions/networkactions/NetworkSubCommands.java (100%) rename modules/{chaostesting => pumba}/src/main/java/org/testcontainers/client/actions/networkactions/RateLimitOutgoingTraffic.java (100%) rename modules/{chaostesting => pumba}/src/main/java/org/testcontainers/client/commandparts/PumbaCommandPart.java (100%) rename modules/{chaostesting => pumba}/src/main/java/org/testcontainers/client/commandparts/SupportedTimeUnit.java (100%) rename modules/{chaostesting => pumba}/src/main/java/org/testcontainers/client/commandparts/TimeExpression.java (100%) rename modules/{chaostesting => pumba}/src/main/java/org/testcontainers/client/executionmodes/PumbaExecutionMode.java (100%) rename modules/{chaostesting => pumba}/src/main/java/org/testcontainers/client/executionmodes/PumbaExecutionModes.java (100%) rename modules/{chaostesting => pumba}/src/main/java/org/testcontainers/client/targets/PumbaTarget.java (100%) rename modules/{chaostesting => pumba}/src/main/java/org/testcontainers/client/targets/PumbaTargets.java (100%) rename modules/{chaostesting => pumba}/src/main/java/org/testcontainers/executables/PumbaContainer.java (96%) rename modules/{chaostesting => pumba}/src/main/java/org/testcontainers/executables/PumbaExecutables.java (100%) rename modules/{chaostesting => pumba}/src/main/java/org/testcontainers/executables/TestcontainersExecutable.java (100%) rename modules/{chaostesting => pumba}/src/test/java/org/testcontainers/test/CanSpawnContainers.java (100%) rename modules/{chaostesting => pumba}/src/test/java/org/testcontainers/test/Container.java (100%) rename modules/{chaostesting => pumba}/src/test/java/org/testcontainers/test/DelayingOutgoingPacketsTest.java (95%) rename modules/{chaostesting => pumba}/src/test/java/org/testcontainers/test/DockerEnvironment.java (100%) rename modules/{chaostesting => pumba}/src/test/java/org/testcontainers/test/DroppingPacketsTest.java (95%) rename modules/{chaostesting => pumba}/src/test/java/org/testcontainers/test/KillingContainersTest.java (93%) rename modules/{chaostesting => pumba}/src/test/java/org/testcontainers/test/PausingContainersTest.java (91%) rename modules/{chaostesting => pumba}/src/test/java/org/testcontainers/test/Pinger.java (100%) rename modules/{chaostesting => pumba}/src/test/java/org/testcontainers/test/RateLimitingOutgoingPacketsTest.java (95%) rename modules/{chaostesting => pumba}/src/test/java/org/testcontainers/test/RemovingContainerTest.java (93%) rename modules/{chaostesting => pumba}/src/test/java/org/testcontainers/test/StoppingContainerTest.java (93%) rename modules/{chaostesting => pumba}/src/test/resources/logback-test.xml (100%) diff --git a/.gitignore b/.gitignore index 8e548131d5d..de7336c0127 100644 --- a/.gitignore +++ b/.gitignore @@ -46,3 +46,4 @@ node_modules/ .gradle/ build/ +out/ diff --git a/modules/chaostesting/build.gradle b/modules/pumba/build.gradle similarity index 59% rename from modules/chaostesting/build.gradle rename to modules/pumba/build.gradle index 47c8c660a62..9a832e1922e 100644 --- a/modules/chaostesting/build.gradle +++ b/modules/pumba/build.gradle @@ -1,9 +1,9 @@ -description = "Testcontainers :: chaostesting" +description = "Testcontainers :: pumba" dependencies { compile project(':testcontainers') - testCompile 'com.jayway.awaitility:awaitility:1.7.0' + testCompile 'org.awaitility:awaitility:3.1.0' testCompile 'org.assertj:assertj-core:3.9.0' testCompile 'com.google.guava:guava:23.6-jre' -} \ No newline at end of file +} diff --git a/modules/chaostesting/src/main/java/org/testcontainers/client/InternalPumbaClient.java b/modules/pumba/src/main/java/org/testcontainers/client/InternalPumbaClient.java similarity index 100% rename from modules/chaostesting/src/main/java/org/testcontainers/client/InternalPumbaClient.java rename to modules/pumba/src/main/java/org/testcontainers/client/InternalPumbaClient.java diff --git a/modules/chaostesting/src/main/java/org/testcontainers/client/PumbaClient.java b/modules/pumba/src/main/java/org/testcontainers/client/PumbaClient.java similarity index 100% rename from modules/chaostesting/src/main/java/org/testcontainers/client/PumbaClient.java rename to modules/pumba/src/main/java/org/testcontainers/client/PumbaClient.java diff --git a/modules/chaostesting/src/main/java/org/testcontainers/client/PumbaClients.java b/modules/pumba/src/main/java/org/testcontainers/client/PumbaClients.java similarity index 100% rename from modules/chaostesting/src/main/java/org/testcontainers/client/PumbaClients.java rename to modules/pumba/src/main/java/org/testcontainers/client/PumbaClients.java diff --git a/modules/chaostesting/src/main/java/org/testcontainers/client/PumbaCommand.java b/modules/pumba/src/main/java/org/testcontainers/client/PumbaCommand.java similarity index 100% rename from modules/chaostesting/src/main/java/org/testcontainers/client/PumbaCommand.java rename to modules/pumba/src/main/java/org/testcontainers/client/PumbaCommand.java diff --git a/modules/chaostesting/src/main/java/org/testcontainers/client/PumbaDSL.java b/modules/pumba/src/main/java/org/testcontainers/client/PumbaDSL.java similarity index 100% rename from modules/chaostesting/src/main/java/org/testcontainers/client/PumbaDSL.java rename to modules/pumba/src/main/java/org/testcontainers/client/PumbaDSL.java diff --git a/modules/chaostesting/src/main/java/org/testcontainers/client/PumbaExecutable.java b/modules/pumba/src/main/java/org/testcontainers/client/PumbaExecutable.java similarity index 100% rename from modules/chaostesting/src/main/java/org/testcontainers/client/PumbaExecutable.java rename to modules/pumba/src/main/java/org/testcontainers/client/PumbaExecutable.java diff --git a/modules/chaostesting/src/main/java/org/testcontainers/client/actions/PumbaAction.java b/modules/pumba/src/main/java/org/testcontainers/client/actions/PumbaAction.java similarity index 100% rename from modules/chaostesting/src/main/java/org/testcontainers/client/actions/PumbaAction.java rename to modules/pumba/src/main/java/org/testcontainers/client/actions/PumbaAction.java diff --git a/modules/chaostesting/src/main/java/org/testcontainers/client/actions/containeractions/ContainerAction.java b/modules/pumba/src/main/java/org/testcontainers/client/actions/containeractions/ContainerAction.java similarity index 100% rename from modules/chaostesting/src/main/java/org/testcontainers/client/actions/containeractions/ContainerAction.java rename to modules/pumba/src/main/java/org/testcontainers/client/actions/containeractions/ContainerAction.java diff --git a/modules/chaostesting/src/main/java/org/testcontainers/client/actions/containeractions/ContainerActions.java b/modules/pumba/src/main/java/org/testcontainers/client/actions/containeractions/ContainerActions.java similarity index 100% rename from modules/chaostesting/src/main/java/org/testcontainers/client/actions/containeractions/ContainerActions.java rename to modules/pumba/src/main/java/org/testcontainers/client/actions/containeractions/ContainerActions.java diff --git a/modules/chaostesting/src/main/java/org/testcontainers/client/actions/containeractions/KillContainers.java b/modules/pumba/src/main/java/org/testcontainers/client/actions/containeractions/KillContainers.java similarity index 100% rename from modules/chaostesting/src/main/java/org/testcontainers/client/actions/containeractions/KillContainers.java rename to modules/pumba/src/main/java/org/testcontainers/client/actions/containeractions/KillContainers.java diff --git a/modules/chaostesting/src/main/java/org/testcontainers/client/actions/containeractions/PauseContainers.java b/modules/pumba/src/main/java/org/testcontainers/client/actions/containeractions/PauseContainers.java similarity index 100% rename from modules/chaostesting/src/main/java/org/testcontainers/client/actions/containeractions/PauseContainers.java rename to modules/pumba/src/main/java/org/testcontainers/client/actions/containeractions/PauseContainers.java diff --git a/modules/chaostesting/src/main/java/org/testcontainers/client/actions/containeractions/RemoveContainers.java b/modules/pumba/src/main/java/org/testcontainers/client/actions/containeractions/RemoveContainers.java similarity index 100% rename from modules/chaostesting/src/main/java/org/testcontainers/client/actions/containeractions/RemoveContainers.java rename to modules/pumba/src/main/java/org/testcontainers/client/actions/containeractions/RemoveContainers.java diff --git a/modules/chaostesting/src/main/java/org/testcontainers/client/actions/containeractions/StopContainers.java b/modules/pumba/src/main/java/org/testcontainers/client/actions/containeractions/StopContainers.java similarity index 100% rename from modules/chaostesting/src/main/java/org/testcontainers/client/actions/containeractions/StopContainers.java rename to modules/pumba/src/main/java/org/testcontainers/client/actions/containeractions/StopContainers.java diff --git a/modules/chaostesting/src/main/java/org/testcontainers/client/actions/networkactions/DelayOutgoingPackets.java b/modules/pumba/src/main/java/org/testcontainers/client/actions/networkactions/DelayOutgoingPackets.java similarity index 100% rename from modules/chaostesting/src/main/java/org/testcontainers/client/actions/networkactions/DelayOutgoingPackets.java rename to modules/pumba/src/main/java/org/testcontainers/client/actions/networkactions/DelayOutgoingPackets.java diff --git a/modules/chaostesting/src/main/java/org/testcontainers/client/actions/networkactions/DroppingPacketsModels.java b/modules/pumba/src/main/java/org/testcontainers/client/actions/networkactions/DroppingPacketsModels.java similarity index 100% rename from modules/chaostesting/src/main/java/org/testcontainers/client/actions/networkactions/DroppingPacketsModels.java rename to modules/pumba/src/main/java/org/testcontainers/client/actions/networkactions/DroppingPacketsModels.java diff --git a/modules/chaostesting/src/main/java/org/testcontainers/client/actions/networkactions/NetworkAction.java b/modules/pumba/src/main/java/org/testcontainers/client/actions/networkactions/NetworkAction.java similarity index 100% rename from modules/chaostesting/src/main/java/org/testcontainers/client/actions/networkactions/NetworkAction.java rename to modules/pumba/src/main/java/org/testcontainers/client/actions/networkactions/NetworkAction.java diff --git a/modules/chaostesting/src/main/java/org/testcontainers/client/actions/networkactions/NetworkActions.java b/modules/pumba/src/main/java/org/testcontainers/client/actions/networkactions/NetworkActions.java similarity index 100% rename from modules/chaostesting/src/main/java/org/testcontainers/client/actions/networkactions/NetworkActions.java rename to modules/pumba/src/main/java/org/testcontainers/client/actions/networkactions/NetworkActions.java diff --git a/modules/chaostesting/src/main/java/org/testcontainers/client/actions/networkactions/NetworkSubCommands.java b/modules/pumba/src/main/java/org/testcontainers/client/actions/networkactions/NetworkSubCommands.java similarity index 100% rename from modules/chaostesting/src/main/java/org/testcontainers/client/actions/networkactions/NetworkSubCommands.java rename to modules/pumba/src/main/java/org/testcontainers/client/actions/networkactions/NetworkSubCommands.java diff --git a/modules/chaostesting/src/main/java/org/testcontainers/client/actions/networkactions/RateLimitOutgoingTraffic.java b/modules/pumba/src/main/java/org/testcontainers/client/actions/networkactions/RateLimitOutgoingTraffic.java similarity index 100% rename from modules/chaostesting/src/main/java/org/testcontainers/client/actions/networkactions/RateLimitOutgoingTraffic.java rename to modules/pumba/src/main/java/org/testcontainers/client/actions/networkactions/RateLimitOutgoingTraffic.java diff --git a/modules/chaostesting/src/main/java/org/testcontainers/client/commandparts/PumbaCommandPart.java b/modules/pumba/src/main/java/org/testcontainers/client/commandparts/PumbaCommandPart.java similarity index 100% rename from modules/chaostesting/src/main/java/org/testcontainers/client/commandparts/PumbaCommandPart.java rename to modules/pumba/src/main/java/org/testcontainers/client/commandparts/PumbaCommandPart.java diff --git a/modules/chaostesting/src/main/java/org/testcontainers/client/commandparts/SupportedTimeUnit.java b/modules/pumba/src/main/java/org/testcontainers/client/commandparts/SupportedTimeUnit.java similarity index 100% rename from modules/chaostesting/src/main/java/org/testcontainers/client/commandparts/SupportedTimeUnit.java rename to modules/pumba/src/main/java/org/testcontainers/client/commandparts/SupportedTimeUnit.java diff --git a/modules/chaostesting/src/main/java/org/testcontainers/client/commandparts/TimeExpression.java b/modules/pumba/src/main/java/org/testcontainers/client/commandparts/TimeExpression.java similarity index 100% rename from modules/chaostesting/src/main/java/org/testcontainers/client/commandparts/TimeExpression.java rename to modules/pumba/src/main/java/org/testcontainers/client/commandparts/TimeExpression.java diff --git a/modules/chaostesting/src/main/java/org/testcontainers/client/executionmodes/PumbaExecutionMode.java b/modules/pumba/src/main/java/org/testcontainers/client/executionmodes/PumbaExecutionMode.java similarity index 100% rename from modules/chaostesting/src/main/java/org/testcontainers/client/executionmodes/PumbaExecutionMode.java rename to modules/pumba/src/main/java/org/testcontainers/client/executionmodes/PumbaExecutionMode.java diff --git a/modules/chaostesting/src/main/java/org/testcontainers/client/executionmodes/PumbaExecutionModes.java b/modules/pumba/src/main/java/org/testcontainers/client/executionmodes/PumbaExecutionModes.java similarity index 100% rename from modules/chaostesting/src/main/java/org/testcontainers/client/executionmodes/PumbaExecutionModes.java rename to modules/pumba/src/main/java/org/testcontainers/client/executionmodes/PumbaExecutionModes.java diff --git a/modules/chaostesting/src/main/java/org/testcontainers/client/targets/PumbaTarget.java b/modules/pumba/src/main/java/org/testcontainers/client/targets/PumbaTarget.java similarity index 100% rename from modules/chaostesting/src/main/java/org/testcontainers/client/targets/PumbaTarget.java rename to modules/pumba/src/main/java/org/testcontainers/client/targets/PumbaTarget.java diff --git a/modules/chaostesting/src/main/java/org/testcontainers/client/targets/PumbaTargets.java b/modules/pumba/src/main/java/org/testcontainers/client/targets/PumbaTargets.java similarity index 100% rename from modules/chaostesting/src/main/java/org/testcontainers/client/targets/PumbaTargets.java rename to modules/pumba/src/main/java/org/testcontainers/client/targets/PumbaTargets.java diff --git a/modules/chaostesting/src/main/java/org/testcontainers/executables/PumbaContainer.java b/modules/pumba/src/main/java/org/testcontainers/executables/PumbaContainer.java similarity index 96% rename from modules/chaostesting/src/main/java/org/testcontainers/executables/PumbaContainer.java rename to modules/pumba/src/main/java/org/testcontainers/executables/PumbaContainer.java index 37ec5af3c30..9bee869e8ae 100644 --- a/modules/chaostesting/src/main/java/org/testcontainers/executables/PumbaContainer.java +++ b/modules/pumba/src/main/java/org/testcontainers/executables/PumbaContainer.java @@ -5,6 +5,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.SystemUtils; import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.output.Slf4jLogConsumer; import org.testcontainers.containers.startupcheck.StartupCheckStrategy; import org.testcontainers.images.RemoteDockerImage; import org.testcontainers.images.builder.ImageFromDockerfile; @@ -48,7 +49,7 @@ private void fetchIPRouteImage() { } private void setupLogging() { - withLogConsumer(frame -> log.debug("Pumba container: \"{}\"", frame.getUtf8String())); + withLogConsumer(new Slf4jLogConsumer(log)); } private static ImageFromDockerfile buildPumbaDockerImage() { diff --git a/modules/chaostesting/src/main/java/org/testcontainers/executables/PumbaExecutables.java b/modules/pumba/src/main/java/org/testcontainers/executables/PumbaExecutables.java similarity index 100% rename from modules/chaostesting/src/main/java/org/testcontainers/executables/PumbaExecutables.java rename to modules/pumba/src/main/java/org/testcontainers/executables/PumbaExecutables.java diff --git a/modules/chaostesting/src/main/java/org/testcontainers/executables/TestcontainersExecutable.java b/modules/pumba/src/main/java/org/testcontainers/executables/TestcontainersExecutable.java similarity index 100% rename from modules/chaostesting/src/main/java/org/testcontainers/executables/TestcontainersExecutable.java rename to modules/pumba/src/main/java/org/testcontainers/executables/TestcontainersExecutable.java diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/CanSpawnContainers.java b/modules/pumba/src/test/java/org/testcontainers/test/CanSpawnContainers.java similarity index 100% rename from modules/chaostesting/src/test/java/org/testcontainers/test/CanSpawnContainers.java rename to modules/pumba/src/test/java/org/testcontainers/test/CanSpawnContainers.java diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/Container.java b/modules/pumba/src/test/java/org/testcontainers/test/Container.java similarity index 100% rename from modules/chaostesting/src/test/java/org/testcontainers/test/Container.java rename to modules/pumba/src/test/java/org/testcontainers/test/Container.java diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/DelayingOutgoingPacketsTest.java b/modules/pumba/src/test/java/org/testcontainers/test/DelayingOutgoingPacketsTest.java similarity index 95% rename from modules/chaostesting/src/test/java/org/testcontainers/test/DelayingOutgoingPacketsTest.java rename to modules/pumba/src/test/java/org/testcontainers/test/DelayingOutgoingPacketsTest.java index db25d35d941..4d551890244 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/DelayingOutgoingPacketsTest.java +++ b/modules/pumba/src/test/java/org/testcontainers/test/DelayingOutgoingPacketsTest.java @@ -2,15 +2,15 @@ import org.junit.Before; import org.junit.Test; -import org.testcontainers.executables.PumbaExecutables; import org.testcontainers.client.PumbaClient; import org.testcontainers.client.PumbaClients; import org.testcontainers.client.commandparts.SupportedTimeUnit; +import org.testcontainers.executables.PumbaExecutables; import org.testcontainers.test.Pinger.PingResponse; -import static com.jayway.awaitility.Awaitility.await; import static java.util.concurrent.TimeUnit.SECONDS; import static org.assertj.core.api.Assertions.assertThat; +import static org.awaitility.Awaitility.await; import static org.testcontainers.client.actions.networkactions.NetworkActions.networkAction; import static org.testcontainers.client.actions.networkactions.NetworkSubCommands.delayOutgoingPackets; import static org.testcontainers.client.executionmodes.PumbaExecutionModes.onlyOnce; @@ -48,7 +48,7 @@ public void should_be_able_to_delay_outgoing_packets_from_container() throws Exc .execute(onlyOnce().onAllChosenContainers()); // then - await().atMost(30, SECONDS).until(() -> { + await().atMost(30, SECONDS).untilAsserted(() -> { final PingResponse ping = pinger.ping(aContainer); assertThat(ping.latencyInMilliseconds()).isGreaterThanOrEqualTo(450); }); diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/DockerEnvironment.java b/modules/pumba/src/test/java/org/testcontainers/test/DockerEnvironment.java similarity index 100% rename from modules/chaostesting/src/test/java/org/testcontainers/test/DockerEnvironment.java rename to modules/pumba/src/test/java/org/testcontainers/test/DockerEnvironment.java diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/DroppingPacketsTest.java b/modules/pumba/src/test/java/org/testcontainers/test/DroppingPacketsTest.java similarity index 95% rename from modules/chaostesting/src/test/java/org/testcontainers/test/DroppingPacketsTest.java rename to modules/pumba/src/test/java/org/testcontainers/test/DroppingPacketsTest.java index 22190c11c62..ff42b5423cb 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/DroppingPacketsTest.java +++ b/modules/pumba/src/test/java/org/testcontainers/test/DroppingPacketsTest.java @@ -2,15 +2,15 @@ import org.junit.Before; import org.junit.Test; -import org.testcontainers.executables.PumbaExecutables; import org.testcontainers.client.PumbaClient; import org.testcontainers.client.PumbaClients; import org.testcontainers.client.commandparts.SupportedTimeUnit; +import org.testcontainers.executables.PumbaExecutables; import org.testcontainers.test.Pinger.PingResponse; -import static com.jayway.awaitility.Awaitility.await; import static java.util.concurrent.TimeUnit.SECONDS; import static org.assertj.core.api.Assertions.assertThat; +import static org.awaitility.Awaitility.await; import static org.testcontainers.client.actions.networkactions.NetworkActions.networkAction; import static org.testcontainers.client.actions.networkactions.NetworkSubCommands.lossOutgoingPackets; import static org.testcontainers.client.executionmodes.PumbaExecutionModes.onlyOnce; @@ -49,7 +49,7 @@ public void should_be_able_to_drop_outgoing_packets_with_bernoulli_model() throw .execute(onlyOnce().onAllChosenContainers()); // then - await().atMost(30, SECONDS).until(() -> { + await().atMost(30, SECONDS).untilAsserted(() -> { final PingResponse pingResponse = pinger.ping(aContainer); assertThat(pingResponse.packetLost()).isTrue(); }); @@ -78,7 +78,7 @@ public void should_be_able_to_drop_outgoing_packets_with_markov_model() throws E .execute(onlyOnce().onAllChosenContainers()); // then - await().atMost(30, SECONDS).until(() -> { + await().atMost(30, SECONDS).untilAsserted(() -> { final PingResponse pingResponse = pinger.ping(aContainer); assertThat(pingResponse.packetLost()).isTrue(); }); @@ -104,7 +104,7 @@ public void should_be_able_to_drop_outgoing_packets_with_gilbert_elliot_model() .execute(onlyOnce().onAllChosenContainers()); // then - await().atMost(30, SECONDS).until(() -> { + await().atMost(30, SECONDS).untilAsserted(() -> { final PingResponse pingResponse = pinger.ping(aContainer); assertThat(pingResponse.packetLost()).isTrue(); }); diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/KillingContainersTest.java b/modules/pumba/src/test/java/org/testcontainers/test/KillingContainersTest.java similarity index 93% rename from modules/chaostesting/src/test/java/org/testcontainers/test/KillingContainersTest.java rename to modules/pumba/src/test/java/org/testcontainers/test/KillingContainersTest.java index 1c871d2f277..3ffeda037a1 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/KillingContainersTest.java +++ b/modules/pumba/src/test/java/org/testcontainers/test/KillingContainersTest.java @@ -2,11 +2,11 @@ import org.junit.Before; import org.junit.Test; -import org.testcontainers.executables.PumbaExecutables; import org.testcontainers.client.PumbaClient; import org.testcontainers.client.PumbaClients; import org.testcontainers.client.commandparts.SupportedTimeUnit; import org.testcontainers.containers.GenericContainer; +import org.testcontainers.executables.PumbaExecutables; import java.util.Collection; import java.util.UUID; @@ -14,8 +14,8 @@ import java.util.function.Predicate; import java.util.regex.Pattern; -import static com.jayway.awaitility.Awaitility.await; import static org.assertj.core.api.Assertions.assertThat; +import static org.awaitility.Awaitility.await; import static org.testcontainers.client.actions.containeractions.ContainerActions.killContainers; import static org.testcontainers.client.executionmodes.PumbaExecutionModes.onlyOnce; import static org.testcontainers.client.executionmodes.PumbaExecutionModes.recurrently; @@ -49,7 +49,7 @@ public void should_kill_single_container() throws Exception { .execute(onlyOnce().onAllChosenContainers()); // then - await().atMost(30, TimeUnit.SECONDS).until(() -> { + await().atMost(30, TimeUnit.SECONDS).untilAsserted(() -> { final Collection namesOfRunningContainers = environment.namesOfRunningContainers(); assertThat(namesOfRunningContainers).doesNotContain(containerToKill.getContainerName()); @@ -71,7 +71,7 @@ public void should_kill_more_than_one_containers() throws Exception { .execute(onlyOnce().onAllChosenContainers()); // then - await().atMost(30, TimeUnit.SECONDS).until(() -> { + await().atMost(30, TimeUnit.SECONDS).untilAsserted(() -> { final Collection namesOfRunningContainers = environment.namesOfRunningContainers(); assertThat(namesOfRunningContainers).doesNotContain(firstVictim.getContainerName(), secondVictim.getContainerName()); @@ -93,7 +93,7 @@ public void should_kill_containers_matching_regular_expression() throws Exceptio .execute(onlyOnce().onAllChosenContainers()); // then - await().atMost(30, TimeUnit.SECONDS).until(() -> { + await().atMost(30, TimeUnit.SECONDS).untilAsserted(() -> { final Collection namesOfRunningContainers = environment.namesOfRunningContainers(); assertThat(namesOfRunningContainers).filteredOn(matchesRegexp("foobar.*")).isEmpty(); @@ -114,14 +114,14 @@ public void should_kill_one_random_container_periodically() throws Exception { .execute(recurrently(5, SupportedTimeUnit.SECONDS).onRandomlyChosenContainer()); // then - await().atMost(5, TimeUnit.SECONDS).until(() -> + await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> assertThat(environment.namesOfRunningContainers()) .filteredOn(matchesRegexp("foobar.*")) .hasSize(1) ); // and - await().atMost(10, TimeUnit.SECONDS).until(() -> + await().atMost(10, TimeUnit.SECONDS).untilAsserted(() -> assertThat(environment.namesOfRunningContainers()) .filteredOn(matchesRegexp("foobar.*")) .isEmpty() diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/PausingContainersTest.java b/modules/pumba/src/test/java/org/testcontainers/test/PausingContainersTest.java similarity index 91% rename from modules/chaostesting/src/test/java/org/testcontainers/test/PausingContainersTest.java rename to modules/pumba/src/test/java/org/testcontainers/test/PausingContainersTest.java index fac9f991c3e..aa4c1fad800 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/PausingContainersTest.java +++ b/modules/pumba/src/test/java/org/testcontainers/test/PausingContainersTest.java @@ -2,17 +2,17 @@ import org.junit.Before; import org.junit.Test; -import org.testcontainers.executables.PumbaExecutables; import org.testcontainers.client.PumbaClient; import org.testcontainers.client.PumbaClients; import org.testcontainers.client.commandparts.SupportedTimeUnit; import org.testcontainers.containers.GenericContainer; +import org.testcontainers.executables.PumbaExecutables; import org.testcontainers.test.DockerEnvironment.ContainerDetails; import java.util.concurrent.TimeUnit; -import static com.jayway.awaitility.Awaitility.await; import static org.assertj.core.api.Assertions.assertThat; +import static org.awaitility.Awaitility.await; import static org.testcontainers.client.actions.containeractions.ContainerActions.pauseContainers; import static org.testcontainers.client.executionmodes.PumbaExecutionModes.onlyOnce; import static org.testcontainers.client.targets.PumbaTargets.containers; @@ -43,12 +43,12 @@ public void should_pause_single_container() throws Exception { .execute(onlyOnce().onAllChosenContainers()); // then - await().atMost(1, TimeUnit.SECONDS).until(() -> { + await().atMost(1, TimeUnit.SECONDS).untilAsserted(() -> { final ContainerDetails container = environment.containerDetails(containerToPause.getContainerId()); assertThat(container.isPaused()).isTrue(); }); - await().atMost(1, TimeUnit.SECONDS).until(() -> { + await().atMost(1, TimeUnit.SECONDS).untilAsserted(() -> { final ContainerDetails container = environment.containerDetails(containerToPause.getContainerId()); assertThat(container.isPaused()).isFalse(); }); diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/Pinger.java b/modules/pumba/src/test/java/org/testcontainers/test/Pinger.java similarity index 100% rename from modules/chaostesting/src/test/java/org/testcontainers/test/Pinger.java rename to modules/pumba/src/test/java/org/testcontainers/test/Pinger.java diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/RateLimitingOutgoingPacketsTest.java b/modules/pumba/src/test/java/org/testcontainers/test/RateLimitingOutgoingPacketsTest.java similarity index 95% rename from modules/chaostesting/src/test/java/org/testcontainers/test/RateLimitingOutgoingPacketsTest.java rename to modules/pumba/src/test/java/org/testcontainers/test/RateLimitingOutgoingPacketsTest.java index 8324e010813..af7fe394432 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/RateLimitingOutgoingPacketsTest.java +++ b/modules/pumba/src/test/java/org/testcontainers/test/RateLimitingOutgoingPacketsTest.java @@ -2,15 +2,15 @@ import org.junit.Before; import org.junit.Test; -import org.testcontainers.executables.PumbaExecutables; import org.testcontainers.client.PumbaClient; import org.testcontainers.client.PumbaClients; import org.testcontainers.client.commandparts.SupportedTimeUnit; +import org.testcontainers.executables.PumbaExecutables; import org.testcontainers.test.Pinger.PingResponse; -import static com.jayway.awaitility.Awaitility.await; import static java.util.concurrent.TimeUnit.SECONDS; import static org.assertj.core.api.Assertions.assertThat; +import static org.awaitility.Awaitility.await; import static org.testcontainers.client.actions.networkactions.NetworkActions.networkAction; import static org.testcontainers.client.actions.networkactions.NetworkSubCommands.rateLimitOutgoingTraffic; import static org.testcontainers.client.actions.networkactions.RateLimitOutgoingTraffic.RateUnit.KILOBITS_PER_SECOND; @@ -49,7 +49,7 @@ public void should_be_able_to_rate_limit_outgoing_packets_from_container() throw .execute(onlyOnce().onAllChosenContainers()); // then - await().atMost(30, SECONDS).until(() -> { + await().atMost(30, SECONDS).untilAsserted(() -> { final PingResponse pingResponse = pinger.ping(containerToRateLimit, 117); assertThat(pingResponse.latencyInMilliseconds()).isGreaterThan(1000); }); diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/RemovingContainerTest.java b/modules/pumba/src/test/java/org/testcontainers/test/RemovingContainerTest.java similarity index 93% rename from modules/chaostesting/src/test/java/org/testcontainers/test/RemovingContainerTest.java rename to modules/pumba/src/test/java/org/testcontainers/test/RemovingContainerTest.java index 4ecd1c7144e..75370e98d6f 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/RemovingContainerTest.java +++ b/modules/pumba/src/test/java/org/testcontainers/test/RemovingContainerTest.java @@ -2,15 +2,15 @@ import org.junit.Before; import org.junit.Test; -import org.testcontainers.executables.PumbaExecutables; import org.testcontainers.client.PumbaClient; import org.testcontainers.client.PumbaClients; import org.testcontainers.containers.GenericContainer; +import org.testcontainers.executables.PumbaExecutables; import java.util.concurrent.TimeUnit; -import static com.jayway.awaitility.Awaitility.await; import static org.assertj.core.api.Assertions.assertThat; +import static org.awaitility.Awaitility.await; import static org.testcontainers.client.actions.containeractions.ContainerActions.removeContainers; import static org.testcontainers.client.executionmodes.PumbaExecutionModes.onlyOnce; import static org.testcontainers.client.targets.PumbaTargets.containers; @@ -42,7 +42,7 @@ public void should_remove_running_container() throws Exception { .execute(onlyOnce().onAllChosenContainers()); // then - await().atMost(30, TimeUnit.SECONDS).until(() -> + await().atMost(30, TimeUnit.SECONDS).untilAsserted(() -> assertThat(environment.namesOfAllContainers()) .doesNotContain(containerToRemove.getContainerName()) ); diff --git a/modules/chaostesting/src/test/java/org/testcontainers/test/StoppingContainerTest.java b/modules/pumba/src/test/java/org/testcontainers/test/StoppingContainerTest.java similarity index 93% rename from modules/chaostesting/src/test/java/org/testcontainers/test/StoppingContainerTest.java rename to modules/pumba/src/test/java/org/testcontainers/test/StoppingContainerTest.java index 84b4fed055c..997d56e8ac7 100644 --- a/modules/chaostesting/src/test/java/org/testcontainers/test/StoppingContainerTest.java +++ b/modules/pumba/src/test/java/org/testcontainers/test/StoppingContainerTest.java @@ -2,17 +2,17 @@ import org.junit.Before; import org.junit.Test; -import org.testcontainers.executables.PumbaExecutables; import org.testcontainers.client.PumbaClient; import org.testcontainers.client.PumbaClients; import org.testcontainers.client.actions.containeractions.ContainerActions; import org.testcontainers.containers.GenericContainer; +import org.testcontainers.executables.PumbaExecutables; import org.testcontainers.test.DockerEnvironment.ContainerDetails; import java.util.concurrent.TimeUnit; -import static com.jayway.awaitility.Awaitility.await; import static org.assertj.core.api.Assertions.assertThat; +import static org.awaitility.Awaitility.await; import static org.testcontainers.client.executionmodes.PumbaExecutionModes.onlyOnce; import static org.testcontainers.client.targets.PumbaTargets.containers; @@ -42,7 +42,7 @@ public void should_stop_single_container() throws Exception { .execute(onlyOnce().onAllChosenContainers()); // then - await().atMost(30, TimeUnit.SECONDS).until(() -> { + await().atMost(30, TimeUnit.SECONDS).untilAsserted(() -> { final ContainerDetails container = environment.containerDetails(containerToStop.getContainerId()); assertThat(container.isRunning()).isFalse(); }); diff --git a/modules/chaostesting/src/test/resources/logback-test.xml b/modules/pumba/src/test/resources/logback-test.xml similarity index 100% rename from modules/chaostesting/src/test/resources/logback-test.xml rename to modules/pumba/src/test/resources/logback-test.xml From 2b05ca3fa267d639fbb10df207ae8856c5e41bbe Mon Sep 17 00:00:00 2001 From: Slawomir Nowak Date: Sat, 19 May 2018 17:12:42 +0200 Subject: [PATCH 30/32] PR comments - got rid of custom duration class --- .../containeractions/PauseContainers.java | 9 ++-- .../networkactions/DelayOutgoingPackets.java | 24 ++++----- .../networkactions/NetworkActions.java | 18 +++---- .../commandparts/SupportedTimeUnit.java | 52 ------------------- .../client/commandparts/TimeExpression.java | 20 +++---- .../executionmodes/PumbaExecutionModes.java | 9 ++-- .../test/DelayingOutgoingPacketsTest.java | 7 +-- .../test/DroppingPacketsTest.java | 9 ++-- .../test/KillingContainersTest.java | 4 +- .../test/PausingContainersTest.java | 4 +- .../test/RateLimitingOutgoingPacketsTest.java | 5 +- 11 files changed, 53 insertions(+), 108 deletions(-) delete mode 100644 modules/pumba/src/main/java/org/testcontainers/client/commandparts/SupportedTimeUnit.java diff --git a/modules/pumba/src/main/java/org/testcontainers/client/actions/containeractions/PauseContainers.java b/modules/pumba/src/main/java/org/testcontainers/client/actions/containeractions/PauseContainers.java index 07e873b7d44..56eaf4445e7 100644 --- a/modules/pumba/src/main/java/org/testcontainers/client/actions/containeractions/PauseContainers.java +++ b/modules/pumba/src/main/java/org/testcontainers/client/actions/containeractions/PauseContainers.java @@ -3,19 +3,20 @@ import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.testcontainers.client.commandparts.PumbaCommandPart; -import org.testcontainers.client.commandparts.SupportedTimeUnit; import org.testcontainers.client.commandparts.TimeExpression; +import java.time.Duration; + /** * Created by novy on 17.01.17. */ @NoArgsConstructor(access = AccessLevel.PACKAGE) public class PauseContainers implements ContainerAction { - private TimeExpression duration = TimeExpression.of(15, SupportedTimeUnit.SECONDS); + private TimeExpression duration = TimeExpression.of(Duration.ofSeconds(15)); - public PauseContainers forDuration(long duration, SupportedTimeUnit unit) { - this.duration = TimeExpression.of(duration, unit); + public PauseContainers forDuration(Duration duration) { + this.duration = TimeExpression.of(duration); return this; } diff --git a/modules/pumba/src/main/java/org/testcontainers/client/actions/networkactions/DelayOutgoingPackets.java b/modules/pumba/src/main/java/org/testcontainers/client/actions/networkactions/DelayOutgoingPackets.java index 5edef207042..8b7cdc4c112 100644 --- a/modules/pumba/src/main/java/org/testcontainers/client/actions/networkactions/DelayOutgoingPackets.java +++ b/modules/pumba/src/main/java/org/testcontainers/client/actions/networkactions/DelayOutgoingPackets.java @@ -3,9 +3,9 @@ import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.testcontainers.client.commandparts.PumbaCommandPart; -import org.testcontainers.client.commandparts.SupportedTimeUnit; import org.testcontainers.client.commandparts.TimeExpression; +import java.time.Duration; import java.util.Optional; /** @@ -13,18 +13,18 @@ */ @NoArgsConstructor(access = AccessLevel.PACKAGE) public class DelayOutgoingPackets implements NetworkSubCommands.NetworkSubCommand { - private TimeExpression delayTime = TimeExpression.of(100, SupportedTimeUnit.MILLISECONDS); - private TimeExpression jitter = TimeExpression.of(10, SupportedTimeUnit.MILLISECONDS); + private TimeExpression delayTime = TimeExpression.of(Duration.ofMillis(100)); + private TimeExpression jitter = TimeExpression.of(Duration.ofMillis(10)); private int correlation = 20; private Distribution distribution = Distribution.NO_DISTRIBUTION; - public DelayOutgoingPackets delayFor(int time, SupportedTimeUnit unit) { - this.delayTime = TimeExpression.of(time, unit); + public DelayOutgoingPackets delayFor(Duration duration) { + this.delayTime = TimeExpression.of(duration); return this; } - public DelayOutgoingPackets withJitter(int time, SupportedTimeUnit unit) { - this.jitter = TimeExpression.of(time, unit); + public DelayOutgoingPackets withJitter(Duration duration) { + this.jitter = TimeExpression.of(duration); return this; } @@ -62,11 +62,11 @@ private PumbaCommandPart distributionPart() { @Override public String evaluate() { return delayCommandPart() - .append(delayTimePart()) - .append(jitterPart()) - .append(correlationPart()) - .append(distributionPart()) - .evaluate(); + .append(delayTimePart()) + .append(jitterPart()) + .append(correlationPart()) + .append(distributionPart()) + .evaluate(); } public enum Distribution { diff --git a/modules/pumba/src/main/java/org/testcontainers/client/actions/networkactions/NetworkActions.java b/modules/pumba/src/main/java/org/testcontainers/client/actions/networkactions/NetworkActions.java index ec84e769d99..3590fe673fa 100644 --- a/modules/pumba/src/main/java/org/testcontainers/client/actions/networkactions/NetworkActions.java +++ b/modules/pumba/src/main/java/org/testcontainers/client/actions/networkactions/NetworkActions.java @@ -3,9 +3,9 @@ import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.testcontainers.client.commandparts.PumbaCommandPart; -import org.testcontainers.client.commandparts.SupportedTimeUnit; import org.testcontainers.client.commandparts.TimeExpression; +import java.time.Duration; import java.util.Optional; /** @@ -20,12 +20,12 @@ public static NetworkActionWithSubCommand networkAction() { public static class NetworkActionWithSubCommand { - private TimeExpression duration = TimeExpression.of(1, SupportedTimeUnit.MINUTES); + private TimeExpression duration = TimeExpression.of(Duration.ofMinutes(1)); private String networkInterface = "eth0"; private String targetIP; - public NetworkActionWithSubCommand lastingFor(int time, SupportedTimeUnit unit) { - this.duration = TimeExpression.of(time, unit); + public NetworkActionWithSubCommand lastingFor(Duration duration) { + this.duration = TimeExpression.of(duration); return this; } @@ -41,11 +41,11 @@ public NetworkActionWithSubCommand onTrafficTo(String targetIP) { public NetworkAction executeSubCommand(NetworkSubCommands.NetworkSubCommand subCommand) { return () -> netemPart() - .append(durationPart()) - .append(interfacePart()) - .append(trafficFilterPart()) - .append(subCommand) - .evaluate(); + .append(durationPart()) + .append(interfacePart()) + .append(trafficFilterPart()) + .append(subCommand) + .evaluate(); } private PumbaCommandPart netemPart() { diff --git a/modules/pumba/src/main/java/org/testcontainers/client/commandparts/SupportedTimeUnit.java b/modules/pumba/src/main/java/org/testcontainers/client/commandparts/SupportedTimeUnit.java deleted file mode 100644 index dd311e228f3..00000000000 --- a/modules/pumba/src/main/java/org/testcontainers/client/commandparts/SupportedTimeUnit.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.testcontainers.client.commandparts; - -/** - * Created by novy on 01.01.17. - */ -public enum SupportedTimeUnit { - MILLISECONDS { - @Override - String abbreviation() { - return "ms"; - } - - @Override - long millisecondsMultiplier() { - return 1; - } - }, SECONDS { - @Override - String abbreviation() { - return "s"; - } - - @Override - long millisecondsMultiplier() { - return 1000; - } - }, MINUTES { - @Override - String abbreviation() { - return "m"; - } - - @Override - long millisecondsMultiplier() { - return 60_000; - } - }, HOURS { - @Override - String abbreviation() { - return "h"; - } - - @Override - long millisecondsMultiplier() { - return 3_600_000; - } - }; - - abstract String abbreviation(); - - abstract long millisecondsMultiplier(); -} diff --git a/modules/pumba/src/main/java/org/testcontainers/client/commandparts/TimeExpression.java b/modules/pumba/src/main/java/org/testcontainers/client/commandparts/TimeExpression.java index 7c7b6f98e8d..28f5330215b 100644 --- a/modules/pumba/src/main/java/org/testcontainers/client/commandparts/TimeExpression.java +++ b/modules/pumba/src/main/java/org/testcontainers/client/commandparts/TimeExpression.java @@ -1,31 +1,23 @@ package org.testcontainers.client.commandparts; -import lombok.AccessLevel; import lombok.RequiredArgsConstructor; +import java.time.Duration; + /** * Created by novy on 01.01.17. */ -@RequiredArgsConstructor(access = AccessLevel.PRIVATE) +@RequiredArgsConstructor(staticName = "of") public class TimeExpression implements PumbaCommandPart { - private final long value; - private final SupportedTimeUnit unit; - - public static TimeExpression of(int value, SupportedTimeUnit unit) { - return new TimeExpression(value, unit); - } - - public static TimeExpression of(long value, SupportedTimeUnit unit) { - return new TimeExpression(value, unit); - } + private final Duration duration; @Override public String evaluate() { - return value + unit.abbreviation(); + return asMilliseconds() + "ms"; } public long asMilliseconds() { - return value * unit.millisecondsMultiplier(); + return duration.toMillis(); } } diff --git a/modules/pumba/src/main/java/org/testcontainers/client/executionmodes/PumbaExecutionModes.java b/modules/pumba/src/main/java/org/testcontainers/client/executionmodes/PumbaExecutionModes.java index c3a626c3d00..e924f748c7a 100644 --- a/modules/pumba/src/main/java/org/testcontainers/client/executionmodes/PumbaExecutionModes.java +++ b/modules/pumba/src/main/java/org/testcontainers/client/executionmodes/PumbaExecutionModes.java @@ -4,9 +4,10 @@ import lombok.NoArgsConstructor; import lombok.RequiredArgsConstructor; import org.testcontainers.client.commandparts.PumbaCommandPart; -import org.testcontainers.client.commandparts.SupportedTimeUnit; import org.testcontainers.client.commandparts.TimeExpression; +import java.time.Duration; + /** * Created by novy on 01.01.17. */ @@ -15,13 +16,13 @@ public final class PumbaExecutionModes { public static WithSchedule onlyOnce() { return new WithSchedule( - () -> "" + () -> "" ); } - public static WithSchedule recurrently(int time, SupportedTimeUnit unit) { + public static WithSchedule recurrently(Duration duration) { return new WithSchedule( - () -> "--interval " + TimeExpression.of(time, unit).evaluate() + () -> "--interval " + TimeExpression.of(duration).evaluate() ); } diff --git a/modules/pumba/src/test/java/org/testcontainers/test/DelayingOutgoingPacketsTest.java b/modules/pumba/src/test/java/org/testcontainers/test/DelayingOutgoingPacketsTest.java index 4d551890244..e1e0fb986b7 100644 --- a/modules/pumba/src/test/java/org/testcontainers/test/DelayingOutgoingPacketsTest.java +++ b/modules/pumba/src/test/java/org/testcontainers/test/DelayingOutgoingPacketsTest.java @@ -4,10 +4,11 @@ import org.junit.Test; import org.testcontainers.client.PumbaClient; import org.testcontainers.client.PumbaClients; -import org.testcontainers.client.commandparts.SupportedTimeUnit; import org.testcontainers.executables.PumbaExecutables; import org.testcontainers.test.Pinger.PingResponse; +import java.time.Duration; + import static java.util.concurrent.TimeUnit.SECONDS; import static org.assertj.core.api.Assertions.assertThat; import static org.awaitility.Awaitility.await; @@ -38,10 +39,10 @@ public void should_be_able_to_delay_outgoing_packets_from_container() throws Exc // when pumba .performNetworkChaos(networkAction() - .lastingFor(30, SupportedTimeUnit.SECONDS) + .lastingFor(Duration.ofSeconds(30)) .executeSubCommand( delayOutgoingPackets() - .delayFor(500, SupportedTimeUnit.MILLISECONDS) + .delayFor(Duration.ofMillis(500)) ) ) .affect(containers(aContainer.getContainerName())) diff --git a/modules/pumba/src/test/java/org/testcontainers/test/DroppingPacketsTest.java b/modules/pumba/src/test/java/org/testcontainers/test/DroppingPacketsTest.java index ff42b5423cb..4d015a0c789 100644 --- a/modules/pumba/src/test/java/org/testcontainers/test/DroppingPacketsTest.java +++ b/modules/pumba/src/test/java/org/testcontainers/test/DroppingPacketsTest.java @@ -4,10 +4,11 @@ import org.junit.Test; import org.testcontainers.client.PumbaClient; import org.testcontainers.client.PumbaClients; -import org.testcontainers.client.commandparts.SupportedTimeUnit; import org.testcontainers.executables.PumbaExecutables; import org.testcontainers.test.Pinger.PingResponse; +import java.time.Duration; + import static java.util.concurrent.TimeUnit.SECONDS; import static org.assertj.core.api.Assertions.assertThat; import static org.awaitility.Awaitility.await; @@ -38,7 +39,7 @@ public void should_be_able_to_drop_outgoing_packets_with_bernoulli_model() throw // when pumba .performNetworkChaos(networkAction() - .lastingFor(30, SupportedTimeUnit.SECONDS) + .lastingFor(Duration.ofSeconds(30)) .executeSubCommand( lossOutgoingPackets() .accordingToBernoulliModel() @@ -63,7 +64,7 @@ public void should_be_able_to_drop_outgoing_packets_with_markov_model() throws E // when pumba .performNetworkChaos(networkAction() - .lastingFor(30, SupportedTimeUnit.SECONDS) + .lastingFor(Duration.ofSeconds(30)) .executeSubCommand( lossOutgoingPackets() .accordingToMarkovModel() @@ -92,7 +93,7 @@ public void should_be_able_to_drop_outgoing_packets_with_gilbert_elliot_model() // when pumba .performNetworkChaos(networkAction() - .lastingFor(30, SupportedTimeUnit.SECONDS) + .lastingFor(Duration.ofSeconds(30)) .executeSubCommand( lossOutgoingPackets() .accordingToGilbertElliotModel() diff --git a/modules/pumba/src/test/java/org/testcontainers/test/KillingContainersTest.java b/modules/pumba/src/test/java/org/testcontainers/test/KillingContainersTest.java index 3ffeda037a1..b8cbfe1484d 100644 --- a/modules/pumba/src/test/java/org/testcontainers/test/KillingContainersTest.java +++ b/modules/pumba/src/test/java/org/testcontainers/test/KillingContainersTest.java @@ -4,10 +4,10 @@ import org.junit.Test; import org.testcontainers.client.PumbaClient; import org.testcontainers.client.PumbaClients; -import org.testcontainers.client.commandparts.SupportedTimeUnit; import org.testcontainers.containers.GenericContainer; import org.testcontainers.executables.PumbaExecutables; +import java.time.Duration; import java.util.Collection; import java.util.UUID; import java.util.concurrent.TimeUnit; @@ -111,7 +111,7 @@ public void should_kill_one_random_container_periodically() throws Exception { pumba .performContainerChaos(killContainers()) .affect(containersMatchingRegexp("foobar.*")) - .execute(recurrently(5, SupportedTimeUnit.SECONDS).onRandomlyChosenContainer()); + .execute(recurrently(Duration.ofSeconds(5)).onRandomlyChosenContainer()); // then await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> diff --git a/modules/pumba/src/test/java/org/testcontainers/test/PausingContainersTest.java b/modules/pumba/src/test/java/org/testcontainers/test/PausingContainersTest.java index aa4c1fad800..ac4bea8941c 100644 --- a/modules/pumba/src/test/java/org/testcontainers/test/PausingContainersTest.java +++ b/modules/pumba/src/test/java/org/testcontainers/test/PausingContainersTest.java @@ -4,11 +4,11 @@ import org.junit.Test; import org.testcontainers.client.PumbaClient; import org.testcontainers.client.PumbaClients; -import org.testcontainers.client.commandparts.SupportedTimeUnit; import org.testcontainers.containers.GenericContainer; import org.testcontainers.executables.PumbaExecutables; import org.testcontainers.test.DockerEnvironment.ContainerDetails; +import java.time.Duration; import java.util.concurrent.TimeUnit; import static org.assertj.core.api.Assertions.assertThat; @@ -38,7 +38,7 @@ public void should_pause_single_container() throws Exception { // when pumba - .performContainerChaos(pauseContainers().forDuration(1, SupportedTimeUnit.SECONDS)) + .performContainerChaos(pauseContainers().forDuration(Duration.ofSeconds(1))) .affect(containers(containerToPause.getContainerName())) .execute(onlyOnce().onAllChosenContainers()); diff --git a/modules/pumba/src/test/java/org/testcontainers/test/RateLimitingOutgoingPacketsTest.java b/modules/pumba/src/test/java/org/testcontainers/test/RateLimitingOutgoingPacketsTest.java index af7fe394432..a34b309ac2b 100644 --- a/modules/pumba/src/test/java/org/testcontainers/test/RateLimitingOutgoingPacketsTest.java +++ b/modules/pumba/src/test/java/org/testcontainers/test/RateLimitingOutgoingPacketsTest.java @@ -4,10 +4,11 @@ import org.junit.Test; import org.testcontainers.client.PumbaClient; import org.testcontainers.client.PumbaClients; -import org.testcontainers.client.commandparts.SupportedTimeUnit; import org.testcontainers.executables.PumbaExecutables; import org.testcontainers.test.Pinger.PingResponse; +import java.time.Duration; + import static java.util.concurrent.TimeUnit.SECONDS; import static org.assertj.core.api.Assertions.assertThat; import static org.awaitility.Awaitility.await; @@ -40,7 +41,7 @@ public void should_be_able_to_rate_limit_outgoing_packets_from_container() throw pumba .performNetworkChaos( networkAction() - .lastingFor(30, SupportedTimeUnit.SECONDS) + .lastingFor(Duration.ofSeconds(30)) .executeSubCommand( rateLimitOutgoingTraffic().to(1, KILOBITS_PER_SECOND) ) From bb11d955236f323e34cb8e68236ad8791a49d1fe Mon Sep 17 00:00:00 2001 From: Slawomir Nowak Date: Sat, 19 May 2018 17:19:52 +0200 Subject: [PATCH 31/32] PR comments - simplifying docker socket path --- .../org/testcontainers/executables/PumbaContainer.java | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/modules/pumba/src/main/java/org/testcontainers/executables/PumbaContainer.java b/modules/pumba/src/main/java/org/testcontainers/executables/PumbaContainer.java index 9bee869e8ae..7ce3e966923 100644 --- a/modules/pumba/src/main/java/org/testcontainers/executables/PumbaContainer.java +++ b/modules/pumba/src/main/java/org/testcontainers/executables/PumbaContainer.java @@ -3,7 +3,6 @@ import com.github.dockerjava.api.DockerClient; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang.SystemUtils; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.output.Slf4jLogConsumer; import org.testcontainers.containers.startupcheck.StartupCheckStrategy; @@ -22,7 +21,7 @@ class PumbaContainer extends GenericContainer { private static final String PUMBA_DOCKER_IMAGE = "gaiaadm/pumba:0.4.7"; private static final String IP_ROUTE_DOCKER_IMAGE = "gaiadocker/iproute2:3.3"; - private static final String DOCKER_SOCKET_HOST_PATH = "/var/run/docker.sock"; + private static final String DOCKER_SOCKET_HOST_PATH = "//var/run/docker.sock"; private static final String DOCKER_SOCKET_CONTAINER_PATH = "/docker.sock"; PumbaContainer(String pumbaCommandToExecute) { @@ -39,7 +38,7 @@ private void doNotWaitForStartupAtAll() { } private void mountDockerSocket() { - addFileSystemBind(dockerSocketHostPath(), DOCKER_SOCKET_CONTAINER_PATH, READ_WRITE); + addFileSystemBind(DOCKER_SOCKET_HOST_PATH, DOCKER_SOCKET_CONTAINER_PATH, READ_WRITE); addEnv("DOCKER_HOST", String.format("unix://%s", DOCKER_SOCKET_CONTAINER_PATH)); } @@ -63,10 +62,6 @@ private static ImageFromDockerfile buildPumbaDockerImage() { ); } - private static String dockerSocketHostPath() { - return SystemUtils.IS_OS_WINDOWS ? "/" + DOCKER_SOCKET_HOST_PATH : DOCKER_SOCKET_HOST_PATH; - } - private static class FailOnlyOnErrorExitCode extends StartupCheckStrategy { @Override From 5d4712bb8514753b3ca026ff45b38823f4cd164c Mon Sep 17 00:00:00 2001 From: Slawomir Nowak Date: Sat, 19 May 2018 18:31:10 +0200 Subject: [PATCH 32/32] PR comments - simplified code with lombok --- .../networkactions/DroppingPacketsModels.java | 131 ++++++------------ 1 file changed, 42 insertions(+), 89 deletions(-) diff --git a/modules/pumba/src/main/java/org/testcontainers/client/actions/networkactions/DroppingPacketsModels.java b/modules/pumba/src/main/java/org/testcontainers/client/actions/networkactions/DroppingPacketsModels.java index beca21a28f3..325b25e8ab1 100644 --- a/modules/pumba/src/main/java/org/testcontainers/client/actions/networkactions/DroppingPacketsModels.java +++ b/modules/pumba/src/main/java/org/testcontainers/client/actions/networkactions/DroppingPacketsModels.java @@ -1,7 +1,9 @@ package org.testcontainers.client.actions.networkactions; import lombok.AccessLevel; +import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; +import lombok.experimental.Wither; import org.testcontainers.client.commandparts.PumbaCommandPart; /** @@ -24,26 +26,18 @@ public GilbertElliotModel accordingToGilbertElliotModel() { } @NoArgsConstructor(access = AccessLevel.PRIVATE) + @AllArgsConstructor(access = AccessLevel.PRIVATE) + @Wither public static class BernoulliModel implements NetworkSubCommands.NetworkSubCommand { - private double percentageLoss = 0; + private double lossProbability = 0; private double correlation = 0; - public BernoulliModel withLossProbability(double percentageLoss) { - this.percentageLoss = percentageLoss; - return this; - } - - public BernoulliModel withCorrelation(double correlation) { - this.correlation = correlation; - return this; - } - @Override public String evaluate() { return commandPart() - .append(probabilityPart()) - .append(correlationPart()) - .evaluate(); + .append(probabilityPart()) + .append(correlationPart()) + .evaluate(); } private PumbaCommandPart commandPart() { @@ -51,7 +45,7 @@ private PumbaCommandPart commandPart() { } private PumbaCommandPart probabilityPart() { - return () -> "--percent " + percentageLoss; + return () -> "--percent " + lossProbability; } private PumbaCommandPart correlationPart() { @@ -60,47 +54,24 @@ private PumbaCommandPart correlationPart() { } @NoArgsConstructor(access = AccessLevel.PRIVATE) + @AllArgsConstructor(access = AccessLevel.PRIVATE) + @Wither public static class MarkovModel implements NetworkSubCommands.NetworkSubCommand { - private double p13Transition = 0; - private double p31Transition = 100; - private double p32Transition = 0; - private double p23Transition = 100; - private double p14Transition = 0; - - public MarkovModel withProbabilityOfTransitionFromFirstToThirdState(double probability) { - this.p13Transition = probability; - return this; - } - - public MarkovModel withProbabilityOfTransitionFromThirdToFirstState(double probability) { - this.p31Transition = probability; - return this; - } - - public MarkovModel withProbabilityOfTransitionFromThirdToSecondState(double probability) { - this.p32Transition = probability; - return this; - } - - public MarkovModel withProbabilityOfTransitionFromSecondToThirdState(double probability) { - this.p23Transition = probability; - return this; - } - - public MarkovModel withProbabilityOfTransitionFromFirstToForthState(double probability) { - this.p14Transition = probability; - return this; - } + private double probabilityOfTransitionFromFirstToThirdState = 0; + private double probabilityOfTransitionFromThirdToFirstState = 100; + private double probabilityOfTransitionFromThirdToSecondState = 0; + private double probabilityOfTransitionFromSecondToThirdState = 100; + private double probabilityOfTransitionFromFirstToForthState = 0; @Override public String evaluate() { return commandPart() - .append(p13Part()) - .append(p31Part()) - .append(p32Part()) - .append(p23Part()) - .append(p14Part()) - .evaluate(); + .append(p13Part()) + .append(p31Part()) + .append(p32Part()) + .append(p23Part()) + .append(p14Part()) + .evaluate(); } private PumbaCommandPart commandPart() { @@ -108,61 +79,43 @@ private PumbaCommandPart commandPart() { } private PumbaCommandPart p13Part() { - return () -> "--p13 " + p13Transition; + return () -> "--p13 " + probabilityOfTransitionFromFirstToThirdState; } private PumbaCommandPart p31Part() { - return () -> "--p31 " + p31Transition; + return () -> "--p31 " + probabilityOfTransitionFromThirdToFirstState; } private PumbaCommandPart p32Part() { - return () -> "--p32 " + p32Transition; + return () -> "--p32 " + probabilityOfTransitionFromThirdToSecondState; } private PumbaCommandPart p23Part() { - return () -> "--p23 " + p23Transition; + return () -> "--p23 " + probabilityOfTransitionFromSecondToThirdState; } private PumbaCommandPart p14Part() { - return () -> "--p14 " + p14Transition; + return () -> "--p14 " + probabilityOfTransitionFromFirstToForthState; } } @NoArgsConstructor(access = AccessLevel.PRIVATE) + @AllArgsConstructor(access = AccessLevel.PRIVATE) + @Wither public static class GilbertElliotModel implements NetworkSubCommands.NetworkSubCommand { - private double transitionToBadStateProbability = 0; - private double transitionToGoodStateProbability = 100; - private double lossProbabilityInBadState = 100; - private double lossProbabilityInGoodState = 0; - - public GilbertElliotModel withProbabilityOfTransitionToBadState(double probability) { - this.transitionToBadStateProbability = probability; - return this; - } - - public GilbertElliotModel withProbabilityOfTransitionToGoodState(double probability) { - this.transitionToGoodStateProbability = probability; - return this; - } - - public GilbertElliotModel withProbabilityOfPacketLossInBadState(double probability) { - this.lossProbabilityInBadState = probability; - return this; - } - - public GilbertElliotModel withProbabilityOfPacketLossInGoodState(double probability) { - this.lossProbabilityInBadState = probability; - return this; - } + private double probabilityOfTransitionToBadState = 0; + private double probabilityOfTransitionToGoodState = 100; + private double probabilityOfPacketLossInBadState = 100; + private double probabilityOfPacketLossInGoodState = 0; @Override public String evaluate() { return commandPart() - .append(transitionToBadStatePart()) - .append(lossInBadStatePart()) - .append(transitionToGoodStatePart()) - .append(lossInGoodStatePart()) - .evaluate(); + .append(transitionToBadStatePart()) + .append(lossInBadStatePart()) + .append(transitionToGoodStatePart()) + .append(lossInGoodStatePart()) + .evaluate(); } private PumbaCommandPart commandPart() { @@ -170,19 +123,19 @@ private PumbaCommandPart commandPart() { } private PumbaCommandPart transitionToBadStatePart() { - return () -> "--pb " + transitionToBadStateProbability; + return () -> "--pb " + probabilityOfTransitionToBadState; } private PumbaCommandPart transitionToGoodStatePart() { - return () -> "--pg " + transitionToGoodStateProbability; + return () -> "--pg " + probabilityOfTransitionToGoodState; } private PumbaCommandPart lossInBadStatePart() { - return () -> "--one-h " + lossProbabilityInBadState; + return () -> "--one-h " + probabilityOfPacketLossInBadState; } private PumbaCommandPart lossInGoodStatePart() { - return () -> "--one-k " + lossProbabilityInGoodState; + return () -> "--one-k " + probabilityOfPacketLossInGoodState; } } }