This is an automated email from the ASF dual-hosted git repository. heneveld pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/brooklyn-server.git
commit d78810d46e7dfaca1f1207972c719e8143b22a4b Author: Alex Heneveld <[email protected]> AuthorDate: Tue Dec 13 00:00:08 2022 +0000 fix edge case where dsl comparison predicate failed on durations --- .../util/core/predicates/DslPredicates.java | 2 +- .../util/core/predicates/DslPredicateTest.java | 39 ++++++++++++++++++---- 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/org/apache/brooklyn/util/core/predicates/DslPredicates.java b/core/src/main/java/org/apache/brooklyn/util/core/predicates/DslPredicates.java index f453f45271..3730ed0d1a 100644 --- a/core/src/main/java/org/apache/brooklyn/util/core/predicates/DslPredicates.java +++ b/core/src/main/java/org/apache/brooklyn/util/core/predicates/DslPredicates.java @@ -161,7 +161,7 @@ public class DslPredicates { return coercedCompare(a instanceof DeferredSupplier ? ((DeferredSupplier)a).get() : a, b instanceof DeferredSupplier ? ((DeferredSupplier)b).get() : b); // if classes are equal or one is a subclass of the other, and the above check was false, that is decisive - if (a.getClass().isAssignableFrom(b.getClass()) && b instanceof Comparable) return ((Comparable) b).compareTo(a); + if (a.getClass().isAssignableFrom(b.getClass()) && b instanceof Comparable) return -((Comparable) b).compareTo(a); if (b.getClass().isAssignableFrom(a.getClass()) && a instanceof Comparable) return ((Comparable) a).compareTo(b); BiFunction<Maybe<?>,Maybe<?>,Integer> maybeCoercedCompare = (ma,mb) -> { diff --git a/core/src/test/java/org/apache/brooklyn/util/core/predicates/DslPredicateTest.java b/core/src/test/java/org/apache/brooklyn/util/core/predicates/DslPredicateTest.java index ca605756fe..a971d8a79e 100644 --- a/core/src/test/java/org/apache/brooklyn/util/core/predicates/DslPredicateTest.java +++ b/core/src/test/java/org/apache/brooklyn/util/core/predicates/DslPredicateTest.java @@ -18,15 +18,14 @@ */ package org.apache.brooklyn.util.core.predicates; -import net.bytebuddy.implementation.bytecode.Throw; import org.apache.brooklyn.core.test.BrooklynMgmtUnitTestSupport; import org.apache.brooklyn.test.Asserts; import org.apache.brooklyn.util.collections.MutableList; import org.apache.brooklyn.util.collections.MutableMap; import org.apache.brooklyn.util.collections.MutableSet; import org.apache.brooklyn.util.core.flags.TypeCoercions; +import org.apache.brooklyn.util.time.Duration; import org.apache.brooklyn.util.time.Time; -import org.apache.brooklyn.util.time.Timestamp; import org.testng.annotations.Test; import java.util.Arrays; @@ -146,14 +145,14 @@ public class DslPredicateTest extends BrooklynMgmtUnitTestSupport { public void testDateGreaterThanOrEquals() { DslPredicates.DslPredicate p = TypeCoercions.coerce(MutableMap.of( "greater-than-or-equal-to", "2022-06-01"), DslPredicates.DslPredicate.class); - Asserts.assertFalse(p.test(Time.parseInstant("2022-06-02"))); - Asserts.assertTrue(p.test(Time.parseInstant("2022-05-31"))); + Asserts.assertTrue(p.test(Time.parseInstant("2022-06-02"))); + Asserts.assertFalse(p.test(Time.parseInstant("2022-05-31"))); // ensure it isn't doing string compare if either side is strongly typed p = TypeCoercions.coerce(MutableMap.of( "greater-than-or-equal-to", "2022.06.01"), DslPredicates.DslPredicate.class); - Asserts.assertFalse(p.test(Time.parseInstant("2022-06-02"))); - Asserts.assertTrue(p.test(Time.parseInstant("2022-05-31"))); + Asserts.assertTrue(p.test(Time.parseInstant("2022-06-02"))); + Asserts.assertFalse(p.test(Time.parseInstant("2022-05-31"))); // whereas if none are strongly typed it does string compare Asserts.assertFalse(p.test("2022-06-02")); @@ -176,6 +175,34 @@ public class DslPredicateTest extends BrooklynMgmtUnitTestSupport { Asserts.assertTrue(p.test("2022.05.31")); } + @Test + public void testLessThanPrefersNonStringComparison() { + DslPredicates.DslPredicate p; + p = TypeCoercions.coerce(MutableMap.of( + "less-than", "2m"), DslPredicates.DslPredicate.class); + + Asserts.assertTrue(p.test(Duration.of("5s"))); + Asserts.assertFalse(p.test(Duration.of("5m"))); + Asserts.assertTrue(p.test(Duration.of("1m"))); + Asserts.assertFalse(p.test(Duration.of("1h"))); + + p = TypeCoercions.coerce(MutableMap.of( + "less-than", Duration.of("2m")), DslPredicates.DslPredicate.class); + + Asserts.assertTrue(p.test(Duration.of("5s"))); + Asserts.assertFalse(p.test(Duration.of("5m"))); + Asserts.assertTrue(p.test(Duration.of("1m"))); + Asserts.assertFalse(p.test(Duration.of("1h"))); + + p = TypeCoercions.coerce(MutableMap.of( + "less-than", Duration.of("2m")), DslPredicates.DslPredicate.class); + + Asserts.assertTrue(p.test(("5s"))); + Asserts.assertFalse(p.test(("5m"))); + Asserts.assertTrue(p.test(("1m"))); + Asserts.assertFalse(p.test(("1h"))); + } + @Test public void testInRange() { DslPredicates.DslPredicate p = TypeCoercions.coerce(MutableMap.of(
