@BeforeEach
    void createHttpFetcher() throws Exception {
        SaveFetcherRequest saveFetcherRequest = SaveFetcherRequest
                .newBuilder()
                .setFetcherId(httpFetcherId)
                .setFetcherClass(HttpFetcher.class.getName())
                .setFetcherConfigJson(OBJECT_MAPPER.writeValueAsString(ImmutableMap
                        .builder()
                        .put("requestTimeout", 30_000)
                        .put("socketTimeout", 30_000)
                        .put("connectTimeout", 20_000)
                        .put("maxConnectionsPerRoute", 200)
                        .put("maxRedirects", 0)
                        .put("maxSpoolSize", -1)
                        .put("overallTimeout", 50_000)
                        .build()))
                .build();
        SaveFetcherReply saveFetcherReply = tikaBlockingStub.saveFetcher(saveFetcherRequest);
        Assertions.assertEquals(saveFetcherReply.getFetcherId(), httpFetcherId);
    }
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