You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2023/10/18 12:27:53 UTC

[commons-io] 02/02: Add MessageDigestInputStream and deprecate MessageDigestCalculatingInputStream

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

ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-io.git

commit 50e2d770f98cbcb709dcb2a981cac53ea70b4f45
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Wed Oct 18 08:27:46 2023 -0400

    Add MessageDigestInputStream and deprecate
    MessageDigestCalculatingInputStream
---
 pom.xml                                            |   6 ++
 src/changes/changes.xml                            |   3 +
 .../input/MessageDigestCalculatingInputStream.java |  21 ++++-
 ...utStream.java => MessageDigestInputStream.java} | 103 +++++++--------------
 .../commons/io/input/ObservableInputStream.java    |   2 +-
 .../MessageDigestCalculatingInputStreamTest.java   |  47 +++++++---
 ...Test.java => MessageDigestInputStreamTest.java} |  30 +++---
 .../io/input/ObservableInputStreamTest.java        |  11 +--
 .../commons/io/input/TimestampedObserverTest.java  |   4 +-
 9 files changed, 112 insertions(+), 115 deletions(-)

diff --git a/pom.xml b/pom.xml
index 592367ff..ac5ee3d7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -288,6 +288,12 @@ file comparators, endian transformation classes, and much more.
       <version>3.13.0</version>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>commons-codec</groupId>
+      <artifactId>commons-codec</artifactId>
+      <version>1.16.0</version>
+      <scope>test</scope>
+    </dependency>
     <dependency>
       <groupId>org.openjdk.jmh</groupId>
       <artifactId>jmh-core</artifactId>
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 109061de..ff6a6c48 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -121,6 +121,9 @@ The <action> type attribute can be add,update,fix,remove.
       <action dev="ggregory" type="add" due-to="Gary Gregory">
         Add org.apache.commons.io.StreamIterator.
       </action>
+      <action dev="ggregory" type="add" due-to="Gary Gregory">
+        Add MessageDigestInputStream and deprecate MessageDigestCalculatingInputStream.
+      </action>
       <!-- UPDATE -->
       <action dev="ggregory" type="update" due-to="Gary Gregory">
         Bump org.apache.commons:commons-parent from 62 to 64.
diff --git a/src/main/java/org/apache/commons/io/input/MessageDigestCalculatingInputStream.java b/src/main/java/org/apache/commons/io/input/MessageDigestCalculatingInputStream.java
index 429b225b..97d7ff59 100644
--- a/src/main/java/org/apache/commons/io/input/MessageDigestCalculatingInputStream.java
+++ b/src/main/java/org/apache/commons/io/input/MessageDigestCalculatingInputStream.java
@@ -27,7 +27,7 @@ import org.apache.commons.io.build.AbstractStreamBuilder;
 
 /**
  * This class is an example for using an {@link ObservableInputStream}. It creates its own {@link org.apache.commons.io.input.ObservableInputStream.Observer},
- * which calculates a checksum using a MessageDigest, for example an MD5 sum.
+ * which calculates a checksum using a {@link MessageDigest}, for example, a SHA-512 sum.
  * <p>
  * To build an instance, see {@link Builder}.
  * </p>
@@ -36,12 +36,11 @@ import org.apache.commons.io.build.AbstractStreamBuilder;
  * Cryptography Architecture Standard Algorithm Name Documentation</a> for information about standard algorithm names.
  * </p>
  * <p>
- * <em>Note</em>: Neither {@link ObservableInputStream}, nor {@link MessageDigest}, are thread safe. So is {@link MessageDigestCalculatingInputStream}.
- * </p>
- * <p>
- * TODO Rename to MessageDigestInputStream in 3.0.
+ * <em>Note</em>: Neither {@link ObservableInputStream}, nor {@link MessageDigest}, are thread safe, so is {@link MessageDigestCalculatingInputStream}.
  * </p>
+ * @deprecated Use {@link MessageDigestInputStream}.
  */
