This is an automated email from the ASF dual-hosted git repository.

peterxcli pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git


The following commit(s) were added to refs/heads/master by this push:
     new b63347345a2 HDDS-14346. Reduce duplication in multipart upload unit 
tests (#9588)
b63347345a2 is described below

commit b63347345a25f009fc5d453fc758ad2a3dcfced6
Author: Doroszlai, Attila <[email protected]>
AuthorDate: Tue Jan 6 08:37:26 2026 +0100

    HDDS-14346. Reduce duplication in multipart upload unit tests (#9588)
---
 .../ozone/s3/endpoint/EndpointTestUtils.java       |  64 +++++++
 .../s3/endpoint/TestAbortMultipartUpload.java      |  13 +-
 .../s3/endpoint/TestInitiateMultipartUpload.java   |  27 +--
 .../hadoop/ozone/s3/endpoint/TestListParts.java    |  34 +---
 .../s3/endpoint/TestMultipartUploadComplete.java   | 136 ++------------
 .../s3/endpoint/TestMultipartUploadWithCopy.java   | 101 +++-------
 .../hadoop/ozone/s3/endpoint/TestObjectGet.java    |  41 ++--
 .../hadoop/ozone/s3/endpoint/TestPartUpload.java   | 207 +++++++--------------
 .../s3/endpoint/TestPartUploadWithStream.java      | 145 ---------------
 .../ozone/s3/endpoint/TestUploadWithStream.java    |  15 +-
 .../ozone/s3/metrics/TestS3GatewayMetrics.java     |  20 +-
 11 files changed, 206 insertions(+), 597 deletions(-)

diff --git 
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/EndpointTestUtils.java
 
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/EndpointTestUtils.java
index a67bd28317a..d2e0a362f1b 100644
--- 
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/EndpointTestUtils.java
+++ 
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/EndpointTestUtils.java
@@ -19,11 +19,14 @@
 
 import static java.nio.charset.StandardCharsets.UTF_8;
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
+import java.util.List;
 import javax.ws.rs.core.Response;
+import org.apache.hadoop.ozone.OzoneConsts;
 import org.apache.hadoop.ozone.s3.exception.OS3Exception;
 import org.apache.http.HttpStatus;
 import org.apache.ratis.util.function.CheckedSupplier;
@@ -104,6 +107,67 @@ public static Response deleteTagging(
     return subject.delete(bucket, key, null, "");
   }
 
+  /** Initiate multipart upload.
+   * @return upload ID */
+  public static String initiateMultipartUpload(ObjectEndpoint subject, String 
bucket, String key)
+      throws IOException, OS3Exception {
+    try (Response response = subject.initializeMultipartUpload(bucket, key)) {
+      assertEquals(HttpStatus.SC_OK, response.getStatus());
+      MultipartUploadInitiateResponse entity = 
(MultipartUploadInitiateResponse) response.getEntity();
+      String uploadID = entity.getUploadID();
+      assertNotNull(uploadID, "uploadID == null");
+      return uploadID;
+    }
+  }
+
+  /** Upload part of multipart key.
+   * @return Part to be used for completion request */
+  public static CompleteMultipartUploadRequest.Part uploadPart(
+      ObjectEndpoint subject,
+      String bucket,
+      String key,
+      int partNumber,
+      String uploadID,
+      String content
+  ) throws IOException, OS3Exception {
+    CompleteMultipartUploadRequest.Part part = new 
CompleteMultipartUploadRequest.Part();
+
+    try (Response response = put(subject, bucket, key, partNumber, uploadID, 
content)) {
+      assertEquals(HttpStatus.SC_OK, response.getStatus());
+      String eTag = response.getHeaderString(OzoneConsts.ETAG);
+      assertNotNull(eTag);
+      part.setETag(eTag);
+    }
+
+    part.setPartNumber(partNumber);
+
+    return part;
+  }
+
+  /** Complete multipart upload. */
+  public static void completeMultipartUpload(
+      ObjectEndpoint subject,
+      String bucket,
+      String key,
+      String uploadID,
+      List<CompleteMultipartUploadRequest.Part> parts
+  ) throws IOException, OS3Exception {
+    CompleteMultipartUploadRequest completeMultipartUploadRequest = new 
CompleteMultipartUploadRequest();
+    completeMultipartUploadRequest.setPartList(parts);
+
+    try (Response response = subject.completeMultipartUpload(bucket, key, 
uploadID, completeMultipartUploadRequest)) {
+      assertEquals(HttpStatus.SC_OK, response.getStatus());
+
+      CompleteMultipartUploadResponse completeMultipartUploadResponse =
+          (CompleteMultipartUploadResponse) response.getEntity();
+
+      assertEquals(bucket, completeMultipartUploadResponse.getBucket());
+      assertEquals(key, completeMultipartUploadResponse.getKey());
+      assertEquals(bucket, completeMultipartUploadResponse.getLocation());
+      assertNotNull(completeMultipartUploadResponse.getETag());
+    }
+  }
+
   /** Verify response is success for {@code request}. */
   public static <E extends Exception> void 
assertSucceeds(CheckedSupplier<Response, E> request) throws E {
     try (Response response = request.get()) {
diff --git 
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestAbortMultipartUpload.java
 
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestAbortMultipartUpload.java
index 9c46a718508..518275c7026 100644
--- 
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestAbortMultipartUpload.java
+++ 
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestAbortMultipartUpload.java
@@ -17,9 +17,9 @@
 
 package org.apache.hadoop.ozone.s3.endpoint;
 
+import static 
org.apache.hadoop.ozone.s3.endpoint.EndpointTestUtils.initiateMultipartUpload;
 import static org.apache.hadoop.ozone.s3.util.S3Consts.STORAGE_CLASS_HEADER;
 import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
@@ -55,17 +55,10 @@ public void testAbortMultipartUpload() throws Exception {
         .build();
 
 
-    Response response = rest.initializeMultipartUpload(bucket, key);
-
-    assertEquals(200, response.getStatus());
-    MultipartUploadInitiateResponse multipartUploadInitiateResponse =
-        (MultipartUploadInitiateResponse) response.getEntity();
-    assertNotNull(multipartUploadInitiateResponse.getUploadID());
-    String uploadID = multipartUploadInitiateResponse.getUploadID();
-
+    String uploadID = initiateMultipartUpload(rest, bucket, key);
 
     // Abort multipart upload
-    response = rest.delete(bucket, key, uploadID, null);
+    Response response = rest.delete(bucket, key, uploadID, null);
 
     assertEquals(204, response.getStatus());
 
diff --git 
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestInitiateMultipartUpload.java
 
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestInitiateMultipartUpload.java
index 71113cec45a..a425c166af4 100644
--- 
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestInitiateMultipartUpload.java
+++ 
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestInitiateMultipartUpload.java
@@ -17,16 +17,14 @@
 
 package org.apache.hadoop.ozone.s3.endpoint;
 
+import static 
org.apache.hadoop.ozone.s3.endpoint.EndpointTestUtils.initiateMultipartUpload;
 import static org.apache.hadoop.ozone.s3.util.S3Consts.STORAGE_CLASS_HEADER;
-import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotEquals;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 import jakarta.annotation.Nonnull;
 import javax.ws.rs.core.HttpHeaders;
-import javax.ws.rs.core.Response;
 import org.apache.hadoop.hdds.client.ECReplicationConfig;
 import org.apache.hadoop.ozone.OzoneConsts;
 import org.apache.hadoop.ozone.client.OzoneClient;
@@ -52,21 +50,11 @@ public void testInitiateMultipartUpload() throws Exception {
 
     ObjectEndpoint rest = getObjectEndpoint(client, headers);
 
-    Response response = rest.initializeMultipartUpload(bucket, key);
-
-    assertEquals(200, response.getStatus());
-    MultipartUploadInitiateResponse multipartUploadInitiateResponse =
-        (MultipartUploadInitiateResponse) response.getEntity();
-    assertNotNull(multipartUploadInitiateResponse.getUploadID());
-    String uploadID = multipartUploadInitiateResponse.getUploadID();
+    String uploadID = initiateMultipartUpload(rest, bucket, key);
 
     // Calling again should return different uploadID.
-    response = rest.initializeMultipartUpload(bucket, key);
-    assertEquals(200, response.getStatus());
-    multipartUploadInitiateResponse =
-        (MultipartUploadInitiateResponse) response.getEntity();
-    assertNotNull(multipartUploadInitiateResponse.getUploadID());
-    assertNotEquals(multipartUploadInitiateResponse.getUploadID(), uploadID);
+    String nextID = initiateMultipartUpload(rest, bucket, key);
+    assertNotEquals(uploadID, nextID);
   }
 
   @Test
@@ -79,12 +67,7 @@ public void testInitiateMultipartUploadWithECKey() throws 
Exception {
     ObjectEndpoint rest = getObjectEndpoint(client, headers);
     client.getObjectStore().getS3Bucket(bucket)
         .setReplicationConfig(new ECReplicationConfig("rs-3-2-1024K"));
-    Response response = rest.initializeMultipartUpload(bucket, key);
-
-    assertEquals(200, response.getStatus());
-    MultipartUploadInitiateResponse multipartUploadInitiateResponse =
-        (MultipartUploadInitiateResponse) response.getEntity();
-    assertNotNull(multipartUploadInitiateResponse.getUploadID());
+    initiateMultipartUpload(rest, bucket, key);
   }
 
   @Nonnull
diff --git 
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestListParts.java
 
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestListParts.java
index 30be715b530..f42c5849aa2 100644
--- 
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestListParts.java
+++ 
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestListParts.java
@@ -17,17 +17,16 @@
 
 package org.apache.hadoop.ozone.s3.endpoint;
 
-import static java.nio.charset.StandardCharsets.UTF_8;
+import static 
org.apache.hadoop.ozone.s3.endpoint.EndpointTestUtils.initiateMultipartUpload;
+import static org.apache.hadoop.ozone.s3.endpoint.EndpointTestUtils.uploadPart;
 import static org.apache.hadoop.ozone.s3.util.S3Consts.STORAGE_CLASS_HEADER;
 import static org.apache.hadoop.ozone.s3.util.S3Consts.X_AMZ_CONTENT_SHA256;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
-import java.io.ByteArrayInputStream;
 import javax.ws.rs.core.HttpHeaders;
 import javax.ws.rs.core.Response;
 import org.apache.hadoop.ozone.OzoneConsts;
@@ -63,32 +62,11 @@ public void setUp() throws Exception {
         .setClient(client)
         .build();
 
-    Response response = rest.initializeMultipartUpload(OzoneConsts.S3_BUCKET,
-        OzoneConsts.KEY);
-    MultipartUploadInitiateResponse multipartUploadInitiateResponse =
-        (MultipartUploadInitiateResponse) response.getEntity();
-    assertNotNull(multipartUploadInitiateResponse.getUploadID());
-    uploadID = multipartUploadInitiateResponse.getUploadID();
+    uploadID = initiateMultipartUpload(rest, OzoneConsts.S3_BUCKET, 
OzoneConsts.KEY);
 
-    assertEquals(200, response.getStatus());
-
-    String content = "Multipart Upload";
-    ByteArrayInputStream body =
-        new ByteArrayInputStream(content.getBytes(UTF_8));
-    response = rest.put(OzoneConsts.S3_BUCKET, OzoneConsts.KEY,
-        content.length(), 1, uploadID, null, null, body);
-
-    assertNotNull(response.getHeaderString(OzoneConsts.ETAG));
-
-    response = rest.put(OzoneConsts.S3_BUCKET, OzoneConsts.KEY,
-        content.length(), 2, uploadID, null, null, body);
-
-    assertNotNull(response.getHeaderString(OzoneConsts.ETAG));
-
-    response = rest.put(OzoneConsts.S3_BUCKET, OzoneConsts.KEY,
-        content.length(), 3, uploadID, null, null, body);
-
-    assertNotNull(response.getHeaderString(OzoneConsts.ETAG));
+    for (int i = 1; i <= 3; i++) {
+      uploadPart(rest, OzoneConsts.S3_BUCKET, OzoneConsts.KEY, i, uploadID, 
"Multipart Upload");
+    }
   }
 
   @Test
diff --git 
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestMultipartUploadComplete.java
 
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestMultipartUploadComplete.java
index fde336f4807..53500bbd2e5 100644
--- 
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestMultipartUploadComplete.java
+++ 
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestMultipartUploadComplete.java
@@ -17,20 +17,19 @@
 
 package org.apache.hadoop.ozone.s3.endpoint;
 
-import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.Collections.singletonList;
+import static 
org.apache.hadoop.ozone.s3.endpoint.EndpointTestUtils.completeMultipartUpload;
+import static org.apache.hadoop.ozone.s3.endpoint.EndpointTestUtils.uploadPart;
 import static 
org.apache.hadoop.ozone.s3.util.S3Consts.CUSTOM_METADATA_HEADER_PREFIX;
 import static org.apache.hadoop.ozone.s3.util.S3Consts.STORAGE_CLASS_HEADER;
 import static org.apache.hadoop.ozone.s3.util.S3Consts.X_AMZ_CONTENT_SHA256;
 import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
-import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -76,7 +75,7 @@ public void setUp() throws Exception {
 
   private String initiateMultipartUpload(String key) throws IOException,
       OS3Exception {
-    return initiateMultipartUpload(key, Collections.emptyMap());
+    return EndpointTestUtils.initiateMultipartUpload(rest, 
OzoneConsts.S3_BUCKET, key);
   }
 
   private String initiateMultipartUpload(String key, Map<String, String> 
metadata) throws IOException,
@@ -90,82 +89,19 @@ private String initiateMultipartUpload(String key, 
Map<String, String> metadata)
 
     when(headers.getRequestHeaders()).thenReturn(metadataHeaders);
 
-    Response response = rest.initializeMultipartUpload(OzoneConsts.S3_BUCKET,
-        key);
-    MultipartUploadInitiateResponse multipartUploadInitiateResponse =
-        (MultipartUploadInitiateResponse) response.getEntity();
-    assertNotNull(multipartUploadInitiateResponse.getUploadID());
-    String uploadID = multipartUploadInitiateResponse.getUploadID();
-
-    assertEquals(200, response.getStatus());
-
-    return uploadID;
-  }
-
-  private Part uploadPart(String key, String uploadID, int partNumber, String
-      content) throws IOException, OS3Exception {
-    ByteArrayInputStream body =
-        new ByteArrayInputStream(content.getBytes(UTF_8));
-    Response response = rest.put(OzoneConsts.S3_BUCKET, key, content.length(),
-        partNumber, uploadID, null, null, body);
-    assertEquals(200, response.getStatus());
-    assertNotNull(response.getHeaderString(OzoneConsts.ETAG));
-    Part part = new Part();
-    part.setETag(response.getHeaderString(OzoneConsts.ETAG));
-    part.setPartNumber(partNumber);
-
-    return part;
-  }
-
-  private void completeMultipartUpload(String key,
-      CompleteMultipartUploadRequest completeMultipartUploadRequest,
-      String uploadID) throws IOException, OS3Exception {
-    Response response = rest.completeMultipartUpload(OzoneConsts.S3_BUCKET, 
key,
-        uploadID, completeMultipartUploadRequest);
-
-    assertEquals(200, response.getStatus());
-
-    CompleteMultipartUploadResponse completeMultipartUploadResponse =
-        (CompleteMultipartUploadResponse) response.getEntity();
-
-    assertEquals(OzoneConsts.S3_BUCKET,
-        completeMultipartUploadResponse.getBucket());
-    assertEquals(key, completeMultipartUploadResponse.getKey());
-    assertEquals(OzoneConsts.S3_BUCKET,
-        completeMultipartUploadResponse.getLocation());
-    assertNotNull(completeMultipartUploadResponse.getETag());
+    return EndpointTestUtils.initiateMultipartUpload(rest, 
OzoneConsts.S3_BUCKET, key);
   }
 
   @Test
   public void testMultipart() throws Exception {
-
-    // Initiate multipart upload
     String uploadID = initiateMultipartUpload(OzoneConsts.KEY);
 
-    List<Part> partsList = new ArrayList<>();
-
-
     // Upload parts
-    String content = "Multipart Upload 1";
-    int partNumber = 1;
-
-    Part part1 = uploadPart(OzoneConsts.KEY, uploadID, partNumber, content);
-    partsList.add(part1);
-
-    content = "Multipart Upload 2";
-    partNumber = 2;
-    Part part2 = uploadPart(OzoneConsts.KEY, uploadID, partNumber, content);
-    partsList.add(part2);
-
-    // complete multipart upload
-    CompleteMultipartUploadRequest completeMultipartUploadRequest = new
-        CompleteMultipartUploadRequest();
-    completeMultipartUploadRequest.setPartList(partsList);
-
-
-    completeMultipartUpload(OzoneConsts.KEY, completeMultipartUploadRequest,
-        uploadID);
+    List<Part> partsList = new ArrayList<>();
+    partsList.add(uploadPart(rest, OzoneConsts.S3_BUCKET, OzoneConsts.KEY, 1, 
uploadID, "Multipart Upload 1"));
+    partsList.add(uploadPart(rest, OzoneConsts.S3_BUCKET, OzoneConsts.KEY, 2, 
uploadID, "Multipart Upload 2"));
 
+    completeMultipartUpload(rest, OzoneConsts.S3_BUCKET, OzoneConsts.KEY, 
uploadID, partsList);
   }
 
   @Test
@@ -177,21 +113,8 @@ public void testMultipartWithCustomMetadata() throws 
Exception {
     customMetadata.put("custom-key2", "custom-value2");
 
     String uploadID = initiateMultipartUpload(key, customMetadata);
-
-    List<Part> partsList = new ArrayList<>();
-
-    // Upload parts
-    String content = "Multipart Upload 1";
-    int partNumber = 1;
-
-    Part part1 = uploadPart(key, uploadID, partNumber, content);
-    partsList.add(part1);
-
-    CompleteMultipartUploadRequest completeMultipartUploadRequest = new
-        CompleteMultipartUploadRequest();
-    completeMultipartUploadRequest.setPartList(partsList);
-
-    completeMultipartUpload(key, completeMultipartUploadRequest, uploadID);
+    Part part1 = uploadPart(rest, OzoneConsts.S3_BUCKET, key, 1, uploadID, 
"Multipart Upload 1");
+    completeMultipartUpload(rest, OzoneConsts.S3_BUCKET, key, uploadID, 
singletonList(part1));
 
     Response headResponse = rest.head(OzoneConsts.S3_BUCKET, key);
 
@@ -209,27 +132,17 @@ public void testMultipartInvalidPartOrderError() throws 
Exception {
     List<Part> partsList = new ArrayList<>();
 
     // Upload parts
-    String content = "Multipart Upload 1";
-    int partNumber = 1;
 
-    Part part1 = uploadPart(key, uploadID, partNumber, content);
+    Part part1 = uploadPart(rest, OzoneConsts.S3_BUCKET, key, 1, uploadID, 
"Multipart Upload 1");
     // Change part number
     part1.setPartNumber(3);
     partsList.add(part1);
 
-    content = "Multipart Upload 2";
-    partNumber = 2;
-
-    Part part2 = uploadPart(key, uploadID, partNumber, content);
-    partsList.add(part2);
+    partsList.add(uploadPart(rest, OzoneConsts.S3_BUCKET, key, 2, uploadID, 
"Multipart Upload 2"));
 
     // complete multipart upload
-    CompleteMultipartUploadRequest completeMultipartUploadRequest = new
-        CompleteMultipartUploadRequest();
-    completeMultipartUploadRequest.setPartList(partsList);
-    OS3Exception ex =
-        assertThrows(OS3Exception.class,
-            () -> completeMultipartUpload(key, completeMultipartUploadRequest, 
uploadID));
+    OS3Exception ex = assertThrows(OS3Exception.class,
+        () -> completeMultipartUpload(rest, OzoneConsts.S3_BUCKET, key, 
uploadID, partsList));
     assertEquals(S3ErrorTable.INVALID_PART_ORDER.getCode(), ex.getCode());
   }
 
@@ -243,27 +156,16 @@ public void testMultipartInvalidPartError() throws 
Exception {
     List<Part> partsList = new ArrayList<>();
 
     // Upload parts
-    String content = "Multipart Upload 1";
-    int partNumber = 1;
-
-    Part part1 = uploadPart(key, uploadID, partNumber, content);
+    Part part1 = uploadPart(rest, OzoneConsts.S3_BUCKET, key, 1, uploadID, 
"Multipart Upload 1");
     // Change part name.
     part1.setETag("random");
     partsList.add(part1);
 
-    content = "Multipart Upload 2";
-    partNumber = 2;
-
-    Part part2 = uploadPart(key, uploadID, partNumber, content);
-    partsList.add(part2);
+    partsList.add(uploadPart(rest, OzoneConsts.S3_BUCKET, key, 2, uploadID, 
"Multipart Upload 2"));
 
     // complete multipart upload
-    CompleteMultipartUploadRequest completeMultipartUploadRequest = new
-        CompleteMultipartUploadRequest();
-    completeMultipartUploadRequest.setPartList(partsList);
-    OS3Exception ex =
-        assertThrows(OS3Exception.class,
-            () -> completeMultipartUpload(key, completeMultipartUploadRequest, 
uploadID));
+    OS3Exception ex = assertThrows(OS3Exception.class,
+        () -> completeMultipartUpload(rest, OzoneConsts.S3_BUCKET, key, 
uploadID, partsList));
     assertEquals(ex.getCode(), S3ErrorTable.INVALID_PART.getCode());
   }
 }
diff --git 
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestMultipartUploadWithCopy.java
 
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestMultipartUploadWithCopy.java
index 702c32d1aba..8bb2cf3fa62 100644
--- 
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestMultipartUploadWithCopy.java
+++ 
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestMultipartUploadWithCopy.java
@@ -18,6 +18,11 @@
 package org.apache.hadoop.ozone.s3.endpoint;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
+import static 
org.apache.hadoop.ozone.s3.endpoint.EndpointTestUtils.assertSucceeds;
+import static 
org.apache.hadoop.ozone.s3.endpoint.EndpointTestUtils.completeMultipartUpload;
+import static 
org.apache.hadoop.ozone.s3.endpoint.EndpointTestUtils.initiateMultipartUpload;
+import static org.apache.hadoop.ozone.s3.endpoint.EndpointTestUtils.put;
+import static org.apache.hadoop.ozone.s3.endpoint.EndpointTestUtils.uploadPart;
 import static org.apache.hadoop.ozone.s3.util.S3Consts.COPY_SOURCE_HEADER;
 import static 
org.apache.hadoop.ozone.s3.util.S3Consts.COPY_SOURCE_HEADER_RANGE;
 import static 
org.apache.hadoop.ozone.s3.util.S3Consts.COPY_SOURCE_IF_MODIFIED_SINCE;
@@ -30,7 +35,6 @@
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
-import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
@@ -132,14 +136,15 @@ public static void setUp() throws Exception {
   @Test
   public void testMultipart() throws Exception {
     // Initiate multipart upload
-    String uploadID = initiateMultipartUpload(KEY);
+    String uploadID = initiateMultipartUpload(endpoint, OzoneConsts.S3_BUCKET, 
KEY);
 
     List<Part> partsList = new ArrayList<>();
 
     // Upload parts
     String content = "Multipart Upload 1";
 
-    Part part1 = uploadPart(KEY, uploadID, 1, content);
+    setHeaders();
+    Part part1 = uploadPart(endpoint, OzoneConsts.S3_BUCKET, KEY, 1, uploadID, 
content);
     partsList.add(part1);
 
     Part part2 =
@@ -160,13 +165,8 @@ public void testMultipart() throws Exception {
             );
     partsList.add(part4);
 
-    // complete multipart upload
-    CompleteMultipartUploadRequest completeMultipartUploadRequest = new
-        CompleteMultipartUploadRequest();
-    completeMultipartUploadRequest.setPartList(partsList);
-
-    completeMultipartUpload(KEY, completeMultipartUploadRequest,
-        uploadID);
+    setHeaders();
+    completeMultipartUpload(endpoint, OzoneConsts.S3_BUCKET, 
TestMultipartUploadWithCopy.KEY, uploadID, partsList);
 
     OzoneBucket bucket =
         client.getObjectStore().getS3Bucket(OzoneConsts.S3_BUCKET);
@@ -309,38 +309,6 @@ public void testMultipartTSHeaders() throws Exception {
     }
   }
 
-  private String initiateMultipartUpload(String key) throws IOException,
-      OS3Exception {
-    setHeaders();
-    Response response = 
endpoint.initializeMultipartUpload(OzoneConsts.S3_BUCKET,
-        key);
-    MultipartUploadInitiateResponse multipartUploadInitiateResponse =
-        (MultipartUploadInitiateResponse) response.getEntity();
-    assertNotNull(multipartUploadInitiateResponse.getUploadID());
-    String uploadID = multipartUploadInitiateResponse.getUploadID();
-
-    assertEquals(200, response.getStatus());
-
-    return uploadID;
-
-  }
-
-  private Part uploadPart(String key, String uploadID, int partNumber, String
-      content) throws IOException, OS3Exception {
-    setHeaders();
-    ByteArrayInputStream body =
-        new ByteArrayInputStream(content.getBytes(UTF_8));
-    Response response = endpoint.put(OzoneConsts.S3_BUCKET, key, 
content.length(),
-        partNumber, uploadID, null, null, body);
-    assertEquals(200, response.getStatus());
-    assertNotNull(response.getHeaderString(OzoneConsts.ETAG));
-    Part part = new Part();
-    part.setETag(response.getHeaderString(OzoneConsts.ETAG));
-    part.setPartNumber(partNumber);
-
-    return part;
-  }
-
   private Part uploadPartWithCopy(String key, String uploadID, int partNumber,
       String keyOrigin, String range) throws IOException, OS3Exception {
     return uploadPartWithCopy(key, uploadID, partNumber, keyOrigin,
@@ -350,7 +318,8 @@ private Part uploadPartWithCopy(String key, String 
uploadID, int partNumber,
   private Part uploadPartWithCopy(String ifModifiedSinceStr,
       String ifUnmodifiedSinceStr) throws IOException, OS3Exception {
     // Initiate multipart upload
-    String uploadID = initiateMultipartUpload(KEY);
+    setHeaders();
+    String uploadID = initiateMultipartUpload(endpoint, OzoneConsts.S3_BUCKET, 
KEY);
 
     return uploadPartWithCopy(KEY, uploadID, 1,
       OzoneConsts.S3_BUCKET + "/" + EXISTING_KEY, "bytes=0-3",
@@ -374,19 +343,18 @@ private Part uploadPartWithCopy(String key, String 
uploadID, int partNumber,
     }
     setHeaders(additionalHeaders);
 
-    ByteArrayInputStream body = new ByteArrayInputStream("".getBytes(UTF_8));
-    Response response = endpoint.put(OzoneConsts.S3_BUCKET, key, 0, partNumber,
-        uploadID, null, null, body);
-    assertEquals(200, response.getStatus());
+    try (Response response = put(endpoint, OzoneConsts.S3_BUCKET, key, 
partNumber, uploadID, "")) {
+      assertEquals(200, response.getStatus());
 
-    CopyPartResult result = (CopyPartResult) response.getEntity();
-    assertNotNull(result.getETag());
-    assertNotNull(result.getLastModified());
-    Part part = new Part();
-    part.setETag(result.getETag());
-    part.setPartNumber(partNumber);
+      CopyPartResult result = (CopyPartResult) response.getEntity();
+      assertNotNull(result.getETag());
+      assertNotNull(result.getLastModified());
+      Part part = new Part();
+      part.setETag(result.getETag());
+      part.setPartNumber(partNumber);
 
-    return part;
+      return part;
+    }
   }
 
   @Test
@@ -396,14 +364,13 @@ public void testUploadWithRangeCopyContentLength()
     // the Content-Length, the key Commit will compare the Content-Length with
     // the actual length of the data written.
 
-    String uploadID = initiateMultipartUpload(KEY);
-    ByteArrayInputStream body = new ByteArrayInputStream("".getBytes(UTF_8));
+    String uploadID = initiateMultipartUpload(endpoint, OzoneConsts.S3_BUCKET, 
KEY);
     Map<String, String> additionalHeaders = new HashMap<>();
     additionalHeaders.put(COPY_SOURCE_HEADER,
         OzoneConsts.S3_BUCKET + "/" + EXISTING_KEY);
     additionalHeaders.put(COPY_SOURCE_HEADER_RANGE, "bytes=0-3");
     setHeaders(additionalHeaders);
-    endpoint.put(OzoneConsts.S3_BUCKET, KEY, 0, 1, uploadID, null, null, body);
+    assertSucceeds(() -> put(endpoint, OzoneConsts.S3_BUCKET, KEY, 1, 
uploadID, ""));
     OzoneMultipartUploadPartListParts parts =
         client.getObjectStore().getS3Bucket(OzoneConsts.S3_BUCKET)
         .listParts(KEY, uploadID, 0, 100);
@@ -411,26 +378,6 @@ public void testUploadWithRangeCopyContentLength()
     assertEquals(4, parts.getPartInfoList().get(0).getSize());
   }
 
-  private void completeMultipartUpload(String key,
-      CompleteMultipartUploadRequest completeMultipartUploadRequest,
-      String uploadID) throws IOException, OS3Exception {
-    setHeaders();
-    Response response = 
endpoint.completeMultipartUpload(OzoneConsts.S3_BUCKET, key,
-        uploadID, completeMultipartUploadRequest);
-
-    assertEquals(200, response.getStatus());
-
-    CompleteMultipartUploadResponse completeMultipartUploadResponse =
-        (CompleteMultipartUploadResponse) response.getEntity();
-
-    assertEquals(OzoneConsts.S3_BUCKET,
-        completeMultipartUploadResponse.getBucket());
-    assertEquals(KEY, completeMultipartUploadResponse.getKey());
-    assertEquals(OzoneConsts.S3_BUCKET,
-        completeMultipartUploadResponse.getLocation());
-    assertNotNull(completeMultipartUploadResponse.getETag());
-  }
-
   private void setHeaders(Map<String, String> additionalHeaders) {
     HttpHeaders headers = mock(HttpHeaders.class);
     when(headers.getHeaderString(STORAGE_CLASS_HEADER)).thenReturn(
diff --git 
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestObjectGet.java
 
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestObjectGet.java
index 7c1352e59dd..ee2158d7334 100644
--- 
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestObjectGet.java
+++ 
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestObjectGet.java
@@ -17,8 +17,9 @@
 
 package org.apache.hadoop.ozone.s3.endpoint;
 
-import static java.nio.charset.StandardCharsets.UTF_8;
 import static 
org.apache.hadoop.ozone.s3.S3GatewayConfigKeys.OZONE_S3G_FSO_DIRECTORY_CREATION_ENABLED;
+import static 
org.apache.hadoop.ozone.s3.endpoint.EndpointTestUtils.assertSucceeds;
+import static org.apache.hadoop.ozone.s3.endpoint.EndpointTestUtils.put;
 import static org.apache.hadoop.ozone.s3.exception.S3ErrorTable.NO_SUCH_KEY;
 import static org.apache.hadoop.ozone.s3.util.S3Consts.RANGE_HEADER;
 import static org.apache.hadoop.ozone.s3.util.S3Consts.TAG_COUNT_HEADER;
@@ -31,18 +32,16 @@
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
-import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.time.format.DateTimeFormatter;
 import javax.ws.rs.core.HttpHeaders;
 import javax.ws.rs.core.MultivaluedMap;
 import javax.ws.rs.core.Response;
-import org.apache.commons.io.IOUtils;
 import org.apache.hadoop.hdds.conf.OzoneConfiguration;
 import org.apache.hadoop.ozone.client.OzoneBucket;
 import org.apache.hadoop.ozone.client.OzoneClient;
 import org.apache.hadoop.ozone.client.OzoneClientStub;
-import org.apache.hadoop.ozone.client.io.OzoneInputStream;
+import org.apache.hadoop.ozone.client.OzoneClientTestUtils;
 import org.apache.hadoop.ozone.s3.exception.OS3Exception;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -72,13 +71,14 @@ public class TestObjectGet {
 
   private HttpHeaders headers;
   private ObjectEndpoint rest;
-  private OzoneClient client;
+  private OzoneBucket bucket;
 
   @BeforeEach
   public void init() throws OS3Exception, IOException {
     //GIVEN
-    client = new OzoneClientStub();
+    OzoneClient client = new OzoneClientStub();
     client.getObjectStore().createS3Bucket(BUCKET_NAME);
+    bucket = client.getObjectStore().getS3Bucket(BUCKET_NAME);
 
     headers = mock(HttpHeaders.class);
     
when(headers.getHeaderString(X_AMZ_CONTENT_SHA256)).thenReturn("UNSIGNED-PAYLOAD");
@@ -88,13 +88,11 @@ public void init() throws OS3Exception, IOException {
         .setHeaders(headers)
         .build();
 
-    ByteArrayInputStream body = new 
ByteArrayInputStream(CONTENT.getBytes(UTF_8));
-    rest.put(BUCKET_NAME, KEY_NAME, CONTENT.length(),
-        1, null, null, null, body);
+    assertSucceeds(() -> put(rest, BUCKET_NAME, KEY_NAME, CONTENT));
+
     // Create a key with object tags
     
when(headers.getHeaderString(TAG_HEADER)).thenReturn("tag1=value1&tag2=value2");
-    rest.put(BUCKET_NAME, KEY_WITH_TAG, CONTENT.length(),
-        1, null, null, null, body);
+    assertSucceeds(() -> put(rest, BUCKET_NAME, KEY_WITH_TAG, CONTENT));
   }
 
   @Test
@@ -103,14 +101,8 @@ public void get() throws IOException, OS3Exception {
     Response response = rest.get(BUCKET_NAME, KEY_NAME, 0, null, 0, null, 
null);
 
     //THEN
-    OzoneInputStream ozoneInputStream =
-        client.getObjectStore().getS3Bucket(BUCKET_NAME)
-            .readKey(KEY_NAME);
-    String keyContent =
-        IOUtils.toString(ozoneInputStream, UTF_8);
-
-    assertEquals(CONTENT, keyContent);
-    assertEquals(String.valueOf(keyContent.length()),
+    OzoneClientTestUtils.assertKeyContent(bucket, KEY_NAME, CONTENT);
+    assertEquals(String.valueOf(CONTENT.length()),
         response.getHeaderString("Content-Length"));
 
     DateTimeFormatter.RFC_1123_DATE_TIME
@@ -125,14 +117,8 @@ public void getKeyWithTag() throws IOException, 
OS3Exception {
     Response response = rest.get(BUCKET_NAME, KEY_WITH_TAG, 0, null, 0, null, 
null);
 
     //THEN
-    OzoneInputStream ozoneInputStream =
-        client.getObjectStore().getS3Bucket(BUCKET_NAME)
-            .readKey(KEY_NAME);
-    String keyContent =
-        IOUtils.toString(ozoneInputStream, UTF_8);
-
-    assertEquals(CONTENT, keyContent);
-    assertEquals(String.valueOf(keyContent.length()),
+    OzoneClientTestUtils.assertKeyContent(bucket, KEY_WITH_TAG, CONTENT);
+    assertEquals(String.valueOf(CONTENT.length()),
         response.getHeaderString("Content-Length"));
 
     DateTimeFormatter.RFC_1123_DATE_TIME
@@ -251,7 +237,6 @@ public void 
testGetWhenKeyIsDirectoryAndDoesNotEndWithASlash()
     OzoneConfiguration config = new OzoneConfiguration();
     config.set(OZONE_S3G_FSO_DIRECTORY_CREATION_ENABLED, "true");
     rest.setOzoneConfiguration(config);
-    OzoneBucket bucket = client.getObjectStore().getS3Bucket(BUCKET_NAME);
     bucket.createDirectory(keyPath);
 
     // WHEN
diff --git 
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestPartUpload.java
 
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestPartUpload.java
index 2da2a42a05b..0ac2508565c 100644
--- 
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestPartUpload.java
+++ 
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestPartUpload.java
@@ -17,17 +17,19 @@
 
 package org.apache.hadoop.ozone.s3.endpoint;
 
-import static java.net.HttpURLConnection.HTTP_NOT_FOUND;
-import static java.nio.charset.StandardCharsets.UTF_8;
+import static 
org.apache.hadoop.ozone.s3.endpoint.EndpointTestUtils.assertErrorResponse;
+import static 
org.apache.hadoop.ozone.s3.endpoint.EndpointTestUtils.assertSucceeds;
+import static 
org.apache.hadoop.ozone.s3.endpoint.EndpointTestUtils.initiateMultipartUpload;
+import static org.apache.hadoop.ozone.s3.endpoint.EndpointTestUtils.put;
 import static 
org.apache.hadoop.ozone.s3.util.S3Consts.DECODED_CONTENT_LENGTH_HEADER;
 import static org.apache.hadoop.ozone.s3.util.S3Consts.STORAGE_CLASS_HEADER;
 import static org.apache.hadoop.ozone.s3.util.S3Consts.X_AMZ_CONTENT_SHA256;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.fail;
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.anyLong;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.mockStatic;
@@ -36,7 +38,6 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
@@ -45,211 +46,131 @@
 import javax.ws.rs.core.HttpHeaders;
 import javax.ws.rs.core.Response;
 import org.apache.commons.io.IOUtils;
+import org.apache.hadoop.hdds.conf.OzoneConfiguration;
+import org.apache.hadoop.ozone.OzoneConfigKeys;
 import org.apache.hadoop.ozone.OzoneConsts;
 import org.apache.hadoop.ozone.client.OzoneClient;
 import org.apache.hadoop.ozone.client.OzoneClientStub;
 import org.apache.hadoop.ozone.client.OzoneMultipartUploadPartListParts;
 import org.apache.hadoop.ozone.s3.exception.OS3Exception;
+import org.apache.hadoop.ozone.s3.exception.S3ErrorTable;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.Parameter;
+import org.junit.jupiter.params.ParameterizedClass;
+import org.junit.jupiter.params.provider.ValueSource;
 import org.mockito.MockedStatic;
 
 /**
  * This class tests Upload part request.
  */
+@ParameterizedClass
+@ValueSource(booleans = {false, true})
 public class TestPartUpload {
 
   private ObjectEndpoint rest;
   private OzoneClient client;
 
+  private HttpHeaders headers;
+
+  @Parameter
+  private boolean enableDataStream;
+
   @BeforeEach
   public void setUp() throws Exception {
-
     client = new OzoneClientStub();
     client.getObjectStore().createS3Bucket(OzoneConsts.S3_BUCKET);
 
-
-    HttpHeaders headers = mock(HttpHeaders.class);
+    headers = mock(HttpHeaders.class);
     when(headers.getHeaderString(STORAGE_CLASS_HEADER)).thenReturn(
         "STANDARD");
     when(headers.getHeaderString(X_AMZ_CONTENT_SHA256))
         .thenReturn("mockSignature");
 
-    rest = EndpointBuilder.newObjectEndpointBuilder()
+    OzoneConfiguration conf = new OzoneConfiguration();
+    conf.setBoolean(OzoneConfigKeys.HDDS_CONTAINER_RATIS_DATASTREAM_ENABLED, 
enableDataStream);
+
+    rest = spy(EndpointBuilder.newObjectEndpointBuilder()
         .setHeaders(headers)
         .setClient(client)
-        .build();
+        .setConfig(conf)
+        .build());
+    assertEquals(enableDataStream, rest.isDatastreamEnabled());
   }
 
   @Test
   public void testPartUpload() throws Exception {
-
-    Response response = rest.initializeMultipartUpload(OzoneConsts.S3_BUCKET,
-        OzoneConsts.KEY);
-    MultipartUploadInitiateResponse multipartUploadInitiateResponse =
-        (MultipartUploadInitiateResponse) response.getEntity();
-    assertNotNull(multipartUploadInitiateResponse.getUploadID());
-    String uploadID = multipartUploadInitiateResponse.getUploadID();
-
-    assertEquals(200, response.getStatus());
+    String uploadID = initiateMultipartUpload(rest, OzoneConsts.S3_BUCKET, 
OzoneConsts.KEY);
 
     String content = "Multipart Upload";
-    ByteArrayInputStream body =
-        new ByteArrayInputStream(content.getBytes(UTF_8));
-    response = rest.put(OzoneConsts.S3_BUCKET, OzoneConsts.KEY,
-        content.length(), 1, uploadID, null, null, body);
-
-    assertNotNull(response.getHeaderString(OzoneConsts.ETAG));
-
-  }
-
-  @Test
-  public void testPartUploadWithOverride() throws Exception {
-
-    Response response = rest.initializeMultipartUpload(OzoneConsts.S3_BUCKET,
-        OzoneConsts.KEY);
-    MultipartUploadInitiateResponse multipartUploadInitiateResponse =
-        (MultipartUploadInitiateResponse) response.getEntity();
-    assertNotNull(multipartUploadInitiateResponse.getUploadID());
-    String uploadID = multipartUploadInitiateResponse.getUploadID();
-
-    assertEquals(200, response.getStatus());
-
-    String content = "Multipart Upload";
-    ByteArrayInputStream body =
-        new ByteArrayInputStream(content.getBytes(UTF_8));
-    response = rest.put(OzoneConsts.S3_BUCKET, OzoneConsts.KEY,
-        content.length(), 1, uploadID, null, null, body);
-
-    assertNotNull(response.getHeaderString(OzoneConsts.ETAG));
-
-    String eTag = response.getHeaderString(OzoneConsts.ETAG);
+    String eTag;
+    try (Response response = put(rest, OzoneConsts.S3_BUCKET, OzoneConsts.KEY, 
1, uploadID, content)) {
+      eTag = response.getHeaderString(OzoneConsts.ETAG);
+      assertNotNull(eTag);
+    }
+    assertContentLength(uploadID, OzoneConsts.KEY, content.length());
 
     // Upload part again with same part Number, the ETag should be changed.
-    content = "Multipart Upload Changed";
-    response = rest.put(OzoneConsts.S3_BUCKET, OzoneConsts.KEY,
-        content.length(), 1, uploadID, null, null, body);
-    assertNotNull(response.getHeaderString(OzoneConsts.ETAG));
-    assertNotEquals(eTag, response.getHeaderString(OzoneConsts.ETAG));
-
+    String newContent = "Multipart Upload Changed";
+    try (Response response = put(rest, OzoneConsts.S3_BUCKET, OzoneConsts.KEY, 
1, uploadID, newContent)) {
+      String newETag = response.getHeaderString(OzoneConsts.ETAG);
+      assertNotNull(newETag);
+      assertNotEquals(eTag, newETag);
+    }
   }
 
   @Test
-  public void testPartUploadWithIncorrectUploadID() throws Exception {
-    OS3Exception ex = assertThrows(OS3Exception.class, () -> {
-      String content = "Multipart Upload With Incorrect uploadID";
-      ByteArrayInputStream body =
-          new ByteArrayInputStream(content.getBytes(UTF_8));
-      rest.put(OzoneConsts.S3_BUCKET, OzoneConsts.KEY, content.length(), 1,
-          "random", null, null, body);
-    });
-    assertEquals("NoSuchUpload", ex.getCode());
-    assertEquals(HTTP_NOT_FOUND, ex.getHttpCode());
+  public void testPartUploadWithIncorrectUploadID() {
+    assertErrorResponse(S3ErrorTable.NO_SUCH_UPLOAD,
+        () -> put(rest, OzoneConsts.S3_BUCKET, OzoneConsts.KEY, 1, "random", 
"any"));
   }
 
   @Test
   public void testPartUploadStreamContentLength()
       throws IOException, OS3Exception {
-    HttpHeaders headers = mock(HttpHeaders.class);
-    when(headers.getHeaderString(X_AMZ_CONTENT_SHA256))
-        .thenReturn("mockSignature");
-    ObjectEndpoint objectEndpoint = EndpointBuilder.newObjectEndpointBuilder()
-        .setHeaders(headers)
-        .setClient(client)
-        .build();
     String keyName = UUID.randomUUID().toString();
 
+    int contentLength = 15;
     String chunkedContent = "0a;chunk-signature=signature\r\n"
         + "1234567890\r\n"
         + "05;chunk-signature=signature\r\n"
         + "abcde\r\n";
-    when(headers.getHeaderString("x-amz-content-sha256"))
+    when(headers.getHeaderString(X_AMZ_CONTENT_SHA256))
         .thenReturn("STREAMING-AWS4-HMAC-SHA256-PAYLOAD");
     when(headers.getHeaderString(DECODED_CONTENT_LENGTH_HEADER))
-        .thenReturn("15");
+        .thenReturn(String.valueOf(contentLength));
 
-    Response response = objectEndpoint.initializeMultipartUpload(
-        OzoneConsts.S3_BUCKET, keyName);
-    MultipartUploadInitiateResponse multipartUploadInitiateResponse =
-        (MultipartUploadInitiateResponse) response.getEntity();
-    assertNotNull(multipartUploadInitiateResponse.getUploadID());
-    String uploadID = multipartUploadInitiateResponse.getUploadID();
-    long contentLength = chunkedContent.length();
+    String uploadID = initiateMultipartUpload(rest, OzoneConsts.S3_BUCKET, 
keyName);
 
-    objectEndpoint.put(OzoneConsts.S3_BUCKET, keyName, contentLength, 1,
-        uploadID, null, null, new 
ByteArrayInputStream(chunkedContent.getBytes(UTF_8)));
-    assertContentLength(uploadID, keyName, 15);
-  }
-
-  @Test
-  public void testPartUploadContentLength() throws IOException, OS3Exception {
-    // The contentLength specified when creating the Key should be the same as
-    // the Content-Length, the key Commit will compare the Content-Length with
-    // the actual length of the data written.
-
-    String keyName = UUID.randomUUID().toString();
-    Response response = rest.initializeMultipartUpload(OzoneConsts.S3_BUCKET,
-        keyName);
-    MultipartUploadInitiateResponse multipartUploadInitiateResponse =
-        (MultipartUploadInitiateResponse) response.getEntity();
-    assertNotNull(multipartUploadInitiateResponse.getUploadID());
-    String uploadID = multipartUploadInitiateResponse.getUploadID();
-    String content = "Multipart Upload";
-    long contentLength = content.length();
-
-    ByteArrayInputStream body =
-        new ByteArrayInputStream(content.getBytes(UTF_8));
-    rest.put(OzoneConsts.S3_BUCKET, keyName,
-        contentLength, 1, uploadID, null, null, body);
-    assertContentLength(uploadID, keyName, content.length());
+    assertSucceeds(() -> put(rest, OzoneConsts.S3_BUCKET, keyName, 1, 
uploadID, chunkedContent));
+    assertContentLength(uploadID, keyName, contentLength);
   }
 
   @Test
   public void testPartUploadMessageDigestResetDuringException() throws 
IOException, OS3Exception {
-    OzoneClient clientStub = new OzoneClientStub();
-    clientStub.getObjectStore().createS3Bucket(OzoneConsts.S3_BUCKET);
-
-
-    HttpHeaders headers = mock(HttpHeaders.class);
-    when(headers.getHeaderString(X_AMZ_CONTENT_SHA256))
-        .thenReturn("mockSignature");
-    when(headers.getHeaderString(STORAGE_CLASS_HEADER)).thenReturn(
-        "STANDARD");
-
-    ObjectEndpoint objectEndpoint = EndpointBuilder.newObjectEndpointBuilder()
-        .setHeaders(headers)
-        .setClient(clientStub)
-        .build();
-
-    objectEndpoint = spy(objectEndpoint);
-
-    Response response = 
objectEndpoint.initializeMultipartUpload(OzoneConsts.S3_BUCKET,
-        OzoneConsts.KEY);
-    MultipartUploadInitiateResponse multipartUploadInitiateResponse =
-        (MultipartUploadInitiateResponse) response.getEntity();
-    assertNotNull(multipartUploadInitiateResponse.getUploadID());
-    String uploadID = multipartUploadInitiateResponse.getUploadID();
-
-    assertEquals(200, response.getStatus());
+    String uploadID = initiateMultipartUpload(rest, OzoneConsts.S3_BUCKET, 
OzoneConsts.KEY);
 
     MessageDigest messageDigest = mock(MessageDigest.class);
     when(messageDigest.getAlgorithm()).thenReturn("MD5");
     MessageDigest sha256Digest = mock(MessageDigest.class);
     when(sha256Digest.getAlgorithm()).thenReturn("SHA-256");
-    try (MockedStatic<IOUtils> mocked = mockStatic(IOUtils.class)) {
-      // Add the mocked methods only during the copy request
-      
when(objectEndpoint.getMessageDigestInstance()).thenReturn(messageDigest);
-      when(objectEndpoint.getSha256DigestInstance()).thenReturn(sha256Digest);
-      mocked.when(() -> IOUtils.copyLarge(any(InputStream.class), 
any(OutputStream.class), anyLong(),
-              anyLong(), any(byte[].class)))
-          .thenThrow(IOException.class);
+    try (MockedStatic<IOUtils> ioutils = mockStatic(IOUtils.class);
+        MockedStatic<ObjectEndpointStreaming> streaming = 
mockStatic(ObjectEndpointStreaming.class)) {
+      // Add the mocked methods only during part upload
+      when(rest.getMessageDigestInstance()).thenReturn(messageDigest);
+      when(rest.getSha256DigestInstance()).thenReturn(sha256Digest);
+      if (enableDataStream) {
+        streaming.when(() -> ObjectEndpointStreaming.createMultipartKey(any(), 
any(), anyLong(), anyInt(), any(),
+                anyInt(), any(), any()))
+            .thenThrow(IOException.class);
+      } else {
+        ioutils.when(() -> IOUtils.copyLarge(any(InputStream.class), 
any(OutputStream.class), anyLong(),
+                anyLong(), any(byte[].class)))
+            .thenThrow(IOException.class);
+      }
 
       String content = "Multipart Upload";
-      ByteArrayInputStream body =
-          new ByteArrayInputStream(content.getBytes(UTF_8));
-      try {
-        objectEndpoint.put(OzoneConsts.S3_BUCKET, OzoneConsts.KEY,
-            content.length(), 1, uploadID, null, null, body);
+      try (Response ignored = put(rest, OzoneConsts.S3_BUCKET, 
OzoneConsts.KEY, 1, uploadID, content)) {
         fail("Should throw IOException");
       } catch (IOException ignored) {
         // Verify that the message digest is reset so that the instance can be 
reused for the
diff --git 
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestPartUploadWithStream.java
 
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestPartUploadWithStream.java
deleted file mode 100644
index 736660073d5..00000000000
--- 
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestPartUploadWithStream.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * 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.hadoop.ozone.s3.endpoint;
-
-import static java.net.HttpURLConnection.HTTP_NOT_FOUND;
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static org.apache.hadoop.ozone.s3.util.S3Consts.STORAGE_CLASS_HEADER;
-import static org.apache.hadoop.ozone.s3.util.S3Consts.X_AMZ_CONTENT_SHA256;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNotEquals;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-import java.io.ByteArrayInputStream;
-import javax.ws.rs.core.HttpHeaders;
-import javax.ws.rs.core.Response;
-import org.apache.hadoop.hdds.conf.OzoneConfiguration;
-import org.apache.hadoop.ozone.OzoneConfigKeys;
-import org.apache.hadoop.ozone.OzoneConsts;
-import org.apache.hadoop.ozone.client.OzoneClient;
-import org.apache.hadoop.ozone.client.OzoneClientStub;
-import org.apache.hadoop.ozone.s3.exception.OS3Exception;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-
-/**
- * This class tests Upload part request.
- */
-public class TestPartUploadWithStream {
-
-  private ObjectEndpoint rest;
-
-  private static final String S3BUCKET = "streampartb1";
-  private static final String S3KEY = "testkey";
-
-  @BeforeEach
-  public void setUp() throws Exception {
-    OzoneClient client = new OzoneClientStub();
-    client.getObjectStore().createS3Bucket(S3BUCKET);
-
-
-    HttpHeaders headers = mock(HttpHeaders.class);
-    when(headers.getHeaderString(STORAGE_CLASS_HEADER)).thenReturn("STANDARD");
-    when(headers.getHeaderString(X_AMZ_CONTENT_SHA256))
-        .thenReturn("mockSignature");
-
-
-    OzoneConfiguration conf = new OzoneConfiguration();
-    conf.setBoolean(OzoneConfigKeys.HDDS_CONTAINER_RATIS_DATASTREAM_ENABLED,
-        true);
-
-    rest = EndpointBuilder.newObjectEndpointBuilder()
-        .setHeaders(headers)
-        .setClient(client)
-        .setConfig(conf)
-        .build();
-  }
-
-  @Test
-  public void testEnableStream() {
-    assertTrue(rest.isDatastreamEnabled());
-  }
-
-  @Test
-  public void testPartUpload() throws Exception {
-
-    Response response = rest.initializeMultipartUpload(S3BUCKET, S3KEY);
-    MultipartUploadInitiateResponse multipartUploadInitiateResponse =
-        (MultipartUploadInitiateResponse) response.getEntity();
-    assertNotNull(multipartUploadInitiateResponse.getUploadID());
-    String uploadID = multipartUploadInitiateResponse.getUploadID();
-
-    assertEquals(200, response.getStatus());
-
-    String content = "Multipart Upload";
-    ByteArrayInputStream body =
-        new ByteArrayInputStream(content.getBytes(UTF_8));
-    response = rest.put(S3BUCKET, S3KEY,
-        content.length(), 1, uploadID, null, null, body);
-
-    assertNotNull(response.getHeaderString(OzoneConsts.ETAG));
-
-  }
-
-  @Test
-  public void testPartUploadWithOverride() throws Exception {
-
-    Response response = rest.initializeMultipartUpload(S3BUCKET, S3KEY);
-    MultipartUploadInitiateResponse multipartUploadInitiateResponse =
-        (MultipartUploadInitiateResponse) response.getEntity();
-    assertNotNull(multipartUploadInitiateResponse.getUploadID());
-    String uploadID = multipartUploadInitiateResponse.getUploadID();
-
-    assertEquals(200, response.getStatus());
-
-    String content = "Multipart Upload";
-    ByteArrayInputStream body =
-        new ByteArrayInputStream(content.getBytes(UTF_8));
-    response = rest.put(S3BUCKET, S3KEY,
-        content.length(), 1, uploadID, null, null, body);
-
-    assertNotNull(response.getHeaderString(OzoneConsts.ETAG));
-
-    String eTag = response.getHeaderString(OzoneConsts.ETAG);
-
-    // Upload part again with same part Number, the ETag should be changed.
-    content = "Multipart Upload Changed";
-    response = rest.put(S3BUCKET, S3KEY,
-        content.length(), 1, uploadID, null, null, body);
-    assertNotNull(response.getHeaderString(OzoneConsts.ETAG));
-    assertNotEquals(eTag, response.getHeaderString(OzoneConsts.ETAG));
-
-  }
-
-  @Test
-  public void testPartUploadWithIncorrectUploadID() throws Exception {
-    OS3Exception ex = assertThrows(OS3Exception.class, () -> {
-      String content = "Multipart Upload With Incorrect uploadID";
-      ByteArrayInputStream body =
-          new ByteArrayInputStream(content.getBytes(UTF_8));
-      rest.put(S3BUCKET, S3KEY, content.length(), 1,
-          "random", null, null, body);
-    });
-    assertEquals("NoSuchUpload", ex.getCode());
-    assertEquals(HTTP_NOT_FOUND, ex.getHttpCode());
-  }
-}
diff --git 
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestUploadWithStream.java
 
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestUploadWithStream.java
index e9d70f67982..66d4a4cbef6 100644
--- 
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestUploadWithStream.java
+++ 
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestUploadWithStream.java
@@ -19,6 +19,8 @@
 
 import static java.nio.charset.StandardCharsets.UTF_8;
 import static 
org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_FS_DATASTREAM_AUTO_THRESHOLD;
+import static 
org.apache.hadoop.ozone.s3.endpoint.EndpointTestUtils.assertSucceeds;
+import static org.apache.hadoop.ozone.s3.endpoint.EndpointTestUtils.put;
 import static org.apache.hadoop.ozone.s3.util.S3Consts.COPY_SOURCE_HEADER;
 import static org.apache.hadoop.ozone.s3.util.S3Consts.STORAGE_CLASS_HEADER;
 import static org.apache.hadoop.ozone.s3.util.S3Consts.X_AMZ_CONTENT_SHA256;
@@ -27,12 +29,10 @@
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
-import java.io.ByteArrayInputStream;
 import java.io.OutputStream;
 import java.util.HashMap;
 import java.util.Map;
 import javax.ws.rs.core.HttpHeaders;
-import javax.ws.rs.core.Response;
 import org.apache.hadoop.hdds.client.ReplicationConfig;
 import org.apache.hadoop.hdds.client.ReplicationFactor;
 import org.apache.hadoop.hdds.client.ReplicationType;
@@ -89,12 +89,7 @@ public void testEnableStream() {
 
   @Test
   public void testUpload() throws Exception {
-    byte[] keyContent = S3_COPY_EXISTING_KEY_CONTENT.getBytes(UTF_8);
-    ByteArrayInputStream body =
-        new ByteArrayInputStream(keyContent);
-    Response response = rest.put(S3BUCKET, S3KEY, 0, 0, null, null, null, 
body);
-
-    assertEquals(200, response.getStatus());
+    assertSucceeds(() -> put(rest, S3BUCKET, S3KEY, 
S3_COPY_EXISTING_KEY_CONTENT));
   }
 
   @Test
@@ -126,9 +121,7 @@ public void testUploadWithCopy() throws Exception {
         .forEach((k, v) -> when(headers.getHeaderString(k)).thenReturn(v));
     rest.setHeaders(headers);
 
-    Response response = rest.put(S3BUCKET, S3KEY, 0, 0, null, null, null, 
null);
-
-    assertEquals(200, response.getStatus());
+    assertSucceeds(() -> put(rest, S3BUCKET, S3KEY, null));
 
     final long newDataSize = bucket.getKey(S3KEY).getDataSize();
     assertEquals(dataSize, newDataSize);
diff --git 
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/metrics/TestS3GatewayMetrics.java
 
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/metrics/TestS3GatewayMetrics.java
index 8aa4ba707ef..d01acbe708b 100644
--- 
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/metrics/TestS3GatewayMetrics.java
+++ 
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/metrics/TestS3GatewayMetrics.java
@@ -51,7 +51,7 @@
 import org.apache.hadoop.ozone.s3.endpoint.BucketEndpoint;
 import org.apache.hadoop.ozone.s3.endpoint.CompleteMultipartUploadRequest;
 import org.apache.hadoop.ozone.s3.endpoint.EndpointBuilder;
-import org.apache.hadoop.ozone.s3.endpoint.MultipartUploadInitiateResponse;
+import org.apache.hadoop.ozone.s3.endpoint.EndpointTestUtils;
 import org.apache.hadoop.ozone.s3.endpoint.ObjectEndpoint;
 import org.apache.hadoop.ozone.s3.endpoint.RootEndpoint;
 import org.apache.hadoop.ozone.s3.endpoint.TestBucketAcl;
@@ -357,7 +357,7 @@ public void testGetKeyFailure() {
   public void testInitMultiPartUploadSuccess() throws Exception {
 
     long oriMetric = metrics.getInitMultiPartUploadSuccess();
-    keyEndpoint.initializeMultipartUpload(bucketName, keyName);
+    EndpointTestUtils.initiateMultipartUpload(keyEndpoint, bucketName, 
keyName);
     long curMetric = metrics.getInitMultiPartUploadSuccess();
     assertEquals(1L, curMetric - oriMetric);
   }
@@ -560,20 +560,8 @@ public void testDeleteObjectTaggingFailure() {
     assertEquals(1L, curMetric - oriMetric);
   }
 
-  private String initiateMultipartUpload(String bktName, String key)
-      throws IOException,
-      OS3Exception {
-    // Initiate the Upload
-    Response response =
-        keyEndpoint.initializeMultipartUpload(bktName, key);
-    MultipartUploadInitiateResponse multipartUploadInitiateResponse =
-        (MultipartUploadInitiateResponse) response.getEntity();
-    if (response.getStatus() == 200) {
-      // Fetch the Upload-Id
-      String uploadID = multipartUploadInitiateResponse.getUploadID();
-      return uploadID;
-    }
-    return "Invalid-Id";
+  private String initiateMultipartUpload(String bktName, String key) throws 
IOException, OS3Exception {
+    return EndpointTestUtils.initiateMultipartUpload(keyEndpoint, bktName, 
key);
   }
 
   private static String getPutTaggingBody() {


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to