diff --git a/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/common/grpc/GrpcDownloader.java b/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/common/grpc/GrpcDownloader.java index d658d645fa766ed2d9f3a180c93150cd67678254..6d777066a4cea56cb6df3276760a5f44df47b567 100644 --- a/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/common/grpc/GrpcDownloader.java +++ b/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/common/grpc/GrpcDownloader.java @@ -16,26 +16,21 @@ import de.ozgcloud.apilib.file.OzgCloudFileId; import de.ozgcloud.common.errorhandling.TechnicalException; import io.grpc.stub.CallStreamObserver; import lombok.Builder; -import lombok.Getter; public class GrpcDownloader<T> { private static final int CHUNK_SIZE = 255 * 1024; - @Getter private CallStreamObserver<T> callObserver; - @Getter private Function<ByteString, T> chunkBuilder; - @Getter private Consumer<OutputStream> downloadConsumer; - @Getter private TaskExecutor taskExecutor; private final byte[] buffer = new byte[GrpcDownloader.CHUNK_SIZE]; + private final AtomicBoolean downloadInProgress = new AtomicBoolean(false); private PipedInputStream inputStream; private PipedOutputStream outputStream; - private AtomicBoolean downloadInProgress = new AtomicBoolean(false); @Builder public GrpcDownloader(CallStreamObserver<T> callObserver, OzgCloudFileId fileId, Function<ByteString, T> chunkBuilder, @@ -88,7 +83,7 @@ public class GrpcDownloader<T> { while (callObserver.isReady() && (bytesRead = inputStream.read(buffer)) != -1) { callObserver.onNext(chunkBuilder.apply(ByteString.copyFrom(buffer, 0, bytesRead))); } - if (hasFinishedDownload()) { + if (!downloadInProgress.get()) { inputStream.close(); callObserver.onCompleted(); } @@ -109,10 +104,6 @@ public class GrpcDownloader<T> { } private void throwException(IOException e) { - throw new TechnicalException("Error occured during downloading file content download.", e); - } - - private boolean hasFinishedDownload() throws IOException { - return !downloadInProgress.get() && inputStream.available() == 0; + throw new TechnicalException("Error occurred during downloading file content download.", e); } } \ No newline at end of file diff --git a/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/CollaborationGrpcServiceTest.java b/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/CollaborationGrpcServiceTest.java index 7a7038c8febda85ddfc7e6a30a5166b3e298b4e2..7614a782ae107dcd1fdd6d3e5c521d6777b98e36 100644 --- a/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/CollaborationGrpcServiceTest.java +++ b/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/CollaborationGrpcServiceTest.java @@ -27,7 +27,10 @@ import static org.assertj.core.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; +import java.io.OutputStream; import java.util.UUID; +import java.util.function.Consumer; +import java.util.function.Function; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -37,6 +40,9 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; import org.springframework.core.task.TaskExecutor; +import org.springframework.test.util.ReflectionTestUtils; + +import com.google.protobuf.ByteString; import de.ozgcloud.collaboration.common.grpc.GrpcDownloader; import de.ozgcloud.collaboration.vorgang.CollaborationVorgangMapper; @@ -188,28 +194,47 @@ class CollaborationGrpcServiceTest { void shouldContainCallObserver() { var downloader = grpcService.buildDownloader(fileId, callStreamObserver); - assertThat(downloader.getCallObserver()).isEqualTo(callStreamObserver); + assertThat(getCallObserver(downloader)).isEqualTo(callStreamObserver); } @Test void shouldContainDownloadConsumer() { var downloader = grpcService.buildDownloader(fileId, callStreamObserver); - assertThat(downloader.getDownloadConsumer()).isNotNull(); + assertThat(getDownloadConsumer(downloader)).isNotNull(); } @Test void shouldContainChunkBuilder() { var downloader = grpcService.buildDownloader(fileId, callStreamObserver); - assertThat(downloader.getChunkBuilder()).isNotNull(); + assertThat(getChunkBuilder(downloader)).isNotNull(); } @Test void shouldContainTaskBuilder() { var downloader = grpcService.buildDownloader(fileId, callStreamObserver); - assertThat(downloader.getTaskExecutor()).isEqualTo(taskExecutor); + assertThat(getTaskExecuter(downloader)).isEqualTo(taskExecutor); + } + + @SuppressWarnings("unchecked") + private CallStreamObserver<GrpcGetFileContentResponse> getCallObserver(GrpcDownloader<GrpcGetFileContentResponse> downloader) { + return (CallStreamObserver<GrpcGetFileContentResponse>) ReflectionTestUtils.getField(downloader, "callObserver"); + } + + @SuppressWarnings("unchecked") + private Consumer<OutputStream> getDownloadConsumer(GrpcDownloader<GrpcGetFileContentResponse> downloader) { + return (Consumer<OutputStream>) ReflectionTestUtils.getField(downloader, "downloadConsumer"); + } + + @SuppressWarnings("unchecked") + private Function<ByteString, GrpcGetFileContentResponse> getChunkBuilder(GrpcDownloader<GrpcGetFileContentResponse> downloader) { + return (Function<ByteString, GrpcGetFileContentResponse>) ReflectionTestUtils.getField(downloader, "chunkBuilder"); + } + + private TaskExecutor getTaskExecuter(GrpcDownloader<GrpcGetFileContentResponse> downloader) { + return (TaskExecutor) ReflectionTestUtils.getField(downloader, "taskExecutor"); } } } \ No newline at end of file diff --git a/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/common/grpc/GrpcDownloaderTest.java b/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/common/grpc/GrpcDownloaderTest.java index 1eb5787a7776283cf0da1e90c4a88348c6ec37bd..5a20435f5a258fb348bcc0c11a5abf3b9a5e5372 100644 --- a/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/common/grpc/GrpcDownloaderTest.java +++ b/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/common/grpc/GrpcDownloaderTest.java @@ -247,7 +247,6 @@ class GrpcDownloaderTest { @Test void shouldCallOnCompleted() { ReflectionTestUtils.setField(downloader, "downloadInProgress", new AtomicBoolean(false)); - when(inputStream.available()).thenReturn(0); downloader.doSendChunks(); @@ -258,7 +257,6 @@ class GrpcDownloaderTest { @Test void shouldCloseInputStream() { ReflectionTestUtils.setField(downloader, "downloadInProgress", new AtomicBoolean(false)); - when(inputStream.available()).thenReturn(0); downloader.doSendChunks();