From 158e157be4ca026b280f44b4518a41770e441bb3 Mon Sep 17 00:00:00 2001 From: Krzysztof <krzysztof.witukiewicz@mgm-tp.com> Date: Tue, 1 Apr 2025 13:40:10 +0200 Subject: [PATCH] OZG-7573 OZG-7991 Make FileSender extend (not delegate to) StreamExclusiveFileSender --- .../binaryfile/GrpcFileUploadUtils.java | 46 ++++----- .../binaryfile/GrpcFileUploadUtilsTest.java | 99 ++----------------- 2 files changed, 31 insertions(+), 114 deletions(-) diff --git a/ozgcloud-common-lib/src/main/java/de/ozgcloud/common/binaryfile/GrpcFileUploadUtils.java b/ozgcloud-common-lib/src/main/java/de/ozgcloud/common/binaryfile/GrpcFileUploadUtils.java index 1b7f1c1..f66eb63 100644 --- a/ozgcloud-common-lib/src/main/java/de/ozgcloud/common/binaryfile/GrpcFileUploadUtils.java +++ b/ozgcloud-common-lib/src/main/java/de/ozgcloud/common/binaryfile/GrpcFileUploadUtils.java @@ -32,51 +32,47 @@ import io.grpc.stub.CallStreamObserver; import io.grpc.stub.StreamObserver; import lombok.AccessLevel; import lombok.NoArgsConstructor; -import lombok.NonNull; import lombok.extern.log4j.Log4j2; @Log4j2 @NoArgsConstructor(access = AccessLevel.PRIVATE) public class GrpcFileUploadUtils { - /* - * Q = Request Type; S = Response Type + /** + * @param <Q> Request Type + * @param <S> Response Type + * @deprecated use {@link #createStreamExclusiveFileSender(BiFunction, InputStream, Function)} instead */ + @Deprecated(since = "4.13.0") public static <Q, S> FileSender<Q, S> createSender(BiFunction<byte[], Integer, Q> chunkBuilder, InputStream inputStream, Function<StreamObserver<S>, CallStreamObserver<Q>> reqObserverBuilder) { return new FileSender<>(chunkBuilder, inputStream, reqObserverBuilder); } + /** + * @param <Q> Request Type + * @param <S> Response Type + */ + public static <Q, S> StreamingFileSender<Q, S> createStreamExclusiveFileSender(BiFunction<byte[], Integer, Q> chunkBuilder, InputStream inputStream, + Function<StreamObserver<S>, CallStreamObserver<Q>> reqObserverBuilder) { + return new StreamExclusiveFileSender<>(chunkBuilder, inputStream, reqObserverBuilder); + } + + /** + * @param <Q> Request Type + * @param <S> Response Type + */ public static <Q, S> StreamingFileSender<Q, S> createStreamSharingSender(BiFunction<byte[], Integer, Q> chunkBuilder, InputStream inputStream, CallStreamObserver<Q> requestObserver, Consumer<Runnable> onReadyHandlerRegistrar) { return new StreamSharingFileSender<>(chunkBuilder, inputStream, requestObserver, onReadyHandlerRegistrar); } - public static class FileSender<Q, S> { - - private final StreamExclusiveFileSender<Q, S> sender; + // for backwards compatibility + public static class FileSender<Q, S> extends StreamExclusiveFileSender<Q, S> { FileSender(BiFunction<byte[], Integer, Q> chunkBuilder, InputStream inputStream, Function<StreamObserver<S>, CallStreamObserver<Q>> reqObserverBuilder) { - this.sender = new StreamExclusiveFileSender<>(chunkBuilder, inputStream, reqObserverBuilder); - } - - public FileSender<Q, S> withMetaData(@NonNull Q metaData) { - sender.withMetaData(metaData); - return this; - } - - public FileSender<Q, S> send() { - sender.send(); - return this; - } - - public void cancelOnTimeout() { - sender.cancelOnTimeout(); - } - - public void cancelOnError(Throwable t) { - sender.cancelOnError(t); + super(chunkBuilder, inputStream, reqObserverBuilder); } } diff --git a/ozgcloud-common-lib/src/test/java/de/ozgcloud/common/binaryfile/GrpcFileUploadUtilsTest.java b/ozgcloud-common-lib/src/test/java/de/ozgcloud/common/binaryfile/GrpcFileUploadUtilsTest.java index 82c4698..c94b69e 100644 --- a/ozgcloud-common-lib/src/test/java/de/ozgcloud/common/binaryfile/GrpcFileUploadUtilsTest.java +++ b/ozgcloud-common-lib/src/test/java/de/ozgcloud/common/binaryfile/GrpcFileUploadUtilsTest.java @@ -24,22 +24,18 @@ package de.ozgcloud.common.binaryfile; import static org.assertj.core.api.Assertions.*; -import static org.mockito.Mockito.*; import java.io.InputStream; import java.util.function.BiFunction; import java.util.function.Consumer; import java.util.function.Function; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.mockito.Mock; import de.ozgcloud.common.binaryfile.BinaryFileTestFactory.TestRequestType; import de.ozgcloud.common.binaryfile.BinaryFileTestFactory.TestResponseType; -import de.ozgcloud.common.binaryfile.GrpcFileUploadUtils.FileSender; -import de.ozgcloud.common.test.ReflectionTestUtils; import io.grpc.stub.CallStreamObserver; import io.grpc.stub.StreamObserver; @@ -60,107 +56,32 @@ class GrpcFileUploadUtilsTest { class TestCreateSender { @Test - void shouldReturnInstanceOfFileSender() { + void shouldReturnInstanceOfStreamExclusiveFileSender() { var createdSender = GrpcFileUploadUtils.createSender(chunkBuilder, inputStream, reqObserverBuilder); - assertThat(createdSender).isInstanceOf(FileSender.class); + assertThat(createdSender).isInstanceOf(StreamExclusiveFileSender.class); } } @Nested - class TestCreateStreamSharingSender { + class TestCreateStreamExclusiveFileSender { @Test - void shouldReturnInstanceOfStreamSharingSender() { - var createdSender = GrpcFileUploadUtils.createStreamSharingSender(chunkBuilder, inputStream, requestObserver, onReadyHandlerRegistrar); + void shouldReturnInstanceOfStreamExclusiveFileSender() { + var createdSender = GrpcFileUploadUtils.createStreamExclusiveFileSender(chunkBuilder, inputStream, reqObserverBuilder); - assertThat(createdSender).isInstanceOf(StreamSharingFileSender.class); + assertThat(createdSender).isInstanceOf(StreamExclusiveFileSender.class); } } @Nested - class TestFileSender { - - private final FileSender<TestRequestType, TestResponseType> fileSender = new FileSender<>(chunkBuilder, inputStream, reqObserverBuilder); - @Mock - private StreamExclusiveFileSender<TestRequestType, TestResponseType> streamExclusiveFileSender; + class TestCreateStreamSharingSender { @Test - void shouldCreateStreamExclusiveFileSender() { - var internalFileSender = ReflectionTestUtils.getField(fileSender, "sender", StreamExclusiveFileSender.class); - - assertThat(internalFileSender).isInstanceOf(StreamExclusiveFileSender.class); - } - - @Nested - class TestMethods { - - @BeforeEach - void init() { - ReflectionTestUtils.setField(fileSender, "sender", streamExclusiveFileSender); - } - - @Nested - class TestWithMetaData { - - private final TestRequestType request = new TestRequestType(); - - @Test - void shouldDelegate() { - fileSender.withMetaData(request); - - verify(streamExclusiveFileSender).withMetaData(request); - } - - @Test - void shouldReturnItself() { - var senderWithMetaData = fileSender.withMetaData(request); - - assertThat(senderWithMetaData).isSameAs(fileSender); - } - } - - @Nested - class TestSend { - - @Test - void shouldDelegate() { - fileSender.send(); - - verify(streamExclusiveFileSender).send(); - } - - @Test - void shouldReturnItself() { - var returnedSender = fileSender.send(); - - assertThat(returnedSender).isSameAs(fileSender); - } - } - - @Nested - class TestCancelOnTimeout { - - @Test - void shouldDelegate() { - fileSender.cancelOnTimeout(); - - verify(streamExclusiveFileSender).cancelOnTimeout(); - } - } - - @Nested - class TestCancelOnError { - - @Test - void shouldDelegate() { - var error = new Throwable(); - - fileSender.cancelOnError(error); + void shouldReturnInstanceOfStreamSharingSender() { + var createdSender = GrpcFileUploadUtils.createStreamSharingSender(chunkBuilder, inputStream, requestObserver, onReadyHandlerRegistrar); - verify(streamExclusiveFileSender).cancelOnError(error); - } - } + assertThat(createdSender).isInstanceOf(StreamSharingFileSender.class); } } } \ No newline at end of file -- GitLab