/* Ċ Ġ* Ġ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 . client ĊĊ Ċ import Ġcom . github . mar co f errer . k roto plus . coroutines . utils . assert Fails With Status Ċ import Ġcom . github . mar co f errer . k roto plus . coroutines . with Coroutine Context Ċ import Ġio . grpc . Call Options Ċ import Ġio . grpc . Client Call Ċ import Ġio . grpc . Status Ċ import Ġio . grpc . examples . helloworld . G reet er Grpc Ċ import Ġio . grpc . examples . helloworld . Hello Reply Ċ import Ġio . grpc . examples . helloworld . Hello Request Ċ import Ġio . grpc . stub . Stream Observer Ċ import Ġio . grpc . testing . Grpc Server Rule Ċ import Ġio . mock k . Runs Ċ import Ġio . mock k . every Ċ import Ġio . mock k . just Ċ import Ġio . mock k . spy k Ċ import Ġio . mock k . verify Ċ import Ġkotlinx . coroutines . Cancellation Exception Ċ import Ġkotlinx . coroutines . Coroutine Start Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Job Ċ import Ġkotlinx . coroutines . cancel Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġorg . junit . Rule Ċ import Ġorg . junit . Test Ċ import Ġkotlin . test . Before Test Ċ import Ġkotlin . test . assertEquals Ċ import Ġkotlin . test . assert Fails With ĊĊ Ċ class ĠClient Call Unary Tests Ġ{ ĊĊĠĠĠ Ġ@ [ Rule ĠJ vm Field ] ĊĠĠĠ Ġvar Ġgrpc Server Rule Ġ= ĠGr pc Server Rule (). direct Executor () ĊĊĠĠĠ Ġprivate Ġval Ġmethod Descriptor Ġ= ĠG reet er Grpc . getS ay Hello Method () ĊĠĠĠ Ġprivate Ġval Ġservice Ġ= Ġspy k ( object Ġ: ĠG reet er Grpc . G reet er Impl Base (){ }) ĊĠĠĠ Ġprivate Ġval Ġrequest Ġ= ĠHello Request . newBuilder (). setName (" request "). build () ĊĠĠĠ Ġprivate Ġval Ġresponse Ġ= ĠHello Reply . newBuilder (). setMessage (" reply "). build () ĊĊĠĠĠ Ġinner Ġclass ĠRpc Spy { ĊĠĠĠĠĠĠĠ Ġval Ġstub : ĠG reet er Grpc . G reet er Stub ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġcall : ĠClient Call < Hello Request , Hello Reply > ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchannel Spy Ġ= Ġspy k ( grpc Server Rule . channel ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstub Ġ= ĠG reet er Grpc . new Stub ( channel Spy ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġchannel Spy . new Call ( method Descriptor , Ġany ()) Ġ} Ġanswers Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspy k ( grpc Server Rule . channel . new Call ( method Descriptor , Ġsecond Arg < Call Options >() )). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Rpc Spy . call Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Server Handler No op (){ ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġservice . say Hello ( request , any ()) Ġ} Ġjust ĠRuns ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Before Test ĊĠĠĠ Ġfun Ġsetup Service (){ ĊĠĠĠĠĠĠĠ Ġgrpc Server Rule . service Registry . add Service ( service ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Call Ġsucceeds Ġon Ġserver Ġresponse ` (){ ĊĠĠĠĠĠĠĠ Ġval Ġstub Ġ= ĠG reet er Grpc . new Stub ( grpc Server Rule . channel ) ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġservice . say Hello ( request , any ()) Ġ} Ġanswers Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( second Arg < Stream Observer < Hello Reply >> ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Next ( response ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Completed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstub . client Call Unary ( request , Ġmethod Descriptor ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( response , Ġresult ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Call Ġfails Ġon Ġserver Ġerror ` (){ ĊĠĠĠĠĠĠĠ Ġval Ġstub Ġ= ĠG reet er Grpc . new Stub ( grpc Server Rule . channel ) ĊĠĠĠĠĠĠĠ Ġval Ġexpected Error Ġ= ĠStatus . INVALID _ ARGUMENT . as RuntimeException () ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġservice . say Hello ( request , any ()) Ġ} Ġanswers Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsecond Arg < Stream Observer < Hello Reply >>() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. onError ( expected Error ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġassert Fails With Status ( Status . INVALID _ ARGUMENT ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstub . client Call Unary ( request , Ġmethod Descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Call Ġis Ġcanceled Ġwhen Ġscope Ġis Ġcanceled Ġnormally ` (){ ĊĠĠĠĠĠĠĠ Ġval Ġrpc Spy Ġ= ĠRpc Spy () ĊĠĠĠĠĠĠĠ Ġval Ġstub Ġ= Ġrpc Spy . stub ĊĠĠĠĠĠĠĠ Ġsetup Server Handler No op () ĊĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch ( Dispatch ers . Default ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch ( start Ġ= ĠCor outine Start . UN DISPATCH ED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstub . client Call Unary ( request , Ġmethod Descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġrpc Spy . call . cancel ( any (), any ()) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Call Ġis Ġcanceled Ġwhen Ġscope Ġis Ġcanceled Ġexception ally ` (){ ĊĠĠĠĠĠĠĠ Ġval Ġrpc Spy Ġ= ĠRpc Spy () ĊĠĠĠĠĠĠĠ Ġval Ġstub Ġ= Ġrpc Spy . stub ĊĠĠĠĠĠĠĠ Ġsetup Server Handler No op () ĊĊĠĠĠĠĠĠĠ Ġassert Fails With ( IllegalStateException :: class ," cancel ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch ( Dispatch ers . Default ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch ( start Ġ= ĠCor outine Start . UN DISPATCH ED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstub . client Call Unary ( request , Ġmethod Descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" cancel ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġrpc Spy . call . cancel (" Parent Ġjob Ġis ĠC ancell ing ", any ()) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Call Ġis Ġcanceled Ġwhen Ġstub Ġcontext Ġjob Ġdiffers ` (){ ĊĠĠĠĠĠĠĠ Ġval Ġrpc Spy Ġ= ĠRpc Spy () ĊĠĠĠĠĠĠĠ Ġval Ġstub Ġ= Ġrpc Spy . stub ĊĠĠĠĠĠĠĠ Ġsetup Server Handler No op () ĊĊĠĠĠĠĠĠĠ Ġval Ġjob Ġ= ĠJob () ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch ( Dispatch ers . Default ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch ( start Ġ= ĠCor outine Start . UN DISPATCH ED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstub . with Coroutine Context ( job ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. client Call Unary ( request , Ġmethod Descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġrpc Spy . call . cancel ( any (), any < Cancellation Exception >()) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Call Ġis Ġcanceled Ġwhen Ġstub Ġcontext Ġjob Ġis Ġcancelled ` (){ ĊĠĠĠĠĠĠĠ Ġval Ġrpc Spy Ġ= ĠRpc Spy () ĊĠĠĠĠĠĠĠ Ġval Ġstub Ġ= Ġrpc Spy . stub ĊĠĠĠĠĠĠĠ Ġsetup Server Handler No op () ĊĊĠĠĠĠĠĠĠ Ġval Ġjob Ġ= ĠJob (). apply Ġ{ Ġcancel () Ġ} ĊĠĠĠĠĠĠĠ Ġassert Fails With Status ( Status . CANCEL LED , Ġ" CANCEL LED : ĠJob Ġwas Ġcancelled ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstub . with Coroutine Context ( job ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. client Call Unary ( request , Ġmethod Descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġrpc Spy . call . cancel (" Job Ġwas Ġcancelled ", any ()) Ġ} ĊĠĠĠ Ġ} Ċ Ċ }