diff --git a/generator/.DevConfigs/433a9a6d-b8ea-4676-b763-70711e8288e6.json b/generator/.DevConfigs/433a9a6d-b8ea-4676-b763-70711e8288e6.json
new file mode 100644
index 000000000000..5d67e3a8b858
--- /dev/null
+++ b/generator/.DevConfigs/433a9a6d-b8ea-4676-b763-70711e8288e6.json
@@ -0,0 +1,11 @@
+{
+ "services": [
+ {
+ "serviceName": "S3",
+ "type": "patch",
+ "changeLogMessages": [
+ "Added CompleteMultipartUploadResponse to TransferUtilityUploadResponse mapping"
+ ]
+ }
+ ]
+}
diff --git a/sdk/src/Services/S3/Custom/Transfer/Internal/ResponseMapper.cs b/sdk/src/Services/S3/Custom/Transfer/Internal/ResponseMapper.cs
index d130aee20bff..7e8505ecbf69 100644
--- a/sdk/src/Services/S3/Custom/Transfer/Internal/ResponseMapper.cs
+++ b/sdk/src/Services/S3/Custom/Transfer/Internal/ResponseMapper.cs
@@ -99,6 +99,67 @@ internal static TransferUtilityUploadResponse MapPutObjectResponse(PutObjectResp
return response;
}
+
+ ///
+ /// Maps a CompleteMultipartUploadResponse to TransferUtilityUploadResponse.
+ /// Uses the field mappings defined in mapping.json "Conversion" -> "CompleteMultipartResponse" -> "UploadResponse".
+ ///
+ /// The CompleteMultipartUploadResponse to map from
+ /// A new TransferUtilityUploadResponse with mapped fields
+ internal static TransferUtilityUploadResponse MapCompleteMultipartUploadResponse(CompleteMultipartUploadResponse source)
+ {
+ if (source == null)
+ return null;
+
+ var response = new TransferUtilityUploadResponse();
+
+ // Map all fields as defined in mapping.json "Conversion" -> "CompleteMultipartResponse" -> "UploadResponse"
+ if (source.IsSetBucketKeyEnabled())
+ response.BucketKeyEnabled = source.BucketKeyEnabled.GetValueOrDefault();
+
+ if (source.IsSetChecksumCRC32())
+ response.ChecksumCRC32 = source.ChecksumCRC32;
+
+ if (source.IsSetChecksumCRC32C())
+ response.ChecksumCRC32C = source.ChecksumCRC32C;
+
+ if (source.IsSetChecksumCRC64NVME())
+ response.ChecksumCRC64NVME = source.ChecksumCRC64NVME;
+
+ if (source.IsSetChecksumSHA1())
+ response.ChecksumSHA1 = source.ChecksumSHA1;
+
+ if (source.IsSetChecksumSHA256())
+ response.ChecksumSHA256 = source.ChecksumSHA256;
+
+ if (source.ChecksumType != null)
+ response.ChecksumType = source.ChecksumType;
+
+ if (source.IsSetETag())
+ response.ETag = source.ETag;
+
+ if (source.Expiration != null)
+ response.Expiration = source.Expiration;
+
+ if (source.IsSetRequestCharged())
+ response.RequestCharged = source.RequestCharged;
+
+ if (source.ServerSideEncryptionMethod != null)
+ response.ServerSideEncryptionMethod = source.ServerSideEncryptionMethod;
+
+ if (source.IsSetServerSideEncryptionKeyManagementServiceKeyId())
+ response.ServerSideEncryptionKeyManagementServiceKeyId = source.ServerSideEncryptionKeyManagementServiceKeyId;
+
+ if (source.IsSetVersionId())
+ response.VersionId = source.VersionId;
+
+ // Copy response metadata
+ response.ResponseMetadata = source.ResponseMetadata;
+ response.ContentLength = source.ContentLength;
+ response.HttpStatusCode = source.HttpStatusCode;
+
+ return response;
+ }
}
}
diff --git a/sdk/test/Services/S3/UnitTests/Custom/EmbeddedResource/property-aliases.json b/sdk/test/Services/S3/UnitTests/Custom/EmbeddedResource/property-aliases.json
index e9de0a44b4fe..97a29b7695c3 100644
--- a/sdk/test/Services/S3/UnitTests/Custom/EmbeddedResource/property-aliases.json
+++ b/sdk/test/Services/S3/UnitTests/Custom/EmbeddedResource/property-aliases.json
@@ -112,6 +112,10 @@
},
"AbortMultipartUploadRequest": {
"Bucket": "BucketName"
+ },
+ "CompleteMultipartUploadResponse": {
+ "ServerSideEncryption": "ServerSideEncryptionMethod",
+ "SSEKMSKeyId": "ServerSideEncryptionKeyManagementServiceKeyId"
}
}
}
\ No newline at end of file
diff --git a/sdk/test/Services/S3/UnitTests/Custom/ResponseMapperTests.cs b/sdk/test/Services/S3/UnitTests/Custom/ResponseMapperTests.cs
index ca6569d286db..1854c8d79020 100644
--- a/sdk/test/Services/S3/UnitTests/Custom/ResponseMapperTests.cs
+++ b/sdk/test/Services/S3/UnitTests/Custom/ResponseMapperTests.cs
@@ -462,6 +462,56 @@ public void ValidateTransferUtilityUploadResponseDefinitionCompleteness()
"TransferUtilityUploadResponse");
}
+ [TestMethod]
+ [TestCategory("S3")]
+ public void MapCompleteMultipartUploadResponse_AllMappedProperties_WorkCorrectly()
+ {
+ ValidateMappingTransferUtilityAndSdkRequests(
+ new[] { "Conversion", "CompleteMultipartResponse", "UploadResponse" },
+ (sourceResponse) =>
+ {
+ return ResponseMapper.MapCompleteMultipartUploadResponse(sourceResponse);
+ },
+ usesHeadersCollection: false,
+ (sourceResponse) =>
+ {
+ sourceResponse.HttpStatusCode = HttpStatusCode.OK;
+ sourceResponse.ContentLength = 2048;
+ },
+ (sourceResponse, targetResponse) =>
+ {
+ Assert.AreEqual(sourceResponse.HttpStatusCode, targetResponse.HttpStatusCode, "HttpStatusCode should match");
+ Assert.AreEqual(sourceResponse.ContentLength, targetResponse.ContentLength, "ContentLength should match");
+ });
+ }
+
+ [TestMethod]
+ [TestCategory("S3")]
+ public void MapCompleteMultipartUploadResponse_NullValues_HandledCorrectly()
+ {
+ // Test null handling scenarios
+ var testCases = new[]
+ {
+ // Test null Expiration
+ new CompleteMultipartUploadResponse { Expiration = null },
+
+ // Test null enum conversions
+ new CompleteMultipartUploadResponse { ChecksumType = null, RequestCharged = null, ServerSideEncryptionMethod = null }
+ };
+
+ foreach (var testCase in testCases)
+ {
+ var mapped = ResponseMapper.MapCompleteMultipartUploadResponse(testCase);
+ Assert.IsNotNull(mapped, "Response should always be mappable");
+
+ // Test null handling
+ if (testCase.Expiration == null)
+ {
+ Assert.IsNull(mapped.Expiration, "Null Expiration should map to null");
+ }
+ }
+ }
+
[TestMethod]
[TestCategory("S3")]
public void ValidateCompleteMultipartUploadResponseConversionCompleteness()