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 8b6050b1f0a1ab972e5eb204d8a0857e2e220c0b
Author: Alex Heneveld <[email protected]>
AuthorDate: Sat Mar 18 09:31:34 2023 +0000

    add two tests for type field being obeyed when it shouldn't be
    
    indicating the current behaviour and what we want to resolve
---
 .../brooklyn/camp/brooklyn/WorkflowYamlTest.java   | 31 +++++++++++++++++
 ...klynRegisteredTypeJacksonSerializationTest.java | 39 ++++++++++++++++++++++
 2 files changed, 70 insertions(+)

diff --git 
a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/WorkflowYamlTest.java
 
b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/WorkflowYamlTest.java
index 5a3840925c..88d1f3d126 100644
--- 
a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/WorkflowYamlTest.java
+++ 
b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/WorkflowYamlTest.java
@@ -147,6 +147,37 @@ public class WorkflowYamlTest extends AbstractYamlTest {
         EntityAsserts.assertConfigEquals(entity, 
ConfigKeys.newConfigKey(Object.class, "foo"), 2);
     }
 
+    public static class SpecialMap {
+        String x;
+    }
+
+    @Test(groups="WIP")
+    public void testWorkflowComplexSensor() throws Exception {
+        Entity app = createAndStartApplication(
+                "services:",
+                "- type: " + BasicEntity.class.getName(),
+                "  brooklyn.initializers:",
+                "  - type: workflow-initializer",
+                "    brooklyn.config:",
+                "      steps:",
+                "        - type: set-sensor",
+                "          input:",
+                "            sensor:",
+                "              name: foo",
+                "              type: "+SpecialMap.class.getName(),
+                "            value:",
+                "              x: bar",
+                "");
+        waitForApplicationTasks(app);
+
+        Entity entity = Iterables.getOnlyElement(app.getChildren());
+        EntityAsserts.assertAttribute(entity, Sensors.newSensor(Object.class, 
"foo"), v -> {
+            Asserts.assertInstanceOf(v, SpecialMap.class);
+            Asserts.assertEquals( ((SpecialMap)v).x, "bar" );
+            return true;
+        });
+    }
+
     @Test
     public void testWorkflowSensorTrigger() throws Exception {
         doTestWorkflowSensor("triggers: theTrigger", 
Duration.seconds(1)::isLongerThan);
diff --git 
a/core/src/test/java/org/apache/brooklyn/core/resolve/jackson/BrooklynRegisteredTypeJacksonSerializationTest.java
 
b/core/src/test/java/org/apache/brooklyn/core/resolve/jackson/BrooklynRegisteredTypeJacksonSerializationTest.java
index 218bc784c4..242dbf0a85 100644
--- 
a/core/src/test/java/org/apache/brooklyn/core/resolve/jackson/BrooklynRegisteredTypeJacksonSerializationTest.java
+++ 
b/core/src/test/java/org/apache/brooklyn/core/resolve/jackson/BrooklynRegisteredTypeJacksonSerializationTest.java
@@ -34,6 +34,7 @@ import org.apache.brooklyn.core.typereg.RegisteredTypes;
 import org.apache.brooklyn.core.workflow.WorkflowSensor;
 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.core.config.ConfigBag;
 import org.apache.brooklyn.util.text.Strings;
 import org.apache.brooklyn.util.time.Duration;
@@ -195,6 +196,44 @@ public class 
BrooklynRegisteredTypeJacksonSerializationTest extends BrooklynMgmt
                 e -> Asserts.expectedFailureContainsIgnoreCase(e, 
"unrecognized field", "xx"));
     }
 
+    public static class OtherBean {
+        public String x;
+        public String other;
+    }
+
+    @Test
+    public void testDeserializeSampleBeanWithOtherType() throws Exception {
+        String deser = "{\"type\":\"" + OtherBean.class.getName() + 
"\",\"x\":\"hello\"}";
+        Asserts.assertInstanceOf(deser(deser, SampleBeanWithType.class), 
SampleBeanWithType.class);
+        Asserts.assertInstanceOf(deser(deser, OtherBean.class), 
OtherBean.class);
+        Asserts.assertInstanceOf(deser(deser), OtherBean.class);
+
+        String deser2 = "{\"type\":\"" + OtherBean.class.getName() + 
"\",\"other\":\"hello\"}";
+        Asserts.assertFailsWith(()->deser(deser2, SampleBeanWithType.class), 
e->true);
+        Asserts.assertInstanceOf(deser(deser2, OtherBean.class), 
OtherBean.class);
+        Asserts.assertInstanceOf(deser(deser2), OtherBean.class);
+
+        String deser3 = "{\"type\":\"" + OtherBean.class.getName() + 
"\",\"y\":\"hello\"}";
+        Asserts.assertFailsWith(()->deser(deser3, OtherBean.class), e->true);  
// expected as y doesn't exist on OtherBean
+        Asserts.assertInstanceOf(deser(deser3, SampleBeanWithType.class), 
SampleBeanWithType.class);
+        Asserts.assertFailsWith(()->deser(deser3), e->true);
+        // TODO above should satisfy the below instead, contianing the type
+        // Asserts.assertInstanceOf(deser(deser3), Map.class);
+
+        // TODO would be nice to support this but that might break maps 
containing [type] ?? what happens if we serialize a map containing type as an 
object?
+//        String deser4 = "{\"[type]\":\"" + OtherBean.class.getName() + 
"\",\"y\":\"hello\"}";
+//        Asserts.assertFailsWith(()->deser(deser3, OtherBean.class), e->true);
+//        Asserts.assertInstanceOf(deser(deser3, SampleBeanWithType.class), 
SampleBeanWithType.class);
+//        Asserts.assertInstanceOf(deser(deser3), Map.class);
+//        Asserts.assertEquals( ((Map)deser(deser3)).get("type"), 
OtherBean.class.getName());
+//        Asserts.assertNull( ((Map)deser(deser3)).get("[type]") );
+//        Asserts.assertInstanceOf(deser(deser3, Map.class), Map.class);
+//        Asserts.assertEquals( ((Map)deser(deser3)).get("[type]"), 
OtherBean.class.getName());
+//        Asserts.assertNull( ((Map)deser(deser3)).get("type") );
+
+        Asserts.assertEquals(ser(MutableList.of(MutableMap.of("type", 
OtherBean.class.getName(), "x", "hello"))), 
"[{\"type\":\""+OtherBean.class.getName()+"\",\"x\":\"hello\"}]");
+    }
+
     @Test
     public void testDeserializeEntityInitializerWithTypeField() throws 
Exception {
         BrooklynAppUnitTestSupport.addRegisteredTypeBean(mgmt, 
"samplebean-with-type", "1", SampleBeanWithType.class);

Reply via email to