diff --git a/dhfs-parent/dhfs-app/src/test/java/com/usatiuk/dhfs/integration/KillIT.java b/dhfs-parent/dhfs-app/src/test/java/com/usatiuk/dhfs/integration/KillIT.java index 55e9babd..0b9ea84c 100644 --- a/dhfs-parent/dhfs-app/src/test/java/com/usatiuk/dhfs/integration/KillIT.java +++ b/dhfs-parent/dhfs-app/src/test/java/com/usatiuk/dhfs/integration/KillIT.java @@ -18,10 +18,7 @@ import java.nio.file.Files; import java.time.Duration; import java.util.Objects; import java.util.UUID; -import java.util.concurrent.CyclicBarrier; -import java.util.concurrent.Executors; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; +import java.util.concurrent.*; import java.util.stream.Stream; import static org.awaitility.Awaitility.await; @@ -39,12 +36,18 @@ public class KillIT { File data1; File data2; + Network network; + + ExecutorService executor; + @BeforeEach void setup(TestInfo testInfo) throws IOException, InterruptedException, TimeoutException { + executor = Executors.newCachedThreadPool(); + data1 = Files.createTempDirectory("").toFile(); data2 = Files.createTempDirectory("").toFile(); - Network network = Network.newNetwork(); + network = Network.newNetwork(); container1 = new GenericContainer<>(DhfsImage.getInstance()) .withPrivilegedMode(true) @@ -96,11 +99,27 @@ public class KillIT { Stream.of(container1, container2).parallel().forEach(GenericContainer::stop); TestDataCleaner.purgeDirectory(data1); TestDataCleaner.purgeDirectory(data2); + executor.close(); + } + + private void checkConsistency() { + await().atMost(45, TimeUnit.SECONDS).until(() -> { + Log.info("Listing consistency"); + var ls1 = container1.execInContainer("/bin/sh", "-c", "ls /dhfs_test/fuse"); + var cat1 = container1.execInContainer("/bin/sh", "-c", "cat /dhfs_test/fuse/*"); + var ls2 = container2.execInContainer("/bin/sh", "-c", "ls /dhfs_test/fuse"); + var cat2 = container2.execInContainer("/bin/sh", "-c", "cat /dhfs_test/fuse/*"); + Log.info(ls1); + Log.info(cat1); + Log.info(ls2); + Log.info(cat2); + + return ls1.equals(ls2) && cat1.equals(cat2); + }); } @Test void killTest(TestInfo testInfo) throws Exception { - var executor = Executors.newFixedThreadPool(2); var barrier = new CyclicBarrier(2); var ret1 = executor.submit(() -> { try { @@ -124,24 +143,11 @@ public class KillIT { waitingConsumer2.waitUntil(frame -> frame.getUtf8String().contains("Connected"), 60, TimeUnit.SECONDS); waitingConsumer1.waitUntil(frame -> frame.getUtf8String().contains("Connected"), 60, TimeUnit.SECONDS); - await().atMost(45, TimeUnit.SECONDS).until(() -> { - Log.info("Listing consistency"); - var ls1 = container1.execInContainer("/bin/sh", "-c", "ls /dhfs_test/fuse"); - var cat1 = container1.execInContainer("/bin/sh", "-c", "cat /dhfs_test/fuse/*"); - var ls2 = container2.execInContainer("/bin/sh", "-c", "ls /dhfs_test/fuse"); - var cat2 = container2.execInContainer("/bin/sh", "-c", "cat /dhfs_test/fuse/*"); - Log.info(ls1); - Log.info(cat1); - Log.info(ls2); - Log.info(cat2); - - return ls1.equals(ls2) && cat1.equals(cat2); - }); + checkConsistency(); } @Test void killTestDirs(TestInfo testInfo) throws Exception { - var executor = Executors.newFixedThreadPool(2); var barrier = new CyclicBarrier(2); var ret1 = executor.submit(() -> { try { @@ -165,18 +171,64 @@ public class KillIT { waitingConsumer2.waitUntil(frame -> frame.getUtf8String().contains("Connected"), 60, TimeUnit.SECONDS); waitingConsumer1.waitUntil(frame -> frame.getUtf8String().contains("Connected"), 60, TimeUnit.SECONDS); - await().atMost(45, TimeUnit.SECONDS).until(() -> { - Log.info("Listing consistency"); - var ls1 = container1.execInContainer("/bin/sh", "-c", "ls /dhfs_test/fuse"); - var cat1 = container1.execInContainer("/bin/sh", "-c", "cat /dhfs_test/fuse/*"); - var ls2 = container2.execInContainer("/bin/sh", "-c", "ls /dhfs_test/fuse"); - var cat2 = container2.execInContainer("/bin/sh", "-c", "cat /dhfs_test/fuse/*"); - Log.info(ls1); - Log.info(cat1); - Log.info(ls2); - Log.info(cat2); + checkConsistency(); + } - return ls1.equals(ls2) && cat1.equals(cat2); + @Test + void killTest2(TestInfo testInfo) throws Exception { + var barrier = new CyclicBarrier(2); + var ret1 = executor.submit(() -> { + try { + Log.info("Writing to container 1"); + barrier.await(); + container1.execInContainer("/bin/sh", "-c", "counter=0; while [ ! -f /tmp/stopprinting ]; do counter=`expr $counter + 1`; echo $counter >> /dhfs_test/fuse/test1; done"); + } catch (Exception e) { + throw new RuntimeException(e); + } }); + barrier.await(); + Thread.sleep(10000); + var client = DockerClientFactory.instance().client(); + client.killContainerCmd(container2.getContainerId()).exec(); + container2.stop(); + waitingConsumer1.waitUntil(frame -> frame.getUtf8String().contains("Lost connection to"), 60, TimeUnit.SECONDS); + container1.execInContainer("/bin/sh", "-c", "touch /tmp/stopprinting"); + container2.start(); + waitingConsumer2 = new WaitingConsumer(); + var loggingConsumer2 = new Slf4jLogConsumer(LoggerFactory.getLogger(KillIT.class)).withPrefix("1-" + testInfo.getDisplayName()); + container2.followOutput(loggingConsumer2.andThen(waitingConsumer2)); + waitingConsumer2.waitUntil(frame -> frame.getUtf8String().contains("Connected"), 60, TimeUnit.SECONDS); + waitingConsumer1.waitUntil(frame -> frame.getUtf8String().contains("Connected"), 60, TimeUnit.SECONDS); + + checkConsistency(); + } + + @Test + void killTestDirs2(TestInfo testInfo) throws Exception { + var barrier = new CyclicBarrier(2); + var ret1 = executor.submit(() -> { + try { + Log.info("Writing to container 1"); + barrier.await(); + container1.execInContainer("/bin/sh", "-c", "counter=0; while [ ! -f /tmp/stopprinting ]; do counter=`expr $counter + 1`; echo $counter >> /dhfs_test/fuse/test$counter; done"); + } catch (Exception e) { + throw new RuntimeException(e); + } + }); + barrier.await(); + Thread.sleep(10000); + var client = DockerClientFactory.instance().client(); + client.killContainerCmd(container2.getContainerId()).exec(); + container2.stop(); + waitingConsumer1.waitUntil(frame -> frame.getUtf8String().contains("Lost connection to"), 60, TimeUnit.SECONDS); + container1.execInContainer("/bin/sh", "-c", "touch /tmp/stopprinting"); + container2.start(); + waitingConsumer2 = new WaitingConsumer(); + var loggingConsumer2 = new Slf4jLogConsumer(LoggerFactory.getLogger(KillIT.class)).withPrefix("1-" + testInfo.getDisplayName()); + container2.followOutput(loggingConsumer2.andThen(waitingConsumer2)); + waitingConsumer2.waitUntil(frame -> frame.getUtf8String().contains("Connected"), 60, TimeUnit.SECONDS); + waitingConsumer1.waitUntil(frame -> frame.getUtf8String().contains("Connected"), 60, TimeUnit.SECONDS); + + checkConsistency(); } }