package Ġcom . wallet connect . wallet connect v 2 . relay . data . model Ċ Ċ import Ġcom . squareup . mos hi . M oshi Ċ import Ġcom . squareup . mos hi . kotlin . reflect . Kotlin Json Adapter Factory Ċ import Ġcom . t inder . sc ar let . Message Ċ import Ġcom . t inder . sc ar let . Sc ar let Ċ import Ġcom . t inder . sc ar let . Stream Ċ import Ġcom . t inder . sc ar let . WebSocket Ċ import Ġcom . t inder . sc ar let . message adapter . mos hi . M oshi Message Adapter Ċ import Ġcom . t inder . sc ar let . test utils . Test Stream Observer Ċ import Ġcom . t inder . sc ar let . test utils . Value Assert Ċ import Ġcom . t inder . sc ar let . test utils . any Ċ import Ġcom . t inder . sc ar let . test utils . test Ċ import Ġcom . t inder . sc ar let . utils . getRaw Type Ċ import Ġcom . t inder . sc ar let . websocket . mock webserver . new WebSocket Factory Ċ import Ġcom . t inder . sc ar let . websocket . okhttp . new WebSocket Factory Ċ import Ġcom . t inder . sc ar let . ws . Receive Ċ import Ġcom . t inder . sc ar let . ws . Send Ċ import Ġcom . wallet connect . wallet connect v 2 . common . adapters .* Ċ import Ġcom . wallet connect . wallet connect v 2 . common . model . vo . Expiry VO Ċ import Ġcom . wallet connect . wallet connect v 2 . common . model . vo . Subscription Id VO Ċ import Ġcom . wallet connect . wallet connect v 2 . common . model . vo . Topic VO Ċ import Ġcom . wallet connect . wallet connect v 2 . common . model . vo . T tl VO Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . flow . single OrNull Ċ import Ġokhttp 3 . Ok HttpClient Ċ import Ġokhttp 3 . mock webserver . Mock WebServer Ċ import Ġorg . assertj . core . api . Assertions . assertThat Ċ import Ġorg . intellij . lang . annotations . Language Ċ import Ġorg . json . JSONObject Ċ import Ġorg . junit . Rule Ċ import Ġorg . junit . jupiter . api . BeforeEach Ċ import Ġorg . junit . jupiter . api . Nested Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġcom . wallet connect . wallet connect v 2 . network . model . Relay DTO Ċ import Ġcom . wallet connect . wallet connect v 2 . network . data . service . Relay Service Ċ import Ġcom . wallet connect . wallet connect v 2 . util . Coroutine Test Rule Ċ import Ġcom . wallet connect . wallet connect v 2 . network . data . adapter . Flow Stream Adapter Ċ import Ġcom . wallet connect . wallet connect v 2 . util . getRandom 6 4 Byte HexString Ċ import Ġcom . wallet connect . wallet connect v 2 . util . run Test Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġkotlin . test . assertEquals Ċ import Ġkotlin . test . assertIs Ċ import Ġkotlin . test . assertNotNull Ċ Ċ @ Experimental Cor outines Api Ċ internal Ġclass ĠRelay Test Ġ{ ĊĊĠĠĠ Ġ@ get : Rule ĊĠĠĠ Ġval Ġcoroutine Rule Ġ= ĠCor outine Test Rule () ĊĊĠĠĠ Ġ@ Rule ĊĠĠĠ Ġval Ġmock WebServer Ġ= ĠMock WebServer () ĊĠĠĠ Ġprivate Ġval Ġserver Url String Ġby Ġlazy Ġ{ Ġmock WebServer . url ("/ "). toString () Ġ} ĊĠĠĠ Ġprivate Ġval Ġm oshi Ġ= Ġcreate M oshi () ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġserver : ĠMock Server Service ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġserver Event Observer : ĠTest Stream Observer < WebSocket . Event > ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġclient : ĠRelay Service Ċ // ĠĠĠ Ġprivate Ġlateinit Ġvar Ġclient Event Observer : ĠTest Stream Observer < WebSocket . Event > ĊĊĠĠĠ Ġ@ BeforeEach ĊĠĠĠ Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠ Ġgiven Connection Is Est ab lished () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġinner Ġclass ĠPublish Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` Client Ġsends ĠRelay _ Publish _ Request , Ġshould Ġbe Ġreceived Ġby Ġthe Ġserver `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠArrange ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrelay Publish Request Ġ= ĠRelay DTO . Publish . Request ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams Ġ= ĠRelay DTO . Publish . Request . Params ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtopic Ġ= ĠTopic VO ( getRandom 6 4 Byte HexString ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= ĠgetRandom 6 4 Byte HexString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġserver Relay Publish Observer Ġ= Ġserver . observe Relay Publish (). test () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAct ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . publish Request ( relay Publish Request ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAssert ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserver Event Observer . await Values ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġany < WebSocket . Event . On Connection Opened <* >> (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġany < WebSocket . Event . On Message Received >(). containing Relay Object ( relay Publish Request ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠLook Ġinto Ġwhy Ġthis Ġis Ġfailing Ġall Ġof Ġa Ġsudden Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġserver Relay Publish Observer . await Values ( any < Relay . Publish . Request >()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` Server Ġsends ĠRelay _ Publish _ Ack nowledge ment , Ġshould Ġbe Ġreceived Ġby Ġthe Ġclient `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠArrange ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrelay Publish Ack nowledge ment Ġ= ĠRelay DTO . Publish . Ack nowledge ment ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclient Relay Publish Observer Ġ= Ġclient . observe Publish Ack nowledge ment () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAct ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserver . send Publish Ack nowledge ment ( relay Publish Ack nowledge ment ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAssert Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġclient Event Observer . await Values ( Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġany < WebSocket . Event . On Connection Opened <* >> (), Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġany < WebSocket . Event . On Message Received >(). containing Relay Object ( relay Publish Ack nowledge ment ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Rule . run Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Publish Ack nowledge ment Ġ= Ġclient Relay Publish Observer . single OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( actual Publish Ack nowledge ment ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( relay Publish Ack nowledge ment , Ġactual Publish Ack nowledge ment ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġinner Ġclass ĠSubscribe Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` Client Ġsends ĠRelay _ Subscribe _ Request , Ġshould Ġbe Ġreceived Ġby Ġthe Ġserver `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠArrange ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrelay Subscribe Request Ġ= ĠRelay DTO . Subscribe . Request ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams Ġ= ĠRelay DTO . Subscribe . Request . Params ( Topic VO ( getRandom 6 4 Byte HexString ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġserver Relay Publish Observer Ġ= Ġserver . observe Subscribe Publish (). test () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAct ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . subscribe Request ( relay Subscribe Request ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAssert ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserver Event Observer . await Values ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġany < WebSocket . Event . On Connection Opened <* >> (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġany < WebSocket . Event . On Message Received >(). containing Relay Object ( relay Subscribe Request ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserver Relay Publish Observer . await Values ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġany < Relay DTO . Subscribe . Request > Ġ{ ĠassertThat ( this ). isEqualTo ( relay Subscribe Request ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` Server Ġsends ĠRelay _ Subscribe _ Ack nowledge ment , Ġshould Ġbe Ġreceived Ġby Ġthe Ġclient `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠArrange ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrelay Subscribe Ack nowledge ment Ġ= ĠRelay DTO . Subscribe . Ack nowledge ment ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= ĠSubscription Id VO (" Subscription Id Ġ 1 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclient Relay Subscribe Observer Ġ= Ġclient . observe Subscribe Ack nowledge ment () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAct ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserver . send Subscribe Ack nowledge ment ( relay Subscribe Ack nowledge ment ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAssert Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġclient Event Observer . await Values ( Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġany < WebSocket . Event . On Connection Opened <* >> (), Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġany < WebSocket . Event . On Message Received >(). containing Relay Object ( relay Subscribe Ack nowledge ment ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Rule . run Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Subscribe Ack nowledge ment Ġ= Ġclient Relay Subscribe Observer . single OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( actual Subscribe Ack nowledge ment ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( relay Subscribe Ack nowledge ment , Ġactual Subscribe Ack nowledge ment ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġinner Ġclass ĠSubscription Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` Deserialize ĠSubscription ĠRequest `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Language (" JSON ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmock Subscription Request Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" id ": Ġ 1 6 3 4 2 8 0 3 3 2 6 8 3 2 3 8 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" jsonrpc ": Ġ" 2 . 0 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" method ": Ġ" w aku _ subscription ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" params ": Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" id ": Ġ" ca 6 b 4 c 1 fd 2 efe 0 5 3 7 a 1 2 9 0 c 8 0 3 9 6 3 5 c 7 ea 7 ff cb 9 e 3 1 b 8 f 5 4 d 6 0 aba 0 d 9 d 2 5 7 4 5 c ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" data ": Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" topic ": Ġ" b 1 6 5 ce 3 5 6 7 5 8 2 7 8 8 9 e 2 5 4 0 2 5 4 9 5 8 9 da 4 2 cf 4 7 2 ca 0 a 6 1 dc 3 2 d 6 9 a 1 1 1 baf bc 2 9 f 8 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" message ": Ġ" ef 1 6 7 b 0 c 0 4 2 b 7 2 2 8 4 f 3 3 a 7 7 2 6 f 5 4 8 af 6 4 0 0 cb 3 f 4 3 9 6 6 e 9 4 ce 5 7 a 1 5 0 b 4 3 eb 8 ad 1 b 2 1 1 d 2 0 fd 0 8 7 3 ef 3 8 0 7 7 3 5 e 5 7 5 fab 6 6 6 2 8 1 5 ed 6 9 2 9 c 8 8 f 7 6 6 a 6 7 3 6 d 9 af 5 ad 3 6 8 b 5 9 ddc 4 5 0 5 c 7 5 eb 4 be 5 cf 2 fd 9 a 5 7 4 4 bd 9 4 2 9 c 6 d 0 d 0 6 b 1 5 0 7 a 9 0 da 0 8 c 7 da 3 8 d 2 5 5 3 a 2 6 ecd 0 0 5 d 1 1 c 0 7 1 8 a 1 d 2 1 5 7 c 5 b 5 2 9 1 b 1 a 6 9 a 5 4 2 b 6 3 2 4 d 6 d 4 af 0 c 9 5 6 2 8 4 7 f 0 d 4 9 b 5 6 4 8 3 d 4 c 4 0 9 e 1 b 3 6 f 6 1 6 2 0 2 7 0 bab 7 f 3 0 f 2 7 1 e 0 5 3 c 5 8 fe 3 d 8 a 4 8 b afb 5 8 5 7 b 3 1 1 6 1 e 1 b 1 7 8 a 0 cec 9 d 5 2 9 2 8 b 0 ef 0 0 3 8 4 7 5 3 4 5 7 2 2 d 3 6 b 5 6 2 2 1 e 8 2 8 cb 0 2 f 4 2 1 d 5 0 3 6 7 2 2 c 9 3 fb 3 c 1 9 3 3 f 5 8 8 4 1 7 f 9 9 4 3 cc 0 ac 5 a 4 2 d 8 8 fb 7 ed 7 4 3 da 7 3 e 1 1 7 e 9 bcd 3 6 aa 0 fe ea 2 9 aaa 5 9 2 8 ac 1 c 9 a 7 ac 7 cc 0 5 2 ac 7 6 3 da 6 f 5 4 f 2 4 1 1 4 e 0 0 3 3 2 c 8 1 3 b 4 af 7 8 9 cb 7 db 3 ac 7 ee ad ca 4 6 5 9 cd 4 9 a 2 d 2 d 3 6 2 6 5 ec 1 d 5 7 3 1 b 7 1 7 1 f 2 a 1 2 dc 2 ae 4 5 bfe 3 ad 9 9 b 1 c 7 db 7 f 0 9 9 ab 7 a 4 1 af 4 8 6 3 2 1 aa 5 aa ad 2 ecd 5 4 ab 1 4 9 7 9 4 bca 4 5 cf cf 4 4 6 0 c 8 3 c 5 6 0 c 0 e 2 a 7 5 ba 7 d 0 f 5 c 4 ebf 9 c 8 d 5 8 5 2 8 eb 7 3 af 3 0 f 7 1 7 7 6 0 ab 7 5 cb 4 0 0 3 7 db 8 e 5 2 3 ef 5 a 6 c dec 4 ffc 3 cd 6 6 7 0 d 4 9 0 8 b 3 8 5 0 d 2 c 1 0 f 6 b ade 9 0 2 bd 3 b 3 5 f 3 3 8 bd 7 5 8 a 1 4 3 b 9 aa 2 1 4 d 6 2 7 ba 4 0 6 d 0 0 a 1 9 4 e 8 db 4 6 1 1 2 a 1 7 a 5 9 3 2 4 0 c 1 8 4 7 e 6 e 3 ca 5 a 0 9 6 eae 1 ed bb 5 d 3 ef 4 c 3 7 2 6 1 a 7 aa 7 2 b 9 4 b 0 4 d 5 4 e 3 b 6 0 9 9 7 de eba 2 5 d 5 a 4 9 cd 5 be 0 1 d 1 ff 0 9 6 2 d 7 7 cb 9 8 1 3 2 df 3 7 bca 6 2 1 7 1 c 6 4 0 9 2 3 8 8 d 7 b 7 6 ce 1 3 e 5 1 d 5 1 9 1 db 7 3 5 c 3 5 6 ea 9 5 d 3 bdd f 0 ee 5 a 5 1 f 7 9 1 0 7 1 8 9 4 4 6 5 2 7 a 2 c 2 8 1 7 5 2 7 8 6 da 7 cf 6 bbd 5 8 1 f 4 9 1 b 2 3 d 4 ada ec cb bf 3 e 2 aae 0 7 4 c 5 f 7 2 db 2 9 9 8 1 7 a 5 af 3 7 a 0 d 5 a 3 c 3 7 3 1 0 b 6 9 6 3 6 b 7 3 bb 1 6 5 bfe 9 6 0 6 8 ae 9 8 7 d 7 c 8 0 6 6 5 0 3 9 ffb 1 1 5 2 e 8 7 0 5 b 7 a 4 5 b 2 5 5 2 8 2 7 fb 1 b 0 7 6 d 4 b 0 0 9 ac 2 3 2 fc 3 6 ab 8 3 9 ef ba ac df 3 4 c 4 aee 6 6 9 3 a 5 a 6 c 5 6 2 9 9 1 ccf 0 0 3 3 1 7 d 9 b 3 c 6 6 3 1 ba 1 db 7 f 1 fb 2 d 8 3 9 5 9 4 1 5 aa 9 e 5 a 2 f 8 8 af 2 2 bf 1 6 2 3 a 9 3 9 1 5 2 6 a 4 5 2 9 8 5 8 dd 7 f 6 1 b 8 ce bc 2 6 df 7 c 4 7 ede 5 8 6 5 e 7 3 2 e 5 5 3 1 2 f 1 4 c 4 3 eef 6 9 7 aab 9 5 d 8 5 4 6 2 6 9 7 e 9 4 8 7 a 9 4 a afa 8 5 6 2 dda 0 8 0 5 b 1 f 8 2 1 6 9 4 5 8 1 7 8 f 0 9 e 9 3 e 4 1 6 6 f 6 ef 2 6 f 6 0 6 ef 5 5 ce 6 ed 4 c 2 bfa 6 1 6 6 0 e 8 4 ac 5 1 cfc 8 7 2 2 9 cc 0 df 5 6 d afd 9 a 0 1 b 9 5 6 5 5 5 2 f 6 4 9 2 c 0 7 1 cbf 7 9 dd 7 b 5 1 9 8 c 2 c 2 1 c 2 7 3 ded 8 4 8 5 4 ddb 0 4 3 1 0 1 b 1 6 2 8 1 ef 9 2 f 1 4 a 2 c 9 e 6 8 a 4 a 9 4 4 5 2 bd 9 fa ed 2 8 cde 4 9 d 4 7 7 4 a 1 8 f 7 0 6 b 9 7 9 9 b 4 4 9 b 5 9 ede 2 1 c 2 a 3 7 4 ec 3 d 3 fa 0 6 f 8 9 bc 6 3 3 9 1 b 3 aff cb 8 d 9 3 5 f 7 2 fe 3 d 8 7 e 1 3 c 7 d 9 4 e 6 2 1 0 8 4 4 8 7 c 0 a 4 dc 8 cc 5 f 9 4 1 ec 9 def 4 0 e 8 6 e 1 b 1 6 8 0 e 3 4 3 f 7 7 a 7 c 0 8 8 4 3 8 2 5 a 7 0 7 2 2 4 fe 3 3 4 6 1 3 5 d 0 8 ac 4 e 1 3 8 cd 3 3 c 6 1 dc 3 7 cb 9 9 7 4 e 9 3 cfb 5 9 5 9 f 6 bfc ffb 5 f 8 2 2 ba 6 e 4 5 7 6 8 d 4 e 7 7 5 bbe 3 2 c 1 0 1 4 d 8 0 2 3 4 8 9 0 3 fa 5 e 2 0 6 fc 4 5 7 1 1 e 9 0 d 1 8 7 4 ada 9 9 0 bf 6 8 4 d 5 1 1 3 0 0 5 6 7 1 8 ac 3 be " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeserialized Subscription Request Ġ= Ġm oshi . adapter ( Relay DTO . Subscription . Request :: class . java ). fromJson ( mock Subscription Request ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( de serialized Subscription Request ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` Server Ġsends ĠRelay _ Subscription _ Request , Ġshould Ġbe Ġreceived Ġby Ġthe Ġclient `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ff bec f 8 1 9 a 4 9 a 2 6 6 b 2 6 2 3 0 9 ad 2 6 9 ae 4 0 1 6 ef 8 b 8 ef 1 f 0 1 0 d 4 4 4 7 b 7 e 0 8 9 aac 0 b 9 4 3 d 5 e 2 ca 9 4 6 4 6 ddc fa 9 2 f 4 e 8 e 5 7 7 8 cc 3 e 3 9 e 3 e 8 7 6 dd 9 5 0 6 5 c 5 8 9 9 b 9 5 a 9 8 5 1 2 6 6 4 a 8 c 7 7 8 5 3 c 4 7 d 3 1 c 2 e 7 1 4 e 5 0 0 1 8 f 3 d 1 b 5 2 5 dbd 2 f 7 6 cde 5 bff 8 b 2 6 1 f 3 4 3 ecb 3 d 9 5 6 ad 9 e 7 4 8 1 9 c 8 7 2 9 fa 1 c 7 7 be 4 b 5 fb 7 d 3 9 ccc 6 9 7 bda 4 2 1 fb 9 0 d 1 1 3 1 5 d 8 2 8 e 7 9 fca 6 a 2 7 3 1 6 d 3 b 0 9 f 1 4 c 7 f 3 4 8 3 b 2 5 b 0 0 0 8 2 0 e 7 b 6 4 a 7 5 e 5 f 5 9 2 1 6 e 5 f 0 ec bc 4 ec 2 0 c 5 3 6 6 4 ad 5 e 9 6 7 0 2 6 aa 1 1 9 a 3 2 a 6 5 5 e 3 ff 3 e 1 1 0 ca 4 c 7 e 6 2 9 b 8 4 5 b 8 ecf 7 ea 6 f 2 9 6 a 7 9 a 6 de 3 dc 5 7 9 4 c 3 a 5 1 0 5 9 bb 0 8 b 0 9 9 7 4 5 0 1 ff cf 2 d 7 fdd af afd 9 f 1 b 2 2 e 9 7 b 6 ab bb 6 bcd 9 7 8 a 8 a 8 7 3 4 1 f 3 3 bc 6 6 2 c 1 0 1 9 4 7 a 0 6 c 7 2 f 6 c 7 7 0 9 a 0 a 6 1 2 f 4 6 fcd 8 b 5 fb ce 0 bdd 4 c 5 6 ca 3 3 0 e 6 e 2 8 0 2 fbf 6 e 3 8 3 0 2 1 0 f 3 c 1 b 6 2 6 8 6 3 de 9 3 fd 0 2 8 5 7 c 6 1 5 4 3 6 e 1 b 9 dc 7 d 3 6 d 4 5 bb ec 8 ac fb 2 4 cd 4 5 c 4 6 9 4 6 8 3 2 d 5 a 7 cc 2 0 3 3 4 fd 7 4 0 5 dba 9 9 7 daf 4 7 2 5 bc 8 4 9 4 5 0 f 1 9 7 e 7 e 9 e 2 f 5 e 2 0 8 3 9 ba 1 f 7 7 8 9 5 b 3 cb ccc 2 7 9 fdc 0 a 9 d 4 0 1 5 6 a 2 8 ad 2 ad cd 6 a 8 afc 6 8 f 9 7 3 5 c 4 e 7 c 2 2 c 4 9 caf 5 1 5 0 f 2 4 3 bab 7 0 2 a 7 1 6 9 9 c 9 b 2 6 4 2 0 6 6 8 c 8 1 fc 5 b 3 1 1 4 8 8 3 3 1 a 4 4 5 6 ba 1 baf 6 1 9 8 1 8 b 4 ec fe 6 f 6 de 8 f 8 0 dc 4 2 a 8 5 c 7 8 5 aa 7 8 dd 1 8 7 e 8 2 fa ec 5 4 9 7 8 0 0 5 1 5 5 1 3 3 5 c 6 5 1 af 1 0 f 8 9 a 3 e 3 7 1 0 3 e 5 6 a 8 ebf 2 7 f 3 0 5 4 e 4 3 0 3 a 6 bce 8 8 d 7 c 0 8 2 bf da 8 9 7 fac fd 9 5 2 df 5 d 3 d 6 7 7 6 3 7 0 8 8 4 cb 0 4 9 2 3 c 8 0 4 c 9 9 0 5 9 bb 2 6 9 fdb ff 3 5 4 3 d 8 9 6 4 8 f 3 9 a 7 cc 6 fd ad 6 1 ea 0 f 2 4 dee ab 4 2 0 bc 6 5 dde 6 c 7 a 6 a 3 f 5 fe 3 7 7 5 fe 4 a 9 5 a 8 bf 8 b 7 0 ae 9 4 6 6 9 6 c 8 0 8 2 0 6 baf 1 1 9 f 0 b 3 1 4 2 d 5 0 2 c 7 ca 0 c 1 0 2 5 4 8 a 1 2 6 3 de 2 c 0 4 bde 4 7 aa 1 a 7 1 6 ae 7 b 0 0 9 5 9 e 3 0 0 b 5 6 d 6 f 0 5 9 5 d 1 5 8 8 e 0 7 c 6 1 8 b 9 1 4 e 3 c 7 6 cb 7 d 1 0 3 cd 8 c 6 b 9 1 ed 0 aa adc 2 c 1 2 9 4 5 5 c 0 7 9 0 5 e 5 2 7 2 ea 4 0 3 9 6 6 0 cb 8 e 5 3 a 6 4 1 0 1 dae 6 e 8 7 3 7 a 0 8 2 ac 9 a 9 b 5 3 1 a 4 cbc 8 3 e 0 0 9 c 1 7 2 2 ca 1 0 8 a 2 6 bd 1 9 3 8 1 7 3 9 2 8 9 0 b 8 0 cf 5 1 9 f 2 f 1 4 e 1 fc 0 e 1 b 4 7 d 0 b 7 da 4 7 d 0 6 3 5 e ace 2 8 e 4 2 4 5 6 a 2 2 2 da 5 f 2 0 4 4 8 9 5 9 1 4 a 0 b 2 1 5 6 8 d 4 9 c 2 2 2 f 5 5 b 1 1 4 a 5 5 8 6 4 9 f 0 9 4 0 1 2 db aa abd 0 2 ad 1 aae 5 9 1 d 8 0 b 8 7 5 4 bb 3 9 9 6 4 f 4 b 9 c 2 3 5 1 6 6 b 1 ea 5 c 8 0 eb 9 8 7 0 e 9 0 f 0 7 3 7 2 2 9 2 6 f 8 2 3 e 5 ca 7 2 7 1 4 de 1 0 f 6 f 4 ed 4 0 7 2 bfd 3 ffc 4 d 3 2 ec 0 e 9 2 0 edb 4 0 4 b 7 b 1 afa 1 f 0 0 1 d 1 8 9 4 8 fe 2 5 5 6 2 c 9 b 8 d 5 2 8 2 4 a 4 fad 2 0 0 8 2 f 2 8 a 1 3 e 9 6 b 7 2 7 7 cb 4 e 7 a 5 cc bbf 8 0 9 5 2 9 3 8 9 2 b 2 bac 0 0 8 fce e 0 3 8 7 6 5 7 4 3 fb 9 6 8 8 abf 8 aff d 2 4 7 7 f 7 de 9 0 4 9 4 ccb ba 9 4 f 6 a 8 8 a 0 e 0 c 2 1 5 d 5 1 3 4 b 7 0 f 4 1 f 2 8 7 5 4 e 1 b 2 3 6 ab 4 3 ec 6 5 6 9 6 fa 1 8 2 fa 9 5 2 5 a 7 0 e 7 f 4 2 1 4 1 ec 3 8 cfe 5 7 d 2 6 2 3 0 b 3 d 5 2 0 ba 2 7 6 9 5 1 7 c 9 f 8 f 4 3 a 1 6 1 d 3 8 4 3 8 0 7 9 b 9 6 7 ab 7 3 8 3 5 8 6 5 b 6 8 a 2 2 d 3 cde 7 a 3 7 fcc ad 1 ee 3 f 3 3 ae 1 3 bb 0 f 0 9 b 4 b 8 6 ce 2 ee 0 7 8 2 3 ba 7 9 3 a 0 fa fee " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠArrange ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrelay Subscription Request Ġ= ĠRelay DTO . Subscription . Request ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams Ġ= ĠRelay DTO . Subscription . Request . Params ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubscription Id Ġ= ĠSubscription Id VO (" subscriptionId "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubscription Data Ġ= ĠRelay DTO . Subscription . Request . Params . Subscription Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtopic Ġ= ĠTopic VO ( getRandom 6 4 Byte HexString ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġmessage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclient Relay Subscription Observer Ġ= Ġclient . observe Subscription Request () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAct ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserver . send Subscription Request ( relay Subscription Request ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAssert Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġclient Event Observer . await Values ( Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġany < WebSocket . Event . On Connection Opened <* >> (), Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġany < WebSocket . Event . On Message Received >(). containing Relay Object ( relay Subscription Request ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Rule . run Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Relay Subscription Request Ġ= Ġclient Relay Subscription Observer . single OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( actual Relay Subscription Request ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( relay Subscription Request , Ġactual Relay Subscription Request ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` Client Ġsends ĠRelay _ Subscription _ Ack nowledge ment , Ġshould Ġbe Ġreceived Ġby Ġthe Ġserver `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠArrange ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrelay Subscription Ack nowledge ment Ġ= ĠRelay DTO . Subscription . Ack nowledge ment ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġserver Relay Subscription Observer Ġ= Ġserver . observe Subscription Ack nowledge ment (). test () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAct ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . publish Subscription Ack nowledge ment ( relay Subscription Ack nowledge ment ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAssert Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġserver Event Observer . await Values ( Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġany < WebSocket . Event . On Connection Opened <* >> (), Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġany < WebSocket . Event . On Message Received >(). containing Relay Object ( relay Subscription Ack nowledge ment ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserver Relay Subscription Observer . await Values ( any < Relay DTO . Subscription . Ack nowledge ment >()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġinner Ġclass ĠUn subscribe Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` Client Ġsends ĠRelay _ Subscribe _ Request , Ġshould Ġbe Ġreceived Ġby Ġthe Ġserver `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠArrange ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrelay Un subscribe Request Ġ= ĠRelay DTO . Un subscribe . Request ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams Ġ= ĠRelay DTO . Un subscribe . Request . Params ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtopic Ġ= ĠTopic VO ( getRandom 6 4 Byte HexString ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubscription Id Ġ= ĠSubscription Id VO (" subscriptionId ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġserver Relay Publish Observer Ġ= Ġserver . observe Un subscribe Publish (). test () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAct ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . unsubscribe Request ( relay Un subscribe Request ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAssert ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserver Event Observer . await Values ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġany < WebSocket . Event . On Connection Opened <* >> (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġany < WebSocket . Event . On Message Received >(). containing Relay Object ( relay Un subscribe Request ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserver Relay Publish Observer . await Values ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġany < Relay DTO . Un subscribe . Request > Ġ{ ĠassertThat ( this ). isEqualTo ( relay Un subscribe Request ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` Server Ġsends ĠRelay _ Un subscribe _ Ack nowledge ment , Ġshould Ġbe Ġreceived Ġby Ġthe Ġclient `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠArrange ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrelay Un subscribe Ack nowledge ment Ġ= ĠRelay DTO . Un subscribe . Ack nowledge ment ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclient Relay Un subscribe Observer Ġ= Ġclient . observe Un subscribe Ack nowledge ment () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAct ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserver . send Un subscribe Ack nowledge ment ( relay Un subscribe Ack nowledge ment ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAssert Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġclient Event Observer . await Values ( Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġany < WebSocket . Event . On Connection Opened <* >> (), Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġany < WebSocket . Event . On Message Received >(). containing Relay Object ( relay Un subscribe Ack nowledge ment ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Rule . run Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Subscribe Ack nowledge ment Ġ= Ġclient Relay Un subscribe Observer . single OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( relay Un subscribe Ack nowledge ment , Ġactual Subscribe Ack nowledge ment ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate M oshi (): ĠM oshi Ġ= ĠM oshi . Builder () ĊĠĠĠĠĠĠĠ Ġ. add Ġ{ Ġtype , Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( type . getRaw Type (). name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExp iry VO :: class . qualified Name Ġ-> ĠExp iry Adapter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJSONObject :: class . qualified Name Ġ-> ĠJSONObject Adapter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSubscription Id VO :: class . qualified Name Ġ-> ĠSubscription Id Adapter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTopic VO :: class . qualified Name Ġ-> ĠTopic Adapter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠT tl VO :: class . qualified Name Ġ-> ĠT tl Adapter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. add Last ( Kotlin Json Adapter Factory ()) ĊĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠ Ġprivate Ġfun Ġgiven Connection Is Est ab lished () Ġ{ ĊĠĠĠĠĠĠĠ Ġcreate Client And Server () ĊĠĠĠĠĠĠĠ Ġblock Until Connection Is Est ablish () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Client And Server () Ġ{ ĊĠĠĠĠĠĠĠ Ġserver Ġ= Ġcreate Server () ĊĠĠĠĠĠĠĠ Ġserver Event Observer Ġ= Ġserver . observe Events (). test () ĊĠĠĠĠĠĠĠ Ġclient Ġ= Ġcreate Client () Ċ // ĠĠĠĠĠĠĠ Ġclient Event Observer Ġ= Ġclient . observe Events (). test () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Server (): ĠMock Server Service Ġ= ĠS car let . Builder () ĊĠĠĠĠĠĠĠ Ġ. web Socket Factory ( mock WebServer . new WebSocket Factory ()) ĊĠĠĠĠĠĠĠ Ġ. addMessage Adapter Factory ( M oshi Message Adapter . Factory ( mos hi )) ĊĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ. create () ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Client (): ĠRelay Service Ġ= ĠS car let . Builder () ĊĠĠĠĠĠĠĠ Ġ. web Socket Factory ( create Ok HttpClient (). new WebSocket Factory ( server Url String )) ĊĠĠĠĠĠĠĠ Ġ. add Stream Adapter Factory ( Flow Stream Adapter . Factory ()) ĊĠĠĠĠĠĠĠ Ġ. addMessage Adapter Factory ( M oshi Message Adapter . Factory ( mos hi )) ĊĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ. create () ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Ok HttpClient (): ĠOk HttpClient Ġ= ĠOk HttpClient . Builder () ĊĠĠĠĠĠĠĠ Ġ. call Timeout ( 1 , ĠTimeUnit . MIN UTES ) ĊĠĠĠĠĠĠĠ Ġ. write Timeout ( 1 , ĠTimeUnit . MIN UTES ) ĊĠĠĠĠĠĠĠ Ġ. read Timeout ( 1 , ĠTimeUnit . MIN UTES ) ĊĠĠĠĠĠĠĠ Ġ. connect Timeout ( 1 , ĠTimeUnit . MIN UTES ) ĊĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠ Ġprivate Ġfun Ġblock Until Connection Is Est ablish () Ġ{ ĊĠĠĠĠĠĠĠ Ġserver Event Observer . await Values ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġany < WebSocket . Event . On Connection Opened <* >>() ĊĠĠĠĠĠĠĠ Ġ) Ċ // ĠĠĠĠĠĠĠ Ġclient Event Observer . await Values ( Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġany < WebSocket . Event . On Connection Opened <* >>() Ċ // ĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġinterface ĠMock Server Service Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Receive ĊĠĠĠĠĠĠĠ Ġfun Ġobserve Events (): ĠStream < WebSocket . Event > ĊĊĠĠĠĠĠĠĠ Ġ@ Receive ĊĠĠĠĠĠĠĠ Ġfun Ġobserve Relay Publish (): ĠStream < Relay DTO . Publish . Request > ĊĊĠĠĠĠĠĠĠ Ġ@ Send ĊĠĠĠĠĠĠĠ Ġfun Ġsend Publish Ack nowledge ment ( server Ack nowledge ment : ĠRelay DTO . Publish . Ack nowledge ment ) ĊĊĠĠĠĠĠĠĠ Ġ@ Receive ĊĠĠĠĠĠĠĠ Ġfun Ġobserve Subscribe Publish (): ĠStream < Relay DTO . Subscribe . Request > ĊĊĠĠĠĠĠĠĠ Ġ@ Send ĊĠĠĠĠĠĠĠ Ġfun Ġsend Subscribe Ack nowledge ment ( server Ack nowledge ment : ĠRelay DTO . Subscribe . Ack nowledge ment ) ĊĊĠĠĠĠĠĠĠ Ġ@ Send ĊĠĠĠĠĠĠĠ Ġfun Ġsend Subscription Request ( server Request : ĠRelay DTO . Subscription . Request ) ĊĊĠĠĠĠĠĠĠ Ġ@ Receive ĊĠĠĠĠĠĠĠ Ġfun Ġobserve Subscription Ack nowledge ment (): ĠStream < Relay DTO . Subscription . Ack nowledge ment > ĊĊĠĠĠĠĠĠĠ Ġ@ Receive ĊĠĠĠĠĠĠĠ Ġfun Ġobserve Un subscribe Publish (): ĠStream < Relay DTO . Un subscribe . Request > ĊĊĠĠĠĠĠĠĠ Ġ@ Send ĊĠĠĠĠĠĠĠ Ġfun Ġsend Un subscribe Ack nowledge ment ( server Ack nowledge ment : ĠRelay DTO . Un subscribe . Ack nowledge ment ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠRelay DTO > ĠValue Assert < WebSocket . Event . On Message Received >. containing Relay Object ( relay Obj : ĠT ) Ġ= Ġassert Ġ{ ĊĠĠĠĠĠĠĠ Ġassert Is < Message . Text >( message ) ĊĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġmessage Ġas ĠMessage . Text ĊĠĠĠĠĠĠĠ Ġval Ġexpected Text Ġ= ĠMessage . Text ( mos hi . adapter ( T :: class . java ). toJson ( relay Obj )) ĊĠĠĠĠĠĠĠ ĠassertEquals ( expected Text , Ġtext ) ĊĠĠĠ Ġ} Ċ }