From 5b678878d5e36350e601578fb0c9e6f7e3ee9a9f Mon Sep 17 00:00:00 2001 From: odisseus Date: Fri, 8 Nov 2024 15:36:46 +0100 Subject: [PATCH] test --- .../shared_indexes/remote/S3Upload.scala | 8 ++-- .../remote/JdkIndexesS3OperationsTest.scala | 43 ++++++++++++++++++- 2 files changed, 46 insertions(+), 5 deletions(-) diff --git a/src/main/scala/com/virtuslab/shared_indexes/remote/S3Upload.scala b/src/main/scala/com/virtuslab/shared_indexes/remote/S3Upload.scala index 5bd1c8b..68e28ec 100644 --- a/src/main/scala/com/virtuslab/shared_indexes/remote/S3Upload.scala +++ b/src/main/scala/com/virtuslab/shared_indexes/remote/S3Upload.scala @@ -29,15 +29,15 @@ class S3Upload(private val s3: S3, private val timeout: Duration = Duration(5, " val failedUploads = uploadFiles(plan.getNewEntries.asScala) val failureSummary = new StringBuilder() if (failedRemoves.nonEmpty) { - failureSummary.append(s"Failed to remove ${failedRemoves.size} entries: \n") + failureSummary.append(s"Failed to remove ${failedRemoves.size} entries:\n") failedRemoves.foreach { case (entry, e) => - failureSummary.append(s" $entry: \n ${e.getMessage}\n") + failureSummary.append(s" $entry:\n ${e.getMessage}\n") } } if (failedUploads.nonEmpty) { - failureSummary.append(s"Failed to upload ${failedUploads.size} entries: \n") + failureSummary.append(s"Failed to upload ${failedUploads.size} entries:\n") failedUploads.foreach { case (entry, e) => - failureSummary.append(s" $entry: \n ${e.getMessage}\n") + failureSummary.append(s" $entry:\n ${e.getMessage}\n") } } if (failureSummary.nonEmpty) { diff --git a/src/test/scala/com/virtuslab/shared_indexes/remote/JdkIndexesS3OperationsTest.scala b/src/test/scala/com/virtuslab/shared_indexes/remote/JdkIndexesS3OperationsTest.scala index 76e6791..f7825c8 100644 --- a/src/test/scala/com/virtuslab/shared_indexes/remote/JdkIndexesS3OperationsTest.scala +++ b/src/test/scala/com/virtuslab/shared_indexes/remote/JdkIndexesS3OperationsTest.scala @@ -6,10 +6,11 @@ import org.scalamock.scalatest.MockFactory import org.scalatest.funsuite.AnyFunSuite import software.amazon.awssdk.core.sync.RequestBody import software.amazon.awssdk.services.s3.S3Client -import software.amazon.awssdk.services.s3.model.{S3Object, PutObjectRequest, DeleteObjectRequest} +import software.amazon.awssdk.services.s3.model.{DeleteObjectRequest, PutObjectRequest, S3Object} import java.time.Instant import scala.jdk.CollectionConverters._ +import scala.util.Try class JdkIndexesS3OperationsTest extends AnyFunSuite with MockFactory { @@ -46,4 +47,44 @@ class JdkIndexesS3OperationsTest extends AnyFunSuite with MockFactory { } + test("single server error") { + // Given + val newEntries = Seq( + "shared-index-jdk.metadata.json" -> "application/json", + "shared-index-jdk.ijx.xz" -> "application/xz", + "shared-index-jdk.sha256" -> "application/octet-stream" + ).map { case (key, contentType) => + new CdnUploadDataEntry(key, contentType, () => Array.emptyByteArray) + }.asJava + val removeEntries = Seq().asJava + val updatePlan = new CdnUpdatePlan(newEntries, removeEntries) + val s3Upload = new S3Upload(s3) + (s3Client.putObject(_: PutObjectRequest, _: RequestBody)).when(*, *).throws(new Exception("Server error")).once() + + // When + val exception = Try { + s3Upload.updateS3Indexes(updatePlan) + }.failed.get + + // Then + Seq( + "shared-index-jdk.metadata.json" -> "application/json", + "shared-index-jdk.ijx.xz" -> "application/xz", + "shared-index-jdk.sha256" -> "application/octet-stream" + ).foreach { case (key, contentType) => + (s3Client.putObject(_: PutObjectRequest, _: RequestBody)).verify(where { + (req: PutObjectRequest, _: RequestBody) => + req.contentType() == contentType && + req.key() == "/path/to/indexes/" + key + }) + } + val expectedErrorMessage = + """Failed to upload 1 entries: + | UploadDataEntry(key=shared-index-jdk.metadata.json, type=application/json): + | Server error + |""".stripMargin + + assert(exception.getMessage == expectedErrorMessage) + } + }