package org.lognet.springboot.grpc; import io.grpc.ManagedChannel; import io.grpc.ManagedChannelBuilder; import io.grpc.examples.GreeterGrpc; import io.grpc.examples.GreeterOuterClass; import io.grpc.inprocess.InProcessChannelBuilder; import io.grpc.netty.GrpcSslContexts; import io.grpc.netty.NettyChannelBuilder; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.lognet.springboot.grpc.autoconfigure.GRpcServerProperties; import org.lognet.springboot.grpc.context.LocalRunningGrpcPort; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.ApplicationContext; import org.springframework.core.io.Resource; import org.springframework.util.StringUtils; import java.io.IOException; import java.util.Optional; import java.util.concurrent.ExecutionException; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; public abstract class GrpcServerTestBase { @Autowired(required = false) @Qualifier("grpcServerRunner") protected GRpcServerRunner grpcServerRunner; @Autowired(required = false) @Qualifier("grpcInprocessServerRunner") protected GRpcServerRunner grpcInprocessServerRunner; protected ManagedChannel channel; protected ManagedChannel inProcChannel; @LocalRunningGrpcPort protected int runningPort; @Autowired protected ApplicationContext context; @Autowired protected GRpcServerProperties gRpcServerProperties; @Before public final void setupChannels() throws IOException { if(gRpcServerProperties.isEnabled()) { ManagedChannelBuilder<?> channelBuilder = ManagedChannelBuilder.forAddress("localhost", getPort()); Resource certChain = Optional.ofNullable(gRpcServerProperties.getSecurity()) .map(GRpcServerProperties.SecurityProperties::getCertChain) .orElse(null); if(null!= certChain){ ((NettyChannelBuilder)channelBuilder) .useTransportSecurity() .sslContext(GrpcSslContexts.forClient().trustManager(certChain.getInputStream()).build()); }else{ channelBuilder.usePlaintext(); } channel = onChannelBuild(channelBuilder).build(); } if(StringUtils.hasText(gRpcServerProperties.getInProcessServerName())){ inProcChannel = onChannelBuild( InProcessChannelBuilder.forName(gRpcServerProperties.getInProcessServerName()) .usePlaintext() ).build(); } } protected int getPort(){ return runningPort; } protected ManagedChannelBuilder<?> onChannelBuild(ManagedChannelBuilder<?> channelBuilder){ return channelBuilder; } protected InProcessChannelBuilder onChannelBuild(InProcessChannelBuilder channelBuilder){ return channelBuilder; } @After public final void shutdownChannels() { Optional.ofNullable(channel).ifPresent(ManagedChannel::shutdownNow); Optional.ofNullable(inProcChannel).ifPresent(ManagedChannel::shutdownNow); } @Test final public void simpleGreeting() throws ExecutionException, InterruptedException { beforeGreeting(); String name ="John"; final GreeterGrpc.GreeterFutureStub greeterFutureStub = GreeterGrpc.newFutureStub(Optional.ofNullable(channel).orElse(inProcChannel)); final GreeterOuterClass.HelloRequest helloRequest =GreeterOuterClass.HelloRequest.newBuilder().setName(name).build(); final String reply = greeterFutureStub.sayHello(helloRequest).get().getMessage(); assertNotNull("Replay should not be null",reply); assertTrue(String.format("Replay should contain name '%s'",name),reply.contains(name)); afterGreeting(); } protected void beforeGreeting() { } protected void afterGreeting(){ } }