mirror of
https://github.com/corda/corda.git
synced 2024-12-20 05:28:21 +00:00
CORDA-3643: Initialise MockNetwork's serialisation environment with all custom cordapps. (#6115)
This commit is contained in:
parent
76cf4e6e66
commit
a7358ffa1a
@ -0,0 +1,63 @@
|
|||||||
|
package net.corda.node
|
||||||
|
|
||||||
|
import net.corda.contracts.serialization.custom.Currantsy
|
||||||
|
import net.corda.core.contracts.TransactionVerificationException.ContractRejection
|
||||||
|
import net.corda.flows.serialization.custom.CustomSerializerFlow
|
||||||
|
import net.corda.testing.common.internal.testNetworkParameters
|
||||||
|
import net.corda.testing.node.MockNetwork
|
||||||
|
import net.corda.testing.node.MockNetworkParameters
|
||||||
|
import net.corda.testing.node.internal.cordappWithPackages
|
||||||
|
import org.assertj.core.api.Assertions.assertThat
|
||||||
|
import org.junit.After
|
||||||
|
import org.junit.Before
|
||||||
|
import org.junit.BeforeClass
|
||||||
|
import org.junit.Test
|
||||||
|
import java.util.concurrent.ExecutionException
|
||||||
|
import kotlin.test.assertFailsWith
|
||||||
|
|
||||||
|
@Suppress("FunctionName")
|
||||||
|
class MockNetworkCustomSerializerTest {
|
||||||
|
companion object {
|
||||||
|
private const val CURRANTS = 5000L
|
||||||
|
|
||||||
|
@JvmField
|
||||||
|
val currantsy = Currantsy(CURRANTS)
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
@JvmStatic
|
||||||
|
fun checkData() {
|
||||||
|
assertNotCordaSerializable<Currantsy>()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private lateinit var mockNetwork: MockNetwork
|
||||||
|
|
||||||
|
@Before
|
||||||
|
fun setup() {
|
||||||
|
mockNetwork = MockNetwork(
|
||||||
|
MockNetworkParameters(
|
||||||
|
networkParameters = testNetworkParameters(minimumPlatformVersion = 4),
|
||||||
|
cordappsForAllNodes = listOf(
|
||||||
|
cordappWithPackages("net.corda.flows.serialization.custom").signed(),
|
||||||
|
cordappWithPackages("net.corda.contracts.serialization.custom").signed()
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
fun shutdown() {
|
||||||
|
mockNetwork.stopNodes()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(timeout = 300_000)
|
||||||
|
fun `flow with custom serializer mock network`() {
|
||||||
|
val a = mockNetwork.createPartyNode()
|
||||||
|
val ex = assertFailsWith<ExecutionException> {
|
||||||
|
a.startFlow(CustomSerializerFlow(currantsy)).get()
|
||||||
|
}
|
||||||
|
assertThat(ex)
|
||||||
|
.hasCauseExactlyInstanceOf(ContractRejection::class.java)
|
||||||
|
.hasMessageContaining("Too many currants! $currantsy is unraisinable!")
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,66 @@
|
|||||||
|
package net.corda.node
|
||||||
|
|
||||||
|
import net.corda.contracts.serialization.whitelist.WhitelistData
|
||||||
|
import net.corda.core.contracts.TransactionVerificationException.ContractRejection
|
||||||
|
import net.corda.flows.serialization.whitelist.WhitelistFlow
|
||||||
|
import net.corda.testing.common.internal.testNetworkParameters
|
||||||
|
import net.corda.testing.node.MockNetwork
|
||||||
|
import net.corda.testing.node.MockNetworkParameters
|
||||||
|
import net.corda.testing.node.internal.cordappWithPackages
|
||||||
|
import org.assertj.core.api.Assertions.assertThat
|
||||||
|
import org.junit.After
|
||||||
|
import org.junit.Before
|
||||||
|
import org.junit.BeforeClass
|
||||||
|
import org.junit.Test
|
||||||
|
import java.util.concurrent.ExecutionException
|
||||||
|
import kotlin.test.assertFailsWith
|
||||||
|
|
||||||
|
@Suppress("FunctionName")
|
||||||
|
class MockNetworkSerializationWhitelistTest {
|
||||||
|
companion object {
|
||||||
|
private const val DATA = 654321L
|
||||||
|
|
||||||
|
@JvmField
|
||||||
|
val contractCordapp = cordappWithPackages("net.corda.contracts.serialization.whitelist").signed()
|
||||||
|
|
||||||
|
@JvmField
|
||||||
|
val workflowCordapp = cordappWithPackages("net.corda.flows.serialization.whitelist").signed()
|
||||||
|
|
||||||
|
@JvmField
|
||||||
|
val badData = WhitelistData(DATA)
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
@JvmStatic
|
||||||
|
fun checkData() {
|
||||||
|
assertNotCordaSerializable<WhitelistData>()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private lateinit var mockNetwork: MockNetwork
|
||||||
|
|
||||||
|
@Before
|
||||||
|
fun setup() {
|
||||||
|
mockNetwork = MockNetwork(
|
||||||
|
MockNetworkParameters(
|
||||||
|
networkParameters = testNetworkParameters(minimumPlatformVersion = 4),
|
||||||
|
cordappsForAllNodes = listOf(contractCordapp, workflowCordapp)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
fun shutdown() {
|
||||||
|
mockNetwork.stopNodes()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(timeout = 300_000)
|
||||||
|
fun `test serialization whitelist with mock network`() {
|
||||||
|
val node = mockNetwork.createPartyNode()
|
||||||
|
val ex = assertFailsWith<ExecutionException> {
|
||||||
|
node.startFlow(WhitelistFlow(badData)).get()
|
||||||
|
}
|
||||||
|
assertThat(ex)
|
||||||
|
.hasCauseExactlyInstanceOf(ContractRejection::class.java)
|
||||||
|
.hasMessageContaining("WhitelistData $badData exceeds maximum value!")
|
||||||
|
}
|
||||||
|
}
|
@ -62,6 +62,7 @@ import rx.Observable
|
|||||||
import rx.Scheduler
|
import rx.Scheduler
|
||||||
import rx.internal.schedulers.CachedThreadScheduler
|
import rx.internal.schedulers.CachedThreadScheduler
|
||||||
import java.math.BigInteger
|
import java.math.BigInteger
|
||||||
|
import java.net.URLClassLoader
|
||||||
import java.nio.file.Path
|
import java.nio.file.Path
|
||||||
import java.nio.file.Paths
|
import java.nio.file.Paths
|
||||||
import java.security.PublicKey
|
import java.security.PublicKey
|
||||||
@ -148,6 +149,14 @@ open class InternalMockNetwork(cordappPackages: List<String> = emptyList(),
|
|||||||
val defaultFactory: (MockNodeArgs) -> MockNode = { args -> MockNode(args) },
|
val defaultFactory: (MockNodeArgs) -> MockNode = { args -> MockNode(args) },
|
||||||
cordappsForAllNodes: Collection<TestCordappInternal> = emptySet(),
|
cordappsForAllNodes: Collection<TestCordappInternal> = emptySet(),
|
||||||
val autoVisibleNodes: Boolean = true) : AutoCloseable {
|
val autoVisibleNodes: Boolean = true) : AutoCloseable {
|
||||||
|
companion object {
|
||||||
|
fun createCordappClassLoader(cordapps: Collection<TestCordappInternal>?): URLClassLoader? {
|
||||||
|
if (cordapps == null || cordapps.isEmpty()) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
return URLClassLoader(cordapps.map { it.jarFile.toUri().toURL() }.toTypedArray())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var networkParameters: NetworkParameters = initialNetworkParameters
|
var networkParameters: NetworkParameters = initialNetworkParameters
|
||||||
private set
|
private set
|
||||||
@ -168,9 +177,12 @@ open class InternalMockNetwork(cordappPackages: List<String> = emptyList(),
|
|||||||
private val networkId = random63BitValue()
|
private val networkId = random63BitValue()
|
||||||
private val networkParametersCopier: NetworkParametersCopier
|
private val networkParametersCopier: NetworkParametersCopier
|
||||||
private val _nodes = mutableListOf<MockNode>()
|
private val _nodes = mutableListOf<MockNode>()
|
||||||
private val serializationEnv = checkNotNull(setDriverSerialization()) { "Using more than one mock network simultaneously is not supported." }
|
|
||||||
private val sharedUserCount = AtomicInteger(0)
|
private val sharedUserCount = AtomicInteger(0)
|
||||||
private val combinedCordappsForAllNodes = cordappsForPackages(cordappPackages) + cordappsForAllNodes
|
private val combinedCordappsForAllNodes = cordappsForPackages(cordappPackages) + cordappsForAllNodes
|
||||||
|
private val cordappClassLoader = createCordappClassLoader(combinedCordappsForAllNodes)
|
||||||
|
private val serializationEnv = checkNotNull(setDriverSerialization(cordappClassLoader)) {
|
||||||
|
"Using more than one mock network simultaneously is not supported."
|
||||||
|
}
|
||||||
|
|
||||||
/** A read only view of the current set of nodes. */
|
/** A read only view of the current set of nodes. */
|
||||||
val nodes: List<MockNode> get() = _nodes
|
val nodes: List<MockNode> get() = _nodes
|
||||||
@ -565,11 +577,13 @@ open class InternalMockNetwork(cordappPackages: List<String> = emptyList(),
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun stopNodes() {
|
fun stopNodes() {
|
||||||
// Serialization env must be unset even if other parts of this method fail.
|
cordappClassLoader.use { _ ->
|
||||||
serializationEnv.use {
|
// Serialization env must be unset even if other parts of this method fail.
|
||||||
nodes.forEach { it.started?.dispose() }
|
serializationEnv.use {
|
||||||
|
nodes.forEach { it.started?.dispose() }
|
||||||
|
}
|
||||||
|
messagingNetwork.stop()
|
||||||
}
|
}
|
||||||
messagingNetwork.stop()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Block until all scheduled activity, active flows and network activity has ceased. */
|
/** Block until all scheduled activity, active flows and network activity has ceased. */
|
||||||
|
Loading…
Reference in New Issue
Block a user