@BeforeAll
    static void setUpGrpcServer() throws Exception {
        grpcPort = findAvailablePort();
        FileUtils.copyFile(tikaConfigXmlTemplate, tikaConfigXml);

        grpcServer = new TikaGrpcServer();
        grpcServer.setTikaConfigXml(tikaConfigXml);
        grpcServer.setPort(grpcPort);
        grpcServer.setSecure(true);
        grpcServer.setCertChain(Paths.get("src", "test", "resources", "certs", "server1.pem").toFile());
        grpcServer.setPrivateKey(Paths.get("src", "test", "resources", "certs", "server1.key").toFile());
        grpcServer.setTrustCertCollection(Paths.get("src", "test", "resources", "certs", "ca.pem").toFile());
        grpcServer.setClientAuthRequired(true);
        grpcServer.start();

        String target = InetAddress
                .getByName("localhost")
                .getHostAddress() + ":" + grpcPort;

        TlsChannelCredentials.Builder channelCredBuilder = TlsChannelCredentials.newBuilder();
        File clientCertChain = Paths.get("src", "test", "resources", "certs", "client.pem").toFile();
        File clientPrivateKey = Paths.get("src", "test", "resources", "certs", "client.key").toFile();
        channelCredBuilder.keyManager(clientCertChain, clientPrivateKey);
        channelCredBuilder.trustManager(InsecureTrustManagerFactory.INSTANCE.getTrustManagers());

        ManagedChannel channel = Grpc
                .newChannelBuilder(target, channelCredBuilder.build())
                .build();

        tikaBlockingStub = TikaGrpc.newBlockingStub(channel);
        tikaStub = TikaGrpc.newStub(channel);
    }
This test will start an HTTP server using jetty.
Then it will start Tika Pipes Grpc service.
Then it will, using a bidirectional stream of data, send urls to the
HTTP fetcher whilst simultaneously receiving parsed output as they parse.
tika-grpc/src/test/java/org/apache/tika/pipes/grpc/PipesBiDirectionalStreamingIntegrationTest.java