From e0cd719083fdd4ebc559418cf6eaf5976b5b7955 Mon Sep 17 00:00:00 2001 From: Shreyas Sinha Date: Wed, 22 Oct 2025 19:03:03 +0000 Subject: [PATCH 1/6] feat: Adding API for AbortMultipartUpload. --- .../model/AbortMultipartUploadRequest.java | 122 ++++++++++++++++++ .../model/AbortMultipartUploadResponse.java | 12 ++ 2 files changed, 134 insertions(+) create mode 100644 google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/AbortMultipartUploadRequest.java create mode 100644 google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/AbortMultipartUploadResponse.java diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/AbortMultipartUploadRequest.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/AbortMultipartUploadRequest.java new file mode 100644 index 000000000..e6fabedee --- /dev/null +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/AbortMultipartUploadRequest.java @@ -0,0 +1,122 @@ +/* + * Copyright 2025 Google LLC + * + * Licensed 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 com.google.cloud.storage.multipartupload.model; + +import com.google.api.core.BetaApi; + +/** + * Represents a request to abort a multipart upload. This request is used to stop an in-progress + * multipart upload, deleting any previously uploaded parts. + */ +@BetaApi +public final class AbortMultipartUploadRequest { + private final String bucket; + private final String key; + private final String uploadId; + + private AbortMultipartUploadRequest(Builder builder) { + this.bucket = builder.bucket; + this.key = builder.key; + this.uploadId = builder.uploadId; + } + + /** + * Returns the name of the bucket in which the multipart upload is stored. + * + * @return The bucket name. + */ + public String bucket() { + return bucket; + } + + /** + * Returns the name of the object that is being uploaded. + * + * @return The object name. + */ + public String key() { + return key; + } + + /** + * Returns the upload ID of the multipart upload to abort. + * + * @return The upload ID. + */ + public String uploadId() { + return uploadId; + } + + /** + * Returns a new builder for creating {@link AbortMultipartUploadRequest} instances. + * + * @return A new {@link Builder}. + */ + public static Builder builder() { + return new Builder(); + } + + /** A builder for creating {@link AbortMultipartUploadRequest} instances. */ + public static class Builder { + private String bucket; + private String key; + private String uploadId; + + private Builder() {} + + /** + * Sets the name of the bucket in which the multipart upload is stored. + * + * @param bucket The bucket name. + * @return This builder. + */ + public Builder bucket(String bucket) { + this.bucket = bucket; + return this; + } + + /** + * Sets the name of the object that is being uploaded. + * + * @param key The object name. + * @return This builder. + */ + public Builder key(String key) { + this.key = key; + return this; + } + + /** + * Sets the upload ID of the multipart upload to abort. + * + * @param uploadId The upload ID. + * @return This builder. + */ + public Builder uploadId(String uploadId) { + this.uploadId = uploadId; + return this; + } + + /** + * Builds a new {@link AbortMultipartUploadRequest} instance. + * + * @return A new {@link AbortMultipartUploadRequest}. + */ + public AbortMultipartUploadRequest build() { + return new AbortMultipartUploadRequest(this); + } + } +} diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/AbortMultipartUploadResponse.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/AbortMultipartUploadResponse.java new file mode 100644 index 000000000..fef1a57c8 --- /dev/null +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/AbortMultipartUploadResponse.java @@ -0,0 +1,12 @@ +package com.google.cloud.storage.multipartupload.model; + +import com.google.api.core.BetaApi; + +/** + * Represents a response to an abort multipart upload request. This class is currently empty as the + * abort operation does not return any specific data in its response body. + */ +@BetaApi +public final class AbortMultipartUploadResponse { + +} From a8e1aedc5bc018f9d5020afae7d3ed02cf40b5ee Mon Sep 17 00:00:00 2001 From: Shreyas Sinha Date: Wed, 22 Oct 2025 19:57:20 +0000 Subject: [PATCH 2/6] chore: adding implementation for Abort --- .../cloud/storage/MultipartUploadClient.java | 16 +++++ .../storage/MultipartUploadClientImpl.java | 15 +++++ .../MultipartUploadHttpRequestManager.java | 26 +++++++- .../model/AbortMultipartUploadResponse.java | 15 +++++ ...MultipartUploadHttpRequestManagerTest.java | 66 ++++++++++++++++++- 5 files changed, 135 insertions(+), 3 deletions(-) diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/MultipartUploadClient.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/MultipartUploadClient.java index fdd53b8f8..3ca2a642b 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/MultipartUploadClient.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/MultipartUploadClient.java @@ -18,12 +18,15 @@ import com.google.api.core.BetaApi; import com.google.api.core.InternalExtensionOnly; +import com.google.cloud.storage.multipartupload.model.AbortMultipartUploadRequest; +import com.google.cloud.storage.multipartupload.model.AbortMultipartUploadResponse; import com.google.cloud.storage.multipartupload.model.CreateMultipartUploadRequest; import com.google.cloud.storage.multipartupload.model.CreateMultipartUploadResponse; import com.google.cloud.storage.multipartupload.model.ListPartsRequest; import com.google.cloud.storage.multipartupload.model.ListPartsResponse; import java.io.IOException; import java.net.URI; +import java.security.NoSuchAlgorithmException; /** * A client for interacting with Google Cloud Storage's Multipart Upload API. @@ -60,6 +63,19 @@ public abstract CreateMultipartUploadResponse createMultipartUpload( @BetaApi public abstract ListPartsResponse listParts(ListPartsRequest listPartsRequest) throws IOException; + /** + * Aborts a multipart upload. + * + * @param request The request object containing the details for aborting the multipart upload. + * @return An {@link AbortMultipartUploadResponse} object. + * @throws IOException if an I/O error occurs. + * @throws NoSuchAlgorithmException if the specified algorithm is not available. + */ + @BetaApi + public abstract AbortMultipartUploadResponse abortMultipartUpload( + AbortMultipartUploadRequest request) + throws IOException, NoSuchAlgorithmException; + /** * Creates a new instance of {@link MultipartUploadClient}. * diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/MultipartUploadClientImpl.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/MultipartUploadClientImpl.java index 9c52aa441..c62c9723d 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/MultipartUploadClientImpl.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/MultipartUploadClientImpl.java @@ -20,12 +20,15 @@ import com.google.api.core.BetaApi; import com.google.cloud.storage.Conversions.Decoder; import com.google.cloud.storage.Retrying.Retrier; +import com.google.cloud.storage.multipartupload.model.AbortMultipartUploadRequest; +import com.google.cloud.storage.multipartupload.model.AbortMultipartUploadResponse; import com.google.cloud.storage.multipartupload.model.CreateMultipartUploadRequest; import com.google.cloud.storage.multipartupload.model.CreateMultipartUploadResponse; import com.google.cloud.storage.multipartupload.model.ListPartsRequest; import com.google.cloud.storage.multipartupload.model.ListPartsResponse; import java.io.IOException; import java.net.URI; +import java.security.NoSuchAlgorithmException; /** * This class is an implementation of {@link MultipartUploadClient} that uses the Google Cloud @@ -64,4 +67,16 @@ public ListPartsResponse listParts(ListPartsRequest request) throws IOException () -> httpRequestManager.sendListPartsRequest(uri, request, options), Decoder.identity()); } + + @Override + @BetaApi + public AbortMultipartUploadResponse abortMultipartUpload(AbortMultipartUploadRequest request) + throws IOException, NoSuchAlgorithmException { + + return retrier.run( + Retrying.alwaysRetry(), + () -> httpRequestManager.sendAbortMultipartUploadRequest( + uri, request, options), + Decoder.identity()); + } } diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/MultipartUploadHttpRequestManager.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/MultipartUploadHttpRequestManager.java index ec382add6..3887153e5 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/MultipartUploadHttpRequestManager.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/MultipartUploadHttpRequestManager.java @@ -20,6 +20,8 @@ import com.google.api.client.http.HttpRequest; import com.google.api.client.http.HttpRequestFactory; import com.google.api.client.util.ObjectParser; +import com.google.cloud.storage.multipartupload.model.AbortMultipartUploadRequest; +import com.google.cloud.storage.multipartupload.model.AbortMultipartUploadResponse; import com.google.cloud.storage.multipartupload.model.CreateMultipartUploadRequest; import com.google.cloud.storage.multipartupload.model.CreateMultipartUploadResponse; import com.google.cloud.storage.multipartupload.model.ListPartsRequest; @@ -66,7 +68,7 @@ CreateMultipartUploadResponse sendCreateMultipartUploadRequest( return httpRequest.execute().parseAs(CreateMultipartUploadResponse.class); } - public ListPartsResponse sendListPartsRequest( + ListPartsResponse sendListPartsRequest( URI uri, ListPartsRequest request, HttpStorageOptions options) throws IOException { String encodedBucket = encode(request.bucket()); @@ -91,6 +93,28 @@ public ListPartsResponse sendListPartsRequest( return httpRequest.execute().parseAs(ListPartsResponse.class); } + AbortMultipartUploadResponse sendAbortMultipartUploadRequest( + URI uri, AbortMultipartUploadRequest request, HttpStorageOptions options) + throws IOException { + + String encodedBucket = encode(request.bucket()); + String encodedKey = encode(request.key()); + String resourcePath = "/" + encodedBucket + "/" + encodedKey; + String queryString = "?uploadId=" + encode(request.uploadId()); + String abortUri = uri.toString() + resourcePath + queryString; + String contentType = "application/x-www-form-urlencoded"; + Map extensionHeaders = getGenericExtensionHeader(options); + + HttpRequest httpRequest = requestFactory.buildDeleteRequest(new GenericUrl(abortUri)); + httpRequest.getHeaders().setContentType(contentType); + for (Map.Entry entry : extensionHeaders.entrySet()) { + httpRequest.getHeaders().set(entry.getKey(), entry.getValue()); + } + httpRequest.setParser(objectParser); + httpRequest.setThrowExceptionOnExecuteError(true); + return httpRequest.execute().parseAs(AbortMultipartUploadResponse.class); + } + private Map getExtensionHeadersForCreateMultipartUpload( CreateMultipartUploadRequest request, HttpStorageOptions options) { Map extensionHeaders = getGenericExtensionHeader(options); diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/AbortMultipartUploadResponse.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/AbortMultipartUploadResponse.java index fef1a57c8..e2b1c7f94 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/AbortMultipartUploadResponse.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/AbortMultipartUploadResponse.java @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Google LLC + * + * Licensed 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 com.google.cloud.storage.multipartupload.model; import com.google.api.core.BetaApi; diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITMultipartUploadHttpRequestManagerTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITMultipartUploadHttpRequestManagerTest.java index 7d389ba60..cbb26d90d 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITMultipartUploadHttpRequestManagerTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITMultipartUploadHttpRequestManagerTest.java @@ -29,6 +29,8 @@ import com.google.cloud.storage.it.runner.annotations.Backend; import com.google.cloud.storage.it.runner.annotations.ParallelFriendly; import com.google.cloud.storage.it.runner.annotations.SingleBackend; +import com.google.cloud.storage.multipartupload.model.AbortMultipartUploadRequest; +import com.google.cloud.storage.multipartupload.model.AbortMultipartUploadResponse; import com.google.cloud.storage.multipartupload.model.CreateMultipartUploadRequest; import com.google.cloud.storage.multipartupload.model.CreateMultipartUploadResponse; import com.google.cloud.storage.multipartupload.model.ListPartsRequest; @@ -392,7 +394,7 @@ public void sendListPartsRequest_success() throws Exception { + " false\n" + " \n" + " 1\n" - + " \"etag\"\n" + + " etag\n" + " 123\n" + " 2024-05-08T17:50:00.000Z\n" + " \n" @@ -431,7 +433,7 @@ public void sendListPartsRequest_success() throws Exception { assertThat(response.getParts()).hasSize(1); Part part = response.getParts().get(0); assertThat(part.partNumber()).isEqualTo(1); - assertThat(part.eTag()).isEqualTo("\"etag\""); + assertThat(part.eTag()).isEqualTo("etag"); assertThat(part.size()).isEqualTo(123); assertThat(part.lastModified()).isEqualTo("2024-05-08T17:50:00.000Z"); } @@ -465,4 +467,64 @@ public void sendListPartsRequest_error() throws Exception { assertThat(se.getCode()).isEqualTo(400); } } + + @Test + public void sendAbortMultipartUploadRequest_success() throws Exception { + HttpRequestHandler handler = + req -> { + assertThat(req.uri()).contains("?uploadId=test-upload-id"); + AbortMultipartUploadResponse response = new AbortMultipartUploadResponse(); + ByteBuf buf = Unpooled.wrappedBuffer(gson.toByteArray(response)); + + DefaultFullHttpResponse resp = + new DefaultFullHttpResponse(req.protocolVersion(), OK, buf); + resp.headers().set(CONTENT_TYPE, "application/xml; charset=utf-8"); + return resp; + }; + + try (FakeHttpServer fakeHttpServer = FakeHttpServer.of(handler)) { + URI endpoint = fakeHttpServer.getEndpoint(); + AbortMultipartUploadRequest request = + AbortMultipartUploadRequest.builder() + .bucket("test-bucket") + .key("test-key") + .uploadId("test-upload-id") + .build(); + + AbortMultipartUploadResponse response = + multipartUploadHttpRequestManager.sendAbortMultipartUploadRequest( + endpoint, request, httpStorageOptions); + + assertThat(response).isNotNull(); + } + } + + @Test + public void sendAbortMultipartUploadRequest_error() throws Exception { + HttpRequestHandler handler = + req -> { + FullHttpResponse resp = + new DefaultFullHttpResponse(req.protocolVersion(), HttpResponseStatus.BAD_REQUEST); + resp.headers().set(CONTENT_TYPE, "text/plain; charset=utf-8"); + return resp; + }; + + try (FakeHttpServer fakeHttpServer = FakeHttpServer.of(handler)) { + URI endpoint = fakeHttpServer.getEndpoint(); + AbortMultipartUploadRequest request = + AbortMultipartUploadRequest.builder() + .bucket("test-bucket") + .key("test-key") + .uploadId("test-upload-id") + .build(); + + StorageException se = + assertThrows( + StorageException.class, + () -> + multipartUploadHttpRequestManager.sendAbortMultipartUploadRequest( + endpoint, request, httpStorageOptions)); + assertThat(se.getCode()).isEqualTo(400); + } + } } From 18cd58aafb452632f2633d151eb3fa8f6fc772ae Mon Sep 17 00:00:00 2001 From: Shreyas Sinha Date: Wed, 22 Oct 2025 20:18:48 +0000 Subject: [PATCH 3/6] chore: fixing lint error. --- .../cloud/storage/MultipartUploadClient.java | 3 +-- .../storage/MultipartUploadClientImpl.java | 3 +-- .../MultipartUploadHttpRequestManager.java | 27 +++++++++---------- .../model/AbortMultipartUploadResponse.java | 4 +-- 4 files changed, 16 insertions(+), 21 deletions(-) diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/MultipartUploadClient.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/MultipartUploadClient.java index 3ca2a642b..eb1ef3c9f 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/MultipartUploadClient.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/MultipartUploadClient.java @@ -73,8 +73,7 @@ public abstract CreateMultipartUploadResponse createMultipartUpload( */ @BetaApi public abstract AbortMultipartUploadResponse abortMultipartUpload( - AbortMultipartUploadRequest request) - throws IOException, NoSuchAlgorithmException; + AbortMultipartUploadRequest request) throws IOException, NoSuchAlgorithmException; /** * Creates a new instance of {@link MultipartUploadClient}. diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/MultipartUploadClientImpl.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/MultipartUploadClientImpl.java index c62c9723d..784349556 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/MultipartUploadClientImpl.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/MultipartUploadClientImpl.java @@ -75,8 +75,7 @@ public AbortMultipartUploadResponse abortMultipartUpload(AbortMultipartUploadReq return retrier.run( Retrying.alwaysRetry(), - () -> httpRequestManager.sendAbortMultipartUploadRequest( - uri, request, options), + () -> httpRequestManager.sendAbortMultipartUploadRequest(uri, request, options), Decoder.identity()); } } diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/MultipartUploadHttpRequestManager.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/MultipartUploadHttpRequestManager.java index 50ac889b0..4a77567d6 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/MultipartUploadHttpRequestManager.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/MultipartUploadHttpRequestManager.java @@ -93,26 +93,25 @@ ListPartsResponse sendListPartsRequest( return httpRequest.execute().parseAs(ListPartsResponse.class); } - AbortMultipartUploadResponse sendAbortMultipartUploadRequest( - URI uri, AbortMultipartUploadRequest request, HttpStorageOptions options) - throws IOException { + AbortMultipartUploadResponse sendAbortMultipartUploadRequest( + URI uri, AbortMultipartUploadRequest request, HttpStorageOptions options) throws IOException { - String encodedBucket = encode(request.bucket()); - String encodedKey = encode(request.key()); - String resourcePath = "/" + encodedBucket + "/" + encodedKey; - String queryString = "?uploadId=" + encode(request.uploadId()); - String abortUri = uri.toString() + resourcePath + queryString; - String contentType = "application/x-www-form-urlencoded"; - Map extensionHeaders = getGenericExtensionHeader(options); + String encodedBucket = encode(request.bucket()); + String encodedKey = encode(request.key()); + String resourcePath = "/" + encodedBucket + "/" + encodedKey; + String queryString = "?uploadId=" + encode(request.uploadId()); + String abortUri = uri.toString() + resourcePath + queryString; + String contentType = "application/x-www-form-urlencoded"; + Map extensionHeaders = getGenericExtensionHeader(options); - HttpRequest httpRequest = requestFactory.buildDeleteRequest(new GenericUrl(abortUri)); + HttpRequest httpRequest = requestFactory.buildDeleteRequest(new GenericUrl(abortUri)); httpRequest.getHeaders().setContentType(contentType); for (Map.Entry entry : extensionHeaders.entrySet()) { httpRequest.getHeaders().set(entry.getKey(), entry.getValue()); } - httpRequest.setParser(objectParser); - httpRequest.setThrowExceptionOnExecuteError(true); - return httpRequest.execute().parseAs(AbortMultipartUploadResponse.class); + httpRequest.setParser(objectParser); + httpRequest.setThrowExceptionOnExecuteError(true); + return httpRequest.execute().parseAs(AbortMultipartUploadResponse.class); } private Map getExtensionHeadersForCreateMultipartUpload( diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/AbortMultipartUploadResponse.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/AbortMultipartUploadResponse.java index e2b1c7f94..e5cfc5e47 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/AbortMultipartUploadResponse.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/AbortMultipartUploadResponse.java @@ -22,6 +22,4 @@ * abort operation does not return any specific data in its response body. */ @BetaApi -public final class AbortMultipartUploadResponse { - -} +public final class AbortMultipartUploadResponse {} From d257a51746bdbfec6239b0af28a1837bbd8def61 Mon Sep 17 00:00:00 2001 From: Shreyas Sinha Date: Thu, 23 Oct 2025 08:06:04 +0000 Subject: [PATCH 4/6] chore: fixed integ test. --- .../cloud/storage/ITMultipartUploadHttpRequestManagerTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITMultipartUploadHttpRequestManagerTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITMultipartUploadHttpRequestManagerTest.java index 45db19e44..f2a2b0815 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITMultipartUploadHttpRequestManagerTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITMultipartUploadHttpRequestManagerTest.java @@ -479,7 +479,7 @@ public void sendAbortMultipartUploadRequest_success() throws Exception { req -> { assertThat(req.uri()).contains("?uploadId=test-upload-id"); AbortMultipartUploadResponse response = new AbortMultipartUploadResponse(); - ByteBuf buf = Unpooled.wrappedBuffer(gson.toByteArray(response)); + ByteBuf buf = Unpooled.wrappedBuffer(xmlMapper.writeValueAsBytes(response)); DefaultFullHttpResponse resp = new DefaultFullHttpResponse(req.protocolVersion(), OK, buf); From 9569a20ab810e0dbdbaa5ed19eb98d0d13bde1a7 Mon Sep 17 00:00:00 2001 From: Shreyas Sinha Date: Thu, 23 Oct 2025 08:28:35 +0000 Subject: [PATCH 5/6] fixed test cases --- .../storage/ITMultipartUploadHttpRequestManagerTest.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITMultipartUploadHttpRequestManagerTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITMultipartUploadHttpRequestManagerTest.java index 8114a5c80..91c28353a 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITMultipartUploadHttpRequestManagerTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITMultipartUploadHttpRequestManagerTest.java @@ -520,13 +520,11 @@ public void sendAbortMultipartUploadRequest_error() throws Exception { .uploadId("test-upload-id") .build(); - StorageException se = assertThrows( - StorageException.class, + HttpResponseException.class, () -> multipartUploadHttpRequestManager.sendAbortMultipartUploadRequest( endpoint, request, httpStorageOptions)); - assertThat(se.getCode()).isEqualTo(400); } } } From 495d09e12c68b58e099d183dd1fb13cac5ba898e Mon Sep 17 00:00:00 2001 From: Shreyas Sinha Date: Tue, 28 Oct 2025 09:28:26 +0000 Subject: [PATCH 6/6] chore:Added Beta API annotation. --- .../multipartupload/model/AbortMultipartUploadRequest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/AbortMultipartUploadRequest.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/AbortMultipartUploadRequest.java index e6fabedee..e33b1b386 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/AbortMultipartUploadRequest.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/AbortMultipartUploadRequest.java @@ -70,6 +70,7 @@ public static Builder builder() { } /** A builder for creating {@link AbortMultipartUploadRequest} instances. */ + @BetaApi public static class Builder { private String bucket; private String key;