Skip to content

Commit

Permalink
ENT-2489: Fix serialization for some of the CordaExceptions. (corda#3925
Browse files Browse the repository at this point in the history
)

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:?]
```
  • Loading branch information
vkolomeyko authored Sep 12, 2018
1 parent ca5d88e commit 90a7dd2
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -140,4 +140,4 @@ interface IdentityService {
fun partiesFromName(query: String, exactMatch: Boolean): Set<Party>
}

class UnknownAnonymousPartyException(msg: String) : CordaException(msg)
class UnknownAnonymousPartyException(message: String) : CordaException(message)
Original file line number Diff line number Diff line change
Expand Up @@ -750,7 +750,7 @@ abstract class AbstractNode<S>(val configuration: NodeConfiguration,
}

// 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) {
val props = configuration.dataSourceProperties
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,4 @@ import net.corda.core.CordaException
/**
* An exception propagated and thrown in case a session initiation fails.
*/
class SessionRejectException(reason: String) : CordaException(reason)
class SessionRejectException(message: String) : CordaException(message)
Original file line number Diff line number Diff line change
@@ -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()
}
}

0 comments on commit 90a7dd2

Please sign in to comment.