@@ -76,6 +76,7 @@ class _TCPSocket {
76
76
try socketAddress. withMemoryRebound ( to: sockaddr. self, capacity: MemoryLayout< sockaddr> . size, {
77
77
let addr = UnsafePointer < sockaddr > ( $0)
78
78
_ = try attempt ( " bind " , valid: isZero, bind ( listenSocket, addr, socklen_t ( MemoryLayout< sockaddr> . size) ) )
79
+ _ = try attempt ( " listen " , valid: isZero, listen ( listenSocket, SOMAXCONN) )
79
80
} )
80
81
81
82
var actualSA = sockaddr_in ( )
@@ -104,7 +105,6 @@ class _TCPSocket {
104
105
}
105
106
106
107
func acceptConnection( notify: ServerSemaphore ) throws {
107
- _ = try attempt ( " listen " , valid: isZero, listen ( listenSocket, SOMAXCONN) )
108
108
try socketAddress. withMemoryRebound ( to: sockaddr. self, capacity: MemoryLayout< sockaddr> . size, {
109
109
let addr = UnsafeMutablePointer < sockaddr > ( $0)
110
110
var sockLen = socklen_t ( MemoryLayout< sockaddr> . size)
@@ -486,6 +486,10 @@ public class ServerSemaphore {
486
486
dispatchSemaphore. wait ( )
487
487
}
488
488
489
+ public func wait( timeout: DispatchTime ) -> DispatchTimeoutResult {
490
+ return dispatchSemaphore. wait ( timeout: timeout)
491
+ }
492
+
489
493
public func signal( ) {
490
494
dispatchSemaphore. signal ( )
491
495
}
@@ -495,6 +499,8 @@ class LoopbackServerTest : XCTestCase {
495
499
private static let staticSyncQ = DispatchQueue ( label: " org.swift.TestFoundation.HTTPServer.StaticSyncQ " )
496
500
497
501
private static var _serverPort : Int = - 1
502
+ private static let serverReady = ServerSemaphore ( )
503
+
498
504
static var serverPort : Int {
499
505
get {
500
506
return staticSyncQ. sync { _serverPort }
@@ -511,13 +517,13 @@ class LoopbackServerTest : XCTestCase {
511
517
let test = try TestURLSessionServer ( port: nil , startDelay: startDelay, sendDelay: sendDelay, bodyChunks: bodyChunks)
512
518
serverPort = Int ( test. port)
513
519
try test. start ( started: condition)
520
+ defer { test. stop ( ) }
514
521
try test. readAndRespond ( )
515
522
serverPort = - 2
516
- test. stop ( )
517
523
}
518
524
}
519
525
520
- let serverReady = ServerSemaphore ( )
526
+
521
527
globalDispatchQueue. async {
522
528
do {
523
529
try runServer ( with: serverReady)
@@ -527,7 +533,20 @@ class LoopbackServerTest : XCTestCase {
527
533
return
528
534
}
529
535
}
530
-
531
536
serverReady. wait ( )
532
537
}
538
+
539
+ class func waitForServerReady( ) {
540
+ let timeout = DispatchTime ( uptimeNanoseconds: DispatchTime . now ( ) . uptimeNanoseconds + 2_000_000_000 )
541
+ while serverPort == - 2 {
542
+ guard serverReady. wait ( timeout: timeout) == . success else {
543
+ fatalError ( " Timedout waiting for server to be ready " )
544
+ }
545
+ }
546
+ }
547
+
548
+ override func setUp( ) {
549
+ super. setUp ( )
550
+ LoopbackServerTest . waitForServerReady ( )
551
+ }
533
552
}
0 commit comments