1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
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
57 if (f.getName().contains("cobertura")) {
58 continue;
59 }
60
61
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")
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 }