diff --git a/src/main/kotlin/core/testing/MockNode.kt b/src/main/kotlin/core/testing/MockNode.kt index f7ecdd317b..2b42fe7f75 100644 --- a/src/main/kotlin/core/testing/MockNode.kt +++ b/src/main/kotlin/core/testing/MockNode.kt @@ -48,18 +48,18 @@ class MockNetwork(private val threadPerNode: Boolean = false, /** Allows customisation of how nodes are created. */ interface Factory { fun create(dir: Path, config: NodeConfiguration, network: MockNetwork, - timestamperAddr: NodeInfo?): MockNode + timestamperAddr: NodeInfo?, id: Int): MockNode } object DefaultFactory : Factory { override fun create(dir: Path, config: NodeConfiguration, network: MockNetwork, - timestamperAddr: NodeInfo?): MockNode { - return MockNode(dir, config, network, timestamperAddr) + timestamperAddr: NodeInfo?, id: Int): MockNode { + return MockNode(dir, config, network, timestamperAddr, id) } } open class MockNode(dir: Path, config: NodeConfiguration, val mockNet: MockNetwork, - withTimestamper: NodeInfo?, val forcedID: Int = -1) : AbstractNode(dir, config, withTimestamper, Clock.systemUTC()) { + withTimestamper: NodeInfo?, val id: Int) : AbstractNode(dir, config, withTimestamper, Clock.systemUTC()) { override val log: Logger = loggerFor() override val serverThread: ExecutorService = if (mockNet.threadPerNode) @@ -71,10 +71,8 @@ class MockNetwork(private val threadPerNode: Boolean = false, // through the java.nio API which we are already mocking via Jimfs. override fun makeMessagingService(): MessagingService { - if (forcedID == -1) - return mockNet.messagingNetwork.createNode(!mockNet.threadPerNode).second.start().get() - else - return mockNet.messagingNetwork.createNodeWithID(!mockNet.threadPerNode, forcedID).start().get() + require(id >= 0) { "Node ID must be zero or positive, was passed: " + id } + return mockNet.messagingNetwork.createNodeWithID(!mockNet.threadPerNode, id).start().get() } override fun makeIdentityService() = FixedIdentityService(mockNet.identities) @@ -105,7 +103,7 @@ class MockNetwork(private val threadPerNode: Boolean = false, override val exportJMXto: String = "" override val nearestCity: String = "Atlantis" } - val node = nodeFactory.create(path, config, this, withTimestamper).start() + val node = nodeFactory.create(path, config, this, withTimestamper, id).start() node.info.advertisedServices = advertisedServices _nodes.add(node) return node diff --git a/src/main/kotlin/core/testing/Simulation.kt b/src/main/kotlin/core/testing/Simulation.kt index 4be4f0d52b..f4931d93e0 100644 --- a/src/main/kotlin/core/testing/Simulation.kt +++ b/src/main/kotlin/core/testing/Simulation.kt @@ -32,14 +32,14 @@ abstract class Simulation(val runAsync: Boolean, // This puts together a mock network of SimulatedNodes. open class SimulatedNode(dir: Path, config: NodeConfiguration, mockNet: MockNetwork, - withTimestamper: NodeInfo?) : MockNetwork.MockNode(dir, config, mockNet, withTimestamper) { + withTimestamper: NodeInfo?, id: Int) : MockNetwork.MockNode(dir, config, mockNet, withTimestamper, id) { override fun findMyLocation(): PhysicalLocation? = CityDatabase[configuration.nearestCity] } inner class BankFactory : MockNetwork.Factory { var counter = 0 - override fun create(dir: Path, config: NodeConfiguration, network: MockNetwork, timestamperAddr: NodeInfo?): MockNetwork.MockNode { + override fun create(dir: Path, config: NodeConfiguration, network: MockNetwork, timestamperAddr: NodeInfo?, id: Int): MockNetwork.MockNode { val letter = 'A' + counter val city = bankLocations[counter++ % bankLocations.size] val cfg = object : NodeConfiguration { @@ -48,7 +48,7 @@ abstract class Simulation(val runAsync: Boolean, override val exportJMXto: String = "" override val nearestCity: String = city } - return SimulatedNode(dir, cfg, network, timestamperAddr) + return SimulatedNode(dir, cfg, network, timestamperAddr, id) } fun createAll(): List = bankLocations.map { network.createNode(timestamper.info, nodeFactory = this) as SimulatedNode } @@ -57,25 +57,25 @@ abstract class Simulation(val runAsync: Boolean, val bankFactory = BankFactory() object TimestampingNodeFactory : MockNetwork.Factory { - override fun create(dir: Path, config: NodeConfiguration, network: MockNetwork, timestamperAddr: NodeInfo?): MockNetwork.MockNode { + override fun create(dir: Path, config: NodeConfiguration, network: MockNetwork, timestamperAddr: NodeInfo?, id: Int): MockNetwork.MockNode { val cfg = object : NodeConfiguration { override val myLegalName: String = "Timestamping Service" // A magic string recognised by the CP contract override val exportJMXto: String = "" override val nearestCity: String = "Zurich" } - return SimulatedNode(dir, cfg, network, timestamperAddr) + return SimulatedNode(dir, cfg, network, timestamperAddr, id) } } object RatesOracleFactory : MockNetwork.Factory { - override fun create(dir: Path, config: NodeConfiguration, network: MockNetwork, timestamperAddr: NodeInfo?): MockNetwork.MockNode { + override fun create(dir: Path, config: NodeConfiguration, network: MockNetwork, timestamperAddr: NodeInfo?, id: Int): MockNetwork.MockNode { val cfg = object : NodeConfiguration { override val myLegalName: String = "Rates Service Provider" override val exportJMXto: String = "" override val nearestCity: String = "Madrid" } - val n = object : SimulatedNode(dir, cfg, network, timestamperAddr) { + val n = object : SimulatedNode(dir, cfg, network, timestamperAddr, id) { override fun makeInterestRatesOracleService() { super.makeInterestRatesOracleService() interestRatesService.upload(javaClass.getResourceAsStream("example.rates.txt")) @@ -86,14 +86,14 @@ abstract class Simulation(val runAsync: Boolean, } object RegulatorFactory : MockNetwork.Factory { - override fun create(dir: Path, config: NodeConfiguration, network: MockNetwork, timestamperAddr: NodeInfo?): MockNetwork.MockNode { + override fun create(dir: Path, config: NodeConfiguration, network: MockNetwork, timestamperAddr: NodeInfo?, id: Int): MockNetwork.MockNode { val cfg = object : NodeConfiguration { override val myLegalName: String = "Regulator A" override val exportJMXto: String = "" override val nearestCity: String = "Paris" } - val n = object : SimulatedNode(dir, cfg, network, timestamperAddr) { + val n = object : SimulatedNode(dir, cfg, network, timestamperAddr, id) { // TODO: Regulatory nodes don't actually exist properly, this is a last minute demo request. // So we just fire a message at a node that doesn't know how to handle it, and it'll ignore it. // But that's fine for visualisation purposes. diff --git a/src/test/kotlin/core/messaging/AttachmentTests.kt b/src/test/kotlin/core/messaging/AttachmentTests.kt index 6ed842e81d..bb5440b56f 100644 --- a/src/test/kotlin/core/messaging/AttachmentTests.kt +++ b/src/test/kotlin/core/messaging/AttachmentTests.kt @@ -87,8 +87,8 @@ class AttachmentTests { fun maliciousResponse() { // Make a node that doesn't do sanity checking at load time. val n0 = network.createNode(null, nodeFactory = object : MockNetwork.Factory { - override fun create(dir: Path, config: NodeConfiguration, network: MockNetwork, timestamperAddr: NodeInfo?): MockNetwork.MockNode { - return object : MockNetwork.MockNode(dir, config, network, timestamperAddr) { + override fun create(dir: Path, config: NodeConfiguration, network: MockNetwork, timestamperAddr: NodeInfo?, id: Int): MockNetwork.MockNode { + return object : MockNetwork.MockNode(dir, config, network, timestamperAddr, id) { override fun start(): MockNetwork.MockNode { super.start() (storage.attachments as NodeAttachmentService).checkAttachmentsOnLoad = false diff --git a/src/test/kotlin/core/messaging/TwoPartyTradeProtocolTests.kt b/src/test/kotlin/core/messaging/TwoPartyTradeProtocolTests.kt index 0090be5e90..e83dcdc677 100644 --- a/src/test/kotlin/core/messaging/TwoPartyTradeProtocolTests.kt +++ b/src/test/kotlin/core/messaging/TwoPartyTradeProtocolTests.kt @@ -154,7 +154,7 @@ class TwoPartyTradeProtocolTests : TestWithInMemoryNetwork() { // ... bring the node back up ... the act of constructing the SMM will re-register the message handlers // that Bob was waiting on before the reboot occurred. bobNode = net.createNode(timestamperAddr, bobAddr.id, object : MockNetwork.Factory { - override fun create(dir: Path, config: NodeConfiguration, network: MockNetwork, timestamperAddr: NodeInfo?): MockNetwork.MockNode { + override fun create(dir: Path, config: NodeConfiguration, network: MockNetwork, timestamperAddr: NodeInfo?, id: Int): MockNetwork.MockNode { return object : MockNetwork.MockNode(dir, config, net, timestamperAddr, bobAddr.id) { override fun initialiseStorageService(dir: Path): StorageService { val ss = super.initialiseStorageService(dir) @@ -185,8 +185,8 @@ class TwoPartyTradeProtocolTests : TestWithInMemoryNetwork() { private fun makeNodeWithTracking(name: String): MockNetwork.MockNode { // Create a node in the mock network ... return net.createNode(null, nodeFactory = object : MockNetwork.Factory { - override fun create(dir: Path, config: NodeConfiguration, network: MockNetwork, timestamperAddr: NodeInfo?): MockNetwork.MockNode { - return object : MockNetwork.MockNode(dir, config, network, timestamperAddr) { + override fun create(dir: Path, config: NodeConfiguration, network: MockNetwork, timestamperAddr: NodeInfo?, id: Int): MockNetwork.MockNode { + return object : MockNetwork.MockNode(dir, config, network, timestamperAddr, id) { // That constructs the storage service object in a customised way ... override fun constructStorageService(attachments: NodeAttachmentService, keypair: KeyPair, identity: Party): StorageServiceImpl { // To use RecordingMaps instead of ordinary HashMaps.