+@Deprecated
 public class MessageDigestCalculatingInputStream extends ObservableInputStream {
 
     /**
@@ -96,6 +95,9 @@ public class MessageDigestCalculatingInputStream extends ObservableInputStream {
 
         /**
          * Sets the message digest.
+         * <p>
+         * The MD5 cryptographic algorithm is weak and should not be used.
+         * </p>
          *
          * @param messageDigest the message digest.
          */
@@ -105,6 +107,9 @@ public class MessageDigestCalculatingInputStream extends ObservableInputStream {
 
         /**
          * Sets the name of the name of the message digest algorithm.
+         * <p>
+         * The MD5 cryptographic algorithm is weak and should not be used.
+         * </p>
          *
          * @param algorithm the name of the algorithm. See the MessageDigest section in the
          *                  <a href= "https://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html#MessageDigest"> Java Cryptography
@@ -192,6 +197,9 @@ public class MessageDigestCalculatingInputStream extends ObservableInputStream {
 
     /**
      * Constructs a new instance, which calculates a signature on the given stream, using the given {@link MessageDigest}.
+     * <p>
+     * The MD5 cryptographic algorithm is weak and should not be used.
+     * </p>
      *
      * @param inputStream   the stream to calculate the message digest for
      * @param messageDigest the message digest to use
@@ -206,6 +214,9 @@ public class MessageDigestCalculatingInputStream extends ObservableInputStream {
 
     /**
      * Constructs a new instance, which calculates a signature on the given stream, using a {@link MessageDigest} with the given algorithm.
+     * <p>
+     * The MD5 cryptographic algorithm is weak and should not be used.
+     * </p>
      *
      * @param inputStream the stream to calculate the message digest for
      * @param algorithm   the name of the algorithm requested. See the MessageDigest section in the
diff --git a/src/main/java/org/apache/commons/io/input/MessageDigestCalculatingInputStream.java b/src/main/java/org/apache/commons/io/input/MessageDigestInputStream.java
similarity index 61%
copy from src/main/java/org/apache/commons/io/input/MessageDigestCalculatingInputStream.java
copy to src/main/java/org/apache/commons/io/input/MessageDigestInputStream.java
index 429b225b..d822256b 100644
--- a/src/main/java/org/apache/commons/io/input/MessageDigestCalculatingInputStream.java
+++ b/src/main/java/org/apache/commons/io/input/MessageDigestInputStream.java
@@ -20,14 +20,13 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
-import java.security.Provider;
 import java.util.Objects;
 
 import org.apache.commons.io.build.AbstractStreamBuilder;
 
 /**
  * This class is an example for using an {@link ObservableInputStream}. It creates its own {@link org.apache.commons.io.input.ObservableInputStream.Observer},
- * which calculates a checksum using a MessageDigest, for example an MD5 sum.
+ * which calculates a checksum using a {@link MessageDigest}, for example, a SHA-512 sum.
  * <p>
  * To build an instance, see {@link Builder}.
  * </p>
@@ -36,29 +35,32 @@ import org.apache.commons.io.build.AbstractStreamBuilder;
  * Cryptography Architecture Standard Algorithm Name Documentation</a> for information about standard algorithm names.
  * </p>
  * <p>
- * <em>Note</em>: Neither {@link ObservableInputStream}, nor {@link MessageDigest}, are thread safe. So is {@link MessageDigestCalculatingInputStream}.
+ * You must specify a message digest algorithm name or instance.
  * </p>
  * <p>
- * TODO Rename to MessageDigestInputStream in 3.0.
+ * <em>Note</em>: Neither {@link ObservableInputStream}, nor {@link MessageDigest}, are thread safe, so is {@link MessageDigestInputStream}.
  * </p>
+ *
+ * @since 2.15.0
  */
-public class MessageDigestCalculatingInputStream extends ObservableInputStream {
+public final class MessageDigestInputStream extends ObservableInputStream {
 
     /**
-     * Builds a new {@link MessageDigestCalculatingInputStream} instance.
+     * Builds new {@link MessageDigestInputStream} instances.
      * <p>
      * For example:
      * </p>
      * <pre>{@code
-     * MessageDigestCalculatingInputStream s = MessageDigestCalculatingInputStream.builder()
+     * MessageDigestInputStream s = MessageDigestInputStream.builder()
      *   .setPath(path)
      *   .setMessageDigest("SHA-512")
      *   .get();}
      * </pre>
-     *
-     * @since 2.12.0
+     * <p>
+     * You must specify a message digest algorithm name or instance.
+     * </p>
      */
-    public static class Builder extends AbstractStreamBuilder<MessageDigestCalculatingInputStream, Builder> {
+    public static class Builder extends AbstractStreamBuilder<MessageDigestInputStream, Builder> {
 
         private MessageDigest messageDigest;
 
@@ -66,12 +68,7 @@ public class MessageDigestCalculatingInputStream extends ObservableInputStream {
          * Constructs a new Builder.
          */
         public Builder() {
-            try {
-                this.messageDigest = getDefaultMessageDigest();
-            } catch (final NoSuchAlgorithmException e) {
-                // Should not happen.
-                throw new IllegalStateException(e);
-            }
+            // empty
         }
 
         /**
@@ -90,29 +87,39 @@ public class MessageDigestCalculatingInputStream extends ObservableInputStream {
          */
         @SuppressWarnings("resource")
         @Override
-        public MessageDigestCalculatingInputStream get() throws IOException {
-            return new MessageDigestCalculatingInputStream(getInputStream(), messageDigest);
+        public MessageDigestInputStream get() throws IOException {
+            return new MessageDigestInputStream(getInputStream(), messageDigest);
         }
 
         /**
          * Sets the message digest.
+         * <p>
+         * The MD5 cryptographic algorithm is weak and should not be used.
+         * </p>
          *
          * @param messageDigest the message digest.
+         * @return this
          */
-        public void setMessageDigest(final MessageDigest messageDigest) {
+        public Builder setMessageDigest(final MessageDigest messageDigest) {
             this.messageDigest = messageDigest;
+            return this;
         }
 
         /**
          * Sets the name of the name of the message digest algorithm.
+         * <p>
+         * The MD5 cryptographic algorithm is weak and should not be used.
+         * </p>
          *
          * @param algorithm the name of the algorithm. See the MessageDigest section in the
          *                  <a href= "https://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html#MessageDigest"> Java Cryptography
          *                  Architecture Standard Algorithm Name Documentation</a> for information about standard algorithm names.
+         * @return this
          * @throws NoSuchAlgorithmException if no Provider supports a MessageDigestSpi implementation for the specified algorithm.
          */
-        public void setMessageDigest(final String algorithm) throws NoSuchAlgorithmException {
+        public Builder setMessageDigest(final String algorithm) throws NoSuchAlgorithmException {
             this.messageDigest = MessageDigest.getInstance(algorithm);
+            return this;
         }
 
     }
@@ -121,6 +128,7 @@ public class MessageDigestCalculatingInputStream extends ObservableInputStream {
      * Maintains the message digest.
      */
     public static class MessageDigestMaintainingObserver extends Observer {
+
         private final MessageDigest messageDigest;
 
         /**
@@ -144,81 +152,32 @@ public class MessageDigestCalculatingInputStream extends ObservableInputStream {
         }
     }
 
-    /**
-     * The default message digest algorithm.
-     * <p>
-     * The MD5 cryptographic algorithm is weak and should not be used.
-     * </p>
-     */
-    private static final String DEFAULT_ALGORITHM = "MD5";
-
     /**
      * Constructs a new {@link Builder}.
      *
      * @return a new {@link Builder}.
-     * @since 2.12.0
      */
     public static Builder builder() {
         return new Builder();
     }
 
-    /**
-     * Gets a MessageDigest object that implements the default digest algorithm.
-     *
-     * @return a Message Digest object that implements the default algorithm.
-     * @throws NoSuchAlgorithmException if no Provider supports a MessageDigestSpi implementation.
-     * @see Provider
-     */
-    static MessageDigest getDefaultMessageDigest() throws NoSuchAlgorithmException {
-        return MessageDigest.getInstance(DEFAULT_ALGORITHM);
-    }
-
     private final MessageDigest messageDigest;
 
     /**
-     * Constructs a new instance, which calculates a signature on the given stream, using a {@link MessageDigest} with the "MD5" algorithm.
+     * Constructs a new instance, which calculates a signature on the given stream, using the given {@link MessageDigest}.
      * <p>
-     * The MD5 algorithm is weak and should not be used.
+     * The MD5 cryptographic algorithm is weak and should not be used.
      * </p>
      *
-     * @param inputStream the stream to calculate the message digest for
-     * @throws NoSuchAlgorithmException if no Provider supports a MessageDigestSpi implementation for the specified algorithm.
-     * @deprecated Use {@link #builder()}, {@link Builder}, and {@link Builder#get()}.
-     */
-    @Deprecated
-    public MessageDigestCalculatingInputStream(final InputStream inputStream) throws NoSuchAlgorithmException {
-        this(inputStream, getDefaultMessageDigest());
-    }
-
-    /**
-     * Constructs a new instance, which calculates a signature on the given stream, using the given {@link MessageDigest}.
-     *
      * @param inputStream   the stream to calculate the message digest for
      * @param messageDigest the message digest to use
      * @throws NullPointerException if messageDigest is null.
-     * @deprecated Use {@link #builder()}, {@link Builder}, and {@link Builder#get()}.
      */
-    @Deprecated
-    public MessageDigestCalculatingInputStream(final InputStream inputStream, final MessageDigest messageDigest) {
+    private MessageDigestInputStream(final InputStream inputStream, final MessageDigest messageDigest) {
         super(inputStream, new MessageDigestMaintainingObserver(messageDigest));
         this.messageDigest = messageDigest;
     }
 
-    /**
-     * Constructs a new instance, which calculates a signature on the given stream, using a {@link MessageDigest} with the given algorithm.
-     *
-     * @param inputStream the stream to calculate the message digest for
-     * @param algorithm   the name of the algorithm requested. See the MessageDigest section in the
-     *                    <a href= "https://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html#MessageDigest"> Java Cryptography
-     *                    Architecture Standard Algorithm Name Documentation</a> for information about standard algorithm names.
-     * @throws NoSuchAlgorithmException if no Provider supports a MessageDigestSpi implementation for the specified algorithm.
-     * @deprecated Use {@link #builder()}, {@link Builder}, and {@link Builder#get()}.
-     */
-    @Deprecated
-    public MessageDigestCalculatingInputStream(final InputStream inputStream, final String algorithm) throws NoSuchAlgorithmException {
-        this(inputStream, MessageDigest.getInstance(algorithm));
-    }
-
     /**
      * Gets the {@link MessageDigest}, which is being used for generating the checksum.
      * <p>
diff --git a/src/main/java/org/apache/commons/io/input/ObservableInputStream.java b/src/main/java/org/apache/commons/io/input/ObservableInputStream.java
index ee080f06..a97702fb 100644
--- a/src/main/java/org/apache/commons/io/input/ObservableInputStream.java
+++ b/src/main/java/org/apache/commons/io/input/ObservableInputStream.java
@@ -39,7 +39,7 @@ import org.apache.commons.io.function.IOConsumer;
  * be used.
  * </p>
  *
- * @see MessageDigestCalculatingInputStream
+ * @see MessageDigestInputStream
  */
 public class ObservableInputStream extends ProxyInputStream {
 
diff --git a/src/test/java/org/apache/commons/io/input/MessageDigestCalculatingInputStreamTest.java b/src/test/java/org/apache/commons/io/input/MessageDigestCalculatingInputStreamTest.java
index 517a014e..9123c41f 100644
--- a/src/test/java/org/apache/commons/io/input/MessageDigestCalculatingInputStreamTest.java
+++ b/src/test/java/org/apache/commons/io/input/MessageDigestCalculatingInputStreamTest.java
@@ -20,40 +20,57 @@ import static org.junit.jupiter.api.Assertions.assertArrayEquals;
 
 import java.io.ByteArrayInputStream;
 import java.security.MessageDigest;
-import java.util.Random;
 
+import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.commons.codec.digest.MessageDigestAlgorithms;
+import org.apache.commons.io.input.MessageDigestCalculatingInputStream.Builder;
 import org.junit.jupiter.api.Test;
 
 /**
  * Tests {@link MessageDigestCalculatingInputStream}.
  */
+@SuppressWarnings("deprecation")
 public class MessageDigestCalculatingInputStreamTest {
 
-    public static byte[] generateRandomByteStream(final int pSize) {
-        final byte[] buffer = new byte[pSize];
-        final Random rnd = new Random();
-        rnd.nextBytes(buffer);
-        return buffer;
-    }
-
     @Test
-    public void test() throws Exception {
+    public void testNormalUse() throws Exception {
         for (int i = 256; i < 8192; i = i * 2) {
-            final byte[] buffer = generateRandomByteStream(i);
-            final MessageDigest messageDigest = MessageDigestCalculatingInputStream.getDefaultMessageDigest();
-            final byte[] expect = messageDigest.digest(buffer);
+            final byte[] buffer = MessageDigestInputStreamTest.generateRandomByteStream(i);
+            final MessageDigest defaultMessageDigest = MessageDigestCalculatingInputStream.getDefaultMessageDigest();
+            final byte[] defaultExpect = defaultMessageDigest.digest(buffer);
+            // Defaults
             try (MessageDigestCalculatingInputStream messageDigestInputStream = new MessageDigestCalculatingInputStream(new ByteArrayInputStream(buffer))) {
                 messageDigestInputStream.consume();
-                assertArrayEquals(expect, messageDigestInputStream.getMessageDigest().digest());
+                assertArrayEquals(defaultExpect, messageDigestInputStream.getMessageDigest().digest());
             }
             try (MessageDigestCalculatingInputStream messageDigestInputStream = MessageDigestCalculatingInputStream.builder()
                     .setInputStream(new ByteArrayInputStream(buffer)).get()) {
                 messageDigestInputStream.consume();
-                assertArrayEquals(expect, messageDigestInputStream.getMessageDigest().digest());
+                assertArrayEquals(defaultExpect, messageDigestInputStream.getMessageDigest().digest());
             }
             try (MessageDigestCalculatingInputStream messageDigestInputStream = MessageDigestCalculatingInputStream.builder().setByteArray(buffer).get()) {
                 messageDigestInputStream.consume();
-                assertArrayEquals(expect, messageDigestInputStream.getMessageDigest().digest());
+                assertArrayEquals(defaultExpect, messageDigestInputStream.getMessageDigest().digest());
+            }
+            // SHA-512
+            final byte[] sha512Expect = DigestUtils.sha512(buffer);
+            {
+                final Builder builder = MessageDigestCalculatingInputStream.builder();
+                builder.setMessageDigest(MessageDigestAlgorithms.SHA_512);
+                builder.setInputStream(new ByteArrayInputStream(buffer));
+                try (MessageDigestCalculatingInputStream messageDigestInputStream = builder.get()) {
+                    messageDigestInputStream.consume();
+                    assertArrayEquals(sha512Expect, messageDigestInputStream.getMessageDigest().digest());
+                }
+            }
+            {
+                final Builder builder = MessageDigestCalculatingInputStream.builder();
+                builder.setMessageDigest(MessageDigestAlgorithms.SHA_512);
+                builder.setInputStream(new ByteArrayInputStream(buffer));
+                try (MessageDigestCalculatingInputStream messageDigestInputStream = builder.get()) {
+                    messageDigestInputStream.consume();
+                    assertArrayEquals(sha512Expect, messageDigestInputStream.getMessageDigest().digest());
+                }
             }
         }
     }
diff --git a/src/test/java/org/apache/commons/io/input/MessageDigestCalculatingInputStreamTest.java b/src/test/java/org/apache/commons/io/input/MessageDigestInputStreamTest.java
similarity index 60%
copy from src/test/java/org/apache/commons/io/input/MessageDigestCalculatingInputStreamTest.java
copy to src/test/java/org/apache/commons/io/input/MessageDigestInputStreamTest.java
index 517a014e..d41da0b7 100644
--- a/src/test/java/org/apache/commons/io/input/MessageDigestCalculatingInputStreamTest.java
+++ b/src/test/java/org/apache/commons/io/input/MessageDigestInputStreamTest.java
@@ -17,19 +17,21 @@
 package org.apache.commons.io.input;
 
 import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 
 import java.io.ByteArrayInputStream;
-import java.security.MessageDigest;
 import java.util.Random;
 
+import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.commons.codec.digest.MessageDigestAlgorithms;
 import org.junit.jupiter.api.Test;
 
 /**
- * Tests {@link MessageDigestCalculatingInputStream}.
+ * Tests {@link MessageDigestInputStream}.
  */
-public class MessageDigestCalculatingInputStreamTest {
+public class MessageDigestInputStreamTest {
 
-    public static byte[] generateRandomByteStream(final int pSize) {
+    static byte[] generateRandomByteStream(final int pSize) {
         final byte[] buffer = new byte[pSize];
         final Random rnd = new Random();
         rnd.nextBytes(buffer);
@@ -37,21 +39,23 @@ public class MessageDigestCalculatingInputStreamTest {
     }
 
     @Test
-    public void test() throws Exception {
+    public void testNoDefault() throws Exception {
+        assertThrows(IllegalStateException.class, () -> MessageDigestInputStream.builder().get());
+        assertThrows(NullPointerException.class, () -> MessageDigestInputStream.builder().setInputStream(new ByteArrayInputStream(new byte[] { 1 })).get());
+    }
+
+    @Test
+    public void testNormalUse() throws Exception {
         for (int i = 256; i < 8192; i = i * 2) {
             final byte[] buffer = generateRandomByteStream(i);
-            final MessageDigest messageDigest = MessageDigestCalculatingInputStream.getDefaultMessageDigest();
-            final byte[] expect = messageDigest.digest(buffer);
-            try (MessageDigestCalculatingInputStream messageDigestInputStream = new MessageDigestCalculatingInputStream(new ByteArrayInputStream(buffer))) {
-                messageDigestInputStream.consume();
-                assertArrayEquals(expect, messageDigestInputStream.getMessageDigest().digest());
-            }
-            try (MessageDigestCalculatingInputStream messageDigestInputStream = MessageDigestCalculatingInputStream.builder()
+            final byte[] expect = DigestUtils.sha512(buffer);
+            try (MessageDigestInputStream messageDigestInputStream = MessageDigestInputStream.builder().setMessageDigest(MessageDigestAlgorithms.SHA_512)
                     .setInputStream(new ByteArrayInputStream(buffer)).get()) {
                 messageDigestInputStream.consume();
                 assertArrayEquals(expect, messageDigestInputStream.getMessageDigest().digest());
             }
-            try (MessageDigestCalculatingInputStream messageDigestInputStream = MessageDigestCalculatingInputStream.builder().setByteArray(buffer).get()) {
+            try (MessageDigestInputStream messageDigestInputStream = MessageDigestInputStream.builder().setByteArray(buffer)
+                    .setMessageDigest(DigestUtils.getSha512Digest()).get()) {
                 messageDigestInputStream.consume();
                 assertArrayEquals(expect, messageDigestInputStream.getMessageDigest().digest());
             }
diff --git a/src/test/java/org/apache/commons/io/input/ObservableInputStreamTest.java b/src/test/java/org/apache/commons/io/input/ObservableInputStreamTest.java
index 4c9b193b..8c099ade 100644
--- a/src/test/java/org/apache/commons/io/input/ObservableInputStreamTest.java
+++ b/src/test/java/org/apache/commons/io/input/ObservableInputStreamTest.java
@@ -153,8 +153,7 @@ public class ObservableInputStreamTest {
      */
     @Test
     public void testDataByteCalled_add() throws Exception {
-        final byte[] buffer = MessageDigestCalculatingInputStreamTest
-            .generateRandomByteStream(IOUtils.DEFAULT_BUFFER_SIZE);
+        final byte[] buffer = MessageDigestInputStreamTest.generateRandomByteStream(IOUtils.DEFAULT_BUFFER_SIZE);
         final DataViewObserver lko = new DataViewObserver();
         try (ObservableInputStream ois = new ObservableInputStream(new ByteArrayInputStream(buffer))) {
             assertEquals(-1, lko.lastValue);
@@ -185,8 +184,7 @@ public class ObservableInputStreamTest {
      */
     @Test
     public void testDataByteCalled_ctor() throws Exception {
-        final byte[] buffer = MessageDigestCalculatingInputStreamTest
-            .generateRandomByteStream(IOUtils.DEFAULT_BUFFER_SIZE);
+        final byte[] buffer = MessageDigestInputStreamTest.generateRandomByteStream(IOUtils.DEFAULT_BUFFER_SIZE);
         final DataViewObserver lko = new DataViewObserver();
         try (ObservableInputStream ois = new ObservableInputStream(new ByteArrayInputStream(buffer), lko)) {
             assertEquals(-1, lko.lastValue);
@@ -216,10 +214,9 @@ public class ObservableInputStreamTest {
      */
     @Test
     public void testDataBytesCalled() throws Exception {
-        final byte[] buffer = MessageDigestCalculatingInputStreamTest
-            .generateRandomByteStream(IOUtils.DEFAULT_BUFFER_SIZE);
+        final byte[] buffer = MessageDigestInputStreamTest.generateRandomByteStream(IOUtils.DEFAULT_BUFFER_SIZE);
         try (ByteArrayInputStream bais = new ByteArrayInputStream(buffer);
-            final ObservableInputStream ois = new ObservableInputStream(bais)) {
+                final ObservableInputStream ois = new ObservableInputStream(bais)) {
             final DataViewObserver observer = new DataViewObserver();
             final byte[] readBuffer = new byte[23];
             assertNull(observer.buffer);
diff --git a/src/test/java/org/apache/commons/io/input/TimestampedObserverTest.java b/src/test/java/org/apache/commons/io/input/TimestampedObserverTest.java
index 54922005..ea37b381 100644
--- a/src/test/java/org/apache/commons/io/input/TimestampedObserverTest.java
+++ b/src/test/java/org/apache/commons/io/input/TimestampedObserverTest.java
@@ -51,7 +51,7 @@ public class TimestampedObserverTest {
         assertTrue(timestampedObserver.getOpenToNowDuration().toNanos() > 0);
         assertNull(timestampedObserver.getCloseInstant());
         assertFalse(timestampedObserver.isClosed());
-        final byte[] buffer = MessageDigestCalculatingInputStreamTest.generateRandomByteStream(IOUtils.DEFAULT_BUFFER_SIZE);
+        final byte[] buffer = MessageDigestInputStreamTest.generateRandomByteStream(IOUtils.DEFAULT_BUFFER_SIZE);
         try (ObservableInputStream ois = new ObservableInputStream(new ByteArrayInputStream(buffer), timestampedObserver)) {
             assertTrue(timestampedObserver.getOpenInstant().isAfter(before));
             assertTrue(timestampedObserver.getOpenToNowDuration().toNanos() > 0);
@@ -68,7 +68,7 @@ public class TimestampedObserverTest {
     @Test
     public void testExample() throws IOException {
         final TimestampedObserver timestampedObserver = new TimestampedObserver();
-        final byte[] buffer = MessageDigestCalculatingInputStreamTest
+        final byte[] buffer = MessageDigestInputStreamTest
             .generateRandomByteStream(IOUtils.DEFAULT_BUFFER_SIZE);
         try (ObservableInputStream ois = new ObservableInputStream(new ByteArrayInputStream(buffer),
             timestampedObserver)) {