Clean up X500 names in Corda simulation

Clean up X500 names in Corda simulation, and ensure they're consistent with the standard test names.
This includes using the locations present in those test names, which requires updates to the node
config test.
This commit is contained in:
Ross Nicoll 2017-04-27 17:44:23 +01:00
parent 780f93e625
commit e85ed639bb
16 changed files with 61 additions and 36 deletions

View File

@ -659,6 +659,7 @@ object X509Utilities {
} }
val X500Name.commonName: String get() = getRDNs(BCStyle.CN).first().first.value.toString() val X500Name.commonName: String get() = getRDNs(BCStyle.CN).first().first.value.toString()
val X500Name.location: String get() = getRDNs(BCStyle.L).first().first.value.toString()
class CertificateStream(val input: InputStream) { class CertificateStream(val input: InputStream) {
private val certificateFactory = CertificateFactory.getInstance("X.509") private val certificateFactory = CertificateFactory.getInstance("X.509")

View File

@ -20,11 +20,11 @@ val DUMMY_KEY_2: KeyPair by lazy { generateKeyPair() }
val DUMMY_NOTARY_KEY: KeyPair by lazy { entropyToKeyPair(BigInteger.valueOf(20)) } val DUMMY_NOTARY_KEY: KeyPair by lazy { entropyToKeyPair(BigInteger.valueOf(20)) }
/** Dummy notary identity for tests and simulations */ /** Dummy notary identity for tests and simulations */
val DUMMY_NOTARY: Party get() = Party(X500Name("CN=Notary Service,O=R3,OU=corda,L=London,C=UK"), DUMMY_NOTARY_KEY.public) val DUMMY_NOTARY: Party get() = Party(X500Name("CN=Notary Service,O=R3,OU=corda,L=Zurich,C=CH"), DUMMY_NOTARY_KEY.public)
val DUMMY_MAP_KEY: KeyPair by lazy { entropyToKeyPair(BigInteger.valueOf(30)) } val DUMMY_MAP_KEY: KeyPair by lazy { entropyToKeyPair(BigInteger.valueOf(30)) }
/** Dummy network map service identity for tests and simulations */ /** Dummy network map service identity for tests and simulations */
val DUMMY_MAP: Party get() = Party(X500Name("CN=Network Map Service,O=R3,OU=corda,L=London,C=UK"), DUMMY_MAP_KEY.public) val DUMMY_MAP: Party get() = Party(X500Name("CN=Network Map Service,O=R3,OU=corda,L=Amsterdam,C=NL"), DUMMY_MAP_KEY.public)
val DUMMY_BANK_A_KEY: KeyPair by lazy { entropyToKeyPair(BigInteger.valueOf(40)) } val DUMMY_BANK_A_KEY: KeyPair by lazy { entropyToKeyPair(BigInteger.valueOf(40)) }
/** Dummy bank identity for tests and simulations */ /** Dummy bank identity for tests and simulations */
@ -32,11 +32,11 @@ val DUMMY_BANK_A: Party get() = Party(X500Name("CN=Bank A,O=Bank A,L=London,C=UK
val DUMMY_BANK_B_KEY: KeyPair by lazy { entropyToKeyPair(BigInteger.valueOf(50)) } val DUMMY_BANK_B_KEY: KeyPair by lazy { entropyToKeyPair(BigInteger.valueOf(50)) }
/** Dummy bank identity for tests and simulations */ /** Dummy bank identity for tests and simulations */
val DUMMY_BANK_B: Party get() = Party(X500Name("CN=Bank B,O=Bank B,L=New York,C=USA"), DUMMY_BANK_B_KEY.public) val DUMMY_BANK_B: Party get() = Party(X500Name("CN=Bank B,O=Bank B,L=New York,C=US"), DUMMY_BANK_B_KEY.public)
val DUMMY_BANK_C_KEY: KeyPair by lazy { entropyToKeyPair(BigInteger.valueOf(60)) } val DUMMY_BANK_C_KEY: KeyPair by lazy { entropyToKeyPair(BigInteger.valueOf(60)) }
/** Dummy bank identity for tests and simulations */ /** Dummy bank identity for tests and simulations */
val DUMMY_BANK_C: Party get() = Party(X500Name("CN=Bank C,O=Bank C,L=Tokyo,C=Japan"), DUMMY_BANK_C_KEY.public) val DUMMY_BANK_C: Party get() = Party(X500Name("CN=Bank C,O=Bank C,L=Tokyo,C=JP"), DUMMY_BANK_C_KEY.public)
val ALICE_KEY: KeyPair by lazy { entropyToKeyPair(BigInteger.valueOf(70)) } val ALICE_KEY: KeyPair by lazy { entropyToKeyPair(BigInteger.valueOf(70)) }
/** Dummy individual identity for tests and simulations */ /** Dummy individual identity for tests and simulations */
@ -49,3 +49,7 @@ val BOB: Party get() = Party(X500Name("CN=Bob Plc,O=Bob Plc,L=London,C=UK"), BOB
val CHARLIE_KEY: KeyPair by lazy { entropyToKeyPair(BigInteger.valueOf(90)) } val CHARLIE_KEY: KeyPair by lazy { entropyToKeyPair(BigInteger.valueOf(90)) }
/** Dummy individual identity for tests and simulations */ /** Dummy individual identity for tests and simulations */
val CHARLIE: Party get() = Party(X500Name("CN=Charlie Ltd,O=Charlie Ltd,L=London,C=UK"), CHARLIE_KEY.public) val CHARLIE: Party get() = Party(X500Name("CN=Charlie Ltd,O=Charlie Ltd,L=London,C=UK"), CHARLIE_KEY.public)
val DUMMY_REGULATOR_KEY: KeyPair by lazy { entropyToKeyPair(BigInteger.valueOf(100)) }
/** Dummy regulator for tests and simulations */
val DUMMY_REGULATOR: Party get() = Party(X500Name("CN=Regulator A,OU=Corda,O=AMF,L=Paris,C=FR"), DUMMY_REGULATOR_KEY.public)

View File

@ -216,7 +216,7 @@ is a three node example;
cordapps [] cordapps []
} }
node { node {
name "CN=NodeB,O=R3,OU=corda,L=New York,C=USA" name "CN=NodeB,O=R3,OU=corda,L=New York,C=US"
nearestCity "New York" nearestCity "New York"
advertisedServices = [] advertisedServices = []
p2pPort 10008 p2pPort 10008

View File

@ -65,7 +65,7 @@ task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) {
rpcUsers = ext.rpcUsers rpcUsers = ext.rpcUsers
} }
node { node {
name "CN=Bank B,O=Bank B,L=New York,C=USA" name "CN=Bank B,O=Bank B,L=New York,C=US"
nearestCity "New York" nearestCity "New York"
advertisedServices = [] advertisedServices = []
p2pPort 10008 p2pPort 10008

View File

@ -52,7 +52,7 @@ task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) {
cordapps = [] cordapps = []
} }
node { node {
name "CN=BankOfCorda,O=R3,OU=corda,L=New York,C=USA" name "CN=BankOfCorda,O=R3,OU=corda,L=New York,C=US"
nearestCity "New York" nearestCity "New York"
advertisedServices = ["corda.issuer.USD"] advertisedServices = ["corda.issuer.USD"]
p2pPort 10005 p2pPort 10005

View File

@ -69,7 +69,7 @@ task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) {
useTestClock true useTestClock true
} }
node { node {
name "CN=Bank B,O=Bank B,L=New York,C=USA" name "CN=Bank B,O=Bank B,L=New York,C=US"
nearestCity "New York" nearestCity "New York"
advertisedServices = [] advertisedServices = []
p2pPort 10008 p2pPort 10008

View File

@ -2,6 +2,7 @@ package net.corda.simulation
import com.google.common.util.concurrent.Futures import com.google.common.util.concurrent.Futures
import com.google.common.util.concurrent.ListenableFuture import com.google.common.util.concurrent.ListenableFuture
import net.corda.core.crypto.location
import net.corda.core.flatMap import net.corda.core.flatMap
import net.corda.core.flows.FlowLogic import net.corda.core.flows.FlowLogic
import net.corda.core.messaging.SingleMessageRecipient import net.corda.core.messaging.SingleMessageRecipient
@ -12,6 +13,7 @@ import net.corda.core.node.services.containsType
import net.corda.core.then import net.corda.core.then
import net.corda.core.utilities.DUMMY_MAP import net.corda.core.utilities.DUMMY_MAP
import net.corda.core.utilities.DUMMY_NOTARY import net.corda.core.utilities.DUMMY_NOTARY
import net.corda.core.utilities.DUMMY_REGULATOR
import net.corda.core.utilities.ProgressTracker import net.corda.core.utilities.ProgressTracker
import net.corda.irs.api.NodeInterestRates import net.corda.irs.api.NodeInterestRates
import net.corda.node.services.config.NodeConfiguration import net.corda.node.services.config.NodeConfiguration
@ -24,6 +26,7 @@ import net.corda.testing.node.InMemoryMessagingNetwork
import net.corda.testing.node.MockNetwork import net.corda.testing.node.MockNetwork
import net.corda.testing.node.TestClock import net.corda.testing.node.TestClock
import net.corda.testing.node.setTo import net.corda.testing.node.setTo
import org.bouncycastle.asn1.x500.X500Name
import rx.Observable import rx.Observable
import rx.subjects.PublishSubject import rx.subjects.PublishSubject
import java.math.BigInteger import java.math.BigInteger
@ -47,7 +50,7 @@ abstract class Simulation(val networkSendManuallyPumped: Boolean,
throw IllegalArgumentException("The latency injector is only useful when using manual pumping.") throw IllegalArgumentException("The latency injector is only useful when using manual pumping.")
} }
val bankLocations = listOf("London", "Frankfurt", "Rome") val bankLocations = listOf(Pair("London", "UK"), Pair("Frankfurt", "DE"), Pair("Rome", "IT"))
// This puts together a mock network of SimulatedNodes. // This puts together a mock network of SimulatedNodes.
@ -65,12 +68,11 @@ abstract class Simulation(val networkSendManuallyPumped: Boolean,
advertisedServices: Set<ServiceInfo>, id: Int, overrideServices: Map<ServiceInfo, KeyPair>?, advertisedServices: Set<ServiceInfo>, id: Int, overrideServices: Map<ServiceInfo, KeyPair>?,
entropyRoot: BigInteger): MockNetwork.MockNode { entropyRoot: BigInteger): MockNetwork.MockNode {
val letter = 'A' + counter val letter = 'A' + counter
val city = bankLocations[counter++ % bankLocations.size] val (city, country) = bankLocations[counter++ % bankLocations.size]
val cfg = TestNodeConfiguration( val cfg = TestNodeConfiguration(
baseDirectory = config.baseDirectory, baseDirectory = config.baseDirectory,
// TODO: Set this back to "Bank of $city" after video day. myLegalName = "CN=Bank $letter,O=Bank $letter,L=$city,C=$country",
myLegalName = "CN=Bank $letter,O=Bank $letter,L=city",
nearestCity = city, nearestCity = city,
networkMapService = null) networkMapService = null)
return SimulatedNode(cfg, network, networkMapAddr, advertisedServices, id, overrideServices, entropyRoot) return SimulatedNode(cfg, network, networkMapAddr, advertisedServices, id, overrideServices, entropyRoot)
@ -94,7 +96,7 @@ abstract class Simulation(val networkSendManuallyPumped: Boolean,
val cfg = TestNodeConfiguration( val cfg = TestNodeConfiguration(
baseDirectory = config.baseDirectory, baseDirectory = config.baseDirectory,
myLegalName = DUMMY_MAP.name, myLegalName = DUMMY_MAP.name,
nearestCity = "Amsterdam", nearestCity = X500Name(DUMMY_MAP.name).location,
networkMapService = null) networkMapService = null)
return object : SimulatedNode(cfg, network, networkMapAddr, advertisedServices, id, overrideServices, entropyRoot) {} return object : SimulatedNode(cfg, network, networkMapAddr, advertisedServices, id, overrideServices, entropyRoot) {}
} }
@ -108,22 +110,24 @@ abstract class Simulation(val networkSendManuallyPumped: Boolean,
val cfg = TestNodeConfiguration( val cfg = TestNodeConfiguration(
baseDirectory = config.baseDirectory, baseDirectory = config.baseDirectory,
myLegalName = DUMMY_NOTARY.name, myLegalName = DUMMY_NOTARY.name,
nearestCity = "Zurich", nearestCity = X500Name(DUMMY_NOTARY.name).location,
networkMapService = null) networkMapService = null)
return SimulatedNode(cfg, network, networkMapAddr, advertisedServices, id, overrideServices, entropyRoot) return SimulatedNode(cfg, network, networkMapAddr, advertisedServices, id, overrideServices, entropyRoot)
} }
} }
object RatesOracleFactory : MockNetwork.Factory { object RatesOracleFactory : MockNetwork.Factory {
// TODO: Make a more realistic legal name
val RATES_SERVICE_NAME = "CN=Rates Service Provider,O=R3,OU=corda,L=Madrid,C=ES"
override fun create(config: NodeConfiguration, network: MockNetwork, networkMapAddr: SingleMessageRecipient?, override fun create(config: NodeConfiguration, network: MockNetwork, networkMapAddr: SingleMessageRecipient?,
advertisedServices: Set<ServiceInfo>, id: Int, overrideServices: Map<ServiceInfo, KeyPair>?, advertisedServices: Set<ServiceInfo>, id: Int, overrideServices: Map<ServiceInfo, KeyPair>?,
entropyRoot: BigInteger): MockNetwork.MockNode { entropyRoot: BigInteger): MockNetwork.MockNode {
require(advertisedServices.containsType(NodeInterestRates.type)) require(advertisedServices.containsType(NodeInterestRates.type))
val cfg = TestNodeConfiguration( val cfg = TestNodeConfiguration(
baseDirectory = config.baseDirectory, baseDirectory = config.baseDirectory,
// TODO: Make a more realistic legal name myLegalName = RATES_SERVICE_NAME,
myLegalName = "CN=Rates Service Provider,O=R3,OU=corda,L=Madrid,C=ES", nearestCity = X500Name(RATES_SERVICE_NAME).location,
nearestCity = "Madrid",
networkMapService = null) networkMapService = null)
return object : SimulatedNode(cfg, network, networkMapAddr, advertisedServices, id, overrideServices, entropyRoot) { return object : SimulatedNode(cfg, network, networkMapAddr, advertisedServices, id, overrideServices, entropyRoot) {
override fun start(): MockNetwork.MockNode { override fun start(): MockNetwork.MockNode {
@ -145,9 +149,8 @@ abstract class Simulation(val networkSendManuallyPumped: Boolean,
entropyRoot: BigInteger): MockNetwork.MockNode { entropyRoot: BigInteger): MockNetwork.MockNode {
val cfg = TestNodeConfiguration( val cfg = TestNodeConfiguration(
baseDirectory = config.baseDirectory, baseDirectory = config.baseDirectory,
// TODO: Make a more realistic legal name myLegalName = DUMMY_REGULATOR.name,
myLegalName = "CN=Regulator A,O=R3,OU=corda,L=Paris,C=FR", nearestCity = X500Name(DUMMY_REGULATOR.name).location,
nearestCity = "Paris",
networkMapService = null) networkMapService = null)
return object : SimulatedNode(cfg, network, networkMapAddr, advertisedServices, id, overrideServices, entropyRoot) { return object : SimulatedNode(cfg, network, networkMapAddr, advertisedServices, id, overrideServices, entropyRoot) {
// TODO: Regulatory nodes don't actually exist properly, this is a last minute demo request. // TODO: Regulatory nodes don't actually exist properly, this is a last minute demo request.

View File

@ -22,7 +22,7 @@
"interestPeriodAdjustment": "Adjusted" "interestPeriodAdjustment": "Adjusted"
}, },
"floatingLeg": { "floatingLeg": {
"floatingRatePayer": "CN=Bank B,O=Bank B,L=New York,C=USA", "floatingRatePayer": "CN=Bank B,O=Bank B,L=New York,C=US",
"notional": "€25000000", "notional": "€25000000",
"paymentFrequency": "Quarterly", "paymentFrequency": "Quarterly",
"effectiveDate": "2016-03-11", "effectiveDate": "2016-03-11",

View File

@ -2,7 +2,7 @@
define(['utils/dayCountBasisLookup'], (dayCountBasisLookup) => { define(['utils/dayCountBasisLookup'], (dayCountBasisLookup) => {
return { return {
floatingRatePayer: "CN=Bank B,O=Bank B,L=New York,C=USA", floatingRatePayer: "CN=Bank B,O=Bank B,L=New York,C=US",
notional: { notional: {
quantity: 2500000000 quantity: 2500000000
}, },

View File

@ -75,7 +75,7 @@ task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) {
cordapps = [] cordapps = []
} }
node { node {
name "CN=Bank B,O=Bank B,L=New York,C=USA" name "CN=Bank B,O=Bank B,L=New York,C=US"
nearestCity "New York" nearestCity "New York"
advertisedServices = [] advertisedServices = []
p2pPort 10006 p2pPort 10006

View File

@ -1,7 +1,7 @@
"use strict"; "use strict";
var FloatingLegViewModel = (function () { var FloatingLegViewModel = (function () {
function FloatingLegViewModel() { function FloatingLegViewModel() {
this.floatingRatePayer = "CN=Bank B,O=Bank B,L=New York,C=USA"; this.floatingRatePayer = "CN=Bank B,O=Bank B,L=New York,C=US";
this.notional = { this.notional = {
quantity: 2500000000 quantity: 2500000000
}; };

View File

@ -1,7 +1,7 @@
export class FloatingLegViewModel { export class FloatingLegViewModel {
constructor() { } constructor() { }
floatingRatePayer = "CN=Bank B,O=Bank B,L=New York,C=USA"; floatingRatePayer = "CN=Bank B,O=Bank B,L=New York,C=US";
notional: Object = { notional: Object = {
quantity: 2500000000 quantity: 2500000000
}; };

View File

@ -76,7 +76,7 @@ task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) {
rpcUsers = ext.rpcUsers rpcUsers = ext.rpcUsers
} }
node { node {
name "CN=Bank B,O=Bank B,L=New York,C=USA" name "CN=Bank B,O=Bank B,L=New York,C=US"
nearestCity "New York" nearestCity "New York"
advertisedServices = [] advertisedServices = []
p2pPort 10008 p2pPort 10008
@ -85,7 +85,7 @@ task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) {
rpcUsers = ext.rpcUsers rpcUsers = ext.rpcUsers
} }
node { node {
name "CN=BankOfCorda,O=R3,OU=corda,L=New York,C=USA" name "CN=BankOfCorda,O=R3,OU=corda,L=New York,C=US"
nearestCity "London" nearestCity "London"
advertisedServices = [] advertisedServices = []
p2pPort 10011 p2pPort 10011

View File

@ -74,7 +74,7 @@ val MINI_CORP: Party get() = Party(X509Utilities.getDevX509Name("MiniCorp"), MIN
val BOC_KEY: KeyPair by lazy { generateKeyPair() } val BOC_KEY: KeyPair by lazy { generateKeyPair() }
val BOC_PUBKEY: PublicKey get() = BOC_KEY.public val BOC_PUBKEY: PublicKey get() = BOC_KEY.public
val BOC: Party get() = Party(X500Name("CN=BankOfCorda,O=R3,OU=corda,L=New York,C=USA"), BOC_PUBKEY) val BOC: Party get() = Party(X500Name("CN=BankOfCorda,O=R3,OU=corda,L=New York,C=US"), BOC_PUBKEY)
val BOC_PARTY_REF = BOC.ref(OpaqueBytes.of(1)).reference val BOC_PARTY_REF = BOC.ref(OpaqueBytes.of(1)).reference
val BIG_CORP_KEY: KeyPair by lazy { generateKeyPair() } val BIG_CORP_KEY: KeyPair by lazy { generateKeyPair() }

View File

@ -1,5 +1,8 @@
package net.corda.demobench.model package net.corda.demobench.model
import com.fasterxml.jackson.annotation.JsonInclude
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.databind.SerializationFeature
import com.google.common.net.HostAndPort import com.google.common.net.HostAndPort
import com.typesafe.config.ConfigFactory import com.typesafe.config.ConfigFactory
import com.typesafe.config.ConfigValueFactory import com.typesafe.config.ConfigValueFactory
@ -11,6 +14,7 @@ import net.corda.nodeapi.User
import net.corda.nodeapi.config.parseAs import net.corda.nodeapi.config.parseAs
import net.corda.webserver.WebServerConfig import net.corda.webserver.WebServerConfig
import org.junit.Test import org.junit.Test
import java.io.StringWriter
import java.nio.file.Path import java.nio.file.Path
import java.nio.file.Paths import java.nio.file.Paths
import kotlin.test.assertEquals import kotlin.test.assertEquals
@ -114,6 +118,19 @@ class NodeConfigTest {
assertFalse(config.isCashIssuer) assertFalse(config.isCashIssuer)
} }
/**
* Reformat JSON via Jackson to ensure a consistent format for comparison purposes.
*/
private fun prettyPrint(content: String): String {
val mapper = ObjectMapper()
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL)
mapper.enable(SerializationFeature.INDENT_OUTPUT)
val sw = StringWriter()
val parsed = mapper.readTree(content)
mapper.writeValue(sw, parsed)
return sw.toString()
}
@Test @Test
fun `test config text`() { fun `test config text`() {
val config = createConfig( val config = createConfig(
@ -126,10 +143,10 @@ class NodeConfigTest {
services = listOf("my.service"), services = listOf("my.service"),
users = listOf(user("jenny")) users = listOf(user("jenny"))
) )
assertEquals("{" assertEquals(prettyPrint("{"
+ "\"extraAdvertisedServiceIds\":[\"my.service\"]," + "\"extraAdvertisedServiceIds\":[\"my.service\"],"
+ "\"h2port\":30001," + "\"h2port\":30001,"
+ "\"myLegalName\":\"MyName\"," + "\"myLegalName\":\"My Name\","
+ "\"nearestCity\":\"Stockholm\"," + "\"nearestCity\":\"Stockholm\","
+ "\"p2pAddress\":\"localhost:10001\"," + "\"p2pAddress\":\"localhost:10001\","
+ "\"rpcAddress\":\"localhost:40002\"," + "\"rpcAddress\":\"localhost:40002\","
@ -138,7 +155,7 @@ class NodeConfigTest {
+ "]," + "],"
+ "\"useTestClock\":true," + "\"useTestClock\":true,"
+ "\"webAddress\":\"localhost:20001\"" + "\"webAddress\":\"localhost:20001\""
+ "}", config.toText().stripWhitespace()) + "}"), prettyPrint(config.toText()))
} }
@Test @Test
@ -155,12 +172,12 @@ class NodeConfigTest {
) )
config.networkMap = NetworkMapConfig(DUMMY_NOTARY.name, 12345) config.networkMap = NetworkMapConfig(DUMMY_NOTARY.name, 12345)
assertEquals("{" assertEquals(prettyPrint("{"
+ "\"extraAdvertisedServiceIds\":[\"my.service\"]," + "\"extraAdvertisedServiceIds\":[\"my.service\"],"
+ "\"h2port\":30001," + "\"h2port\":30001,"
+ "\"myLegalName\":\"MyName\"," + "\"myLegalName\":\"My Name\","
+ "\"nearestCity\":\"Stockholm\"," + "\"nearestCity\":\"Stockholm\","
+ "\"networkMapService\":{\"address\":\"localhost:12345\",\"legalName\":\"CN=NotaryService,O=R3,OU=corda,L=London,C=UK\"}," + "\"networkMapService\":{\"address\":\"localhost:12345\",\"legalName\":\"CN=Notary Service,O=R3,OU=corda,L=Zurich,C=CH\"},"
+ "\"p2pAddress\":\"localhost:10001\"," + "\"p2pAddress\":\"localhost:10001\","
+ "\"rpcAddress\":\"localhost:40002\"," + "\"rpcAddress\":\"localhost:40002\","
+ "\"rpcUsers\":[" + "\"rpcUsers\":["
@ -168,7 +185,7 @@ class NodeConfigTest {
+ "]," + "],"
+ "\"useTestClock\":true," + "\"useTestClock\":true,"
+ "\"webAddress\":\"localhost:20001\"" + "\"webAddress\":\"localhost:20001\""
+ "}", config.toText().stripWhitespace()) + "}"), prettyPrint(config.toText()))
} }
@Test @Test

View File

@ -177,7 +177,7 @@ fun main(args: Array<String>) {
val issuerGBP = startNode(X500Name("CN=UK Bank Plc,O=UK Bank Plc,L=London,C=UK"), rpcUsers = arrayListOf(manager), val issuerGBP = startNode(X500Name("CN=UK Bank Plc,O=UK Bank Plc,L=London,C=UK"), rpcUsers = arrayListOf(manager),
advertisedServices = setOf(ServiceInfo(ServiceType.corda.getSubType("issuer.GBP"))), advertisedServices = setOf(ServiceInfo(ServiceType.corda.getSubType("issuer.GBP"))),
customOverrides = mapOf("nearestCity" to "London")) customOverrides = mapOf("nearestCity" to "London"))
val issuerUSD = startNode(X500Name("CN=USA Bank Corp,O=USA Bank Corp,L=New York,C=USA"), rpcUsers = arrayListOf(manager), val issuerUSD = startNode(X500Name("CN=USA Bank Corp,O=USA Bank Corp,L=New York,C=US"), rpcUsers = arrayListOf(manager),
advertisedServices = setOf(ServiceInfo(ServiceType.corda.getSubType("issuer.USD"))), advertisedServices = setOf(ServiceInfo(ServiceType.corda.getSubType("issuer.USD"))),
customOverrides = mapOf("nearestCity" to "New York")) customOverrides = mapOf("nearestCity" to "New York"))