ENT-2489: Fix serialization for some of the CordaExceptions. (#3925)

Also add a unit test that exposes the problem.

Without these changes AMQP serialization fails with the following:
```
 net.corda.serialization.internal.amqp.AMQPNotSerializableException: Constructor parameter - "reason" -  doesn't refer to a property of "class net.corda.node.services.statemachine.SessionRejectException"
	at net.corda.serialization.internal.amqp.SerializationHelperKt.toPropertyAccessorConstructor(SerializationHelper.kt:120) ~[corda-serialization-4.0-SNAPSHOT.jar:?]
	at net.corda.serialization.internal.amqp.SerializationHelperKt.propertiesForSerializationFromConstructor(SerializationHelper.kt:107) ~[corda-serialization-4.0-SNAPSHOT.jar:?]
	at net.corda.serialization.internal.amqp.custom.ThrowableSerializer.toProxy(ThrowableSerializer.kt:28) [corda-serialization-4.0-SNAPSHOT.jar:?]
	at net.corda.serialization.internal.amqp.custom.ThrowableSerializer.toProxy(ThrowableSerializer.kt:12) [corda-serialization-4.0-SNAPSHOT.jar:?]
	at net.corda.serialization.internal.amqp.CustomSerializer$Proxy.writeDescribedObject(CustomSerializer.kt:159) [corda-serialization-4.0-SNAPSHOT.jar:?]
```
This commit is contained in:
Viktor Kolomeyko 2018-09-12 11:29:36 +01:00 committed by GitHub
parent ca5d88e65a
commit 90a7dd2bf4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 48 additions and 3 deletions

View File

@ -140,4 +140,4 @@ interface IdentityService {
fun partiesFromName(query: String, exactMatch: Boolean): Set<Party> fun partiesFromName(query: String, exactMatch: Boolean): Set<Party>
} }
class UnknownAnonymousPartyException(msg: String) : CordaException(msg) class UnknownAnonymousPartyException(message: String) : CordaException(message)

View File

@ -750,7 +750,7 @@ abstract class AbstractNode<S>(val configuration: NodeConfiguration,
} }
// Specific class so that MockNode can catch it. // Specific class so that MockNode can catch it.
class DatabaseConfigurationException(msg: String) : CordaException(msg) class DatabaseConfigurationException(message: String) : CordaException(message)
protected open fun startDatabase(metricRegistry: MetricRegistry? = null) { protected open fun startDatabase(metricRegistry: MetricRegistry? = null) {
val props = configuration.dataSourceProperties val props = configuration.dataSourceProperties

View File

@ -5,4 +5,4 @@ import net.corda.core.CordaException
/** /**
* An exception propagated and thrown in case a session initiation fails. * An exception propagated and thrown in case a session initiation fails.
*/ */
class SessionRejectException(reason: String) : CordaException(reason) class SessionRejectException(message: String) : CordaException(message)

View File

@ -0,0 +1,45 @@
package net.corda.node.services.statemachine
import net.corda.core.CordaException
import net.corda.core.node.services.UnknownAnonymousPartyException
import net.corda.core.serialization.SerializedBytes
import net.corda.core.serialization.deserialize
import net.corda.core.serialization.serialize
import net.corda.node.internal.AbstractNode
import net.corda.node.utilities.registration.CertificateRequestException
import net.corda.testing.core.SerializationEnvironmentRule
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.Parameterized
import kotlin.test.assertEquals
@RunWith(Parameterized::class)
class ExceptionsSerializationTest(private val initialException: CordaException, @Suppress("UNUSED_PARAMETER") description: String) {
companion object {
@JvmStatic
@Parameterized.Parameters(name = "{1}")
fun data(): Collection<Array<Any>> = listOf(
arrayOf<Any>(SessionRejectException("test"), "SessionRejectException"),
arrayOf<Any>(CertificateRequestException("test"), "CertificateRequestException"),
arrayOf<Any>(UnknownAnonymousPartyException("test"), "UnknownAnonymousPartyException"),
arrayOf<Any>(AbstractNode.DatabaseConfigurationException("test"), "DatabaseConfigurationException")
)
}
@Rule
@JvmField
val testSerialization = SerializationEnvironmentRule()
@Test
fun testMarshal() {
val fromSerialized = performRoundTripSerialization(initialException)
assertEquals(initialException.message, fromSerialized.message)
}
private inline fun <reified T : Any> performRoundTripSerialization(obj: T): T {
val serializedForm: SerializedBytes<T> = obj.serialize()
return serializedForm.deserialize()
}
}