@@ -174,6 +174,7 @@ mod integration {
174
174
#[ cfg( feature = "danger-local-https" ) ]
175
175
#[ cfg( feature = "v2" ) ]
176
176
mod v2 {
177
+ use std:: collections:: HashSet ;
177
178
use std:: sync:: Arc ;
178
179
use std:: time:: Duration ;
179
180
@@ -184,11 +185,13 @@ mod integration {
184
185
use reqwest:: { Client , ClientBuilder , Error , Response } ;
185
186
use testcontainers_modules:: redis:: Redis ;
186
187
use testcontainers_modules:: testcontainers:: clients:: Cli ;
188
+ use tokio:: sync:: Mutex ;
187
189
188
190
use super :: * ;
189
191
190
192
static TESTS_TIMEOUT : Lazy < Duration > = Lazy :: new ( || Duration :: from_secs ( 20 ) ) ;
191
193
static WAIT_SERVICE_INTERVAL : Lazy < Duration > = Lazy :: new ( || Duration :: from_secs ( 3 ) ) ;
194
+ static RESERVED_PORTS : Lazy < Mutex < HashSet < u16 > > > = Lazy :: new ( || Mutex :: new ( HashSet :: new ( ) ) ) ;
192
195
193
196
#[ tokio:: test]
194
197
async fn test_bad_ohttp_keys ( ) {
@@ -197,7 +200,7 @@ mod integration {
197
200
. expect ( "Invalid OhttpKeys" ) ;
198
201
199
202
let ( cert, key) = local_cert_key ( ) ;
200
- let port = find_free_port ( ) ;
203
+ let port = reserve_port ( ) . await ;
201
204
let directory = Url :: parse ( & format ! ( "https://localhost:{}" , port) ) . unwrap ( ) ;
202
205
tokio:: select!(
203
206
err = init_directory( port, ( cert. clone( ) , key) ) => panic!( "Directory server exited early: {:?}" , err) ,
@@ -231,10 +234,10 @@ mod integration {
231
234
async fn test_session_expiration ( ) {
232
235
init_tracing ( ) ;
233
236
let ( cert, key) = local_cert_key ( ) ;
234
- let ohttp_relay_port = find_free_port ( ) ;
237
+ let ohttp_relay_port = reserve_port ( ) . await ;
235
238
let ohttp_relay =
236
239
Url :: parse ( & format ! ( "http://localhost:{}" , ohttp_relay_port) ) . unwrap ( ) ;
237
- let directory_port = find_free_port ( ) ;
240
+ let directory_port = reserve_port ( ) . await ;
238
241
let directory = Url :: parse ( & format ! ( "https://localhost:{}" , directory_port) ) . unwrap ( ) ;
239
242
let gateway_origin = http:: Uri :: from_str ( directory. as_str ( ) ) . unwrap ( ) ;
240
243
tokio:: select!(
@@ -299,10 +302,10 @@ mod integration {
299
302
async fn v2_to_v2 ( ) {
300
303
init_tracing ( ) ;
301
304
let ( cert, key) = local_cert_key ( ) ;
302
- let ohttp_relay_port = find_free_port ( ) ;
305
+ let ohttp_relay_port = reserve_port ( ) . await ;
303
306
let ohttp_relay =
304
307
Url :: parse ( & format ! ( "http://localhost:{}" , ohttp_relay_port) ) . unwrap ( ) ;
305
- let directory_port = find_free_port ( ) ;
308
+ let directory_port = reserve_port ( ) . await ;
306
309
let directory = Url :: parse ( & format ! ( "https://localhost:{}" , directory_port) ) . unwrap ( ) ;
307
310
let gateway_origin = http:: Uri :: from_str ( directory. as_str ( ) ) . unwrap ( ) ;
308
311
tokio:: select!(
@@ -431,10 +434,10 @@ mod integration {
431
434
async fn v2_to_v2_mixed_input_script_types ( ) {
432
435
init_tracing ( ) ;
433
436
let ( cert, key) = local_cert_key ( ) ;
434
- let ohttp_relay_port = find_free_port ( ) ;
437
+ let ohttp_relay_port = reserve_port ( ) . await ;
435
438
let ohttp_relay =
436
439
Url :: parse ( & format ! ( "http://localhost:{}" , ohttp_relay_port) ) . unwrap ( ) ;
437
- let directory_port = find_free_port ( ) ;
440
+ let directory_port = reserve_port ( ) . await ;
438
441
let directory = Url :: parse ( & format ! ( "https://localhost:{}" , directory_port) ) . unwrap ( ) ;
439
442
let gateway_origin = http:: Uri :: from_str ( directory. as_str ( ) ) . unwrap ( ) ;
440
443
tokio:: select!(
@@ -648,10 +651,10 @@ mod integration {
648
651
async fn v1_to_v2 ( ) {
649
652
init_tracing ( ) ;
650
653
let ( cert, key) = local_cert_key ( ) ;
651
- let ohttp_relay_port = find_free_port ( ) ;
654
+ let ohttp_relay_port = reserve_port ( ) . await ;
652
655
let ohttp_relay =
653
656
Url :: parse ( & format ! ( "http://localhost:{}" , ohttp_relay_port) ) . unwrap ( ) ;
654
- let directory_port = find_free_port ( ) ;
657
+ let directory_port = reserve_port ( ) . await ;
655
658
let directory = Url :: parse ( & format ! ( "https://localhost:{}" , directory_port) ) . unwrap ( ) ;
656
659
let gateway_origin = http:: Uri :: from_str ( directory. as_str ( ) ) . unwrap ( ) ;
657
660
tokio:: select!(
@@ -912,9 +915,16 @@ mod integration {
912
915
) )
913
916
}
914
917
915
- fn find_free_port ( ) -> u16 {
918
+ async fn reserve_port ( ) -> u16 {
919
+ let mut reserved_ports = RESERVED_PORTS . lock ( ) . await ;
916
920
let listener = std:: net:: TcpListener :: bind ( "0.0.0.0:0" ) . unwrap ( ) ;
917
- listener. local_addr ( ) . unwrap ( ) . port ( )
921
+ let port = listener. local_addr ( ) . unwrap ( ) . port ( ) ;
922
+ if reserved_ports. insert ( port) {
923
+ println ! ( "{:?}" , & reserved_ports) ;
924
+ port
925
+ } else {
926
+ panic ! ( "PORT RESERVED!!!" ) ;
927
+ }
918
928
}
919
929
920
930
async fn wait_for_service_ready (
0 commit comments