From 2a7ecd0bdefde6ccac77ec3519119203129a9752 Mon Sep 17 00:00:00 2001 From: Atanas Atanasov Date: Thu, 6 Feb 2025 19:11:37 +0200 Subject: [PATCH] failure during write Signed-off-by: Atanas Atanasov --- .../AsyncBlockAsLocalFileWriterTest.java | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/server/src/test/java/com/hedera/block/server/persistence/storage/write/AsyncBlockAsLocalFileWriterTest.java b/server/src/test/java/com/hedera/block/server/persistence/storage/write/AsyncBlockAsLocalFileWriterTest.java index d352065b1..2807c4193 100644 --- a/server/src/test/java/com/hedera/block/server/persistence/storage/write/AsyncBlockAsLocalFileWriterTest.java +++ b/server/src/test/java/com/hedera/block/server/persistence/storage/write/AsyncBlockAsLocalFileWriterTest.java @@ -15,6 +15,7 @@ import com.hedera.block.server.util.PersistTestUtils; import com.hedera.hapi.block.BlockItemUnparsed; import com.hedera.hapi.block.BlockUnparsed; +import java.io.IOException; import java.io.OutputStream; import java.nio.file.Path; import java.util.List; @@ -118,6 +119,40 @@ void testSuccessfulWriteResponse(final long validBlockNumber) throws Exception { .returns(BlockPersistenceStatus.SUCCESS, from(BlockPersistenceResult::status)); } + /** + * This test aims to verify that the {@link AsyncBlockAsLocalFileWriter#call()} + * correctly returns a failure during write status if the offered block is + * complete, but an exception is thrown during the write operation. + * + * @param validBlockNumber parameterized, valid block number + */ + @Timeout(value = TEST_TIMEOUT_MILLIS, unit = TimeUnit.MILLISECONDS) + @ParameterizedTest + @MethodSource("validBlockNumbers") + void testFailDuringWrite(final long validBlockNumber) throws Exception { + // setup + final List validBlock = + PersistTestUtils.generateBlockItemsUnparsedForWithBlockNumber(validBlockNumber); + final AsyncBlockWriter toTest = new AsyncBlockAsLocalFileWriter( + blockPathResolverMock, blockRemoverMock, compressionMock, validBlockNumber); + final TransferQueue q = toTest.getQueue(); + validBlock.forEach(q::offer); + + // when + final Path expectedWrittenBlockFile = testTempDir.resolve(validBlockNumber + Constants.BLOCK_FILE_EXTENSION); + when(blockPathResolverMock.resolveLiveRawPathToBlock(validBlockNumber)).thenReturn(expectedWrittenBlockFile); + when(blockPathResolverMock.existsVerifiedBlock(validBlockNumber)).thenReturn(false); + when(compressionMock.getCompressionFileExtension()).thenReturn(""); + when(compressionMock.wrap(any(OutputStream.class))).thenThrow(IOException.class); + + // then + final BlockPersistenceResult actual = toTest.call(); + assertThat(actual) + .isNotNull() + .returns(validBlockNumber, from(BlockPersistenceResult::blockNumber)) + .returns(BlockPersistenceStatus.FAILURE_DURING_WRITE, from(BlockPersistenceResult::status)); + } + /** * This test aims to verify that the {@link AsyncBlockAsLocalFileWriter#call()} * correctly returns an incomplete block status if the offered block is