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);
