From 0f139b5bb05ceeb87f042a0c8290dbaf9a36c0ef Mon Sep 17 00:00:00 2001 From: Joseph Zuniga-Daly Date: Fri, 3 Jul 2020 13:39:07 +0100 Subject: [PATCH] Test serializer configured with abstract class --- ...ckNetworkCustomSerializerCheckpointTest.kt | 76 +++++++++++++++---- 1 file changed, 61 insertions(+), 15 deletions(-) diff --git a/node/src/integration-test/kotlin/net/corda/node/MockNetworkCustomSerializerCheckpointTest.kt b/node/src/integration-test/kotlin/net/corda/node/MockNetworkCustomSerializerCheckpointTest.kt index 2625575feb..ff261bb019 100644 --- a/node/src/integration-test/kotlin/net/corda/node/MockNetworkCustomSerializerCheckpointTest.kt +++ b/node/src/integration-test/kotlin/net/corda/node/MockNetworkCustomSerializerCheckpointTest.kt @@ -41,7 +41,7 @@ class MockNetworkCustomSerializerCheckpointTest{ @Test(timeout = 300_000) fun `check references are restored correctly`() { val node = mockNetwork.createPartyNode() - val expectedReference = BrokenMap() + val expectedReference = BrokenMapClass() expectedReference.putAll(mapOf("one" to 1)) val actualReference = node.startFlow(TestFlowCheckingReferencesWork(expectedReference)).get() @@ -57,13 +57,23 @@ class MockNetworkCustomSerializerCheckpointTest{ Assertions.assertThat(result).isEqualTo(5) } + @Test(timeout = 300_000) + @Suspendable + fun `check serilization of abstract classes`() { + val node = mockNetwork.createPartyNode() + val result = node.startFlow(TestFlowWithDifficultToSerializeLocalVariableAsAbstract(5)).get() + Assertions.assertThat(result).isEqualTo(5) + } + + // Flows + @StartableByRPC - class TestFlowWithDifficultToSerializeLocalVariableAsInterface(private val purchase: Int) : FlowLogic() { + class TestFlowWithDifficultToSerializeLocalVariableAsAbstract(private val purchase: Int) : FlowLogic() { @Suspendable override fun call(): Int { // This object is difficult to serialize with Kryo - val difficultToSerialize: BrokenMapInterface = BrokenMapSerializedByInterfaceImpl() + val difficultToSerialize: BrokenMapAbstract = BrokenMapAbstractImpl() difficultToSerialize.putAll(mapOf("foo" to purchase)) // Force a checkpoint @@ -74,7 +84,23 @@ class MockNetworkCustomSerializerCheckpointTest{ } } - // Flows + + @StartableByRPC + class TestFlowWithDifficultToSerializeLocalVariableAsInterface(private val purchase: Int) : FlowLogic() { + @Suspendable + override fun call(): Int { + + // This object is difficult to serialize with Kryo + val difficultToSerialize: BrokenMapInterface = BrokenMapInterfaceImpl() + difficultToSerialize.putAll(mapOf("foo" to purchase)) + + // Force a checkpoint + sleep(Duration.ofSeconds(0)) + + // Return value from deserialized object + return difficultToSerialize["foo"] ?: 0 + } + } @StartableByRPC class TestFlowWithDifficultToSerializeLocalVariable(private val purchase: Int) : FlowLogic() { @@ -82,7 +108,7 @@ class MockNetworkCustomSerializerCheckpointTest{ override fun call(): Int { // This object is difficult to serialize with Kryo - val difficultToSerialize: BrokenMap = BrokenMap() + val difficultToSerialize: BrokenMapClass = BrokenMapClass() difficultToSerialize.putAll(mapOf("foo" to purchase)) // Force a checkpoint @@ -94,12 +120,12 @@ class MockNetworkCustomSerializerCheckpointTest{ } @StartableByRPC - class TestFlowCheckingReferencesWork(private val reference: BrokenMap) : FlowLogic>() { + class TestFlowCheckingReferencesWork(private val reference: BrokenMapClass) : FlowLogic>() { private val referenceField = reference @Suspendable - override fun call(): BrokenMap { + override fun call(): BrokenMapClass { val ref = referenceField @@ -118,7 +144,7 @@ class MockNetworkCustomSerializerCheckpointTest{ // Broken Map // This map breaks the rules for the put method. Making the normal map serializer fail. - open class BrokenMapImpl : MutableMap{ + open class BrokenMapBaseImpl : MutableMap{ private val map = HashMap() override val size: Int @@ -141,11 +167,16 @@ class MockNetworkCustomSerializerCheckpointTest{ } // A class to test custom serializers applied to implementations - class BrokenMap : BrokenMapImpl() + class BrokenMapClass : BrokenMapBaseImpl() // An interface and implementation to test custom serializers applied to interface types interface BrokenMapInterface : MutableMap - class BrokenMapSerializedByInterfaceImpl : BrokenMapImpl(), BrokenMapInterface + class BrokenMapInterfaceImpl : BrokenMapBaseImpl(), BrokenMapInterface + + // An abstract class and implementation to test custom serializers applied to interface types + abstract class BrokenMapAbstract : BrokenMapBaseImpl(), MutableMap + class BrokenMapAbstractImpl : BrokenMapAbstract() + // Custom serializers @@ -159,21 +190,36 @@ class MockNetworkCustomSerializerCheckpointTest{ } override fun fromProxy(proxy: HashMap): BrokenMapInterface { - return BrokenMapSerializedByInterfaceImpl().also { it.putAll(proxy) } + return BrokenMapInterfaceImpl().also { it.putAll(proxy) } } } @Suppress("unused") class TestClassSerializer : - CheckpointCustomSerializer, HashMap> { + CheckpointCustomSerializer, HashMap> { - override fun toProxy(obj: BrokenMap): HashMap { + override fun toProxy(obj: BrokenMapClass): HashMap { val proxy = HashMap() return obj.toMap(proxy) } - override fun fromProxy(proxy: HashMap): BrokenMap { - return BrokenMap().also { it.putAll(proxy) } + override fun fromProxy(proxy: HashMap): BrokenMapClass { + return BrokenMapClass().also { it.putAll(proxy) } } } + + @Suppress("unused") + class TestAbstractClassSerializer : + CheckpointCustomSerializer, HashMap> { + + override fun toProxy(obj: BrokenMapAbstract): HashMap { + val proxy = HashMap() + return obj.toMap(proxy) + } + + override fun fromProxy(proxy: HashMap): BrokenMapAbstract { + return BrokenMapAbstractImpl().also { it.putAll(proxy) } + } + } + }