From 726dea63a44ed7a1d68d0694597080147209f65c Mon Sep 17 00:00:00 2001 From: Konstantin Date: Thu, 2 Jul 2026 13:01:15 +0200 Subject: [PATCH 1/2] fixed checksum Error --- .../java/dev/zarr/zarrjava/store/S3Store.java | 31 +++++++++++++------ .../dev/zarr/zarrjava/store/StoreTest.java | 20 ++++++++++++ 2 files changed, 42 insertions(+), 9 deletions(-) diff --git a/src/main/java/dev/zarr/zarrjava/store/S3Store.java b/src/main/java/dev/zarr/zarrjava/store/S3Store.java index 85db5f46..c735a336 100644 --- a/src/main/java/dev/zarr/zarrjava/store/S3Store.java +++ b/src/main/java/dev/zarr/zarrjava/store/S3Store.java @@ -1,18 +1,29 @@ package dev.zarr.zarrjava.store; -import dev.zarr.zarrjava.utils.Utils; -import software.amazon.awssdk.core.ResponseInputStream; -import software.amazon.awssdk.core.sync.RequestBody; -import software.amazon.awssdk.services.s3.S3Client; -import software.amazon.awssdk.services.s3.model.*; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; import java.io.IOException; import java.io.InputStream; import java.nio.ByteBuffer; import java.util.stream.Stream; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +import dev.zarr.zarrjava.utils.Utils; +import software.amazon.awssdk.core.ResponseInputStream; +import software.amazon.awssdk.core.sync.RequestBody; +import software.amazon.awssdk.services.s3.S3Client; +import software.amazon.awssdk.services.s3.model.CommonPrefix; +import software.amazon.awssdk.services.s3.model.DeleteObjectRequest; +import software.amazon.awssdk.services.s3.model.GetObjectRequest; +import software.amazon.awssdk.services.s3.model.GetObjectResponse; +import software.amazon.awssdk.services.s3.model.HeadObjectRequest; +import software.amazon.awssdk.services.s3.model.ListObjectsV2Request; +import software.amazon.awssdk.services.s3.model.ListObjectsV2Response; +import software.amazon.awssdk.services.s3.model.NoSuchKeyException; +import software.amazon.awssdk.services.s3.model.PutObjectRequest; +import software.amazon.awssdk.services.s3.model.S3Exception; +import software.amazon.awssdk.services.s3.model.S3Object; + public class S3Store implements Store, Store.ListableStore { @Nonnull @@ -82,7 +93,9 @@ public ByteBuffer get(String[] keys, long start) { GetObjectRequest req = GetObjectRequest.builder() .bucket(bucketName) .key(resolveKeys(keys)) - .range(String.format("bytes=%d-", start)) + .range(start < 0 //dependant on where we start either fetch last or first bytes + ? String.format("bytes=%d", start) + : String.format("bytes=%d-", start)) .build(); return get(req); } diff --git a/src/test/java/dev/zarr/zarrjava/store/StoreTest.java b/src/test/java/dev/zarr/zarrjava/store/StoreTest.java index f99cfe26..996a922c 100644 --- a/src/test/java/dev/zarr/zarrjava/store/StoreTest.java +++ b/src/test/java/dev/zarr/zarrjava/store/StoreTest.java @@ -105,6 +105,26 @@ public void testGetWithStartEnd() { Assertions.assertArrayEquals(expectedBytes, actualBytes); } + @Test + public void testReadSuffix() { + StoreHandle storeHandle = storeHandleWithData(); + ByteBuffer fullBuffer = storeHandle.read(); + long size = fullBuffer.remaining(); + if (size < 20) { + Assertions.fail("Store size is too small to test suffix read"); + } + + ByteBuffer suffixBuffer = storeHandle.read(-10); + Assertions.assertEquals(10, suffixBuffer.remaining()); + + byte[] expectedBytes = new byte[10]; + fullBuffer.position((int) (size - 10)); + fullBuffer.get(expectedBytes); + byte[] actualBytes = new byte[10]; + suffixBuffer.get(actualBytes); + Assertions.assertArrayEquals(expectedBytes, actualBytes); + } + @Test public abstract void testList() throws ZarrException, IOException; From d406e5ee74a6d35a6451c588bafe117abbe37ecf Mon Sep 17 00:00:00 2001 From: Konstantin Date: Fri, 3 Jul 2026 19:54:45 +0200 Subject: [PATCH 2/2] switched testcase location --- .../zarrjava/store/OnlineS3StoreTest.java | 20 +++++++++++++++++++ .../dev/zarr/zarrjava/store/StoreTest.java | 20 ------------------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/test/java/dev/zarr/zarrjava/store/OnlineS3StoreTest.java b/src/test/java/dev/zarr/zarrjava/store/OnlineS3StoreTest.java index 051006c5..7aa93907 100644 --- a/src/test/java/dev/zarr/zarrjava/store/OnlineS3StoreTest.java +++ b/src/test/java/dev/zarr/zarrjava/store/OnlineS3StoreTest.java @@ -60,6 +60,26 @@ public void testGet() { Assertions.assertEquals(10, bufferWithStartAndEnd.remaining()); } + @Test + public void testReadSuffix() { + StoreHandle storeHandle = storeHandleWithData(); + ByteBuffer fullBuffer = storeHandle.read(); + long size = fullBuffer.remaining(); + if (size < 20) { + Assertions.fail("Store size is too small to test suffix read"); + } + + ByteBuffer suffixBuffer = storeHandle.read(-10); + Assertions.assertEquals(10, suffixBuffer.remaining()); + + byte[] expectedBytes = new byte[10]; + fullBuffer.position((int) (size - 10)); + fullBuffer.get(expectedBytes); + byte[] actualBytes = new byte[10]; + suffixBuffer.get(actualBytes); + Assertions.assertArrayEquals(expectedBytes, actualBytes); + } + @Override StoreHandle storeHandleWithData() { return storeHandle.resolve("zarr.json"); diff --git a/src/test/java/dev/zarr/zarrjava/store/StoreTest.java b/src/test/java/dev/zarr/zarrjava/store/StoreTest.java index 996a922c..f99cfe26 100644 --- a/src/test/java/dev/zarr/zarrjava/store/StoreTest.java +++ b/src/test/java/dev/zarr/zarrjava/store/StoreTest.java @@ -105,26 +105,6 @@ public void testGetWithStartEnd() { Assertions.assertArrayEquals(expectedBytes, actualBytes); } - @Test - public void testReadSuffix() { - StoreHandle storeHandle = storeHandleWithData(); - ByteBuffer fullBuffer = storeHandle.read(); - long size = fullBuffer.remaining(); - if (size < 20) { - Assertions.fail("Store size is too small to test suffix read"); - } - - ByteBuffer suffixBuffer = storeHandle.read(-10); - Assertions.assertEquals(10, suffixBuffer.remaining()); - - byte[] expectedBytes = new byte[10]; - fullBuffer.position((int) (size - 10)); - fullBuffer.get(expectedBytes); - byte[] actualBytes = new byte[10]; - suffixBuffer.get(actualBytes); - Assertions.assertArrayEquals(expectedBytes, actualBytes); - } - @Test public abstract void testList() throws ZarrException, IOException;