View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.commons.codec.digest;
18  
19  import static org.junit.jupiter.api.Assertions.assertArrayEquals;
20  import static org.junit.jupiter.api.Assertions.assertEquals;
21  import static org.junit.jupiter.api.Assertions.assertFalse;
22  import static org.junit.jupiter.api.Assertions.assertNotNull;
23  import static org.junit.jupiter.api.Assertions.fail;
24  import static org.junit.jupiter.api.Assumptions.assumeTrue;
25  
26  import java.io.ByteArrayInputStream;
27  import java.io.File;
28  import java.io.IOException;
29  import java.io.RandomAccessFile;
30  import java.lang.reflect.Field;
31  import java.lang.reflect.Modifier;
32  import java.nio.ByteBuffer;
33  import java.nio.file.OpenOption;
34  import java.nio.file.Path;
35  import java.nio.file.StandardOpenOption;
36  import java.security.MessageDigest;
37  import java.security.NoSuchAlgorithmException;
38  
39  import org.junit.jupiter.api.AfterEach;
40  import org.junit.jupiter.api.BeforeAll;
41  import org.junit.jupiter.api.BeforeEach;
42  import org.junit.jupiter.params.ParameterizedTest;
43  import org.junit.jupiter.params.provider.MethodSource;
44  
45  /**
46   * Tests {@link MessageDigestAlgorithms}.
47   */
48  public class MessageDigestAlgorithmsTest {
49  
50      @BeforeAll
51      public static void checkValues() throws Exception {
52          final Field[] fields = MessageDigestAlgorithms.class.getDeclaredFields();
53          boolean ok = true;
54          int psf = 0;
55          for (final Field f : fields) {
56              // Ignore cobertura instrumentation fields
57              if (f.getName().contains("cobertura")) {
58                  continue;
59              }
60  
61              // Only interested in public fields
62              final int modifiers = f.getModifiers();
63              if (Modifier.isPublic(modifiers) && Modifier.isStatic(modifiers) && Modifier.isFinal(modifiers)) {
64                  psf++;
65                  if (!contains((String) f.get(null))) {
66                      System.out.println("Not found in MessageDigestAlgorithms.values(): " + f.getName());
67                      ok = false;
68                  }
69              }
70          }
71          if (!ok) {
72              fail("One or more entries are missing from the MessageDigestAlgorithms.values() array");
73          }
74          if (psf != MessageDigestAlgorithms.values().length) {
75              fail("One or more unexpected entries found in the MessageDigestAlgorithms.values() array");
76          }
77      }
78  
79      private static boolean contains(final String key) {
80          for (final String s : MessageDigestAlgorithms.values()) {
81              if (s.equals(key)) {
82                  return true;
83              }
84          }
85          return false;
86      }
87  
88      public static String[] data() {
89          return MessageDigestAlgorithms.values();
90      }
91  
92      private DigestUtilsTest digestUtilsTest;
93  
94      private byte[] digestTestData(final String messageDigestAlgorithm) {
95          return DigestUtils.digest(DigestUtils.getDigest(messageDigestAlgorithm), getTestData());
96      }
97  
98      private byte[] getTestData() {
99          return digestUtilsTest.getTestData();
100     }
101 
102     private File getTestFile() {
103         return digestUtilsTest.getTestPath().toFile();
104     }
105 
106     private Path getTestPath() {
107         return digestUtilsTest.getTestPath();
108     }
109 
110     private RandomAccessFile getTestRandomAccessFile() {
111         return digestUtilsTest.getTestRandomAccessFile();
112     }
113 
114     @BeforeEach
115     public void setUp() throws Exception {
116         digestUtilsTest = new DigestUtilsTest();
117         digestUtilsTest.setUp();
118     }
119 
120     @AfterEach
121     public void tearDown() throws Exception {
122         digestUtilsTest.tearDown();
123         digestUtilsTest = null;
124     }
125 
126     @ParameterizedTest
127     @MethodSource("data")
128     public void testAlgorithm(final String messageDigestAlgorithm) throws NoSuchAlgorithmException {
129         final String algorithm = messageDigestAlgorithm;
130         assertNotNull(algorithm);
131         assertFalse(algorithm.isEmpty());
132         assumeTrue(DigestUtils.isAvailable(messageDigestAlgorithm));
133         MessageDigest.getInstance(algorithm);
134     }
135 
136     @ParameterizedTest
137     @MethodSource("data")
138     public void testDigestByteArray(final String messageDigestAlgorithm) {
139         assumeTrue(DigestUtils.isAvailable(messageDigestAlgorithm));
140         assertArrayEquals(digestTestData(messageDigestAlgorithm), DigestUtils.digest(DigestUtils.getDigest(messageDigestAlgorithm), getTestData()));
141         assertArrayEquals(digestTestData(messageDigestAlgorithm), DigestUtils.digest(DigestUtils.getDigest(messageDigestAlgorithm), getTestData()));
142     }
143 
144     @ParameterizedTest
145     @MethodSource("data")
146     public void testDigestByteBuffer(final String messageDigestAlgorithm) {
147         assumeTrue(DigestUtils.isAvailable(messageDigestAlgorithm));
148         assertArrayEquals(digestTestData(messageDigestAlgorithm),
149                 DigestUtils.digest(DigestUtils.getDigest(messageDigestAlgorithm), ByteBuffer.wrap(getTestData())));
150         assertArrayEquals(digestTestData(messageDigestAlgorithm),
151                 DigestUtils.digest(DigestUtils.getDigest(messageDigestAlgorithm), ByteBuffer.wrap(getTestData())));
152     }
153 
154     @ParameterizedTest
155     @MethodSource("data")
156     public void testDigestFile(final String messageDigestAlgorithm) throws IOException {
157         assumeTrue(DigestUtils.isAvailable(messageDigestAlgorithm));
158         assertArrayEquals(digestTestData(messageDigestAlgorithm), DigestUtils.digest(DigestUtils.getDigest(messageDigestAlgorithm), getTestFile()));
159         assertArrayEquals(digestTestData(messageDigestAlgorithm), DigestUtils.digest(DigestUtils.getDigest(messageDigestAlgorithm), getTestFile()));
160     }
161 
162     @ParameterizedTest
163     @MethodSource("data")
164     public void testDigestInputStream(final String messageDigestAlgorithm) throws IOException {
165         assumeTrue(DigestUtils.isAvailable(messageDigestAlgorithm));
166         assertArrayEquals(digestTestData(messageDigestAlgorithm),
167                 DigestUtils.digest(DigestUtils.getDigest(messageDigestAlgorithm), new ByteArrayInputStream(getTestData())));
168         assertArrayEquals(digestTestData(messageDigestAlgorithm),
169                 DigestUtils.digest(DigestUtils.getDigest(messageDigestAlgorithm), new ByteArrayInputStream(getTestData())));
170     }
171 
172     @ParameterizedTest
173     @MethodSource("data")
174     private void testDigestPath(final String messageDigestAlgorithm, final OpenOption... options) throws IOException {
175         assumeTrue(DigestUtils.isAvailable(messageDigestAlgorithm));
176         assertArrayEquals(digestTestData(messageDigestAlgorithm), DigestUtils.digest(DigestUtils.getDigest(messageDigestAlgorithm), getTestPath(), options));
177         assertArrayEquals(digestTestData(messageDigestAlgorithm), DigestUtils.digest(DigestUtils.getDigest(messageDigestAlgorithm), getTestPath(), options));
178     }
179 
180     @ParameterizedTest
181     @MethodSource("data")
182     public void testDigestPathOpenOptionsEmpty(final String messageDigestAlgorithm) throws IOException {
183         testDigestPath(messageDigestAlgorithm);
184     }
185 
186     @ParameterizedTest
187     @MethodSource("data")
188     public void testDigestPathStandardOpenOptionRead(final String messageDigestAlgorithm) throws IOException {
189         testDigestPath(messageDigestAlgorithm, StandardOpenOption.READ);
190     }
191 
192     @ParameterizedTest
193     @MethodSource("data")
194     public void testGetMessageDigest(final String messageDigestAlgorithm) {
195         assumeTrue(DigestUtils.isAvailable(messageDigestAlgorithm));
196         final MessageDigest messageDigest = DigestUtils.getDigest(messageDigestAlgorithm);
197         assertEquals(messageDigestAlgorithm, messageDigest.getAlgorithm());
198     }
199 
200     @ParameterizedTest
201     @MethodSource("data")
202     public void testNonBlockingDigestRandomAccessFile(final String messageDigestAlgorithm) throws IOException {
203         assumeTrue(DigestUtils.isAvailable(messageDigestAlgorithm));
204 
205         final byte[] expected = digestTestData(messageDigestAlgorithm);
206 
207         @SuppressWarnings("resource") // test manages RAF
208         final RandomAccessFile randomAccessFile = getTestRandomAccessFile();
209         assertArrayEquals(expected, DigestUtils.digest(DigestUtils.getDigest(messageDigestAlgorithm), randomAccessFile));
210         randomAccessFile.seek(0);
211         assertArrayEquals(expected, DigestUtils.digest(DigestUtils.getDigest(messageDigestAlgorithm), randomAccessFile));
212     }
213 
214 }