@Test public void testRecycleLIFO() { FakeConnectionProvider connector = new FakeConnectionProvider(); FakeConnectionManager mgr = new FakeConnectionManager(-1, 2, connector, false); FakeWaiter waiter1 = new FakeWaiter(); mgr.getConnection(waiter1); FakeConnection firstInConnection = connector.assertRequest(); firstInConnection.connect(); assertWaitUntil(waiter1::isSuccess); FakeWaiter waiter2 = new FakeWaiter(); mgr.getConnection(waiter2); FakeConnection lastInConnection = connector.assertRequest(); lastInConnection.connect(); assertWaitUntil(waiter2::isSuccess); waiter2.assertSuccess(lastInConnection); firstInConnection.recycle(false); lastInConnection.recycle(false); assertEquals(2, mgr.size()); FakeWaiter waiter3 = new FakeWaiter(); mgr.getConnection(waiter3); assertWaitUntil(waiter3::isSuccess); waiter3.assertSuccess(lastInConnection); }
@Test public void testRecycleFIFO() { FakeConnectionProvider connector = new FakeConnectionProvider(); FakeConnectionManager mgr = new FakeConnectionManager(-1, 2, connector, true); FakeWaiter waiter1 = new FakeWaiter(); mgr.getConnection(waiter1); FakeConnection firstInConnection = connector.assertRequest(); firstInConnection.connect(); assertWaitUntil(waiter1::isSuccess); FakeWaiter waiter2 = new FakeWaiter(); mgr.getConnection(waiter2); FakeConnection lastInConnection = connector.assertRequest(); lastInConnection.connect(); assertWaitUntil(waiter2::isSuccess); waiter2.assertSuccess(lastInConnection); firstInConnection.recycle(false); lastInConnection.recycle(false); assertEquals(2, mgr.size()); FakeWaiter waiter3 = new FakeWaiter(); mgr.getConnection(waiter3); assertWaitUntil(waiter3::isSuccess); waiter3.assertSuccess(firstInConnection); }
@Test public void testCloseRecycledConnection() { FakeConnectionProvider connector = new FakeConnectionProvider(); FakeConnectionManager mgr = new FakeConnectionManager(2, 1, connector); FakeWaiter waiter1 = new FakeWaiter(); mgr.getConnection(waiter1); FakeConnection conn = connector.assertRequest(); conn.connect(); assertWaitUntil(waiter1::isSuccess); conn.recycle(2L); FakeWaiter waiter2 = new FakeWaiter(); // Recycle connection mgr.getConnection(waiter2); // But close it conn.close(); // We have a race here if (waiter2.isComplete()) { // Either the waiter acquires the recycled connection before it's closed } else { // Or a connection request happens conn = connector.assertRequest(); } }
@Test public void testRecycleWithoutDispose() { FakeConnectionProvider connector = new FakeConnectionProvider(); FakeConnectionManager mgr = new FakeConnectionManager(-1, 1, connector); FakeWaiter waiter1 = new FakeWaiter(); mgr.getConnection(waiter1); FakeConnection conn = connector.assertRequest(); conn.connect(); assertWaitUntil(waiter1::isSuccess); conn.recycle(false); FakeWaiter waiter2 = new FakeWaiter(); mgr.getConnection(waiter2); assertWaitUntil(waiter2::isSuccess); waiter2.assertSuccess(conn); conn.recycle(true); assertEquals(0, mgr.size()); }
@Test public void testDiscardExpiredConnections() { FakeConnectionProvider connector = new FakeConnectionProvider(); FakeConnectionManager mgr = new FakeConnectionManager(2, 1, connector); FakeWaiter waiter1 = new FakeWaiter(); mgr.getConnection(waiter1); FakeConnection conn = connector.assertRequest(); conn.connect(); assertWaitUntil(waiter1::isSuccess); conn.recycle(2L); assertEquals(1, mgr.size()); assertEquals(0, mgr.removeExpired(1L)); assertEquals(1, mgr.size()); assertEquals(1, mgr.removeExpired(2L)); assertEquals(0, mgr.size()); }
synchronized long recycle() { return recycle(true); }
synchronized long recycle(boolean dispose) { return recycle(dispose ? 0L : Long.MAX_VALUE); }
long recycle() { FakeConnection conn = (FakeConnection) result; return conn.recycle(); } }
@Test public void testRecycleFIFO() { FakeConnectionProvider connector = new FakeConnectionProvider(); FakeConnectionManager mgr = new FakeConnectionManager(-1, 2, connector, true); FakeWaiter waiter1 = new FakeWaiter(); mgr.getConnection(waiter1); FakeConnection firstInConnection = connector.assertRequest(); firstInConnection.connect(); assertWaitUntil(waiter1::isSuccess); FakeWaiter waiter2 = new FakeWaiter(); mgr.getConnection(waiter2); FakeConnection lastInConnection = connector.assertRequest(); lastInConnection.connect(); assertWaitUntil(waiter2::isSuccess); waiter2.assertSuccess(lastInConnection); firstInConnection.recycle(false); lastInConnection.recycle(false); assertEquals(2, mgr.size()); FakeWaiter waiter3 = new FakeWaiter(); mgr.getConnection(waiter3); assertWaitUntil(waiter3::isSuccess); waiter3.assertSuccess(firstInConnection); }
@Test public void testCloseRecycledConnection() { FakeConnectionProvider connector = new FakeConnectionProvider(); FakeConnectionManager mgr = new FakeConnectionManager(2, 1, connector); FakeWaiter waiter1 = new FakeWaiter(); mgr.getConnection(waiter1); FakeConnection conn = connector.assertRequest(); conn.connect(); assertWaitUntil(waiter1::isSuccess); conn.recycle(2L); FakeWaiter waiter2 = new FakeWaiter(); // Recycle connection mgr.getConnection(waiter2); // But close it conn.close(); // We have a race here if (waiter2.isComplete()) { // Either the waiter acquires the recycled connection before it's closed } else { // Or a connection request happens conn = connector.assertRequest(); } }
@Test public void testRecycleLIFO() { FakeConnectionProvider connector = new FakeConnectionProvider(); FakeConnectionManager mgr = new FakeConnectionManager(-1, 2, connector, false); FakeWaiter waiter1 = new FakeWaiter(); mgr.getConnection(waiter1); FakeConnection firstInConnection = connector.assertRequest(); firstInConnection.connect(); assertWaitUntil(waiter1::isSuccess); FakeWaiter waiter2 = new FakeWaiter(); mgr.getConnection(waiter2); FakeConnection lastInConnection = connector.assertRequest(); lastInConnection.connect(); assertWaitUntil(waiter2::isSuccess); waiter2.assertSuccess(lastInConnection); firstInConnection.recycle(false); lastInConnection.recycle(false); assertEquals(2, mgr.size()); FakeWaiter waiter3 = new FakeWaiter(); mgr.getConnection(waiter3); assertWaitUntil(waiter3::isSuccess); waiter3.assertSuccess(lastInConnection); }
@Test public void testDiscardExpiredConnections() { FakeConnectionProvider connector = new FakeConnectionProvider(); FakeConnectionManager mgr = new FakeConnectionManager(2, 1, connector); FakeWaiter waiter1 = new FakeWaiter(); mgr.getConnection(waiter1); FakeConnection conn = connector.assertRequest(); conn.connect(); assertWaitUntil(waiter1::isSuccess); conn.recycle(2L); assertEquals(1, mgr.size()); assertEquals(0, mgr.removeExpired(1L)); assertEquals(1, mgr.size()); assertEquals(1, mgr.removeExpired(2L)); assertEquals(0, mgr.size()); }
@Test public void testRecycleWithoutDispose() { FakeConnectionProvider connector = new FakeConnectionProvider(); FakeConnectionManager mgr = new FakeConnectionManager(-1, 1, connector); FakeWaiter waiter1 = new FakeWaiter(); mgr.getConnection(waiter1); FakeConnection conn = connector.assertRequest(); conn.connect(); assertWaitUntil(waiter1::isSuccess); conn.recycle(false); FakeWaiter waiter2 = new FakeWaiter(); mgr.getConnection(waiter2); assertWaitUntil(waiter2::isSuccess); waiter2.assertSuccess(conn); conn.recycle(true); assertEquals(0, mgr.size()); }
synchronized long recycle() { return recycle(true); }
synchronized long recycle(boolean dispose) { return recycle(dispose ? 0L : Long.MAX_VALUE); }
long recycle() { FakeConnection conn = (FakeConnection) result; return conn.recycle(); } }