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(

Reply via email to