From 3c413914b71c1118a1c1c4cce1608c2a2f0eaa9a Mon Sep 17 00:00:00 2001 From: James Kebinger Date: Fri, 19 Sep 2025 17:19:37 -0500 Subject: [PATCH] Add support for 'reforge.current-time' property key MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This change adds compatibility for the 'reforge.current-time' property key alongside the existing 'prefab.current-time' key. Both keys now provide the same current timestamp functionality for SDK compatibility. Changes: - Added REFORGE_CURRENT_TIME_KEY constant in ConfigRuleEvaluator - Updated prop() method to handle both time property keys - Added comprehensive test cases for both time key variants 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- .../client/internal/ConfigRuleEvaluator.java | 3 +- .../internal/ConfigRuleEvaluatorTest.java | 51 +++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/client/src/main/java/cloud/prefab/client/internal/ConfigRuleEvaluator.java b/client/src/main/java/cloud/prefab/client/internal/ConfigRuleEvaluator.java index 46eb225..6c5c7c2 100644 --- a/client/src/main/java/cloud/prefab/client/internal/ConfigRuleEvaluator.java +++ b/client/src/main/java/cloud/prefab/client/internal/ConfigRuleEvaluator.java @@ -32,6 +32,7 @@ public class ConfigRuleEvaluator { public static final String CURRENT_TIME_KEY = "prefab.current-time"; + public static final String REFORGE_CURRENT_TIME_KEY = "reforge.current-time"; private static final Logger LOG = LoggerFactory.getLogger(ConfigRuleEvaluator.class); private final ConfigStore configStore; @@ -242,7 +243,7 @@ private Optional prop( } } //TODO: move this current time injection into a ContextResolver class? - if (CURRENT_TIME_KEY.equals(key)) { + if (CURRENT_TIME_KEY.equals(key) || REFORGE_CURRENT_TIME_KEY.equals(key)) { return Optional.of( Prefab.ConfigValue.newBuilder().setInt(System.currentTimeMillis()).build() ); diff --git a/client/src/test/java/cloud/prefab/client/internal/ConfigRuleEvaluatorTest.java b/client/src/test/java/cloud/prefab/client/internal/ConfigRuleEvaluatorTest.java index d904e51..4efdc85 100644 --- a/client/src/test/java/cloud/prefab/client/internal/ConfigRuleEvaluatorTest.java +++ b/client/src/test/java/cloud/prefab/client/internal/ConfigRuleEvaluatorTest.java @@ -583,6 +583,57 @@ public void testTimeAfterRange() { assertThat(eval.isMatch()).isFalse(); } + @Test + public void testReforgeTimeInRange() { + // note this relies on ConfigRuleEvaluator on-demand adding the current time for reforge.current-time + final Prefab.Criterion intRangeCriterion = Prefab.Criterion + .newBuilder() + .setPropertyName(ConfigRuleEvaluator.REFORGE_CURRENT_TIME_KEY) + .setValueToMatch( + Prefab.ConfigValue.newBuilder().setIntRange(Prefab.IntRange.newBuilder().build()) + ) + .setOperator(Prefab.Criterion.CriterionOperator.IN_INT_RANGE) + .build(); + + final EvaluatedCriterion positiveEval = evaluator + .evaluateCriterionMatch(intRangeCriterion, LookupContext.EMPTY) + .stream() + .findFirst() + .get(); + + assertThat(positiveEval.isMatch()).isTrue(); + } + + @Test + public void testReforgeTimeAfterRange() { + // note this relies on ConfigRuleEvaluator on-demand adding the current time for reforge.current-time + long currentTime = System.currentTimeMillis(); + + final Prefab.Criterion intRangeCriterion = Prefab.Criterion + .newBuilder() + .setPropertyName(ConfigRuleEvaluator.REFORGE_CURRENT_TIME_KEY) + .setValueToMatch( + Prefab.ConfigValue + .newBuilder() + .setIntRange( + Prefab.IntRange + .newBuilder() + .setEnd(currentTime - TimeUnit.MINUTES.toMillis(2)) + .build() + ) + ) + .setOperator(Prefab.Criterion.CriterionOperator.IN_INT_RANGE) + .build(); + + final EvaluatedCriterion eval = evaluator + .evaluateCriterionMatch(intRangeCriterion, LookupContext.EMPTY) + .stream() + .findFirst() + .get(); + + assertThat(eval.isMatch()).isFalse(); + } + public static Stream comparisonArguments() { return Stream.of( Arguments.of(