@Test public void testInitialNoConcurrency() { int n = 10; FakeConnectionProvider connector = new FakeConnectionProvider(); FakeConnectionManager mgr = new FakeConnectionManager(-1, 1, connector); List<FakeWaiter> waiters = new ArrayList<>(); for (int i = 0; i < n; i++) { FakeWaiter waiter = new FakeWaiter(); mgr.getConnection(waiter); waiters.add(waiter); } FakeConnection conn = connector.assertRequest(); conn.concurrency(0).connect().awaitConnected(); conn.concurrency(n - 1); assertWaitUntil(() -> waiters.stream().filter(FakeWaiter::isSuccess).count() == n - 1); waiters.stream().filter(FakeWaiter::isSuccess).findFirst().get().recycle(); waiters.forEach(waiter -> { assertWaitUntil(waiter::isSuccess); }); }
@Test public void testConnectSuccess() { FakeConnectionProvider connector = new FakeConnectionProvider(); FakeConnectionManager mgr = new FakeConnectionManager(3, 4, connector); AtomicReference<Boolean> handleLock = new AtomicReference<>(); FakeWaiter waiter = new FakeWaiter() { @Override public synchronized void handleConnection(FakeConnection conn) { assertSame(conn.context, mgr.context); Pool<FakeConnection> pool = mgr.pool(); handleLock.set(Thread.holdsLock(pool)); super.handleConnection(conn); } }; mgr.getConnection(waiter); FakeConnection conn = connector.assertRequest(); conn.connect(); assertWaitUntil(waiter::isComplete); assertEquals(Boolean.FALSE, handleLock.get()); waiter.assertSuccess(conn); waiter.recycle(); assertEquals(0, mgr.size()); assertWaitUntil(() -> mgr.closed()); }
@Test public void testInitialNoConcurrency() { int n = 10; FakeConnectionProvider connector = new FakeConnectionProvider(); FakeConnectionManager mgr = new FakeConnectionManager(-1, 1, connector); List<FakeWaiter> waiters = new ArrayList<>(); for (int i = 0; i < n; i++) { FakeWaiter waiter = new FakeWaiter(); mgr.getConnection(waiter); waiters.add(waiter); } FakeConnection conn = connector.assertRequest(); conn.concurrency(0).connect().awaitConnected(); conn.concurrency(n - 1); assertWaitUntil(() -> waiters.stream().filter(FakeWaiter::isSuccess).count() == n - 1); waiters.stream().filter(FakeWaiter::isSuccess).findFirst().get().recycle(); waiters.forEach(waiter -> { assertWaitUntil(waiter::isSuccess); }); }
@Test public void testConnectSuccess() { FakeConnectionProvider connector = new FakeConnectionProvider(); FakeConnectionManager mgr = new FakeConnectionManager(3, 4, connector); AtomicReference<Boolean> handleLock = new AtomicReference<>(); FakeWaiter waiter = new FakeWaiter() { @Override public synchronized void handleConnection(FakeConnection conn) { assertSame(conn.context, mgr.context); Pool<FakeConnection> pool = mgr.pool(); handleLock.set(Thread.holdsLock(pool)); super.handleConnection(conn); } }; mgr.getConnection(waiter); FakeConnection conn = connector.assertRequest(); conn.connect(); assertWaitUntil(waiter::isComplete); assertEquals(Boolean.FALSE, handleLock.get()); waiter.assertSuccess(conn); waiter.recycle(); assertEquals(0, mgr.size()); assertWaitUntil(() -> mgr.closed()); }
@Test public void testRecycleDiscardedConnection() { FakeConnectionProvider connector = new FakeConnectionProvider(); FakeConnectionManager mgr = new FakeConnectionManager(3, 1, connector); FakeWaiter waiter1 = new FakeWaiter(); mgr.getConnection(waiter1); FakeConnection conn = connector.assertRequest(); conn.connect(); assertWaitUntil(waiter1::isComplete); FakeWaiter waiter2 = new FakeWaiter(); mgr.getConnection(waiter2); conn.close(); waiter1.recycle(); assertWaitUntil(() -> connector.requests() == 1); assertFalse(mgr.closed()); FakeConnection conn2 = connector.assertRequest(); conn2.connect(); assertWaitUntil(waiter2::isSuccess); }
@Test public void testRecycleConnection() { FakeConnectionProvider connector = new FakeConnectionProvider(); FakeConnectionManager mgr = new FakeConnectionManager(3, 1, connector); FakeWaiter waiter1 = new FakeWaiter(); mgr.getConnection(waiter1); FakeConnection conn = connector.assertRequest(); conn.connect(); assertWaitUntil(waiter1::isComplete); FakeWaiter waiter2 = new FakeWaiter(); mgr.getConnection(waiter2); connector.assertRequests(0); waiter1.recycle(); assertWaitUntil(waiter2::isComplete); waiter2.assertSuccess(conn); }
@Test public void testRecycleDiscardedConnection() { FakeConnectionProvider connector = new FakeConnectionProvider(); FakeConnectionManager mgr = new FakeConnectionManager(3, 1, connector); FakeWaiter waiter1 = new FakeWaiter(); mgr.getConnection(waiter1); FakeConnection conn = connector.assertRequest(); conn.connect(); assertWaitUntil(waiter1::isComplete); FakeWaiter waiter2 = new FakeWaiter(); mgr.getConnection(waiter2); conn.close(); waiter1.recycle(); assertWaitUntil(() -> connector.requests() == 1); assertFalse(mgr.closed()); FakeConnection conn2 = connector.assertRequest(); conn2.connect(); assertWaitUntil(waiter2::isSuccess); }
@Test public void testRecycleConnection() { FakeConnectionProvider connector = new FakeConnectionProvider(); FakeConnectionManager mgr = new FakeConnectionManager(3, 1, connector); FakeWaiter waiter1 = new FakeWaiter(); mgr.getConnection(waiter1); FakeConnection conn = connector.assertRequest(); conn.connect(); assertWaitUntil(waiter1::isComplete); FakeWaiter waiter2 = new FakeWaiter(); mgr.getConnection(waiter2); connector.assertRequests(0); waiter1.recycle(); assertWaitUntil(waiter2::isComplete); waiter2.assertSuccess(conn); }