/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠgRPC Ġauthors . Ċ Ġ* Ċ Ġ* Ġ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 Ġio . grpc . kotlin . generator Ċ Ċ import Ġcom . google . common . truth . Truth . assertThat Ċ import Ġcom . google . protobuf . Descriptors . MethodDescriptor Ċ import Ġio . grpc . examples . helloworld . HelloWorld Proto Ċ import Ġio . grpc . kotlin . generator . protoc . Class Simple Name Ċ import Ġio . grpc . kotlin . generator . protoc . Generator Config Ċ import Ġio . grpc . kotlin . generator . protoc . Java Package Policy Ċ import Ġio . grpc . kotlin . generator . protoc . testing . assertThat Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġorg . junit . runners . JUnit 4 Ċ import Ġjava . nio . charset . StandardCharsets Ċ import Ġjava . nio . file . Files Ċ import Ġjava . nio . file . Paths Ċ Ċ @ RunWith ( JUnit 4 :: class ) Ċ class ĠCor outine Server Impl Generator Test Ġ{ ĊĠ Ġprivate Ġval Ġservice Descriptor Ġ= ĊĠĠĠ ĠHello World Proto . get Descriptor (). find Service ByName (" G reet er ") ĊĠ Ġprivate Ġval Ġconfig Ġ= ĠGenerator Config ( Java Package Policy . OPEN _ SOURCE , Ġfalse ) ĊĠ Ġprivate Ġval Ġgenerator Ġ= ĠGr pc Coroutine Server Generator ( config ) ĊĠ Ġprivate Ġval Ġunary Say Hello Descriptor : ĠMethod Descriptor Ġ= ĊĠĠĠ Ġservice Descriptor . find Method ByName (" Say Hello ") ĊĠ Ġprivate Ġval Ġclient Streaming Say Hello Descriptor : ĠMethod Descriptor Ġ= ĊĠĠĠ Ġservice Descriptor . find Method ByName (" Client Stream Say Hello ") ĊĠ Ġprivate Ġval Ġserver Streaming Say Hello Descriptor : ĠMethod Descriptor Ġ= ĊĠĠĠ Ġservice Descriptor . find Method ByName (" Server Stream Say Hello ") ĊĠ Ġprivate Ġval Ġbidi Streaming Say Hello Descriptor : ĠMethod Descriptor Ġ= ĊĠĠĠ Ġservice Descriptor . find Method ByName (" B idi Stream Say Hello ") ĊĠ Ġprivate Ġval Ġstub Simple Name Ġ= ĠClass Simple Name (" This Impl ") ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġunary Impl Stub () Ġ{ ĊĠĠĠ Ġval Ġstub Ġ= Ġgenerator . service Method Stub ( unary Say Hello Descriptor ) ĊĠĠĠ ĠassertThat ( stub . method Spec ). gener ates (""" ĊĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠ Ġ* ĠReturns Ġthe Ġresponse Ġto Ġan ĠRPC Ġfor Ġhel loworld . G reet er . Say Hello . ĊĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠ Ġ* ĠIf Ġthis Ġmethod Ġfails Ġwith Ġa Ġ[ io . grpc . Status Exception ], Ġthe ĠRPC Ġwill Ġfail Ġwith Ġthe Ġcorresponding ĊĠĠĠĠĠĠ Ġ* Ġ[ io . grpc . Status ]. Ġ ĠIf Ġthis Ġmethod Ġfails Ġwith Ġa Ġ[ java . util . concurrent . Cancellation Exception ], Ġthe ĠRPC Ġwill Ġfail ĊĠĠĠĠĠĠ Ġ* Ġwith Ġstatus Ġ` Status . CANCEL LED `. Ġ ĠIf Ġthis Ġmethod Ġfails Ġfor Ġany Ġother Ġreason , Ġthe ĠRPC Ġwill ĊĠĠĠĠĠĠ Ġ* Ġfail Ġwith Ġ` Status . UNKNOWN ` Ġwith Ġthe Ġexception Ġas Ġa Ġcause . ĊĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠ Ġ* Ġ@ param Ġrequest ĠThe Ġrequest Ġfrom Ġthe Ġclient . ĊĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠ Ġopen Ġsuspend Ġfun Ġsay Hello ( request : Ġio . grpc . examples . helloworld . Hello Request ): Ġio . grpc . examples . helloworld . Hello Reply Ġ= Ġthrow Ġio . grpc . Status Exception ( io . grpc . Status . UN IMPLEMENTED . with Description (" Method Ġhel loworld . G reet er . Say Hello Ġis Ġunimplemented ")) ĊĠĠĠ Ġ""" . trim Indent ()) ĊĠĠĠ ĠassertThat ( stub . server Method Def . toString ()). isEqualTo (""" ĊĠĠĠĠĠ Ġio . grpc . kotlin . Server Calls . unary Server Method Definition ( ĊĠĠĠĠĠĠĠ Ġcontext Ġ= Ġthis . context , ĊĠĠĠĠĠĠĠ Ġdescriptor Ġ= Ġio . grpc . examples . helloworld . G reet er Grpc . getS ay Hello Method (), ĊĠĠĠĠĠĠĠ Ġimplementation Ġ= Ġ:: say Hello ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ""" . trim Indent ()) ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġclient Streaming Impl Stub () Ġ{ ĊĠĠĠ Ġval Ġstub Ġ= Ġgenerator . service Method Stub ( client Streaming Say Hello Descriptor ) ĊĠĠĠ ĠassertThat ( stub . method Spec ). gener ates (""" ĊĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠ Ġ* ĠReturns Ġthe Ġresponse Ġto Ġan ĠRPC Ġfor Ġhel loworld . G reet er . Client Stream Say Hello . ĊĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠ Ġ* ĠIf Ġthis Ġmethod Ġfails Ġwith Ġa Ġ[ io . grpc . Status Exception ], Ġthe ĠRPC Ġwill Ġfail Ġwith Ġthe Ġcorresponding ĊĠĠĠĠĠĠ Ġ* Ġ[ io . grpc . Status ]. Ġ ĠIf Ġthis Ġmethod Ġfails Ġwith Ġa Ġ[ java . util . concurrent . Cancellation Exception ], Ġthe ĠRPC Ġwill Ġfail ĊĠĠĠĠĠĠ Ġ* Ġwith Ġstatus Ġ` Status . CANCEL LED `. Ġ ĠIf Ġthis Ġmethod Ġfails Ġfor Ġany Ġother Ġreason , Ġthe ĠRPC Ġwill ĊĠĠĠĠĠĠ Ġ* Ġfail Ġwith Ġ` Status . UNKNOWN ` Ġwith Ġthe Ġexception Ġas Ġa Ġcause . ĊĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠ Ġ* Ġ@ param Ġrequests ĠA Ġ[ kotlin x . coroutines . flow . Flow ] Ġof Ġrequests Ġfrom Ġthe Ġclient . Ġ ĠThis Ġflow Ġcan Ġbe ĊĠĠĠĠĠĠ Ġ* ĠĠĠĠĠĠĠ Ġcollected Ġonly Ġonce Ġand Ġthrows Ġ[ java . lang . IllegalStateException ] Ġon Ġattempts Ġto Ġcollect ĊĠĠĠĠĠĠ Ġ* ĠĠĠĠĠĠĠ Ġit Ġmore Ġthan Ġonce . ĊĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠ Ġopen Ġsuspend Ġfun Ġclient Stream Say Hello ( requests : Ġkotlinx . coroutines . flow . Flow < io . grpc . examples . helloworld . Hello Request >): Ġio . grpc . examples . helloworld . Hello Reply Ġ= Ġthrow Ġio . grpc . Status Exception ( io . grpc . Status . UN IMPLEMENTED . with Description (" Method Ġhel loworld . G reet er . Client Stream Say Hello Ġis Ġunimplemented ")) ĊĠĠĠ Ġ""" . trim Indent ()) ĊĠĠĠ ĠassertThat ( stub . server Method Def . toString ()). isEqualTo (""" ĊĠĠĠĠĠ Ġio . grpc . kotlin . Server Calls . client Streaming Server Method Definition ( ĊĠĠĠĠĠĠĠ Ġcontext Ġ= Ġthis . context , ĊĠĠĠĠĠĠĠ Ġdescriptor Ġ= Ġio . grpc . examples . helloworld . G reet er Grpc . getClient Stream Say Hello Method (), ĊĠĠĠĠĠĠĠ Ġimplementation Ġ= Ġ:: client Stream Say Hello ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ""" . trim Indent ()) ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġserver Streaming Impl Stub () Ġ{ ĊĠĠĠ Ġval Ġstub Ġ= Ġgenerator . service Method Stub ( server Streaming Say Hello Descriptor ) ĊĠĠĠ ĠassertThat ( stub . method Spec ). gener ates (""" ĊĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠ Ġ* ĠReturns Ġa Ġ[ kotlin x . coroutines . flow . Flow ] Ġof Ġresponses Ġto Ġan ĠRPC Ġfor Ġhel loworld . G reet er . Server Stream Say Hello . ĊĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠ Ġ* ĠIf Ġcreating Ġor Ġcollecting Ġthe Ġreturned Ġflow Ġfails Ġwith Ġa Ġ[ io . grpc . Status Exception ], Ġthe ĠRPC ĊĠĠĠĠĠĠ Ġ* Ġwill Ġfail Ġwith Ġthe Ġcorresponding Ġ[ io . grpc . Status ]. Ġ ĠIf Ġit Ġfails Ġwith Ġa ĊĠĠĠĠĠĠ Ġ* Ġ[ java . util . concurrent . Cancellation Exception ], Ġthe ĠRPC Ġwill Ġfail Ġwith Ġstatus Ġ` Status . CANCEL LED `. Ġ ĠIf Ġcreating ĊĠĠĠĠĠĠ Ġ* Ġor Ġcollecting Ġthe Ġreturned Ġflow Ġfails Ġfor Ġany Ġother Ġreason , Ġthe ĠRPC Ġwill Ġfail Ġwith ĊĠĠĠĠĠĠ Ġ* Ġ` Status . UNKNOWN ` Ġwith Ġthe Ġexception Ġas Ġa Ġcause . ĊĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠ Ġ* Ġ@ param Ġrequest ĠThe Ġrequest Ġfrom Ġthe Ġclient . ĊĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠ Ġopen Ġfun Ġserver Stream Say Hello ( request : Ġio . grpc . examples . helloworld . Multi Hello Request ): Ġkotlinx . coroutines . flow . Flow < io . grpc . examples . helloworld . Hello Reply > Ġ= Ġthrow Ġio . grpc . Status Exception ( io . grpc . Status . UN IMPLEMENTED . with Description (" Method Ġhel loworld . G reet er . Server Stream Say Hello Ġis Ġunimplemented ")) ĊĠĠĠ Ġ""" . trim Indent ()) ĊĠĠĠ ĠassertThat ( stub . server Method Def . toString ()). isEqualTo (""" ĊĠĠĠĠĠ Ġio . grpc . kotlin . Server Calls . server Streaming Server Method Definition ( ĊĠĠĠĠĠĠĠ Ġcontext Ġ= Ġthis . context , ĊĠĠĠĠĠĠĠ Ġdescriptor Ġ= Ġio . grpc . examples . helloworld . G reet er Grpc . getServer Stream Say Hello Method (), ĊĠĠĠĠĠĠĠ Ġimplementation Ġ= Ġ:: server Stream Say Hello ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ""" . trim Indent ()) ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġbidi Streaming Impl Stub () Ġ{ ĊĠĠĠ Ġval Ġstub Ġ= Ġgenerator . service Method Stub ( b idi Streaming Say Hello Descriptor ) ĊĠĠĠ ĠassertThat ( stub . method Spec ). gener ates (""" ĊĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠ Ġ* ĠReturns Ġa Ġ[ kotlin x . coroutines . flow . Flow ] Ġof Ġresponses Ġto Ġan ĠRPC Ġfor Ġhel loworld . G reet er . B idi Stream Say Hello . ĊĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠ Ġ* ĠIf Ġcreating Ġor Ġcollecting Ġthe Ġreturned Ġflow Ġfails Ġwith Ġa Ġ[ io . grpc . Status Exception ], Ġthe ĠRPC ĊĠĠĠĠĠĠ Ġ* Ġwill Ġfail Ġwith Ġthe Ġcorresponding Ġ[ io . grpc . Status ]. Ġ ĠIf Ġit Ġfails Ġwith Ġa ĊĠĠĠĠĠĠ Ġ* Ġ[ java . util . concurrent . Cancellation Exception ], Ġthe ĠRPC Ġwill Ġfail Ġwith Ġstatus Ġ` Status . CANCEL LED `. Ġ ĠIf Ġcreating ĊĠĠĠĠĠĠ Ġ* Ġor Ġcollecting Ġthe Ġreturned Ġflow Ġfails Ġfor Ġany Ġother Ġreason , Ġthe ĠRPC Ġwill Ġfail Ġwith ĊĠĠĠĠĠĠ Ġ* Ġ` Status . UNKNOWN ` Ġwith Ġthe Ġexception Ġas Ġa Ġcause . ĊĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠ Ġ* Ġ@ param Ġrequests ĠA Ġ[ kotlin x . coroutines . flow . Flow ] Ġof Ġrequests Ġfrom Ġthe Ġclient . Ġ ĠThis Ġflow Ġcan Ġbe ĊĠĠĠĠĠĠ Ġ* ĠĠĠĠĠĠĠ Ġcollected Ġonly Ġonce Ġand Ġthrows Ġ[ java . lang . IllegalStateException ] Ġon Ġattempts Ġto Ġcollect ĊĠĠĠĠĠĠ Ġ* ĠĠĠĠĠĠĠ Ġit Ġmore Ġthan Ġonce . ĊĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠ Ġopen Ġfun Ġbidi Stream Say Hello ( requests : Ġkotlinx . coroutines . flow . Flow < io . grpc . examples . helloworld . Hello Request >): Ġkotlinx . coroutines . flow . Flow < io . grpc . examples . helloworld . Hello Reply > Ġ= Ġthrow Ġio . grpc . Status Exception ( io . grpc . Status . UN IMPLEMENTED . with Description (" Method Ġhel loworld . G reet er . B idi Stream Say Hello Ġis Ġunimplemented ")) ĊĠĠĠ Ġ""" . trim Indent ()) ĊĠĠĠ ĠassertThat ( stub . server Method Def . toString ()). isEqualTo (""" ĊĠĠĠĠĠ Ġio . grpc . kotlin . Server Calls . b idi Streaming Server Method Definition ( ĊĠĠĠĠĠĠĠ Ġcontext Ġ= Ġthis . context , ĊĠĠĠĠĠĠĠ Ġdescriptor Ġ= Ġio . grpc . examples . helloworld . G reet er Grpc . getB idi Stream Say Hello Method (), ĊĠĠĠĠĠĠĠ Ġimplementation Ġ= Ġ:: b idi Stream Say Hello ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ""" . trim Indent ()) ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġfull Impl () Ġ{ ĊĠĠĠ Ġval Ġtype Ġ= Ġgenerator . generate ( service Descriptor ) ĊĠĠĠ Ġval Ġexpected File Contents Ġ= ĠFiles . read All Lines ( ĊĠĠĠĠĠ ĠPaths . get ( ĊĠĠĠĠĠĠĠ Ġ" src / test / java / io / grpc / kotlin / generator ", ĊĠĠĠĠĠĠĠ Ġ" G reet er Coroutine Impl Base . expected " ĊĠĠĠĠĠ Ġ), ĊĠĠĠĠĠ ĠStandard Charsets . UTF _ 8 ĊĠĠĠ Ġ) ĊĠĠĠ ĠassertThat ( type ). gener ates En closed ( ĊĠĠĠĠĠ Ġexpected File Contents . join ToString ("\ n ") Ġ+ Ġ"\ n " ĊĠĠĠ Ġ) ĊĠ Ġ} Ċ } Ċ