1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.io.input;
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.assertThrows;
22
23 import java.io.ByteArrayInputStream;
24 import java.io.IOException;
25 import java.io.InputStream;
26 import java.util.zip.Adler32;
27 import java.util.zip.CRC32;
28
29 import org.junit.jupiter.api.Test;
30
31
32
33
34 public class ChecksumInputStreamTest {
35
36 @Test
37 public void testDefaultThresholdFailure() throws IOException {
38 final byte[] byteArray = new byte[3];
39 final Adler32 adler32 = new Adler32();
40 try (ChecksumInputStream checksum = ChecksumInputStream.builder()
41
42 .setByteArray(byteArray)
43 .setChecksum(adler32)
44 .setExpectedChecksumValue((byte) -68)
45 .get()) {
46
47 assertEquals(0, checksum.getByteCount());
48 assertEquals(-1, checksum.getRemaining());
49
50 assertEquals(byteArray.length, checksum.read(new byte[byteArray.length + 1]));
51
52 assertThrows(IOException.class, () -> checksum.read(new byte[1]));
53 assertEquals(byteArray.length, checksum.getByteCount());
54 assertEquals(-4, checksum.getRemaining());
55 }
56 }
57
58 @Test
59 public void testDefaultThresholdSuccess() throws IOException {
60
61 final Adler32 sanityCheck = new Adler32();
62 final byte[] byteArray = new byte[3];
63 sanityCheck.update(byteArray);
64 final long expectedChecksum = sanityCheck.getValue();
65
66 final Adler32 adler32 = new Adler32();
67 try (ChecksumInputStream checksum = ChecksumInputStream.builder()
68
69 .setByteArray(byteArray)
70 .setChecksum(adler32)
71 .setExpectedChecksumValue(expectedChecksum)
72 .get()) {
73
74 assertEquals(0, checksum.getByteCount());
75 assertEquals(-1, checksum.getRemaining());
76 assertEquals(3, checksum.read(byteArray));
77 assertEquals(byteArray.length, checksum.getByteCount());
78 assertEquals(-4, checksum.getRemaining());
79 assertEquals(-1, checksum.read(byteArray));
80 assertEquals(byteArray.length, checksum.getByteCount());
81 assertEquals(-4, checksum.getRemaining());
82 }
83 }
84
85 @Test
86 public void testReadTakingByteArrayThrowsException() throws IOException {
87 final Adler32 adler32 = new Adler32();
88 final byte[] byteArray = new byte[3];
89 final long sizeThreshold = -1859L;
90 try (ChecksumInputStream checksum = ChecksumInputStream.builder()
91
92 .setByteArray(byteArray)
93 .setChecksum(adler32)
94 .setExpectedChecksumValue((byte) -68)
95 .setCountThreshold(sizeThreshold)
96 .get()) {
97
98 assertEquals(0, checksum.getByteCount());
99 assertEquals(sizeThreshold, checksum.getRemaining());
100
101 assertEquals(byteArray.length, checksum.read(new byte[byteArray.length + 1]));
102
103 assertThrows(IOException.class, () -> checksum.read(new byte[1]));
104 assertEquals(byteArray.length, checksum.getByteCount());
105 assertEquals(sizeThreshold - byteArray.length, checksum.getRemaining());
106 }
107 }
108
109 @Test
110 public void testReadTakingNoArgumentsThrowsException() throws IOException {
111 final CRC32 crc32 = new CRC32();
112 final byte[] byteArray = new byte[9];
113 try (ChecksumInputStream checksum = ChecksumInputStream.builder()
114
115 .setByteArray(byteArray)
116 .setChecksum(crc32)
117 .setExpectedChecksumValue((byte) 1)
118 .setCountThreshold(1)
119 .get()) {
120
121 assertEquals(0, checksum.getByteCount());
122 assertEquals(1, checksum.getRemaining());
123 assertThrows(IOException.class, () -> checksum.read());
124 assertEquals(1, checksum.getByteCount());
125 assertEquals(0, checksum.getRemaining());
126 }
127 }
128
129 @Test
130 public void testSkip() throws IOException {
131
132 final CRC32 sanityCheck = new CRC32();
133 final byte[] byteArray = new byte[4];
134 sanityCheck.update(byteArray);
135 final long expectedChecksum = sanityCheck.getValue();
136
137 final CRC32 crc32 = new CRC32();
138 final InputStream byteArrayInputStream = new ByteArrayInputStream(byteArray);
139 try (ChecksumInputStream checksum = ChecksumInputStream.builder()
140
141 .setInputStream(byteArrayInputStream)
142 .setChecksum(crc32)
143 .setExpectedChecksumValue(expectedChecksum)
144 .setCountThreshold(33)
145 .get()) {
146
147 assertEquals(0, checksum.getByteCount());
148 assertEquals(4, checksum.read(byteArray));
149 assertEquals(byteArray.length, checksum.getByteCount());
150 assertEquals(29, checksum.getRemaining());
151 final long skipReturnValue = checksum.skip((byte) 1);
152 assertEquals(byteArray.length, checksum.getByteCount());
153 assertEquals(29, checksum.getRemaining());
154 assertEquals(558161692L, crc32.getValue());
155 assertEquals(0, byteArrayInputStream.available());
156 assertArrayEquals(new byte[4], byteArray);
157 assertEquals(0L, skipReturnValue);
158 assertEquals(29, checksum.getRemaining());
159 }
160 }
161
162 }