@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 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 testEndpointLifecycle() { 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::isSuccess); conn.close(); assertWaitUntil(mgr::closed); FakeWaiter waiter2 = new FakeWaiter(); mgr.getConnection(waiter2); assertEquals(2, mgr.sequence()); }
@Test public void testDontCloseEndpointWithInflightRequest() { FakeConnectionProvider connector = new FakeConnectionProvider(); FakeConnectionManager mgr = new FakeConnectionManager(3, 2, 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(); assertWaitUntil(() -> !mgr.contains(conn)); assertFalse(mgr.closed()); }
@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 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 testEndpointLifecycle() { 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::isSuccess); conn.close(); assertWaitUntil(mgr::closed); FakeWaiter waiter2 = new FakeWaiter(); mgr.getConnection(waiter2); assertEquals(2, mgr.sequence()); }
@Test public void testDontCloseEndpointWithInflightRequest() { FakeConnectionProvider connector = new FakeConnectionProvider(); FakeConnectionManager mgr = new FakeConnectionManager(3, 2, 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(); assertWaitUntil(() -> !mgr.contains(conn)); assertFalse(mgr.closed()); }