From 5ef3f784625251316bb0dd63c10bf6a53a0a981f Mon Sep 17 00:00:00 2001 From: Manish Dait Date: Thu, 19 Dec 2024 11:02:54 +0530 Subject: [PATCH 1/2] Implemented tests for missing functionalities in FileClientImpl.updateFile() Signed-off-by: Manish Dait --- .../hiero/base/test/FileClientImplTest.java | 107 ++++++++++++++++-- .../hiero/spring/test/FileClientTests.java | 56 ++++++++- 2 files changed, 154 insertions(+), 9 deletions(-) diff --git a/hiero-enterprise-base/src/test/java/com/openelements/hiero/base/test/FileClientImplTest.java b/hiero-enterprise-base/src/test/java/com/openelements/hiero/base/test/FileClientImplTest.java index a8ba70bf..57420a3f 100644 --- a/hiero-enterprise-base/src/test/java/com/openelements/hiero/base/test/FileClientImplTest.java +++ b/hiero-enterprise-base/src/test/java/com/openelements/hiero/base/test/FileClientImplTest.java @@ -3,17 +3,12 @@ import com.hedera.hashgraph.sdk.FileId; import com.openelements.hiero.base.HieroException; import com.openelements.hiero.base.implementation.FileClientImpl; -import com.openelements.hiero.base.protocol.FileCreateResult; -import com.openelements.hiero.base.protocol.FileCreateRequest; -import com.openelements.hiero.base.protocol.FileAppendRequest; -import com.openelements.hiero.base.protocol.FileAppendResult; -import com.openelements.hiero.base.protocol.FileInfoRequest; -import com.openelements.hiero.base.protocol.FileInfoResponse; -import com.openelements.hiero.base.protocol.ProtocolLayerClient; +import com.openelements.hiero.base.protocol.*; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.Mockito; +import org.mockito.internal.matchers.Null; import java.time.Instant; @@ -120,6 +115,104 @@ void testCreateFileThrowsExceptionForNullContent() { Assertions.assertTrue(exception.getMessage().contains(message)); } + @Test + void testUpdateFile() throws HieroException { + // mock + final FileUpdateResult fileUpdateResult = Mockito.mock(FileUpdateResult.class); + + // given + final FileId fileId = FileId.fromString("1.2.3"); + final byte[] updatedContent = "Hello Hiero! Updated".getBytes(); + + // then + when(protocolLayerClient.executeFileUpdateRequestTransaction(any(FileUpdateRequest.class))) + .thenReturn(fileUpdateResult); + + fileClientImpl.updateFile(fileId, updatedContent); + + verify(protocolLayerClient, times(1)) + .executeFileUpdateRequestTransaction(any(FileUpdateRequest.class)); + } + + @Test + void testUpdateFileForSizeGreaterThanFileCreateMaxSize() throws HieroException { + // mock + final FileUpdateResult fileUpdateResult = Mockito.mock(FileUpdateResult.class); + final FileAppendResult fileAppendResult = Mockito.mock(FileAppendResult.class); + + // given + final FileId fileId = FileId.fromString("1.2.3"); + final byte[] updatedContent = new byte[FileCreateRequest.FILE_CREATE_MAX_SIZE * 2]; + // -1 because 1 for executeFileCreateTransaction() + final int appendCount = Math.floorDiv(updatedContent.length, FileCreateRequest.FILE_CREATE_MAX_SIZE) - 1; + + //then + when(protocolLayerClient.executeFileUpdateRequestTransaction(any(FileUpdateRequest.class))) + .thenReturn(fileUpdateResult); + when(protocolLayerClient.executeFileAppendRequestTransaction(any(FileAppendRequest.class))) + .thenReturn(fileAppendResult); + + fileClientImpl.updateFile(fileId, updatedContent); + + verify(protocolLayerClient, times(1)) + .executeFileUpdateRequestTransaction(any(FileUpdateRequest.class)); + verify(protocolLayerClient, times(appendCount)) + .executeFileAppendRequestTransaction(any(FileAppendRequest.class)); + } + + @Test + void testUpdateFileThrowsExceptionForInvalidFileId() throws HieroException { + final String message = "Failed to execute transaction of type FileUpdateTransaction"; + + // given + final FileId fileId = FileId.fromString("1.2.3"); + final byte[] updatedContent = "Hello Hiero! Updated".getBytes(); + + // then + when(protocolLayerClient.executeFileUpdateRequestTransaction(any(FileUpdateRequest.class))) + .thenThrow(new HieroException(message)); + + final HieroException exception = Assertions.assertThrows( + HieroException.class, () -> fileClientImpl.updateFile(fileId, updatedContent) + ); + Assertions.assertTrue(exception.getMessage().contains(message)); + } + + @Test + void testUpdateFileThrowsExceptionForSizeGreaterThanMaxFileSize() { + final String message = "File contents must be less than " + FileCreateRequest.FILE_MAX_SIZE + " bytes"; + + // given + final FileId fileId = FileId.fromString("1.2.3"); + final byte[] updatedContent = new byte[FileCreateRequest.FILE_MAX_SIZE + 1]; + + // then + final HieroException exception = Assertions.assertThrows( + HieroException.class, () -> fileClientImpl.updateFile(fileId, updatedContent) + ); + Assertions.assertTrue(exception.getMessage().contains(message)); + } + + @Test + void testUpdateFileThrowsExceptionForNullArguments() { + // given + final FileId fileId = FileId.fromString("1.2.3"); + final byte[] updatedContent = "Hello Hiero! Updated".getBytes(); + + // then + final NullPointerException nullContentException = Assertions.assertThrows( + NullPointerException.class, () -> fileClientImpl.updateFile(fileId, null) + ); + Assertions.assertTrue(nullContentException.getMessage().contains("content must not be null")); + + final NullPointerException nullIdException = Assertions.assertThrows( + NullPointerException.class, () -> fileClientImpl.updateFile(null, updatedContent) + ); + Assertions.assertTrue(nullIdException.getMessage().contains("fileId must not be null")); + + Assertions.assertThrows(NullPointerException.class, () -> fileClientImpl.updateFile(null, null)); + } + @Test void testGetFileSize() throws HieroException { // mocks diff --git a/hiero-enterprise-spring/src/test/java/com/openelements/hiero/spring/test/FileClientTests.java b/hiero-enterprise-spring/src/test/java/com/openelements/hiero/spring/test/FileClientTests.java index 84bcb429..e3c4279b 100644 --- a/hiero-enterprise-spring/src/test/java/com/openelements/hiero/spring/test/FileClientTests.java +++ b/hiero-enterprise-spring/src/test/java/com/openelements/hiero/spring/test/FileClientTests.java @@ -3,9 +3,12 @@ import com.hedera.hashgraph.sdk.FileId; import com.openelements.hiero.base.FileClient; import com.openelements.hiero.base.HieroException; + +import java.io.File; import java.time.Duration; import java.time.Instant; import java.time.temporal.ChronoUnit; +import java.util.Arrays; import java.util.stream.IntStream; import com.openelements.hiero.base.protocol.FileCreateRequest; @@ -147,9 +150,9 @@ void testDeleteFileByFileId() throws Exception { @Test void testUpdateFileByFileId() throws Exception { //given - final byte[] contents = "Hello, Hedera!".getBytes(); + final byte[] contents = "Hello, Hiero!".getBytes(); final FileId fileId = fileClient.createFile(contents); - final String newContent = "Hello, Hedera! Updated"; + final String newContent = "Hello, Hiero! Updated"; //when fileClient.updateFile(fileId, newContent.getBytes()); @@ -159,6 +162,55 @@ void testUpdateFileByFileId() throws Exception { Assertions.assertArrayEquals(newContent.getBytes(), readContents); } + @Test + void testUpdateFileForSizeGreaterThanCreateFileSize() throws HieroException { + // given + final byte[] contents = "Hello, Hiero!".getBytes(); + final FileId fileId = fileClient.createFile(contents); + final byte[] updatedContent = new byte[FileCreateRequest.FILE_CREATE_MAX_SIZE * 2]; + + // when + fileClient.updateFile(fileId, updatedContent); + + // then + final byte[] readContent = fileClient.readFile(fileId); + Assertions.assertArrayEquals(updatedContent, readContent); + } + + @Test + void testUpdateFileThrowExceptionForInvalidFileId() { + // given + final FileId fileId = FileId.fromString("1.2.3"); + final byte[] updatedContent = "Hello, Hiero! Update".getBytes(); + + // then + Assertions.assertThrows(HieroException.class, () -> fileClient.updateFile(fileId, updatedContent)); + } + + @Test + void testUpdateFileThrowExceptionIfSizeExceedMaxSize() throws HieroException { + // given + final byte[] contents = "Hello, Hiero!".getBytes(); + final FileId fileId = fileClient.createFile(contents); + final byte[] updatedContent = new byte[FileCreateRequest.FILE_MAX_SIZE + 1]; + + // then + Assertions.assertThrows(HieroException.class, () -> fileClient.updateFile(fileId, updatedContent)); + } + + @Test + void testUpdateFileThrowsErrorForNullValues() throws HieroException { + // given + final byte[] contents = "Hello, Hiero!".getBytes(); + final FileId fileId = fileClient.createFile(contents); + final byte[] updatedContent = "Hello, Hiero! Update".getBytes(); + + // then + Assertions.assertThrows(NullPointerException.class, () -> fileClient.updateFile(fileId, null)); + Assertions.assertThrows(NullPointerException.class, () -> fileClient.updateFile(null, updatedContent)); + Assertions.assertThrows(NullPointerException.class, () -> fileClient.updateFile(null, null)); + } + @Test void testDeleteFileByStringId() throws Exception { //given From 6d0ec11099e92f297f8403cdf3d23a86d5eba70e Mon Sep 17 00:00:00 2001 From: Manish Dait Date: Thu, 19 Dec 2024 11:07:04 +0530 Subject: [PATCH 2/2] Remove unused imports Signed-off-by: Manish Dait --- .../hiero/base/test/FileClientImplTest.java | 11 +++++++++-- .../hiero/spring/test/FileClientTests.java | 2 -- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/hiero-enterprise-base/src/test/java/com/openelements/hiero/base/test/FileClientImplTest.java b/hiero-enterprise-base/src/test/java/com/openelements/hiero/base/test/FileClientImplTest.java index 57420a3f..e48f1fc1 100644 --- a/hiero-enterprise-base/src/test/java/com/openelements/hiero/base/test/FileClientImplTest.java +++ b/hiero-enterprise-base/src/test/java/com/openelements/hiero/base/test/FileClientImplTest.java @@ -3,12 +3,19 @@ import com.hedera.hashgraph.sdk.FileId; import com.openelements.hiero.base.HieroException; import com.openelements.hiero.base.implementation.FileClientImpl; -import com.openelements.hiero.base.protocol.*; +import com.openelements.hiero.base.protocol.FileCreateResult; +import com.openelements.hiero.base.protocol.FileCreateRequest; +import com.openelements.hiero.base.protocol.FileUpdateResult; +import com.openelements.hiero.base.protocol.FileUpdateRequest; +import com.openelements.hiero.base.protocol.FileAppendRequest; +import com.openelements.hiero.base.protocol.FileAppendResult; +import com.openelements.hiero.base.protocol.FileInfoRequest; +import com.openelements.hiero.base.protocol.FileInfoResponse; +import com.openelements.hiero.base.protocol.ProtocolLayerClient; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.Mockito; -import org.mockito.internal.matchers.Null; import java.time.Instant; diff --git a/hiero-enterprise-spring/src/test/java/com/openelements/hiero/spring/test/FileClientTests.java b/hiero-enterprise-spring/src/test/java/com/openelements/hiero/spring/test/FileClientTests.java index e3c4279b..3289c70b 100644 --- a/hiero-enterprise-spring/src/test/java/com/openelements/hiero/spring/test/FileClientTests.java +++ b/hiero-enterprise-spring/src/test/java/com/openelements/hiero/spring/test/FileClientTests.java @@ -4,11 +4,9 @@ import com.openelements.hiero.base.FileClient; import com.openelements.hiero.base.HieroException; -import java.io.File; import java.time.Duration; import java.time.Instant; import java.time.temporal.ChronoUnit; -import java.util.Arrays; import java.util.stream.IntStream; import com.openelements.hiero.base.protocol.FileCreateRequest;