package org.redisson; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import org.junit.Assert; import org.junit.Test; import org.redisson.api.RCountDownLatch; import static org.assertj.core.api.Assertions.*; public class RedissonCountDownLatchTest extends BaseTest { @Test public void testAwaitTimeout() throws InterruptedException { ExecutorService executor = Executors.newFixedThreadPool(2); final RCountDownLatch latch = redisson.getCountDownLatch("latch1"); Assert.assertTrue(latch.trySetCount(1)); executor.execute(() -> { try { Thread.sleep(500); } catch (InterruptedException e) { Assert.fail(); } latch.countDown(); }); executor.execute(() -> { try { Assert.assertEquals(1, latch.getCount()); boolean res = latch.await(550, TimeUnit.MILLISECONDS); Assert.assertTrue(res); } catch (InterruptedException e) { Assert.fail(); } }); executor.shutdown(); Assert.assertTrue(executor.awaitTermination(10, TimeUnit.SECONDS)); } @Test public void testAwaitTimeoutFail() throws InterruptedException { ExecutorService executor = Executors.newFixedThreadPool(2); final RCountDownLatch latch = redisson.getCountDownLatch("latch1"); Assert.assertTrue(latch.trySetCount(1)); executor.execute(() -> { try { Thread.sleep(1000); } catch (InterruptedException e) { Assert.fail(); } latch.countDown(); }); executor.execute(() -> { try { Assert.assertEquals(1, latch.getCount()); boolean res = latch.await(500, TimeUnit.MILLISECONDS); Assert.assertFalse(res); } catch (InterruptedException e) { Assert.fail(); } }); executor.shutdown(); Assert.assertTrue(executor.awaitTermination(10, TimeUnit.SECONDS)); } @Test public void testCountDown() throws InterruptedException { RCountDownLatch latch = redisson.getCountDownLatch("latch"); latch.trySetCount(2); Assert.assertEquals(2, latch.getCount()); latch.countDown(); Assert.assertEquals(1, latch.getCount()); latch.countDown(); Assert.assertEquals(0, latch.getCount()); latch.await(); latch.countDown(); Assert.assertEquals(0, latch.getCount()); latch.await(); latch.countDown(); Assert.assertEquals(0, latch.getCount()); latch.await(); RCountDownLatch latch1 = redisson.getCountDownLatch("latch1"); latch1.trySetCount(1); latch1.countDown(); Assert.assertEquals(0, latch.getCount()); latch1.countDown(); Assert.assertEquals(0, latch.getCount()); latch1.await(); RCountDownLatch latch2 = redisson.getCountDownLatch("latch2"); latch2.trySetCount(1); latch2.countDown(); latch2.await(); latch2.await(); RCountDownLatch latch3 = redisson.getCountDownLatch("latch3"); Assert.assertEquals(0, latch.getCount()); latch3.await(); RCountDownLatch latch4 = redisson.getCountDownLatch("latch4"); Assert.assertEquals(0, latch.getCount()); latch4.countDown(); Assert.assertEquals(0, latch.getCount()); latch4.await(); } @Test public void testDelete() throws Exception { RCountDownLatch latch = redisson.getCountDownLatch("latch"); latch.trySetCount(1); Assert.assertTrue(latch.delete()); } @Test public void testDeleteFailed() throws Exception { RCountDownLatch latch = redisson.getCountDownLatch("latch"); Assert.assertFalse(latch.delete()); } @Test public void testTrySetCount() throws Exception { RCountDownLatch latch = redisson.getCountDownLatch("latch"); assertThat(latch.trySetCount(1)).isTrue(); assertThat(latch.trySetCount(2)).isFalse(); } @Test public void testCount() { RCountDownLatch latch = redisson.getCountDownLatch("latch"); assertThat(latch.getCount()).isEqualTo(0); } }