@@ -9,23 +9,26 @@ import hello.HelloService
99import hello.invoke
1010import kotlinx.coroutines.test.runTest
1111import kotlinx.rpc.grpc.GrpcClient
12- import kotlinx.rpc.grpc.TlsChannelCredentials
12+ import kotlinx.rpc.grpc.GrpcServer
13+ import kotlinx.rpc.grpc.TlsChannelCredentialsBuilder
14+ import kotlinx.rpc.grpc.TlsServerCredentialsBuilder
15+ import kotlinx.rpc.grpc.test.EchoRequest
16+ import kotlinx.rpc.grpc.test.EchoService
17+ import kotlinx.rpc.grpc.test.EchoServiceImpl
18+ import kotlinx.rpc.grpc.test.invoke
19+ import kotlinx.rpc.registerService
1320import kotlinx.rpc.withService
1421import kotlin.test.Test
1522
23+ private const val PORT = 50051
1624
1725class GrpcbInTlsTest {
1826
19- val grpcClient = GrpcClient (" grpcb.in" , 9001 ) {
20- // usePlaintext()
21- }
2227
2328 @Test
2429 fun testTlsCall () = runTest {
30+ val grpcClient = GrpcClient (" grpcb.in" , 9001 )
2531 val service = grpcClient.withService<HelloService >()
26-
27- TlsChannelCredentials .create()
28-
2932 val request = HelloRequest {
3033 greeting = " Postman"
3134 }
@@ -35,4 +38,137 @@ class GrpcbInTlsTest {
3538 }
3639
3740
41+ @Test
42+ fun testLocalTls () = runTest {
43+ val serverTls = TlsServerCredentialsBuilder ()
44+ .keyManager(SERVER_CERT_PEM , SERVER_KEY_PEM )
45+ .build()
46+
47+ val grpcServer = GrpcServer (
48+ PORT ,
49+ credentials = serverTls,
50+ builder = {
51+ registerService<EchoService > { EchoServiceImpl () }
52+ })
53+ grpcServer.start()
54+
55+ val clientTls = TlsChannelCredentialsBuilder ()
56+ .trustManager(SERVER_CERT_PEM )
57+ .build()
58+
59+ val grpcClient = GrpcClient (
60+ " localhost" , PORT ,
61+ credentials = clientTls,
62+ ) {}
63+
64+ val service = grpcClient.withService<EchoService >()
65+ val request = EchoRequest {
66+ message = " Postman"
67+ }
68+
69+ try {
70+ service.UnaryEcho (request)
71+ } catch (t: Throwable ) {
72+ println (" [DEBUG_LOG] TLS test failed: ${t::class .simpleName} : ${t.message} " )
73+ t.printStackTrace()
74+ throw t
75+ } finally {
76+ grpcServer.shutdown()
77+ grpcServer.awaitTermination()
78+ grpcClient.shutdown()
79+ grpcClient.awaitTermination()
80+ }
81+ }
82+
83+
84+ private val SERVER_CERT_PEM = """
85+ -----BEGIN CERTIFICATE-----
86+ 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
115+ ubFotuU6gIPvra9MI/NUSpA=
116+ -----END CERTIFICATE-----
117+ """ .trimIndent()
118+
119+ private val SERVER_KEY_PEM = """
120+ -----BEGIN PRIVATE KEY-----
121+ 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
170+ paLEjX+8kznUisDokSzJ7iHoZgmN
171+ -----END PRIVATE KEY-----
172+ """ .trimIndent()
173+
38174}
0 commit comments