/* Ċ Ġ* ĠCopyright Ġ@ Ġ 2 0 1 8 Ġ- Ġpresent Ġ 8 x 8 , ĠInc . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġorg . j its i . video bridge . api . util Ċ Ċ import Ġio . kot est . core . spec . style . Should Spec Ċ import Ġio . kot est . matchers . comp ar ables . shouldBe Equal Comp aring To Ċ import Ġio . kot est . matchers . null s . should Not BeNull Ċ import Ġio . kot est . matchers . shouldBe Ċ import Ġio . ktor . http . c io . websocket . Frame Ċ import Ġio . mock k . every Ċ import Ġio . mock k . just Ċ import Ġio . mock k . mock k Ċ import Ġio . mock k . runs Ċ import Ġio . mock k . slot Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ import Ġorg . j its i . utils . logging 2 . Logger Impl Ċ import Ġorg . j its i . x mpp . extensions . co lib ri . Col ibri Conference IQ Ċ import Ġorg . j ives o ftware . sm ack . packet . IQ Ċ import Ġorg . j ives o ftware . sm ack . packet . St anza Ċ import Ġorg . jx mpp . jid . impl . J id Create Ċ import Ġjava . time . Duration Ċ import Ġkotlin . random . Random Ċ import Ġkotlin . time . Experimental Time Ċ Ċ @ Experimental Time Ċ class ĠX mpp WebSocket Client Test Ġ: ĠShould Spec () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġcaptured Incoming MessageHandler Ġ= Ġslot <( Frame ) Ġ-> ĠUnit >() ĊĠĠĠ Ġprivate Ġval Ġcaptured Sent Iq Ġ= Ġslot < String >() ĊĠĠĠ Ġprivate Ġval Ġws Client : ĠWebSocket Client Ġ= Ġmock k () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġevery Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġws Client Ġset Property Ġ" incoming MessageHandler " Ġvalue Ġcapture ( captured Incoming MessageHandler ) ĊĠĠĠĠĠĠĠ Ġ} Ġjust Ġruns ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġws Client . run () Ġ} Ġjust Ġruns ĊĊĠĠĠĠĠĠĠ Ġval Ġws Ġ= ĠX mpp WebSocket Client ( ws Client , Ġparent Logger Ġ= ĠLogger Impl (" test "), Ġrequest Timeout Ġ= ĠDuration . of Seconds ( 3 )) ĊĠĠĠĠĠĠĠ Ġws . run () ĊĊĠĠĠĠĠĠĠ Ġcontext (" send Iq AndGet Reply ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext (" when Ġa Ġcorrect Ġreply Ġis Ġsent ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġws Client . respond Correct ly ( captured Incoming MessageHandler . captured ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshould (" work Ġcorrectly ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi q Ġ= Ġgenerate Iq () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresp Ġ= Ġws . send Iq AndGet Reply ( iq ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresp ĠshouldBe Response To Ġi q ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext (" when Ġno Ġreply Ġis Ġsent ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġws Client . never Respond () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshould (" return Ġnull ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi q Ġ= Ġgenerate Iq () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresp Ġ= Ġws . send Iq AndGet Reply ( iq ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresp ĠshouldBe Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext (" when Ġa Ġreply Ġis Ġsent Ġfor Ġa Ġdifferent ĠIQ ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġws Client . respond To Different Iq ( captured Incoming MessageHandler . captured ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshould (" return Ġnull ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi q Ġ= Ġgenerate Iq () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresp Ġ= Ġws . send Iq AndGet Reply ( iq ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresp ĠshouldBe Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext (" when Ġrequests Ġand Ġresponses Ġare Ġmixed ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġws Client . flip Responses ( captured Incoming MessageHandler . captured ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshould (" work Ġcorrectly ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" sending Ġreq Ġ 1 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi q Ġ= Ġgenerate Iq () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresp Ġ= Ġws . send Iq AndGet Reply ( iq ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresp ĠshouldBe Response To Ġi q ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" sending Ġreq Ġ 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi q Ġ= Ġgenerate Iq () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresp Ġ= Ġws . send Iq AndGet Reply ( iq ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresp ĠshouldBe Response To Ġi q ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠConfigure Ġthe Ġmock Ġ[ WebSocket Client ] Ġto Ġsimulate Ġa Ġproper Ġresponse Ġto Ġany Ċ Ġ* ĠIQ Ġit Ġreceives Ċ Ġ*/ Ċ private Ġfun ĠWebSocket Client . respond Correct ly ( msg Handler : Ġ( Frame ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġval Ġi q Str Ġ= Ġslot < String >() ĊĠĠĠ Ġevery Ġ{ Ġsend String ( capture ( iq Str )) Ġ} Ġanswers Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġi q Str . captured . create Response Iq () ĊĠĠĠĠĠĠĠ Ġmsg Handler . invoke ( Frame . Text ( response . to XML (). toString ())) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠConfigure Ġthe Ġmock Ġ[ WebSocket Client ] Ġto Ġreceive Ġan ĠIQ Ġbut Ġnever Ġrespond Ċ Ġ*/ Ċ private Ġfun ĠWebSocket Client . never Respond () Ġ{ ĊĠĠĠ Ġevery Ġ{ Ġsend String ( any ()) Ġ} Ġjust Ġruns Ċ } Ċ Ċ /** Ċ Ġ* ĠConfigure Ġthe Ġmock Ġ[ WebSocket Client ] Ġto Ġreceive Ġan ĠIQ Ġand Ġrespond , Ġbut Ġwith Ġa Ċ Ġ* Ġdifferent Ġst anza ĠID Ċ Ġ*/ Ċ private Ġfun ĠWebSocket Client . respond To Different Iq ( msg Handler : Ġ( Frame ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġval Ġi q Str Ġ= Ġslot < String >() ĊĠĠĠ Ġevery Ġ{ Ġsend String ( capture ( iq Str )) Ġ} Ġanswers Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġi q Str . captured . create Response Iq () ĊĠĠĠĠĠĠĠ Ġresponse . stan za Id Ġ= Ġ"${ response . stan za Id }- wrong " ĊĠĠĠĠĠĠĠ Ġmsg Handler . invoke ( Frame . Text ( response . to XML (). toString ())) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠConfigure Ġthe Ġmock Ġ[ WebSocket Client ] Ġto Ġwait Ġfor Ġ 2 ĠI Qs Ġand Ġsend Ġtheir Ċ Ġ* Ġresponses Ġin Ġthe Ġopposite Ġorder Ġthey Ġwere Ġreceived Ċ Ġ*/ Ċ private Ġfun ĠWebSocket Client . flip Responses ( msg Handler : Ġ( Frame ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġval Ġi q Str Ġ= Ġmutable ListOf < String >() ĊĠĠĠ Ġevery Ġ{ Ġsend String ( capture ( iq Str )) Ġ} Ġanswers Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( iq Str . size Ġ== Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresp 1 Ġ= Ġi q Str [ 0 ]. create Response Iq () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresp 2 Ġ= Ġi q Str [ 1 ]. create Response Iq () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmsg Handler . invoke ( Frame . Text ( resp 2 . to XML (). toString ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmsg Handler . invoke ( Frame . Text ( resp 1 . to XML (). toString ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠConfigure Ġthe Ġmock Ġ[ WebSocket Client ] Ġto Ġwait Ġfor Ġan ĠIQ Ġand Ġthen Ġshut Ġitself Ċ Ġ* Ġdown Ġvia Ġ[ WebSocket Client . stop ] Ċ Ġ*/ Ċ private Ġfun ĠWebSocket Client . stop After Iq ( x mpp Ws Client : ĠX mpp WebSocket Client ) Ġ{ ĊĠĠĠ Ġevery Ġ{ Ġsend String ( any ()) Ġ} Ġanswers Ġ{ ĊĠĠĠĠĠĠĠ Ġx mpp Ws Client . stop () ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠCreate Ġa Ġresponse ĠIQ Ġto Ġthe ĠIQ Ġrequest Ġrepresented Ġby Ġthis ĠString Ċ Ġ*/ Ċ private Ġfun ĠString . create Response Iq (): ĠIQ Ġ{ ĊĠĠĠ Ġval Ġi q Req Ġ= ĠSm ack Xml Ser Des . deserialize ( this ) Ġas ĠIQ ĊĠĠĠ Ġreturn ĠIQ . create Result IQ ( iq Req ) Ċ } Ċ Ċ private Ġfun Ġgenerate Iq ( ĊĠĠĠ Ġto J id Str : ĠString ? Ġ= Ġnull , ĊĠĠĠ Ġfrom J id Str : ĠString ? Ġ= Ġnull Ċ ): ĠIQ Ġ= ĠCol ibri Conference IQ (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġto Ġ= ĠJ id Create . bare From ( to J id Str Ġ?: ĠRandom . next Print able Alpha String ( 5 )) ĊĠĠĠĠĠĠĠ Ġfrom Ġ= ĠJ id Create . bare From ( from J id Str Ġ?: ĠRandom . next Print able Alpha String ( 5 )) ĊĠĠĠ Ġ} Ċ Ċ private Ġfun ĠRandom . next Print able Alpha String ( length : ĠInt ): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġ( 0 Ġuntil Ġlength ). map Ġ{ Ġnext Int ( from Ġ= Ġ 6 5 , Ġuntil Ġ= Ġ 9 0 ). to Char () Ġ}. join ToString ("") Ċ } Ċ Ċ private Ġin fix Ġfun ĠSt anza ?. shouldBe Response To ( req : ĠIQ ) Ġ{ ĊĠĠĠ Ġthis . should Not BeNull () ĊĠĠĠ Ġfrom . shouldBe Equal Comp aring To ( req . to ) ĊĠĠĠ Ġto . shouldBe Equal Comp aring To ( req . from ) Ċ } Ċ