Skip to content

Commit 7dca7c8

Browse files
🧪 [testing improvement] Add tests for TusServletRequest (#130)
* 🧪 Add tests for TusServletRequest Co-authored-by: tomdesair <14034630+tomdesair@users.noreply.github.com> * 🧹 Fix CI codestyle and assertion failure Co-authored-by: tomdesair <14034630+tomdesair@users.noreply.github.com> * 🧹 Fix CI codestyle and assertion failure Co-authored-by: tomdesair <14034630+tomdesair@users.noreply.github.com> * 🧹 [testing improvement] Fix CI codestyle formatting and assertions and resolve merge conflicts Co-authored-by: tomdesair <14034630+tomdesair@users.noreply.github.com> --------- Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> Co-authored-by: tomdesair <14034630+tomdesair@users.noreply.github.com>
1 parent 6ec74c9 commit 7dca7c8

2 files changed

Lines changed: 176 additions & 8 deletions

File tree

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package me.desair.tus.server.util;
2+
3+
import jakarta.servlet.ReadListener;
4+
import jakarta.servlet.ServletInputStream;
5+
import java.io.IOException;
6+
import java.io.InputStream;
7+
8+
public class MockServletInputStream extends ServletInputStream {
9+
10+
private final InputStream delegate;
11+
12+
public MockServletInputStream(InputStream delegate) {
13+
this.delegate = delegate;
14+
}
15+
16+
@Override
17+
public int read() throws IOException {
18+
return delegate.read();
19+
}
20+
21+
@Override
22+
public int read(byte[] b, int off, int len) throws IOException {
23+
return delegate.read(b, off, len);
24+
}
25+
26+
@Override
27+
public boolean isFinished() {
28+
try {
29+
return delegate.available() == 0;
30+
} catch (IOException e) {
31+
return true;
32+
}
33+
}
34+
35+
@Override
36+
public boolean isReady() {
37+
return true;
38+
}
39+
40+
@Override
41+
public void setReadListener(ReadListener readListener) {}
42+
}

src/test/java/me/desair/tus/server/util/TusServletRequestTest.java

Lines changed: 134 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
package me.desair.tus.server.util;
22

3+
import static org.hamcrest.MatcherAssert.assertThat;
4+
import static org.hamcrest.Matchers.hasItems;
5+
import static org.hamcrest.Matchers.is;
6+
import static org.hamcrest.Matchers.notNullValue;
7+
import static org.hamcrest.Matchers.nullValue;
38
import static org.junit.Assert.assertEquals;
49
import static org.junit.Assert.assertNull;
10+
import static org.mockito.Mockito.mock;
511
import static org.mockito.Mockito.when;
612

713
import jakarta.servlet.ReadListener;
@@ -11,6 +17,10 @@
1117
import java.io.IOException;
1218
import java.io.InputStream;
1319
import java.nio.charset.StandardCharsets;
20+
import java.util.Set;
21+
import me.desair.tus.server.HttpHeader;
22+
import me.desair.tus.server.TusExtension;
23+
import me.desair.tus.server.checksum.ChecksumAlgorithm;
1424
import org.apache.commons.io.IOUtils;
1525
import org.junit.Before;
1626
import org.junit.Test;
@@ -23,18 +33,134 @@ public class TusServletRequestTest {
2333

2434
@Mock private HttpServletRequest servletRequest;
2535

26-
private TusServletRequest tusServletRequest;
36+
private TusServletRequest request;
2737

2838
@Before
2939
public void setUp() {
30-
tusServletRequest = new TusServletRequest(servletRequest, true);
40+
request = new TusServletRequest(servletRequest, true);
41+
}
42+
43+
@Test
44+
public void testGetContentInputStream() throws Exception {
45+
byte[] data = "test data".getBytes();
46+
when(servletRequest.getInputStream())
47+
.thenReturn(new MockServletInputStream(new ByteArrayInputStream(data)));
48+
49+
InputStream is = request.getContentInputStream();
50+
51+
assertThat(is, notNullValue());
52+
53+
// Read to the end to trigger counting
54+
byte[] buffer = new byte[1024];
55+
int bytesRead = is.read(buffer);
56+
57+
assertThat(bytesRead, is(9));
58+
assertThat(request.getBytesRead(), is(9L));
59+
}
60+
61+
@Test
62+
public void testGetContentInputStreamChunked() throws Exception {
63+
TusServletRequest chunkedRequest = new TusServletRequest(servletRequest, true);
64+
65+
byte[] data = "5\r\ntest \r\n4\r\ndata\r\n0\r\n\r\n".getBytes();
66+
when(servletRequest.getInputStream())
67+
.thenReturn(new MockServletInputStream(new ByteArrayInputStream(data)));
68+
when(servletRequest.getHeader(HttpHeader.TRANSFER_ENCODING)).thenReturn("chunked");
69+
70+
InputStream is = chunkedRequest.getContentInputStream();
71+
72+
assertThat(is, notNullValue());
73+
74+
// Read to the end to trigger counting
75+
byte[] buffer = new byte[1024];
76+
int bytesRead = 0;
77+
int read;
78+
while ((read = is.read(buffer)) != -1) {
79+
bytesRead += read;
80+
}
81+
82+
assertThat(bytesRead, is(9));
83+
assertThat(chunkedRequest.getBytesRead(), is(9L));
84+
}
85+
86+
@Test
87+
public void testGetContentInputStreamWithChecksum() throws Exception {
88+
byte[] data = "test data".getBytes();
89+
when(servletRequest.getInputStream())
90+
.thenReturn(new MockServletInputStream(new ByteArrayInputStream(data)));
91+
when(servletRequest.getHeader(HttpHeader.UPLOAD_CHECKSUM))
92+
.thenReturn("sha1 9I3YU4IIYIFsddVND1hNyGMyenw=");
93+
94+
InputStream is = request.getContentInputStream();
95+
assertThat(is, notNullValue());
96+
97+
byte[] buffer = new byte[1024];
98+
int read;
99+
while ((read = is.read(buffer)) != -1) {
100+
// Consume stream completely to calculate checksum
101+
}
102+
103+
assertThat(request.hasCalculatedChecksum(), is(true));
104+
Set<ChecksumAlgorithm> algorithms = request.getEnabledChecksums();
105+
assertThat(algorithms, hasItems(ChecksumAlgorithm.SHA1));
106+
107+
assertThat(
108+
request.getCalculatedChecksum(ChecksumAlgorithm.SHA1), is("9I3YU4IIYIFsddVND1hNyGMyenw="));
109+
}
110+
111+
@Test
112+
public void testGetContentInputStreamChunkedWithChecksum() throws Exception {
113+
TusServletRequest chunkedRequest = new TusServletRequest(servletRequest, true);
114+
115+
byte[] data = "5\r\ntest \r\n4\r\ndata\r\n0\r\n\r\n".getBytes();
116+
when(servletRequest.getInputStream())
117+
.thenReturn(new MockServletInputStream(new ByteArrayInputStream(data)));
118+
when(servletRequest.getHeader(HttpHeader.TRANSFER_ENCODING)).thenReturn("chunked");
119+
120+
InputStream is = chunkedRequest.getContentInputStream();
121+
assertThat(is, notNullValue());
122+
123+
byte[] buffer = new byte[1024];
124+
int read;
125+
while ((read = is.read(buffer)) != -1) {
126+
// Consume stream completely to calculate checksum
127+
}
128+
129+
assertThat(chunkedRequest.hasCalculatedChecksum(), is(true));
130+
Set<ChecksumAlgorithm> algorithms = chunkedRequest.getEnabledChecksums();
131+
// Since it's chunked and checksum can come at the end, it should keep track of all algorithms
132+
assertThat(algorithms, hasItems(ChecksumAlgorithm.values()));
133+
134+
assertThat(
135+
chunkedRequest.getCalculatedChecksum(ChecksumAlgorithm.SHA1),
136+
is("9I3YU4IIYIFsddVND1hNyGMyenw="));
137+
}
138+
139+
@Test
140+
public void testIsProcessedBy() {
141+
TusExtension extension = mock(TusExtension.class);
142+
when(extension.getName()).thenReturn("test");
143+
144+
assertThat(request.isProcessedBy(extension), is(false));
145+
146+
request.addProcessor(extension);
147+
148+
assertThat(request.isProcessedBy(extension), is(true));
149+
}
150+
151+
@Test
152+
public void testGetHeader() {
153+
when(servletRequest.getHeader("X-Custom-Header")).thenReturn("custom-value");
154+
155+
assertThat(request.getHeader("X-Custom-Header"), is("custom-value"));
156+
assertThat(request.getHeader("X-Non-Existent"), is(nullValue()));
31157
}
32158

33159
@Test
34160
public void getHeaderFromSuper() {
35161
when(servletRequest.getHeader("X-My-Header")).thenReturn("my-value");
36162

37-
assertEquals("my-value", tusServletRequest.getHeader("X-My-Header"));
163+
assertEquals("my-value", request.getHeader("X-My-Header"));
38164
}
39165

40166
@Test
@@ -68,11 +194,11 @@ public int read() throws IOException {
68194
});
69195

70196
// Read the whole input stream to parse trailers
71-
InputStream contentInputStream = tusServletRequest.getContentInputStream();
197+
InputStream contentInputStream = request.getContentInputStream();
72198
IOUtils.toByteArray(contentInputStream);
73199

74200
// Verify trailer header is returned
75-
assertEquals("trailer-value", tusServletRequest.getHeader("X-My-Trailer"));
201+
assertEquals("trailer-value", request.getHeader("X-My-Trailer"));
76202
}
77203

78204
@Test
@@ -106,16 +232,16 @@ public int read() throws IOException {
106232
});
107233

108234
// Read the whole input stream to parse trailers
109-
InputStream contentInputStream = tusServletRequest.getContentInputStream();
235+
InputStream contentInputStream = request.getContentInputStream();
110236
IOUtils.toByteArray(contentInputStream);
111237

112238
// Verify trailer header is returned because super returned a blank string
113-
assertEquals("trailer-value", tusServletRequest.getHeader("X-My-Trailer"));
239+
assertEquals("trailer-value", request.getHeader("X-My-Trailer"));
114240
}
115241

116242
@Test
117243
public void getHeaderNotFound() {
118244
when(servletRequest.getHeader("X-My-Header")).thenReturn(null);
119-
assertNull(tusServletRequest.getHeader("X-My-Header"));
245+
assertNull(request.getHeader("X-My-Header"));
120246
}
121247
}

0 commit comments

Comments
 (0)