package Ġio . wave beans . tests Ċ Ċ import Ġmu . Kotlin Logging Ċ import Ġjava . io . IOException Ċ import Ġjava . net . Inet Address Ċ import Ġjava . net . Inet SocketAddress Ċ import Ġjava . util . concurrent . Concurrent HashMap Ċ import Ġkotlin . random . Random Ċ import Ġkotlin . random . nextInt Ċ Ċ private Ġval Ġlog Ġ= ĠKotlin Logging . logger Ġ{ Ġ} Ċ Ċ fun Ġcreate Ports ( count : ĠInt , Ġrange : ĠInt Range Ġ= Ġ 2 0 0 0 .. 6 5 0 0 0 ): ĠArray < Int > Ġ= Ġ( 0 Ġuntil Ġcount ). map Ġ{ Ġfind Free Port ( range ) Ġ}. to Typed Array () Ċ Ċ /** ĠMake Ġsure Ġthe Ġports Ġare Ġnot Ġreused Ġacross Ġdifferent Ġport Ġac qu iring Ġattempts . Ġ*/ Ċ private Ġval Ġacquired Ports : ĠMutable Map < Int , ĠUnit > Ġ= ĠConcurrent HashMap () Ċ Ċ fun Ġfind Free Port ( range : ĠInt Range Ġ= Ġ 2 0 0 0 .. 6 5 0 0 0 ): ĠInt Ġ{ ĊĠĠĠ Ġvar Ġport : ĠInt ĊĠĠĠ Ġvar Ġi Ġ= Ġ 1 ĊĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠ Ġport Ġ= ĠRandom . nextInt ( range ) ĊĠĠĠĠĠĠĠ Ġif Ġ( port Ġin Ġacquired Ports . keys ) Ġcontinue ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsocket Ġ= Ġjava . net . Socket () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsocket . bind ( Inet SocketAddress ( Inet Address . get ByName (" localhost "), Ġport )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsocket . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug ( e ) Ġ{ Ġ"[ Attempt Ġ#$ i ] ĠPort Ġ$ port Ġis Ġbusy " Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( i Ġ>= Ġ 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Can 't Ġfind Ġfree Ġport Ġin Ġrange Ġ$ range Ġwithin Ġ$ i Ġattempts ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠ Ġ} ĊĠĠĠ Ġacquired Ports [ port ] Ġ= ĠUnit ĊĠĠĠ Ġlog . debug Ġ{ Ġ" Acquire d Ġport Ġ$ port , Ġoverall Ġlist : Ġ${ acquire d Ports . keys }" Ġ} ĊĠĠĠ Ġreturn Ġport Ċ }