diff --git a/dhfs-parent/dhfs-app/src/test/java/com/usatiuk/dhfs/integration/LazyFsIT.java b/dhfs-parent/dhfs-app/src/test/java/com/usatiuk/dhfs/integration/LazyFsIT.java index 702a9d59..fba571e4 100644 --- a/dhfs-parent/dhfs-app/src/test/java/com/usatiuk/dhfs/integration/LazyFsIT.java +++ b/dhfs-parent/dhfs-app/src/test/java/com/usatiuk/dhfs/integration/LazyFsIT.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,19 +36,26 @@ public class LazyFsIT { File data1; File data2; File data1Lazy; + File data2Lazy; LazyFs lazyFs1; + LazyFs lazyFs2; + + private final ExecutorService executor = Executors.newCachedThreadPool(); @BeforeEach void setup(TestInfo testInfo) throws IOException, InterruptedException, TimeoutException { data1 = Files.createTempDirectory("dhfsdata").toFile(); data2 = Files.createTempDirectory("dhfsdata").toFile(); data1Lazy = Files.createTempDirectory("lazyfsroot").toFile(); + data2Lazy = Files.createTempDirectory("lazyfsroot").toFile(); Network network = Network.newNetwork(); lazyFs1 = new LazyFs(testInfo.getDisplayName(), data1.toString(), data1Lazy.toString()); lazyFs1.start(); + lazyFs2 = new LazyFs(testInfo.getDisplayName(), data2.toString(), data2Lazy.toString()); + lazyFs2.start(); container1 = new GenericContainer<>(DhfsImage.getInstance()) .withPrivilegedMode(true) @@ -101,28 +105,47 @@ public class LazyFsIT { @AfterEach void stop() { lazyFs1.stop(); + lazyFs2.stop(); Stream.of(container1, container2).parallel().forEach(GenericContainer::stop); TestDataCleaner.purgeDirectory(data1); TestDataCleaner.purgeDirectory(data1Lazy); TestDataCleaner.purgeDirectory(data2); + TestDataCleaner.purgeDirectory(data2Lazy); + + 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(() -> { + var barrier = new CountDownLatch(1); + executor.submit(() -> { try { Log.info("Writing to container 1"); - barrier.await(); + barrier.countDown(); container1.execInContainer("/bin/sh", "-c", "counter=0; while true; do counter=`expr $counter + 1`; echo $counter >> /dhfs_test/fuse/test1; done"); } catch (Exception e) { throw new RuntimeException(e); } }); barrier.await(); - Thread.sleep(1000); + Thread.sleep(2000); Log.info("Killing"); lazyFs1.crash(); waitingConsumer1.waitUntil(frame -> frame.getUtf8String().contains("Caused by: org.lmdbjava"), 5, TimeUnit.SECONDS); @@ -139,59 +162,39 @@ public class LazyFsIT { 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 { -// Log.info("Writing to container 1"); -// barrier.await(); -// container1.execInContainer("/bin/sh", "-c", "counter=0; while true; 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(container1.getContainerId()).exec(); -// container1.stop(); -// waitingConsumer2.waitUntil(frame -> frame.getUtf8String().contains("Lost connection to"), 60, TimeUnit.SECONDS); -// container1.start(); -// waitingConsumer1 = new WaitingConsumer(); -// var loggingConsumer1 = new Slf4jLogConsumer(LoggerFactory.getLogger(LazyFsIT.class)).withPrefix("1-" + testInfo.getDisplayName()); -// container1.followOutput(loggingConsumer1.andThen(waitingConsumer1)); -// 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); -// }); -// } + @RepeatedTest(10) + void killTestDirs(TestInfo testInfo) throws Exception { + var barrier = new CountDownLatch(1); + executor.submit(() -> { + try { + Log.info("Writing to container 1"); + barrier.countDown(); + container1.execInContainer("/bin/sh", "-c", "counter=0; while true; do counter=`expr $counter + 1`; echo $counter >> /dhfs_test/fuse/test$counter; done"); + } catch (Exception e) { + throw new RuntimeException(e); + } + }); + barrier.await(); + Thread.sleep(2000); + Log.info("Killing"); + lazyFs1.crash(); + waitingConsumer1.waitUntil(frame -> frame.getUtf8String().contains("Caused by: org.lmdbjava"), 5, TimeUnit.SECONDS); + var client = DockerClientFactory.instance().client(); + client.killContainerCmd(container1.getContainerId()).exec(); + container1.stop(); + waitingConsumer2.waitUntil(frame -> frame.getUtf8String().contains("Lost connection to"), 60, TimeUnit.SECONDS); + Log.info("Restart"); + lazyFs1.start(); + container1.start(); + waitingConsumer1 = new WaitingConsumer(); + var loggingConsumer1 = new Slf4jLogConsumer(LoggerFactory.getLogger(LazyFsIT.class)).withPrefix("1-" + testInfo.getDisplayName()); + container1.followOutput(loggingConsumer1.andThen(waitingConsumer1)); + waitingConsumer2.waitUntil(frame -> frame.getUtf8String().contains("Connected"), 60, TimeUnit.SECONDS); + waitingConsumer1.waitUntil(frame -> frame.getUtf8String().contains("Connected"), 60, TimeUnit.SECONDS); + + checkConsistency(); + } }