void testStreamSSTableComponentFailsMidStream()

in client/src/testFixtures/java/org/apache/cassandra/sidecar/client/SidecarClientTest.java [1134:1224]


    void testStreamSSTableComponentFailsMidStream(boolean useLegacyApi) throws Exception
    {
        try (MockWebServer server = new MockWebServer())
        {
            CountDownLatch latch = new CountDownLatch(1);
            List<byte[]> receivedBytes = new ArrayList<>();
            StreamConsumer mockStreamConsumer = new StreamConsumer()
            {
                @Override
                public void onRead(StreamBuffer buffer)
                {
                    assertThat(buffer.readableBytes()).isGreaterThan(0);
                    byte[] dst = new byte[buffer.readableBytes()];
                    buffer.copyBytes(0, dst, 0, buffer.readableBytes());
                    receivedBytes.add(dst);
                }

                @Override
                public void onComplete()
                {
                }

                @Override
                public void onError(Throwable throwable)
                {
                    latch.countDown();
                    assertThat(throwable).isNotNull();
                }
            };
            InputStream inputStream = resourceInputStream("sstables/nb-1-big-TOC.txt");
            Buffer buffer = Okio.buffer(Okio.source(inputStream)).getBuffer();
            Okio.use(buffer, buffer1 -> {
                try
                {
                    return buffer1.writeAll(Okio.source(inputStream));
                }
                catch (IOException e)
                {
                    throw new RuntimeException(e);
                }
            });

            SidecarInstanceImpl sidecarInstance = RequestExecutorTest.newSidecarInstance(server);
            MockResponse response =
            new MockResponse().setResponseCode(OK.code())
                              .setHeader(HttpHeaderNames.CONTENT_TYPE.toString(),
                                         HttpHeaderValues.APPLICATION_OCTET_STREAM)
                              .setHeader(HttpHeaderNames.ACCEPT_RANGES.toString(), "bytes")
                              .setBody(buffer)
                              .setSocketPolicy(SocketPolicy.DISCONNECT_DURING_RESPONSE_BODY);
            server.enqueue(response);

            String expectedPath;
            if (useLegacyApi)
            {
                client.streamSSTableComponent(sidecarInstance,
                                              "cycling",
                                              "cyclist_name",
                                              "2023.04.12",
                                              "nb-1-big-TOC.txt",
                                              null,
                                              mockStreamConsumer);
                expectedPath = ApiEndpointsV1.COMPONENTS_ROUTE
                               .replaceAll(KEYSPACE_PATH_PARAM, "cycling")
                               .replaceAll(ApiEndpointsV1.TABLE_PATH_PARAM, "cyclist_name")
                               .replaceAll(ApiEndpointsV1.SNAPSHOT_PATH_PARAM, "2023.04.12")
                               .replaceAll(ApiEndpointsV1.COMPONENT_PATH_PARAM, "nb-1-big-TOC.txt");
            }
            else
            {

                ListSnapshotFilesResponse.FileInfo fileInfo = new ListSnapshotFilesResponse.FileInfo(2023,
                                                                                                     server.getHostName(),
                                                                                                     server.getPort(), 0,
                                                                                                     "2023.04.12",
                                                                                                     "cycling",
                                                                                                     "cyclist_name-1234",
                                                                                                     "nb-1-big-TOC.txt");
                client.streamSSTableComponent(sidecarInstance, fileInfo, null, mockStreamConsumer);
                expectedPath = fileInfo.componentDownloadUrl();
            }

            assertThat(latch.await(1, TimeUnit.MINUTES)).isTrue();

            RecordedRequest request = server.takeRequest();
            assertThat(request.getPath()).isEqualTo(expectedPath);
            assertThat(request.getHeader("User-Agent")).isEqualTo("cassandra-sidecar-test/0.0.1");
            assertThat(request.getHeader("range")).isNull();
            assertThat(receivedBytes).hasSizeGreaterThan(0);
        }
    }