From 05e3de52654b4d7a04fb1519e79b5b4789993af2 Mon Sep 17 00:00:00 2001 From: Vladimir Kotal Date: Mon, 22 Sep 2025 15:54:54 +0200 Subject: [PATCH 1/4] improve test coverage of PageConfig#isNotModified() by (not) creating the timestamp file --- .../indexer/configuration/IndexTimestamp.java | 12 ++++++++---- .../java/org/opengrok/web/PageConfigTest.java | 17 +++++++++++++++-- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/opengrok-indexer/src/main/java/org/opengrok/indexer/configuration/IndexTimestamp.java b/opengrok-indexer/src/main/java/org/opengrok/indexer/configuration/IndexTimestamp.java index 305105277ae..95981dd9127 100644 --- a/opengrok-indexer/src/main/java/org/opengrok/indexer/configuration/IndexTimestamp.java +++ b/opengrok-indexer/src/main/java/org/opengrok/indexer/configuration/IndexTimestamp.java @@ -18,7 +18,7 @@ */ /* - * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. */ package org.opengrok.indexer.configuration; @@ -27,6 +27,8 @@ import java.util.Date; import java.util.logging.Level; import java.util.logging.Logger; + +import org.jetbrains.annotations.Nullable; import org.opengrok.indexer.logger.LoggerFactory; public class IndexTimestamp { @@ -34,15 +36,17 @@ public class IndexTimestamp { private static final Logger LOGGER = LoggerFactory.getLogger(IndexTimestamp.class); + public static final String TIMESTAMP_FILE_NAME = "timestamp"; + /** * Get the date of the last index update. * - * @return the time of the last index update. + * @return the time of the last index update or {@code null}. */ - public Date getDateForLastIndexRun() { + public @Nullable Date getDateForLastIndexRun() { RuntimeEnvironment env = RuntimeEnvironment.getInstance(); if (lastModified == null) { - File timestamp = new File(env.getDataRootFile(), "timestamp"); + File timestamp = new File(env.getDataRootFile(), TIMESTAMP_FILE_NAME); if (timestamp.exists()) { lastModified = new Date(timestamp.lastModified()); } diff --git a/opengrok-web/src/test/java/org/opengrok/web/PageConfigTest.java b/opengrok-web/src/test/java/org/opengrok/web/PageConfigTest.java index e0dd781ac01..e9cc0d5ed85 100644 --- a/opengrok-web/src/test/java/org/opengrok/web/PageConfigTest.java +++ b/opengrok-web/src/test/java/org/opengrok/web/PageConfigTest.java @@ -49,11 +49,13 @@ import org.junit.jupiter.api.condition.OS; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; +import org.junit.jupiter.params.provider.ValueSource; import org.opengrok.indexer.authorization.AuthControlFlag; import org.opengrok.indexer.authorization.AuthorizationFramework; import org.opengrok.indexer.authorization.AuthorizationPlugin; import org.opengrok.indexer.authorization.TestPlugin; import org.opengrok.indexer.condition.EnabledForRepository; +import org.opengrok.indexer.configuration.IndexTimestamp; import org.opengrok.indexer.configuration.Project; import org.opengrok.indexer.configuration.RuntimeEnvironment; import org.opengrok.indexer.history.Annotation; @@ -655,8 +657,9 @@ public String getPathInfo() { }; } - @Test - void testIsNotModifiedEtag() { + @ParameterizedTest + @ValueSource(booleans = {true, false}) + void testIsNotModifiedEtag(boolean createTimestamp) throws IOException { HttpServletRequest req = new DummyHttpServletRequest() { @Override public String getHeader(String name) { @@ -672,6 +675,16 @@ public String getPathInfo() { } }; + RuntimeEnvironment env = RuntimeEnvironment.getInstance(); + env.refreshDateForLastIndexRun(); + Path timestampPath = Path.of(env.getDataRootPath(), IndexTimestamp.TIMESTAMP_FILE_NAME); + if (createTimestamp) { + Files.createFile(timestampPath); + assertTrue(timestampPath.toFile().exists()); + } else { + Files.deleteIfExists(timestampPath); + } + PageConfig cfg = PageConfig.get(req); HttpServletResponse resp = mock(HttpServletResponse.class); assertFalse(cfg.isNotModified(req, resp)); From 17c8bc3766f23f0e81b4cbeddc3ec646c8283b59 Mon Sep 17 00:00:00 2001 From: Vladimir Kotal Date: Mon, 22 Sep 2025 15:57:02 +0200 Subject: [PATCH 2/4] add annotation --- .../java/org/opengrok/indexer/configuration/IndexTimestamp.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/opengrok-indexer/src/main/java/org/opengrok/indexer/configuration/IndexTimestamp.java b/opengrok-indexer/src/main/java/org/opengrok/indexer/configuration/IndexTimestamp.java index 95981dd9127..0e25fc9fcc7 100644 --- a/opengrok-indexer/src/main/java/org/opengrok/indexer/configuration/IndexTimestamp.java +++ b/opengrok-indexer/src/main/java/org/opengrok/indexer/configuration/IndexTimestamp.java @@ -29,6 +29,7 @@ import java.util.logging.Logger; import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.VisibleForTesting; import org.opengrok.indexer.logger.LoggerFactory; public class IndexTimestamp { @@ -36,6 +37,7 @@ public class IndexTimestamp { private static final Logger LOGGER = LoggerFactory.getLogger(IndexTimestamp.class); + @VisibleForTesting public static final String TIMESTAMP_FILE_NAME = "timestamp"; /** From d291885decf178a2a5dadd9b2781342c77c73a71 Mon Sep 17 00:00:00 2001 From: Vladimir Kotal Date: Mon, 22 Sep 2025 15:58:03 +0200 Subject: [PATCH 3/4] add comment --- opengrok-web/src/test/java/org/opengrok/web/PageConfigTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/opengrok-web/src/test/java/org/opengrok/web/PageConfigTest.java b/opengrok-web/src/test/java/org/opengrok/web/PageConfigTest.java index e9cc0d5ed85..2ed859a535b 100644 --- a/opengrok-web/src/test/java/org/opengrok/web/PageConfigTest.java +++ b/opengrok-web/src/test/java/org/opengrok/web/PageConfigTest.java @@ -675,6 +675,7 @@ public String getPathInfo() { } }; + // The ETag value depends on the timestamp file. RuntimeEnvironment env = RuntimeEnvironment.getInstance(); env.refreshDateForLastIndexRun(); Path timestampPath = Path.of(env.getDataRootPath(), IndexTimestamp.TIMESTAMP_FILE_NAME); From 568980d1f1ed48af47d6b17374f9e034d705f4da Mon Sep 17 00:00:00 2001 From: Vladimir Kotal Date: Mon, 22 Sep 2025 16:29:23 +0200 Subject: [PATCH 4/4] delete the timestamp file up front --- .../src/test/java/org/opengrok/web/PageConfigTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/opengrok-web/src/test/java/org/opengrok/web/PageConfigTest.java b/opengrok-web/src/test/java/org/opengrok/web/PageConfigTest.java index 2ed859a535b..5f30fb2f9fa 100644 --- a/opengrok-web/src/test/java/org/opengrok/web/PageConfigTest.java +++ b/opengrok-web/src/test/java/org/opengrok/web/PageConfigTest.java @@ -679,11 +679,10 @@ public String getPathInfo() { RuntimeEnvironment env = RuntimeEnvironment.getInstance(); env.refreshDateForLastIndexRun(); Path timestampPath = Path.of(env.getDataRootPath(), IndexTimestamp.TIMESTAMP_FILE_NAME); + Files.deleteIfExists(timestampPath); if (createTimestamp) { Files.createFile(timestampPath); assertTrue(timestampPath.toFile().exists()); - } else { - Files.deleteIfExists(timestampPath); } PageConfig cfg = PageConfig.get(req);