/* Ċ Ġ* Ġ ĠCopyright Ġ 2 0 1 9 ĠK roto + ĠContributors Ċ Ġ* Ċ Ġ* Ġ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 Ġcom . github . mar co f errer . k roto plus . coroutines . integration Ċ Ċ import Ġcom . github . mar co f errer . k roto plus . coroutines . Rpc Call Test Ċ import Ġcom . github . mar co f errer . k roto plus . coroutines . utils . assert Fails With Status 2 Ċ import Ġio . grpc . Server Intercept ors Ċ import Ġio . grpc . Status Ċ import Ġio . grpc . examples . helloworld . G reet er Coroutine Grpc Ċ import Ġio . grpc . examples . helloworld . Hello Reply Ċ import Ġio . grpc . examples . helloworld . Hello Request Ċ import Ġio . mock k . verify Ċ import Ġkotlinx . coroutines . channels . Send Channel Ċ import Ġkotlinx . coroutines . channels . toList Ċ import Ġjava . util . concurrent . P haser Ċ import Ġkotlin . test . Test Ċ import Ġkotlin . test . assertEquals ĊĊ Ċ class ĠServer Streaming Tests Ġ: ĊĠĠĠ ĠRpc Call Test < Hello Request , ĠHello Reply >( G reet er Coroutine Grpc . say Hello Server Streaming Method ){ ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Up Server Handler ( ĊĠĠĠĠĠĠĠ Ġblock : Ġsuspend Ġ( request : ĠHello Request , Ġresponse Channel : ĠSend Channel < Hello Reply >) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġservice Impl Ġ= Ġobject Ġ: ĠG reet er Coroutine Grpc . G reet er Impl Base () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġsay Hello Server Streaming ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest : ĠHello Request , Ġresponse Channel : ĠSend Channel < Hello Reply >) Ġ= Ġblock ( request , Ġresponse Channel ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġservice Ġ= ĠServer Intercept ors . intercept ( service Impl , Ġcall State ) ĊĠĠĠĠĠĠĠ Ġgrpc Server Rule . service Registry . add Service ( service ) ĊĠĠĠĠĠĠĠ Ġnon Direct Grpc Server Rule . service Registry . add Service ( service ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Call Ġis Ġsuccessful ` (){ ĊĠĠĠĠĠĠĠ Ġval Ġrpc Spy Ġ= ĠRpc Spy () ĊĠĠĠĠĠĠĠ Ġsetup Up Server Handler Ġ{ Ġrequest , Ġresponse Channel Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . name . map Ġ{ Ġchar Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Channel . send ( Hello Reply . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMessage (" response :$ char ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġresponse Channel Ġ= Ġrpc Spy . co Stub . say Hello Server Streaming ( expected Request ) ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġrun Test Ġ{ Ġresponse Channel . toList () Ġ} ĊĊĠĠĠĠĠĠĠ Ġcall State . block Until Closed () ĊĊĠĠĠĠĠĠĠ Ġassert ( response Channel . is Closed For Receive ){ Ġ" Response Ġchannel Ġshould Ġbe Ġclosed " Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals ( expected Request . name . length , Ġresult . size ) ĊĠĠĠĠĠĠĠ Ġresult . forEach Indexed Ġ{ Ġindex , Ġresponse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" response :${ expected Request . name [ index ] }", Ġresponse . message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 0 ) Ġ{ Ġrpc Spy . call . cancel ( any (), Ġany ()) Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Server Ġrespon ds Ġwith Ġerror ` (){ ĊĠĠĠĠĠĠĠ Ġval Ġrpc Spy Ġ= ĠRpc Spy () ĊĠĠĠĠĠĠĠ Ġval Ġp haser Ġ= ĠPhaser ( 2 ) ĊĠĠĠĠĠĠĠ Ġsetup Up Server Handler Ġ{ Ġrequest , Ġresponse Channel Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( 3 ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Channel . send ( Hello Reply . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMessage (" response :$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp haser . ar rive And Await Advance () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Channel . close ( Status . INVALID _ ARGUMENT . as RuntimeException ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġresponse Channel Ġ= Ġrpc Spy . co Stub . say Hello Server Streaming ( expected Request ) ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmutable ListOf < Hello Reply >() ĊĠĠĠĠĠĠĠ Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( 3 ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ+= Ġresponse Channel . receive () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp haser . ar rive () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Fails With Status 2 ( Status . INVALID _ ARGUMENT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Channel . receive () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcall State . block Until Closed () ĊĊĠĠĠĠĠĠĠ Ġassert ( response Channel . is Closed For Receive ){ Ġ" Response Ġchannel Ġshould Ġbe Ġclosed " Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals ( 3 , Ġresult . size ) ĊĠĠĠĠĠĠĠ Ġresult . forEach Indexed Ġ{ Ġindex , Ġresponse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" response :$ index ", Ġresponse . message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 0 ) Ġ{ Ġrpc Spy . call . cancel ( any (), Ġany ()) Ġ} ĊĠĠĠ Ġ} Ċ Ċ }