From 914825b2aeb9255bbfdd16d9e1defcdb1c0f414b Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sun, 30 Aug 2026 17:08:18 +0000 Subject: [PATCH] =?UTF-8?q?=F0=9F=A7=AA=20[testing=20improvement]=20Add=20?= =?UTF-8?q?tests=20for=20TusServletRequest=20trailer=20header=20fallback?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: tomdesair <14034630+tomdesair@users.noreply.github.com> --- .../server/util/TusServletRequestTest.java | 121 ++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 src/test/java/me/desair/tus/server/util/TusServletRequestTest.java diff --git a/src/test/java/me/desair/tus/server/util/TusServletRequestTest.java b/src/test/java/me/desair/tus/server/util/TusServletRequestTest.java new file mode 100644 index 0000000..9b95c88 --- /dev/null +++ b/src/test/java/me/desair/tus/server/util/TusServletRequestTest.java @@ -0,0 +1,121 @@ +package me.desair.tus.server.util; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.mockito.Mockito.when; + +import jakarta.servlet.ReadListener; +import jakarta.servlet.ServletInputStream; +import jakarta.servlet.http.HttpServletRequest; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import org.apache.commons.io.IOUtils; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class TusServletRequestTest { + + @Mock private HttpServletRequest servletRequest; + + private TusServletRequest tusServletRequest; + + @Before + public void setUp() { + tusServletRequest = new TusServletRequest(servletRequest, true); + } + + @Test + public void getHeaderFromSuper() { + when(servletRequest.getHeader("X-My-Header")).thenReturn("my-value"); + + assertEquals("my-value", tusServletRequest.getHeader("X-My-Header")); + } + + @Test + public void getHeaderFromTrailer() throws Exception { + when(servletRequest.getHeader("Transfer-Encoding")).thenReturn("chunked"); + when(servletRequest.getHeader("X-My-Trailer")).thenReturn(null); + + String chunkedContent = "5\r\n" + "hello\r\n" + "0\r\n" + "X-My-Trailer: trailer-value\r\n\r\n"; + InputStream bais = new ByteArrayInputStream(chunkedContent.getBytes(StandardCharsets.UTF_8)); + + when(servletRequest.getInputStream()) + .thenReturn( + new ServletInputStream() { + @Override + public boolean isFinished() { + return false; + } + + @Override + public boolean isReady() { + return true; + } + + @Override + public void setReadListener(ReadListener readListener) {} + + @Override + public int read() throws IOException { + return bais.read(); + } + }); + + // Read the whole input stream to parse trailers + InputStream contentInputStream = tusServletRequest.getContentInputStream(); + IOUtils.toByteArray(contentInputStream); + + // Verify trailer header is returned + assertEquals("trailer-value", tusServletRequest.getHeader("X-My-Trailer")); + } + + @Test + public void getHeaderBlankFallsBackToTrailer() throws Exception { + when(servletRequest.getHeader("Transfer-Encoding")).thenReturn("chunked"); + when(servletRequest.getHeader("X-My-Trailer")).thenReturn(""); + + String chunkedContent = "5\r\n" + "hello\r\n" + "0\r\n" + "X-My-Trailer: trailer-value\r\n\r\n"; + InputStream bais = new ByteArrayInputStream(chunkedContent.getBytes(StandardCharsets.UTF_8)); + + when(servletRequest.getInputStream()) + .thenReturn( + new ServletInputStream() { + @Override + public boolean isFinished() { + return false; + } + + @Override + public boolean isReady() { + return true; + } + + @Override + public void setReadListener(ReadListener readListener) {} + + @Override + public int read() throws IOException { + return bais.read(); + } + }); + + // Read the whole input stream to parse trailers + InputStream contentInputStream = tusServletRequest.getContentInputStream(); + IOUtils.toByteArray(contentInputStream); + + // Verify trailer header is returned because super returned a blank string + assertEquals("trailer-value", tusServletRequest.getHeader("X-My-Trailer")); + } + + @Test + public void getHeaderNotFound() { + when(servletRequest.getHeader("X-My-Header")).thenReturn(null); + assertNull(tusServletRequest.getHeader("X-My-Header")); + } +}