@@ -339,4 +339,135 @@ class HTTPConnectionPool_HTTP1ConnectionsTests: XCTestCase {
339
339
connections. removeConnection ( at: failIndex)
340
340
XCTAssertTrue ( connections. isEmpty)
341
341
}
342
+
343
+ func testMigrationFromHTTP2( ) {
344
+ let elg = EmbeddedEventLoopGroup ( loops: 4 )
345
+ let generator = HTTPConnectionPool . Connection. ID. Generator ( )
346
+ var connections = HTTPConnectionPool . HTTP1Connections ( maximumConcurrentConnections: 8 , generator: generator)
347
+
348
+ let el1 = elg. next ( )
349
+ let el2 = elg. next ( )
350
+
351
+ let conn1ID = generator. next ( )
352
+ let conn2ID = generator. next ( )
353
+
354
+ let newConnections = connections. migrateFromHTTP2 (
355
+ starting: [ ( conn1ID, el1) ] ,
356
+ backingOff: [ ( conn2ID, el2) ] ,
357
+ requiredEventLoopsOfPendingRequests: [ el1, el2] ,
358
+ preferredEventLoopsOfPendingGeneralPurposeRequests: [ ]
359
+ )
360
+ XCTAssertTrue ( newConnections. isEmpty)
361
+
362
+ let stats = connections. stats
363
+ XCTAssertEqual ( stats. idle, 0 )
364
+ XCTAssertEqual ( stats. leased, 0 )
365
+ XCTAssertEqual ( stats. connecting, 1 )
366
+ XCTAssertEqual ( stats. backingOff, 1 )
367
+ }
368
+
369
+ func testMigrationFromHTTP2WithPendingRequestsWithRequiredEventLoop( ) {
370
+ let elg = EmbeddedEventLoopGroup ( loops: 4 )
371
+ let generator = HTTPConnectionPool . Connection. ID. Generator ( )
372
+ var connections = HTTPConnectionPool . HTTP1Connections ( maximumConcurrentConnections: 8 , generator: generator)
373
+
374
+ let el1 = elg. next ( )
375
+ let el2 = elg. next ( )
376
+ let el3 = elg. next ( )
377
+
378
+ let conn1ID = generator. next ( )
379
+ let conn2ID = generator. next ( )
380
+
381
+ let newConnections = connections. migrateFromHTTP2 (
382
+ starting: [ ( conn1ID, el1) ] ,
383
+ backingOff: [ ( conn2ID, el2) ] ,
384
+ requiredEventLoopsOfPendingRequests: [ el1, el2, el3] ,
385
+ preferredEventLoopsOfPendingGeneralPurposeRequests: [ ]
386
+ )
387
+ XCTAssertEqual ( newConnections. count, 1 )
388
+ XCTAssertEqual ( newConnections. first? . 1 . id, el3. id)
389
+
390
+ guard let conn3ID = newConnections. first? . 0 else {
391
+ return XCTFail ( " expected to start a new connection " )
392
+ }
393
+
394
+ let stats = connections. stats
395
+ XCTAssertEqual ( stats. idle, 0 )
396
+ XCTAssertEqual ( stats. leased, 0 )
397
+ XCTAssertEqual ( stats. connecting, 2 )
398
+ XCTAssertEqual ( stats. backingOff, 1 )
399
+
400
+ let conn3 : HTTPConnectionPool . Connection = . __testOnly_connection( id: conn3ID, eventLoop: el3)
401
+ let ( _, context) = connections. newHTTP1ConnectionEstablished ( conn3)
402
+ XCTAssertEqual ( context. use, . eventLoop( el3) )
403
+ XCTAssertTrue ( context. eventLoop === el3)
404
+ }
405
+
406
+ func testMigrationFromHTTP2WithPendingRequestsWithPreferredEventLoop( ) {
407
+ let elg = EmbeddedEventLoopGroup ( loops: 4 )
408
+ let generator = HTTPConnectionPool . Connection. ID. Generator ( )
409
+ var connections = HTTPConnectionPool . HTTP1Connections ( maximumConcurrentConnections: 8 , generator: generator)
410
+
411
+ let el1 = elg. next ( )
412
+ let el2 = elg. next ( )
413
+ let el3 = elg. next ( )
414
+
415
+ let conn1ID = generator. next ( )
416
+ let conn2ID = generator. next ( )
417
+
418
+ let newConnections = connections. migrateFromHTTP2 (
419
+ starting: [ ( conn1ID, el1) ] ,
420
+ backingOff: [ ( conn2ID, el2) ] ,
421
+ requiredEventLoopsOfPendingRequests: [ el1, el2] ,
422
+ preferredEventLoopsOfPendingGeneralPurposeRequests: [ el3, el3, el3]
423
+ )
424
+ XCTAssertEqual ( newConnections. count, 1 )
425
+ XCTAssertEqual ( newConnections. first? . 1 . id, el3. id)
426
+
427
+ guard let conn3ID = newConnections. first? . 0 else {
428
+ return XCTFail ( " expected to start a new connection " )
429
+ }
430
+
431
+ let stats = connections. stats
432
+ XCTAssertEqual ( stats. idle, 0 )
433
+ XCTAssertEqual ( stats. leased, 0 )
434
+ XCTAssertEqual ( stats. connecting, 2 )
435
+ XCTAssertEqual ( stats. backingOff, 1 )
436
+
437
+ let conn3 : HTTPConnectionPool . Connection = . __testOnly_connection( id: conn3ID, eventLoop: el3)
438
+ let ( _, context) = connections. newHTTP1ConnectionEstablished ( conn3)
439
+ XCTAssertEqual ( context. use, . generalPurpose)
440
+ XCTAssertTrue ( context. eventLoop === el3)
441
+ }
442
+
443
+ func testMigrationFromHTTP2WithAlreadyLeasedHTTP1Connection( ) {
444
+ let elg = EmbeddedEventLoopGroup ( loops: 4 )
445
+ let generator = HTTPConnectionPool . Connection. ID. Generator ( )
446
+ var connections = HTTPConnectionPool . HTTP1Connections ( maximumConcurrentConnections: 8 , generator: generator)
447
+ let el1 = elg. next ( )
448
+ let el2 = elg. next ( )
449
+ let el3 = elg. next ( )
450
+
451
+ let conn1ID = connections. createNewConnection ( on: el1)
452
+ let conn1 : HTTPConnectionPool . Connection = . __testOnly_connection( id: conn1ID, eventLoop: el1)
453
+ let ( index, _) = connections. newHTTP1ConnectionEstablished ( conn1)
454
+ _ = connections. leaseConnection ( at: index)
455
+
456
+ let conn2ID = generator. next ( )
457
+ let conn3ID = generator. next ( )
458
+
459
+ let newConnections = connections. migrateFromHTTP2 (
460
+ starting: [ ( conn2ID, el2) ] ,
461
+ backingOff: [ ( conn3ID, el3) ] ,
462
+ requiredEventLoopsOfPendingRequests: [ el1, el2, el3] ,
463
+ preferredEventLoopsOfPendingGeneralPurposeRequests: [ el1]
464
+ )
465
+ XCTAssertTrue ( newConnections. isEmpty, " we already have a leased connection on el1 " )
466
+
467
+ let stats = connections. stats
468
+ XCTAssertEqual ( stats. idle, 0 )
469
+ XCTAssertEqual ( stats. leased, 1 )
470
+ XCTAssertEqual ( stats. connecting, 1 )
471
+ XCTAssertEqual ( stats. backingOff, 1 )
472
+ }
342
473
}
0 commit comments