Skip to content

Commit f0c327f

Browse files
committed
add tests for PageConfig#isNotModified()
1 parent 6acb7d0 commit f0c327f

File tree

2 files changed

+58
-14
lines changed

2 files changed

+58
-14
lines changed

opengrok-web/src/main/java/org/opengrok/web/PageConfig.java

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@
3838
import java.net.URISyntaxException;
3939
import java.net.URLDecoder;
4040
import java.nio.charset.StandardCharsets;
41-
import java.nio.file.Paths;
4241
import java.security.InvalidParameterException;
4342
import java.util.ArrayList;
4443
import java.util.Arrays;
@@ -1828,21 +1827,9 @@ private SortedSet<AcceptedMessage> getProjectMessages() {
18281827
* @see <a href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html">HTTP Caching</a>
18291828
*/
18301829
public boolean isNotModified(HttpServletRequest request, HttpServletResponse response) {
1831-
String currentEtag = String.format("W/\"%s\"",
1832-
Objects.hash(
1833-
// last modified time as UTC timestamp in millis
1834-
getLastModified(),
1835-
// all project related messages which changes the view
1836-
getProjectMessages(),
1837-
// last timestamp value
1838-
getEnv().getDateForLastIndexRun() != null ? getEnv().getDateForLastIndexRun().getTime() : 0,
1839-
// OpenGrok version has changed since the last time
1840-
Info.getVersion()
1841-
)
1842-
);
1830+
String currentEtag = getEtag();
18431831

18441832
String headerEtag = request.getHeader(HttpHeaders.IF_NONE_MATCH);
1845-
18461833
if (headerEtag != null && headerEtag.equals(currentEtag)) {
18471834
// weak ETag has not changed, return 304 NOT MODIFIED
18481835
response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
@@ -1854,6 +1841,21 @@ public boolean isNotModified(HttpServletRequest request, HttpServletResponse res
18541841
return false;
18551842
}
18561843

1844+
@VisibleForTesting @NotNull String getEtag() {
1845+
return String.format("W/\"%s\"",
1846+
Objects.hash(
1847+
// last modified time as UTC timestamp in millis
1848+
getLastModified(),
1849+
// all project related messages which changes the view
1850+
getProjectMessages(),
1851+
// last timestamp value
1852+
getEnv().getDateForLastIndexRun() != null ? getEnv().getDateForLastIndexRun().getTime() : 0,
1853+
// OpenGrok version
1854+
Info.getVersion()
1855+
)
1856+
);
1857+
}
1858+
18571859
/**
18581860
* @param root root path
18591861
* @param path path

opengrok-web/src/test/java/org/opengrok/web/PageConfigTest.java

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@
3939
import java.util.stream.Stream;
4040

4141
import jakarta.servlet.http.HttpServletRequest;
42+
import jakarta.servlet.http.HttpServletResponse;
43+
import jakarta.ws.rs.core.HttpHeaders;
4244
import org.apache.commons.lang3.tuple.Pair;
4345
import org.junit.jupiter.api.AfterAll;
4446
import org.junit.jupiter.api.BeforeAll;
@@ -68,6 +70,11 @@
6870
import static org.junit.jupiter.api.Assertions.assertThrows;
6971
import static org.junit.jupiter.api.Assertions.assertTrue;
7072
import static org.junit.jupiter.api.Assumptions.assumeTrue;
73+
import static org.mockito.ArgumentMatchers.eq;
74+
import static org.mockito.ArgumentMatchers.startsWith;
75+
import static org.mockito.Mockito.mock;
76+
import static org.mockito.Mockito.verify;
77+
import static org.mockito.Mockito.when;
7178
import static org.opengrok.indexer.condition.RepositoryInstalled.Type.MERCURIAL;
7279
import static org.opengrok.indexer.history.LatestRevisionUtil.getLatestRevision;
7380

@@ -647,4 +654,39 @@ public String getPathInfo() {
647654
}
648655
};
649656
}
657+
658+
@Test
659+
void testIsNotModifiedEtag() {
660+
HttpServletRequest req = new DummyHttpServletRequest() {
661+
@Override
662+
public String getHeader(String name) {
663+
if (name.equals(HttpHeaders.IF_NONE_MATCH)) {
664+
return "foo"; // will not match the hash computed in
665+
}
666+
return null;
667+
}
668+
669+
@Override
670+
public String getPathInfo() {
671+
return "path";
672+
}
673+
};
674+
675+
PageConfig cfg = PageConfig.get(req);
676+
HttpServletResponse resp = mock(HttpServletResponse.class);
677+
assertFalse(cfg.isNotModified(req, resp));
678+
verify(resp).setHeader(eq(HttpHeaders.ETAG), startsWith("W/"));
679+
}
680+
681+
@Test
682+
void testIsNotModifiedNotModified() {
683+
DummyHttpServletRequest req = mock(DummyHttpServletRequest.class);
684+
when(req.getPathInfo()).thenReturn("/");
685+
PageConfig cfg = PageConfig.get(req);
686+
final String etag = cfg.getEtag();
687+
when(req.getHeader(HttpHeaders.IF_NONE_MATCH)).thenReturn(etag);
688+
HttpServletResponse resp = mock(HttpServletResponse.class);
689+
assertTrue(cfg.isNotModified(req, resp));
690+
verify(resp).setStatus(eq(HttpServletResponse.SC_NOT_MODIFIED));
691+
}
650692
}

0 commit comments

Comments
 (0)