Skip to content

Commit 60e28cd

Browse files
committed
add S3Mock for tests
1 parent 4f7bee8 commit 60e28cd

3 files changed

Lines changed: 84 additions & 3 deletions

File tree

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,5 @@ build/
4545
/main.py
4646
/pyproject.toml
4747
/uv.lock
48-
**/__pycache__
48+
**/__pycache__
49+
/dependency-reduced-pom.xml

pom.xml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,30 @@
126126
<artifactId>commons-compress</artifactId>
127127
<version>1.28.0</version>
128128
</dependency>
129+
<dependency>
130+
<groupId>com.adobe.testing</groupId>
131+
<artifactId>s3mock</artifactId>
132+
<version>4.11.0</version>
133+
<scope>test</scope>
134+
</dependency>
135+
<dependency>
136+
<groupId>com.adobe.testing</groupId>
137+
<artifactId>s3mock-testcontainers</artifactId>
138+
<version>4.11.0</version>
139+
<scope>test</scope>
140+
</dependency>
141+
<dependency>
142+
<groupId>org.testcontainers</groupId>
143+
<artifactId>junit-jupiter</artifactId>
144+
<version>1.20.4</version>
145+
<scope>test</scope>
146+
</dependency>
147+
<dependency>
148+
<groupId>org.testcontainers</groupId>
149+
<artifactId>testcontainers</artifactId>
150+
<version>2.0.2</version>
151+
<scope>test</scope>
152+
</dependency>
129153
</dependencies>
130154

131155
<repositories>

src/test/java/dev/zarr/zarrjava/ZarrStoreTest.java

Lines changed: 58 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,26 @@
11
package dev.zarr.zarrjava;
22

3+
import com.adobe.testing.s3mock.testcontainers.S3MockContainer;
34
import com.fasterxml.jackson.databind.ObjectMapper;
45
import dev.zarr.zarrjava.core.*;
56
import dev.zarr.zarrjava.store.*;
67
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
78
import org.apache.commons.compress.archivers.zip.ZipFile;
8-
import org.junit.jupiter.api.Assertions;
9-
import org.junit.jupiter.api.Test;
9+
import org.junit.jupiter.api.*;
1010
import org.junit.jupiter.params.ParameterizedTest;
1111
import org.junit.jupiter.params.provider.CsvSource;
1212
import org.junit.jupiter.params.provider.MethodSource;
13+
import org.testcontainers.junit.jupiter.Container;
14+
import org.testcontainers.junit.jupiter.Testcontainers;
1315
import software.amazon.awssdk.auth.credentials.AnonymousCredentialsProvider;
16+
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
17+
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
18+
import software.amazon.awssdk.http.SdkHttpClient;
19+
import software.amazon.awssdk.http.apache.ApacheHttpClient;
1420
import software.amazon.awssdk.regions.Region;
1521
import software.amazon.awssdk.services.s3.S3Client;
1622
import software.amazon.awssdk.services.s3.S3Configuration;
23+
import software.amazon.awssdk.utils.AttributeMap;
1724

1825
import java.io.IOException;
1926
import java.io.InputStream;
@@ -32,6 +39,55 @@
3239
import static dev.zarr.zarrjava.Utils.unzipFile;
3340
import static dev.zarr.zarrjava.Utils.zipFile;
3441
import static dev.zarr.zarrjava.v3.Node.makeObjectMapper;
42+
import static software.amazon.awssdk.http.SdkHttpConfigurationOption.TRUST_ALL_CERTIFICATES;
43+
44+
45+
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
46+
@Testcontainers
47+
class S3StoreTest {
48+
private final String TEST_BUCKET = "test-bucket";
49+
@Container
50+
private S3MockContainer s3Mock;
51+
private S3Client s3Client;
52+
53+
@BeforeAll
54+
void setUp() {
55+
s3Mock = new S3MockContainer("latest").withInitialBuckets(TEST_BUCKET);
56+
s3Mock.start();
57+
SdkHttpClient httpClient = ApacheHttpClient.builder().buildWithDefaults(AttributeMap.builder().put(TRUST_ALL_CERTIFICATES, Boolean.TRUE).build());
58+
s3Client = S3Client.builder().endpointOverride(URI.create(s3Mock.getHttpsEndpoint())).serviceConfiguration(S3Configuration.builder().pathStyleAccessEnabled(true).build()).credentialsProvider(StaticCredentialsProvider.create(AwsBasicCredentials.create("foo", "bar"))).region(Region.US_EAST_1) // required, but ignored
59+
.httpClient(httpClient).build();
60+
}
61+
62+
@AfterAll
63+
void tearDown() {
64+
if (s3Mock.isRunning()) {
65+
s3Mock.stop();
66+
}
67+
}
68+
69+
@Test
70+
void testS3Mock() {
71+
Assertions.assertTrue(s3Mock.isRunning());
72+
}
73+
74+
@Test
75+
void testReadWriteS3Store() {
76+
S3Store s3Store = new S3Store(s3Client, TEST_BUCKET, "");
77+
78+
StoreHandle storeHandle = s3Store.resolve("testfile");
79+
byte[] testData = new byte[100];
80+
for (int i = 0; i < testData.length; i++) {
81+
testData[i] = (byte) i;
82+
}
83+
storeHandle.set(ByteBuffer.wrap(testData));
84+
ByteBuffer retrievedData = storeHandle.read();
85+
byte[] retrievedBytes = new byte[retrievedData.remaining()];
86+
retrievedData.get(retrievedBytes);
87+
Assertions.assertArrayEquals(testData, retrievedBytes);
88+
}
89+
90+
}
3591

3692
public class ZarrStoreTest extends ZarrTest {
3793
static StoreHandle createS3StoreHandle() {

0 commit comments

Comments
 (0)