/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠGoogle ĠLLC Ċ Ġ* Ċ Ġ* Ġ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 Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttps :// 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 Ġcom . google . api . example Ċ Ċ import Ġio . grpc . Managed Channel Builder Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . channels . produce Ċ import Ġkotlinx . coroutines . channels . toList Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġorg . junit . After Class Ċ import Ġkotlin . test . Test Ċ import Ġkotlin . test . assertEquals Ċ Ċ private Ġconst Ġval ĠPORT Ġ= Ġ 8 4 8 4 Ċ Ċ @ Experimental Cor outines Api Ċ class ĠExample Test Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġserver Ġ= ĠProto Server (). as Grpc Server ( PORT ). also Ġ{ Ġit . start () Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ After Class ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġafter () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserver . shutdown (). await Termination () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` can Ġcall Ġa Ġunary Ġmethod `() Ġ= Ġwith Client Ġ{ Ġclient Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġclient . ask ( question Ġ{ Ġquery Ġ= Ġ" Hello Ġworld !" Ġ}) ĊĠĠĠĠĠĠĠ ĠassertEquals ( answer Ġ{ Ġresult Ġ= Ġ" you Ġsaid : Ġ' Hello Ġworld ! '" Ġ}, Ġresponse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` can Ġcall Ġa Ġserver Ġstreaming Ġmethod `() Ġ= Ġwith Client Ġ{ Ġclient Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġresponses Ġ= Ġclient . lecture ( question Ġ{ Ġquery Ġ= Ġ" what ?" Ġ}). toList () ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠlistOf ( answer Ġ{ Ġresult Ġ= Ġ" let 's Ġtalk Ġabout Ġ' what ? '" Ġ}) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠList ( 1 0 ) Ġ{ Ġi Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanswer Ġ{ Ġresult Ġ= Ġ" more " Ġ+ Ġ" Ġand Ġmore ". repeat ( i ) Ġ+ Ġ"[ ${ i Ġ+ Ġ 1 }] " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals ( expected . toSet (), Ġresponses . toSet ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` can Ġcall Ġa Ġclient Ġstreaming Ġmethod `() Ġ= Ġwith Client Ġ{ Ġclient Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġclient . listen ( Global Scope . produce Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( item Ġin ĠlistOf (" one ", Ġ" two ", Ġ" three ", Ġ" four ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend ( question Ġ{ Ġquery Ġ= Ġitem Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= Ġanswer Ġ{ Ġresult Ġ= Ġ" Great Ġquestions Ġeveryone !" Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals ( expected , Ġresponse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` can Ġcall Ġa Ġbid irectional Ġstreaming Ġmethod `() Ġ= Ġwith Client Ġ{ Ġclient Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġresponses Ġ= Ġclient . deb ate ( Global Scope . produce Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( item Ġin ĠlistOf (" a ", Ġ" b ", Ġ" c ", Ġ" d ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend ( question Ġ{ Ġquery Ġ= Ġitem Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}). toList () ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠlistOf (" a ", Ġ" b ", Ġ" c ", Ġ" d "). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanswer Ġ{ Ġresult Ġ= Ġ"$ it ? ĠSorry , ĠI Ġdon 't Ġknow ..." Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals ( expected , Ġresponses ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġ< T > Ġwith Client ( block : Ġsuspend Ġ( Proto Service ) Ġ-> ĠT ) Ġ= Ġrun Blocking Ġ{ ĊĠĠĠ ĠManaged Channel Builder ĊĠĠĠĠĠĠĠ Ġ. for Address (" localhost ", ĠPORT ) ĊĠĠĠĠĠĠĠ Ġ. use Pl aintext () ĊĠĠĠĠĠĠĠ Ġ. as Proto Service (). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock ( it ) ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