@@ -1391,6 +1391,151 @@ class ConnectionPoolTests: XCTestCase {
1391
1391
}
1392
1392
}
1393
1393
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
+
1394
1539
override func setUp( ) {
1395
1540
XCTAssertNil ( self . eventLoop)
1396
1541
XCTAssertNil ( self . http1ConnectionProvider)
0 commit comments