You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@opendal.apache.org by gx...@apache.org on 2023/10/31 12:08:50 UTC
(incubator-opendal) 02/02: test(binding/java): add test for presign
This is an automated email from the ASF dual-hosted git repository.
gxd pushed a commit to branch fix_binding_java
in repository https://gitbox.apache.org/repos/asf/incubator-opendal.git
commit 9dc9f76bfe0d53a91787ca5f030bd784c7a5bef3
Author: G-XD <GX...@gmail.com>
AuthorDate: Tue Oct 31 20:00:53 2023 +0800
test(binding/java): add test for presign
---
bindings/java/pom.xml | 11 ++
.../opendal/test/behavior/AsyncPresignTest.java | 138 +++++++++++++++++++++
2 files changed, 149 insertions(+)
diff --git a/bindings/java/pom.xml b/bindings/java/pom.xml
index 4eaa70059..6536ec442 100644
--- a/bindings/java/pom.xml
+++ b/bindings/java/pom.xml
@@ -63,6 +63,7 @@
<dotenv.version>2.3.2</dotenv.version>
<lombok.version>1.18.30</lombok.version>
<slf4j.version>2.0.7</slf4j.version>
+ <httpclient.version>5.2</httpclient.version>
<!-- plugins dependencies -->
<maven-surefire-plugin.version>3.1.2</maven-surefire-plugin.version>
@@ -101,6 +102,11 @@
<artifactId>dotenv-java</artifactId>
<version>${dotenv.version}</version>
</dependency>
+ <dependency>
+ <groupId>org.apache.httpcomponents.client5</groupId>
+ <artifactId>httpclient5</artifactId>
+ <version>${httpclient.version}</version>
+ </dependency>
</dependencies>
</dependencyManagement>
@@ -136,6 +142,11 @@
<artifactId>dotenv-java</artifactId>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.apache.httpcomponents.client5</groupId>
+ <artifactId>httpclient5</artifactId>
+ <scope>test</scope>
+ </dependency>
</dependencies>
<build>
diff --git a/bindings/java/src/test/java/org/apache/opendal/test/behavior/AsyncPresignTest.java b/bindings/java/src/test/java/org/apache/opendal/test/behavior/AsyncPresignTest.java
new file mode 100644
index 000000000..4f2a33c59
--- /dev/null
+++ b/bindings/java/src/test/java/org/apache/opendal/test/behavior/AsyncPresignTest.java
@@ -0,0 +1,138 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.opendal.test.behavior;
+
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assumptions.assumeTrue;
+import java.io.IOException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.time.Duration;
+import java.util.Map;
+import java.util.UUID;
+import org.apache.hc.client5.http.entity.EntityBuilder;
+import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
+import org.apache.hc.client5.http.impl.classic.HttpClients;
+import org.apache.hc.core5.http.ClassicHttpResponse;
+import org.apache.hc.core5.http.HttpEntity;
+import org.apache.hc.core5.http.HttpHeaders;
+import org.apache.hc.core5.http.HttpStatus;
+import org.apache.hc.core5.http.io.entity.EntityUtils;
+import org.apache.hc.core5.http.io.support.ClassicRequestBuilder;
+import org.apache.opendal.Capability;
+import org.apache.opendal.Metadata;
+import org.apache.opendal.PresignedRequest;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestInstance;
+
+@TestInstance(TestInstance.Lifecycle.PER_CLASS)
+public class AsyncPresignTest extends BehaviorTestBase {
+
+ @BeforeAll
+ public void precondition() {
+ final Capability capability = op().info.fullCapability;
+ assumeTrue(capability.list && capability.write && capability.presign);
+ }
+
+ /**
+ * Presign write should succeed.
+ */
+ @Test
+ public void testPresignWrite() throws IOException {
+ final String path = UUID.randomUUID().toString();
+ final byte[] content = generateBytes();
+
+ final PresignedRequest signedReq =
+ op().presignWrite(path, Duration.ofSeconds(3600)).join();
+
+ try (CloseableHttpClient httpclient = HttpClients.createDefault()) {
+ final HttpEntity body = EntityBuilder.create().setBinary(content).build();
+ final ClassicRequestBuilder builder =
+ createRequestBuilder(signedReq).setEntity(body);
+
+ httpclient.execute(builder.build(), rsp -> rsp);
+ }
+
+ final Metadata meta = op().stat(path).join();
+ assertEquals(content.length, meta.getContentLength());
+ op().delete(path).join();
+ }
+
+ /**
+ * Presign stat should succeed.
+ */
+ @Test
+ public void testPresignStat() throws IOException {
+ final String path = UUID.randomUUID().toString();
+ final byte[] content = generateBytes();
+ op().write(path, content).join();
+
+ final PresignedRequest signedReq =
+ op().presignStat(path, Duration.ofSeconds(3600)).join();
+ try (CloseableHttpClient httpclient = HttpClients.createDefault()) {
+ final ClassicRequestBuilder builder = createRequestBuilder(signedReq);
+
+ final ClassicHttpResponse response = httpclient.execute(builder.build(), rsp -> rsp);
+ assertEquals(HttpStatus.SC_OK, response.getCode());
+ assertEquals(
+ String.valueOf(content.length),
+ response.getFirstHeader(HttpHeaders.CONTENT_LENGTH).getValue());
+ }
+
+ op().delete(path).join();
+ }
+
+ /**
+ * Presign read should read content successfully.
+ */
+ @Test
+ public void testPresignRead() throws IOException, NoSuchAlgorithmException {
+ final String path = UUID.randomUUID().toString();
+ final byte[] content = generateBytes();
+ op().write(path, content).join();
+
+ final PresignedRequest signedReq =
+ op().presignRead(path, Duration.ofSeconds(3600)).join();
+ try (CloseableHttpClient httpclient = HttpClients.createDefault()) {
+ final ClassicRequestBuilder builder = createRequestBuilder(signedReq);
+
+ final byte[] responseContent = httpclient.execute(builder.build(), rsp -> {
+ return EntityUtils.toByteArray(rsp.getEntity());
+ });
+ assertEquals(content.length, responseContent.length);
+
+ final MessageDigest digest = MessageDigest.getInstance("SHA-256");
+ assertArrayEquals(digest.digest(content), digest.digest(responseContent));
+ }
+
+ op().delete(path).join();
+ }
+
+ private ClassicRequestBuilder createRequestBuilder(final PresignedRequest signedReq) {
+ final ClassicRequestBuilder builder =
+ ClassicRequestBuilder.create(signedReq.getMethod()).setUri(signedReq.getUri());
+ for (Map.Entry<String, String> entry : signedReq.getHeaders().entrySet()) {
+ builder.addHeader(entry.getKey(), entry.getValue());
+ }
+ return builder;
+ }
+}