@@ -1391,6 +1391,151 @@ class ConnectionPoolTests: XCTestCase {
13911391 }
13921392 }
13931393
1394+ // MARK: - Shutdown tests
1395+
1396+ func testShutdownOnPendingAndSuccess( ) {
1397+ var state = HTTP1ConnectionProvider . ConnectionsState ( eventLoop: self . eventLoop)
1398+
1399+ XCTAssertTrue ( state. enqueue ( ) )
1400+
1401+ let connectionPromise = self . eventLoop. makePromise ( of: Connection . self)
1402+ let setupPromise = self . eventLoop. makePromise ( of: Void . self)
1403+ let waiter = HTTP1ConnectionProvider . Waiter ( promise: connectionPromise, setupComplete: setupPromise. futureResult, preference: . indifferent)
1404+ var action = state. acquire ( waiter: waiter)
1405+
1406+ guard case . create = action else {
1407+ XCTFail ( " unexpected action \( action) " )
1408+ return
1409+ }
1410+
1411+ let snapshot = state. testsOnly_getInternalState ( )
1412+ XCTAssertEqual ( snapshot. openedConnectionsCount, 1 )
1413+
1414+ if let ( waiters, available, leased, clean) = state. close ( ) {
1415+ XCTAssertTrue ( waiters. isEmpty)
1416+ XCTAssertTrue ( available. isEmpty)
1417+ XCTAssertTrue ( leased. isEmpty)
1418+ XCTAssertFalse ( clean)
1419+ } else {
1420+ XCTFail ( " Expecting snapshot " )
1421+ }
1422+
1423+ let connection = Connection ( channel: EmbeddedChannel ( ) , provider: self . http1ConnectionProvider)
1424+
1425+ action = state. offer ( connection: connection)
1426+ guard case . closeAnd( _, . closeProvider) = action else {
1427+ XCTFail ( " unexpected action \( action) " )
1428+ return
1429+ }
1430+
1431+ connectionPromise. fail ( TempError ( ) )
1432+ setupPromise. succeed ( ( ) )
1433+ }
1434+
1435+ func testShutdownOnPendingAndError( ) {
1436+ var state = HTTP1ConnectionProvider . ConnectionsState ( eventLoop: self . eventLoop)
1437+
1438+ XCTAssertTrue ( state. enqueue ( ) )
1439+
1440+ let connectionPromise = self . eventLoop. makePromise ( of: Connection . self)
1441+ let setupPromise = self . eventLoop. makePromise ( of: Void . self)
1442+ let waiter = HTTP1ConnectionProvider . Waiter ( promise: connectionPromise, setupComplete: setupPromise. futureResult, preference: . indifferent)
1443+ var action = state. acquire ( waiter: waiter)
1444+
1445+ guard case . create = action else {
1446+ XCTFail ( " unexpected action \( action) " )
1447+ return
1448+ }
1449+
1450+ let snapshot = state. testsOnly_getInternalState ( )
1451+ XCTAssertEqual ( snapshot. openedConnectionsCount, 1 )
1452+
1453+ if let ( waiters, available, leased, clean) = state. close ( ) {
1454+ XCTAssertTrue ( waiters. isEmpty)
1455+ XCTAssertTrue ( available. isEmpty)
1456+ XCTAssertTrue ( leased. isEmpty)
1457+ XCTAssertFalse ( clean)
1458+ } else {
1459+ XCTFail ( " Expecting snapshot " )
1460+ }
1461+
1462+ action = state. connectFailed ( )
1463+ guard case . closeProvider = action else {
1464+ XCTFail ( " unexpected action \( action) " )
1465+ return
1466+ }
1467+
1468+ connectionPromise. fail ( TempError ( ) )
1469+ setupPromise. succeed ( ( ) )
1470+ }
1471+
1472+ func testShutdownTimeout( ) {
1473+ var state = HTTP1ConnectionProvider . ConnectionsState ( eventLoop: self . eventLoop)
1474+
1475+ var snapshot = self . http1ConnectionProvider. state. testsOnly_getInternalState ( )
1476+
1477+ let connection = Connection ( channel: EmbeddedChannel ( ) , provider: self . http1ConnectionProvider)
1478+ snapshot. availableConnections. append ( connection)
1479+ snapshot. openedConnectionsCount = 1
1480+
1481+ state. testsOnly_setInternalState ( snapshot)
1482+
1483+ if let ( waiters, available, leased, clean) = state. close ( ) {
1484+ XCTAssertTrue ( waiters. isEmpty)
1485+ XCTAssertFalse ( available. isEmpty)
1486+ XCTAssertTrue ( leased. isEmpty)
1487+ XCTAssertTrue ( clean)
1488+ } else {
1489+ XCTFail ( " Expecting snapshot " )
1490+ }
1491+
1492+ let action = state. timeout ( connection: connection)
1493+ switch action {
1494+ case . closeAnd( _, let next) :
1495+ switch next {
1496+ case . closeProvider:
1497+ // expected
1498+ break
1499+ default :
1500+ XCTFail ( " Unexpected action: \( action) " )
1501+ }
1502+ default :
1503+ XCTFail ( " Unexpected action: \( action) " )
1504+ }
1505+ }
1506+
1507+ func testShutdownRemoteClosed( ) {
1508+ var state = HTTP1ConnectionProvider . ConnectionsState ( eventLoop: self . eventLoop)
1509+
1510+ var snapshot = self . http1ConnectionProvider. state. testsOnly_getInternalState ( )
1511+
1512+ let connection = Connection ( channel: EmbeddedChannel ( ) , provider: self . http1ConnectionProvider)
1513+ snapshot. availableConnections. append ( connection)
1514+ snapshot. openedConnectionsCount = 1
1515+
1516+ state. testsOnly_setInternalState ( snapshot)
1517+
1518+ if let ( waiters, available, leased, clean) = state. close ( ) {
1519+ XCTAssertTrue ( waiters. isEmpty)
1520+ XCTAssertFalse ( available. isEmpty)
1521+ XCTAssertTrue ( leased. isEmpty)
1522+ XCTAssertTrue ( clean)
1523+ } else {
1524+ XCTFail ( " Expecting snapshot " )
1525+ }
1526+
1527+ let action = state. remoteClosed ( connection: connection)
1528+ switch action {
1529+ case . closeProvider:
1530+ // expected
1531+ break
1532+ default :
1533+ XCTFail ( " Unexpected action: \( action) " )
1534+ }
1535+ }
1536+
1537+ // MARK: - Helpers
1538+
13941539 override func setUp( ) {
13951540 XCTAssertNil ( self . eventLoop)
13961541 XCTAssertNil ( self . http1ConnectionProvider)
0 commit comments