Skip to content

Commit 45313bc

Browse files
committed
Migrate tests away from S3 SDK MD5DigestCalculatingInputStream
`S3BlobContainerRetriesTests` uses `MD5DigestCalculatingInputStream` from the AWS v1 SDK to compute a MD5 checksum, but this feature is not available in the v2 SDK. With this commit we remove this dependency and compute the MD5 checksums directly instead.
1 parent 439a273 commit 45313bc

File tree

1 file changed

+16
-61
lines changed

1 file changed

+16
-61
lines changed

modules/repository-s3/src/test/java/org/elasticsearch/repositories/s3/S3BlobContainerRetriesTests.java

Lines changed: 16 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.elasticsearch.common.blobstore.BlobPath;
2828
import org.elasticsearch.common.blobstore.OperationPurpose;
2929
import org.elasticsearch.common.blobstore.OptionalBytesReference;
30+
import org.elasticsearch.common.bytes.BytesArray;
3031
import org.elasticsearch.common.bytes.BytesReference;
3132
import org.elasticsearch.common.hash.MessageDigests;
3233
import org.elasticsearch.common.io.Streams;
@@ -45,8 +46,6 @@
4546
import org.elasticsearch.core.SuppressForbidden;
4647
import org.elasticsearch.core.TimeValue;
4748
import org.elasticsearch.env.Environment;
48-
import org.elasticsearch.logging.LogManager;
49-
import org.elasticsearch.logging.Logger;
5049
import org.elasticsearch.repositories.RepositoriesMetrics;
5150
import org.elasticsearch.repositories.blobstore.AbstractBlobContainerRetriesTestCase;
5251
import org.elasticsearch.repositories.blobstore.BlobStoreTestUtil;
@@ -73,7 +72,6 @@
7372
import java.net.UnknownHostException;
7473
import java.nio.charset.StandardCharsets;
7574
import java.nio.file.NoSuchFileException;
76-
import java.security.MessageDigest;
7775
import java.util.ArrayList;
7876
import java.util.Arrays;
7977
import java.util.List;
@@ -379,13 +377,12 @@ public void testWriteLargeBlob() throws Exception {
379377
}
380378
} else if (s3Request.isUploadPartRequest()) {
381379
// upload part request
382-
MD5DigestCalculatingInputStream md5 = new MD5DigestCalculatingInputStream(exchange.getRequestBody());
383-
BytesReference bytes = Streams.readFully(md5);
380+
BytesReference bytes = Streams.readFully(exchange.getRequestBody());
384381
assertThat((long) bytes.length(), anyOf(equalTo(lastPartSize), equalTo(bufferSize.getBytes())));
385382
assertThat(contentLength, anyOf(equalTo(lastPartSize), equalTo(bufferSize.getBytes())));
386383

387384
if (countDownUploads.decrementAndGet() % 2 == 0) {
388-
exchange.getResponseHeaders().add("ETag", md5.getBase16Md5Digest());
385+
exchange.getResponseHeaders().add("ETag", getBase16MD5Digest(bytes));
389386
exchange.sendResponseHeaders(HttpStatus.SC_OK, -1);
390387
exchange.close();
391388
return;
@@ -477,12 +474,11 @@ public void testWriteLargeBlobStreaming() throws Exception {
477474
}
478475
} else if (s3Request.isUploadPartRequest()) {
479476
// upload part request
480-
MD5DigestCalculatingInputStream md5 = new MD5DigestCalculatingInputStream(exchange.getRequestBody());
481-
BytesReference bytes = Streams.readFully(md5);
477+
BytesReference bytes = Streams.readFully(exchange.getRequestBody());
482478

483479
if (counterUploads.incrementAndGet() % 2 == 0) {
484480
bytesReceived.addAndGet(bytes.length());
485-
exchange.getResponseHeaders().add("ETag", md5.getBase16Md5Digest());
481+
exchange.getResponseHeaders().add("ETag", getBase16MD5Digest(bytes));
486482
exchange.sendResponseHeaders(HttpStatus.SC_OK, -1);
487483
exchange.close();
488484
return;
@@ -1125,19 +1121,19 @@ public void testTrimmedLogAndCappedSuppressedErrorOnMultiObjectDeletionException
11251121
}
11261122
}
11271123

1128-
public void testMd5DigestCalculatingInputStream() throws IOException {
1129-
// from Wikipedia
1130-
doMD5DigestCalculatingInputStreamTest("", "d41d8cd98f00b204e9800998ecf8427e");
1131-
doMD5DigestCalculatingInputStreamTest("The quick brown fox jumps over the lazy dog", "9e107d9d372bb6826bd81d3542a419d6");
1132-
doMD5DigestCalculatingInputStreamTest("The quick brown fox jumps over the lazy dog.", "e4d909c290d0fb1ca068ffaddf22cbd0");
1124+
private static String getBase16MD5Digest(BytesReference bytesReference) {
1125+
return MessageDigests.toHexString(MessageDigests.digest(bytesReference, MessageDigests.md5()));
11331126
}
11341127

1135-
private static void doMD5DigestCalculatingInputStreamTest(String input, String expectedDigestString) throws IOException {
1136-
final var bytes = input.getBytes(StandardCharsets.UTF_8);
1137-
try (var s = new ByteArrayInputStream(bytes); var m = new MD5DigestCalculatingInputStream(s)) {
1138-
assertArrayEquals(bytes, m.readAllBytes());
1139-
assertEquals(expectedDigestString, m.getBase16Md5Digest());
1140-
}
1128+
public void testGetBase16MD5Digest() {
1129+
// from Wikipedia, see also org.elasticsearch.common.hash.MessageDigestsTests.testMd5
1130+
assertBase16MD5Digest("", "d41d8cd98f00b204e9800998ecf8427e");
1131+
assertBase16MD5Digest("The quick brown fox jumps over the lazy dog", "9e107d9d372bb6826bd81d3542a419d6");
1132+
assertBase16MD5Digest("The quick brown fox jumps over the lazy dog.", "e4d909c290d0fb1ca068ffaddf22cbd0");
1133+
}
1134+
1135+
private static void assertBase16MD5Digest(String input, String expectedDigestString) {
1136+
assertEquals(expectedDigestString, getBase16MD5Digest(new BytesArray(input)));
11411137
}
11421138

11431139
@Override
@@ -1289,45 +1285,4 @@ public void close() throws IOException {
12891285
}
12901286
}
12911287
}
1292-
1293-
private static final Logger logger = LogManager.getLogger(S3BlobContainerRetriesTests.class);
1294-
1295-
private static class MD5DigestCalculatingInputStream extends InputStream {
1296-
1297-
private final MessageDigest messageDigest = MessageDigests.md5();
1298-
private final InputStream delegate;
1299-
1300-
private MD5DigestCalculatingInputStream(InputStream delegate) {
1301-
this.delegate = delegate;
1302-
}
1303-
1304-
@Override
1305-
public int read() throws IOException {
1306-
final var b = delegate.read();
1307-
if (b >= 0) {
1308-
messageDigest.update((byte) b);
1309-
}
1310-
return b;
1311-
}
1312-
1313-
@Override
1314-
public int read(byte[] b, int off, int len) throws IOException {
1315-
final var readLen = delegate.read(b, off, len);
1316-
if (readLen > 0) {
1317-
messageDigest.update(b, off, readLen);
1318-
}
1319-
return readLen;
1320-
}
1321-
1322-
public String getBase16Md5Digest() {
1323-
final var digestBytes = messageDigest.digest();
1324-
final var stringChars = new char[digestBytes.length * 2];
1325-
for (int i = 0; i < digestBytes.length; i++) {
1326-
final var digestByte = digestBytes[i];
1327-
stringChars[2 * i] = Character.forDigit((digestByte >> 4) & 0xF, 16);
1328-
stringChars[2 * i + 1] = Character.forDigit(digestByte & 0xF, 16);
1329-
}
1330-
return new String(stringChars);
1331-
}
1332-
}
13331288
}

0 commit comments

Comments
 (0)