package Ġio . github . tm creative 1 . play w right . remote Ċ Ċ import Ġio . github . tm creative 1 . play w right . remote . base . Base Test Ċ import Ġio . github . tm creative 1 . play w right . remote . base . server . WebSocket Server Ċ import Ġio . github . tm creative 1 . play w right . remote . core . exceptions . Play w right Exception Ċ import Ġio . github . tm creative 1 . play w right . remote . engine . options . wait . WaitFor Frame Received Options Ċ import Ġio . github . tm creative 1 . play w right . remote . engine . options . wait . WaitFor Frame Sent Options Ċ import Ġio . github . tm creative 1 . play w right . remote . engine . websocket . api . I WebSocket Ċ import Ġio . github . tm creative 1 . play w right . remote . engine . websocket . api . I WebSocket Frame Ċ import Ġorg . junit . jupiter . api . After Each Ċ import Ġorg . junit . jupiter . api . BeforeEach Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġjava . time . Duration Ċ import Ġjava . time . Instant Ċ import Ġjava . util . concurrent . atomic . Atomic Integer Ċ import Ġkotlin . test .* Ċ Ċ class ĠTest WebSocket Ġ: ĠBaseTest () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġweb Socket Port Ġ= ĠAtomicInteger ( 3 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġweb Socket Server Thread Local Ġ= ĠThread Local < WebSocket Server >() ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġvar Ġweb Socket Server : ĠWebSocket Server ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġweb Socket Server Thread Local . get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset ( value ) Ġ= Ġweb Socket Server Thread Local . set ( value ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ BeforeEach ĊĠĠĠ Ġfun Ġstart WebSocket Server () Ġ{ ĊĠĠĠĠĠĠĠ Ġweb Socket Server Ġ= ĠWebSocket Server (" localhost ", Ġweb Socket Port . get And Increment ()) ĊĠĠĠĠĠĠĠ Ġweb Socket Server . start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ After Each ĊĠĠĠ Ġfun Ġstop WebSocket Server () Ġ{ ĊĠĠĠĠĠĠĠ Ġweb Socket Server . stop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠwaitFor Condition ( condition : ĠArray < Boolean >) Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġcondition . size ) ĊĠĠĠĠĠĠĠ Ġval Ġstart Ġ= ĠInstant . now () ĊĠĠĠĠĠĠĠ Ġwhile Ġ(! condition [ 0 ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpage . waitFor Timeout ( 1 0 0 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( Duration . between ( start , ĠInstant . now ()). seconds Ġ< Ġ 3 0 , Ġ" Timed Ġout ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` check Ġcorrect Ġwork `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġjs Script Ġ= Ġ""" port Ġ=> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠ Ġlet Ġcb ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠ Ġconst Ġresult Ġ= Ġnew ĠPromise ( f Ġ=> Ġcb Ġ= Ġf ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠ Ġconst Ġws Ġ= Ġnew ĠWebSocket (' ws :// localhost :' Ġ+ Ġport Ġ+ Ġ'/ ws '); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠ Ġws . addEventListener (' message ', Ġdata Ġ=> Ġ{ Ġws . close (); Ġcb ( data . data ); Ġ}); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠ Ġreturn Ġresult ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| } ĊĠĠĠĠĠĠĠ Ġ""" . trim Margin () ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġpage . evaluate ( js Script , Ġweb Socket Server . port ) ĊĠĠĠĠĠĠĠ ĠassertEquals (" incoming ", Ġresult ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` check Ġto Ġemit Ġclose Ġevents `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsocket Closed Ġ= ĠarrayOf ( false ) ĊĠĠĠĠĠĠĠ Ġval Ġlog Ġ= Ġarray ListOf < String >() ĊĠĠĠĠĠĠĠ Ġval Ġweb Socket Ġ= Ġarray ListOf < I WebSocket ? >( null ) ĊĠĠĠĠĠĠĠ Ġpage . on WebSocket Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . add (" open Ġ${ it . url () }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġweb Socket [ 0 ] Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . onClose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . add (" close ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsocket Closed [ 0 ] Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġjs Script Ġ= Ġ""" port Ġ=> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠ Ġconst Ġws Ġ= Ġnew ĠWebSocket (' ws :// localhost :' Ġ+ Ġport Ġ+ Ġ'/ ws '); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠ Ġws . addEventListener (' open ', Ġ() Ġ=> Ġws . close ()); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| } ĊĠĠĠĠĠĠĠ Ġ""" . trim Margin () ĊĠĠĠĠĠĠĠ Ġpage . evaluate ( js Script , Ġweb Socket Server . port ) ĊĠĠĠĠĠĠĠ ĠwaitFor Condition ( socket Closed ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( array ListOf (" open Ġws :// localhost :${ web Socket Server . port }/ ws ", Ġ" close "), Ġlog ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( web Socket [ 0 ] !!. is Closed ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` check Ġto Ġemit Ġframe Ġevents `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsocket Closed Ġ= ĠarrayOf ( false ) ĊĠĠĠĠĠĠĠ Ġval Ġlog Ġ= Ġarray ListOf < String >() ĊĠĠĠĠĠĠĠ Ġpage . on WebSocket Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . add (" open ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . on Frame Sent Ġ{ Ġframe Ġ-> Ġlog . add (" send Ġ${ frame . text () }") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . on Frame Received Ġ{ Ġframe Ġ-> Ġlog . add (" received Ġ${ frame . text () }") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . onClose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . add (" close ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsocket Closed [ 0 ] Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġjs Script Ġ= Ġ""" port Ġ=> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠ Ġconst Ġws Ġ= Ġnew ĠWebSocket (' ws :// localhost :' Ġ+ Ġport Ġ+ Ġ'/ ws '); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠ Ġws . addEventListener (' open ', Ġ() Ġ=> Ġws . send (' outgoing ')); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠ Ġws . addEventListener (' message ', Ġ() Ġ=> Ġ{ Ġws . close (); Ġ}); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| } ĊĠĠĠĠĠĠĠ Ġ""" . trim Margin () ĊĠĠĠĠĠĠĠ Ġpage . evaluate ( js Script , Ġweb Socket Server . port ) ĊĠĠĠĠĠĠĠ ĠwaitFor Condition ( socket Closed ) ĊĠĠĠĠĠĠĠ Ġif Ġ( is Web kit ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . remove (" received ĠA + g =") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals (" open ", Ġlog [ 0 ], Ġ" Events : Ġ$ log ") ĊĠĠĠĠĠĠĠ ĠassertEquals (" close ", Ġlog [ 3 ], Ġ" Events : Ġ$ log ") ĊĠĠĠĠĠĠĠ ĠassertEquals ( array ListOf (" open ", Ġ" send Ġoutgoing ", Ġ" received Ġincoming ", Ġ" close "). sorted (), Ġlog . sorted ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` check Ġto Ġemit Ġbinary Ġframe Ġevents `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsocket Closed Ġ= ĠarrayOf ( false ) ĊĠĠĠĠĠĠĠ Ġval Ġsend Ġ= Ġarray ListOf < I WebSocket Frame >() ĊĠĠĠĠĠĠĠ Ġpage . on WebSocket Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . onClose Ġ{ Ġsocket Closed [ 0 ] Ġ= Ġtrue Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . on Frame Sent Ġ{ Ġframe Ġ-> Ġsend . add ( frame ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġjs Script Ġ= Ġ""" port Ġ=> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠ Ġconst Ġws Ġ= Ġnew ĠWebSocket (' ws :// localhost :' Ġ+ Ġport Ġ+ Ġ'/ ws '); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠ Ġws . addEventListener (' open ', Ġ() Ġ=> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠ Ġconst Ġbinary Ġ= Ġnew ĠUint 8 Array ( 5 ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠ Ġfor Ġ( let Ġi Ġ= Ġ 0 ; Ġi Ġ< Ġ 5 ; Ġ++ i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠĠĠĠ Ġbinary [ i ] Ġ= Ġi ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠ Ġws . send (' text '); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠ Ġws . send ( binary ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠ Ġws . close (); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠ Ġ}); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| } ĊĠĠĠĠĠĠĠ Ġ""" . trim Margin () ĊĠĠĠĠĠĠĠ Ġpage . evaluate ( js Script , Ġweb Socket Server . port ) ĊĠĠĠĠĠĠĠ ĠwaitFor Condition ( socket Closed ) ĊĠĠĠĠĠĠĠ ĠassertEquals (" text ", Ġsend [ 0 ]. text ()) ĊĠĠĠĠĠĠĠ Ġfor Ġ( index Ġin Ġ 0 .. 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( index . to Byte (), Ġsend [ 1 ]. binary ()[ index ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` check Ġto Ġemit Ġerror `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsocket Error Ġ= ĠarrayOf ( false ) ĊĠĠĠĠĠĠĠ Ġval Ġerror Ġ= Ġarray ListOf < String ? >( null ) ĊĠĠĠĠĠĠĠ Ġpage . on WebSocket Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . on Socket Error Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror [ 0 ] Ġ= Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsocket Error [ 0 ] Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġjs Script Ġ= Ġ""" port Ġ=> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠ Ġnew ĠWebSocket (' ws :// localhost :' Ġ+ Ġport Ġ+ Ġ'/ bo gus - ws '); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| } ĊĠĠĠĠĠĠĠ Ġ""" . trim Margin () ĊĠĠĠĠĠĠĠ Ġpage . evaluate ( js Script , Ġhttp Server . server Port ) ĊĠĠĠĠĠĠĠ ĠwaitFor Condition ( socket Error ) ĊĠĠĠĠĠĠĠ Ġif Ġ( is Firefox ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" CLOSE _ AB NORMAL ", Ġerror [ 0 ]) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( error [ 0 ] !!. contains (" 4 0 4 "), Ġerror [ 0 ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠassertTrue ( socket Error [ 0 ]) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` check Ġto Ġnot Ġhave Ġstr ay Ġerror Ġevents `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġws Ġ= Ġpage . waitFor WebSocket Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjs Script Ġ= Ġ""" port Ġ=> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠ Ġwindow . ws Ġ= Ġnew ĠWebSocket (' ws :// localhost :' Ġ+ Ġport Ġ+ Ġ'/ ws '); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| } ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Margin () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpage . evaluate ( js Script , Ġweb Socket Server . port ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġerror Ġ= ĠarrayOf ( false ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( ws ) ĊĊĠĠĠĠĠĠĠ Ġws . on Socket Error Ġ{ Ġerror [ 0 ] Ġ= Ġtrue Ġ} ĊĠĠĠĠĠĠĠ Ġws . waitFor Frame Received Ġ{} ĊĠĠĠĠĠĠĠ Ġpage . evaluate (" window . ws . close () ") ĊĠĠĠĠĠĠĠ ĠassertFalse ( error [ 0 ]) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` check Ġto Ġreject Ġfuture Ġevent Ġon Ġsocket Ġclose `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġws Ġ= Ġpage . waitFor WebSocket Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjs Script Ġ= Ġ""" port Ġ=> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠ Ġwindow . ws Ġ= Ġnew ĠWebSocket (' ws :// localhost :' Ġ+ Ġport Ġ+ Ġ'/ ws '); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| } ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Margin () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpage . evaluate ( js Script , Ġweb Socket Server . port ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠassertNotNull ( ws ) ĊĠĠĠĠĠĠĠ Ġws . waitFor Frame Received Ġ{ Ġ} ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġws . waitFor Frame Sent Ġ{ Ġpage . evaluate (" window . ws . close () ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfail (" waitFor Frame Sent Ġmethod Ġshould Ġthrow ") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠPlay w right Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( e . message !!. contains (" Socket Ġclosed ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` check Ġto Ġreject Ġfuture Ġevent Ġon Ġpage Ġclose `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġws Ġ= Ġpage . waitFor WebSocket Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjs Script Ġ= Ġ""" port Ġ=> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠ Ġwindow . ws Ġ= Ġnew ĠWebSocket (' ws :// localhost :' Ġ+ Ġport Ġ+ Ġ'/ ws '); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| } ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Margin () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpage . evaluate ( js Script , Ġweb Socket Server . port ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠassertNotNull ( ws ) ĊĠĠĠĠĠĠĠ Ġws . waitFor Frame Received Ġ{} ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġws . waitFor Frame Sent Ġ{ Ġpage . close () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfail (" waitFor Frame Sent Ġmethod Ġshould Ġthrow ") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠPlay w right Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( e . message !!. contains (" Page Ġclosed ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` check Ġto Ġcall Ġframe Ġreceived Ġpredicate `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġws Ġ= Ġpage . waitFor WebSocket Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjs Script Ġ= Ġ""" port Ġ=> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠ Ġwindow . ws Ġ= Ġnew ĠWebSocket (' ws :// localhost :' Ġ+ Ġport Ġ+ Ġ'/ ws '); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| } ĊĠĠĠĠĠĠĠ Ġ""" . trim Margin () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpage . evaluate ( js Script , Ġweb Socket Server . port ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠassertNotNull ( ws ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġarray ListOf < String ? >( null ) ĊĠĠĠĠĠĠĠ Ġval Ġpredicate : Ġ( I WebSocket Frame ) Ġ-> ĠBoolean Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(" incoming " Ġ== Ġit . text ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext [ 0 ] Ġ= Ġit . text () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext [ 0 ] Ġ!= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġframe Ġ= Ġws . waitFor Frame Received ( WaitFor Frame Received Options Ġ{ Ġit . predicate Ġ= Ġpredicate Ġ}) Ġ{} ĊĠĠĠĠĠĠĠ ĠassertNotNull ( frame ) ĊĠĠĠĠĠĠĠ ĠassertEquals (" incoming ", Ġtext [ 0 ]) ĊĠĠĠĠĠĠĠ ĠassertEquals (" incoming ", Ġframe . text ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` check Ġto Ġcall Ġframe Ġsent Ġpredicate `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġws Ġ= Ġpage . waitFor WebSocket Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjs Script Ġ= Ġ""" port Ġ=> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠ Ġwindow . ws Ġ= Ġnew ĠWebSocket (' ws :// localhost :' Ġ+ Ġport Ġ+ Ġ'/ ws '); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠ Ġreturn Ġnew ĠPromise ( f Ġ=> Ġws . addEventListener (' open ', Ġf )); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| } ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Margin () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpage . evaluate ( js Script , Ġweb Socket Server . port ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠassertNotNull ( ws ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġarray ListOf < String ? >( null ) ĊĠĠĠĠĠĠĠ Ġval Ġpredicate : Ġ( I WebSocket Frame ) Ġ-> ĠBoolean Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(" outgoing " Ġ== Ġit . text ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext [ 0 ] Ġ= Ġit . text () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext [ 0 ] Ġ!= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġframe Ġ= Ġws . waitFor Frame Sent ( WaitFor Frame Sent Options Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . predicate Ġ= Ġpredicate ĊĠĠĠĠĠĠĠ Ġ}) Ġ{ Ġpage . evaluate (" ws . send (' outgoing ') ") Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals (" outgoing ", Ġtext [ 0 ]) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( frame ) ĊĠĠĠĠĠĠĠ ĠassertEquals (" outgoing ", Ġframe . text ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` check Ġcorrect Ġwork Ġframe Ġreceived Ġwith Ġtimeout `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġws Ġ= Ġpage . waitFor WebSocket Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjs Script Ġ= Ġ""" port Ġ=> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠ Ġwindow . ws Ġ= Ġnew ĠWebSocket (' ws :// localhost :' Ġ+ Ġport Ġ+ Ġ'/ ws '); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠ Ġreturn Ġnew ĠPromise ( f Ġ=> Ġws . addEventListener (' open ', Ġf )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| } ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Margin () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpage . evaluate ( js Script , Ġweb Socket Server . port ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠassertNotNull ( ws ) ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġws . waitFor Frame Received ( WaitFor Frame Received Options Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . predicate Ġ= Ġ{ Ġfalse Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . timeout Ġ= Ġ 1 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfail (" waitFor Frame Received Ġmethod Ġshould Ġthrow ") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠPlay w right Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( e . message !!. contains (" Timeout "), Ġe . message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` check Ġcorrect Ġwork Ġframe Ġsent Ġwith Ġtimeout `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġws Ġ= Ġpage . waitFor WebSocket Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjs Script Ġ= Ġ""" port Ġ=> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠ Ġwindow . ws Ġ= Ġnew ĠWebSocket (' ws :// localhost :' Ġ+ Ġport Ġ+ Ġ'/ ws '); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠ Ġreturn Ġnew ĠPromise ( f Ġ=> Ġws . addEventListener (' open ', Ġf )); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| } ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Margin () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpage . evaluate ( js Script , Ġweb Socket Server . port ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertNotNull ( ws ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġws . waitFor Frame Sent ( WaitFor Frame Sent Options Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . predicate Ġ= Ġ{ Ġfalse Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . timeout Ġ= Ġ 1 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) Ġ{ Ġpage . evaluate (" ws . send (' outgoing '); ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfail (" waitFor Frame Sent Ġmethod Ġshould Ġthrow ") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠPlay w right Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( e . message !!. contains (" Timeout "), Ġe . message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }