From dc3bd8de7a881b9655d7432b3e43410a8b2b77b5 Mon Sep 17 00:00:00 2001 From: Shams Asari Date: Fri, 13 Jul 2018 10:37:51 +0100 Subject: [PATCH] Retired BankOfCordaRPCClientTest as it's mostly duplicated by BankOfCordaCordformTest (#3565) --- .../finance/utils/StateSummingUtilities.kt | 8 +- .../net/corda/bank/BankOfCordaCordformTest.kt | 22 ++++- .../corda/bank/BankOfCordaRPCClientTest.kt | 94 ------------------- .../net/corda/bank/BankOfCordaCordform.kt | 18 ++-- .../corda/bank/api/BankOfCordaClientApi.kt | 4 +- .../internal/demorun/CordformNodeRunner.kt | 4 +- 6 files changed, 42 insertions(+), 108 deletions(-) delete mode 100644 samples/bank-of-corda-demo/src/integration-test/kotlin/net/corda/bank/BankOfCordaRPCClientTest.kt diff --git a/finance/src/main/kotlin/net/corda/finance/utils/StateSummingUtilities.kt b/finance/src/main/kotlin/net/corda/finance/utils/StateSummingUtilities.kt index 0665664309..ee155bbaf4 100644 --- a/finance/src/main/kotlin/net/corda/finance/utils/StateSummingUtilities.kt +++ b/finance/src/main/kotlin/net/corda/finance/utils/StateSummingUtilities.kt @@ -38,10 +38,14 @@ fun Iterable.sumCashOrZero(currency: Issued): Amount Iterable.sumFungibleOrNull() = filterIsInstance>().map { it.amount }.sumOrNull() +fun Iterable.sumFungibleOrNull(): Amount>? { + return filterIsInstance>().map { it.amount }.sumOrNull() +} /** Sums the asset states in the list, returning zero of the given token if there are none. */ -fun Iterable.sumFungibleOrZero(token: Issued) = filterIsInstance>().map { it.amount }.sumOrZero(token) +fun Iterable.sumFungibleOrZero(token: Issued): Amount> { + return filterIsInstance>().map { it.amount }.sumOrZero(token) +} /** * Sums the obligation states in the list, throwing an exception if there are none. All state objects in the diff --git a/samples/bank-of-corda-demo/src/integration-test/kotlin/net/corda/bank/BankOfCordaCordformTest.kt b/samples/bank-of-corda-demo/src/integration-test/kotlin/net/corda/bank/BankOfCordaCordformTest.kt index e5235553b6..beefbcfc09 100644 --- a/samples/bank-of-corda-demo/src/integration-test/kotlin/net/corda/bank/BankOfCordaCordformTest.kt +++ b/samples/bank-of-corda-demo/src/integration-test/kotlin/net/corda/bank/BankOfCordaCordformTest.kt @@ -1,16 +1,32 @@ package net.corda.bank +import net.corda.client.rpc.CordaRPCClient +import net.corda.core.contracts.withoutIssuer +import net.corda.core.utilities.NetworkHostAndPort import net.corda.finance.DOLLARS -import net.corda.finance.POUNDS +import net.corda.finance.contracts.asset.Cash +import net.corda.finance.utils.sumCash +import net.corda.testing.core.BOC_NAME import net.corda.testing.node.internal.demorun.nodeRunner +import org.assertj.core.api.Assertions.assertThat import org.junit.Test class BankOfCordaCordformTest { @Test fun `run demo`() { - BankOfCordaCordform().nodeRunner().scanPackages(listOf("net.corda.finance")).deployAndRunNodesThen { - IssueCash.requestWebIssue(30000.POUNDS) + BankOfCordaCordform().nodeRunner().scanPackages(listOf("net.corda.finance")).deployAndRunNodesAndThen { IssueCash.requestRpcIssue(20000.DOLLARS) + CordaRPCClient(NetworkHostAndPort("localhost", BOC_RPC_PORT)).use(BOC_RPC_USER, BOC_RPC_PWD) { + assertThat(it.proxy.vaultQuery(Cash.State::class.java).states).isEmpty() // All of the issued cash is transferred + } + CordaRPCClient(NetworkHostAndPort("localhost", BIGCORP_RPC_PORT)).use(BIGCORP_RPC_USER, BIGCORP_RPC_PWD) { + val cashStates = it.proxy.vaultQuery(Cash.State::class.java).states.map { it.state.data } + val knownOwner = it.proxy.wellKnownPartyFromAnonymous(cashStates.map { it.owner }.toSet().single()) + assertThat(knownOwner?.name).isEqualTo(BIGCORP_NAME) + val totalCash = cashStates.sumCash() + assertThat(totalCash.token.issuer.party.nameOrNull()).isEqualTo(BOC_NAME) + assertThat(totalCash.withoutIssuer()).isEqualTo(20000.DOLLARS) + } } } } diff --git a/samples/bank-of-corda-demo/src/integration-test/kotlin/net/corda/bank/BankOfCordaRPCClientTest.kt b/samples/bank-of-corda-demo/src/integration-test/kotlin/net/corda/bank/BankOfCordaRPCClientTest.kt deleted file mode 100644 index d247b64ab6..0000000000 --- a/samples/bank-of-corda-demo/src/integration-test/kotlin/net/corda/bank/BankOfCordaRPCClientTest.kt +++ /dev/null @@ -1,94 +0,0 @@ -package net.corda.bank - -import net.corda.client.rpc.CordaRPCClient -import net.corda.core.messaging.CordaRPCOps -import net.corda.core.messaging.startFlow -import net.corda.core.node.services.Vault -import net.corda.core.node.services.vault.QueryCriteria -import net.corda.core.utilities.OpaqueBytes -import net.corda.core.utilities.getOrThrow -import net.corda.finance.DOLLARS -import net.corda.finance.contracts.asset.Cash -import net.corda.finance.flows.CashIssueAndPaymentFlow -import net.corda.node.services.Permissions.Companion.invokeRpc -import net.corda.node.services.Permissions.Companion.startFlow -import net.corda.testing.core.BOC_NAME -import net.corda.testing.core.expect -import net.corda.testing.core.expectEvents -import net.corda.testing.core.sequence -import net.corda.testing.driver.DriverParameters -import net.corda.testing.driver.driver -import net.corda.testing.node.User -import org.junit.Test - -class BankOfCordaRPCClientTest { - @Test - fun `issuer flow via RPC`() { - val commonPermissions = setOf( - invokeRpc("vaultTrackByCriteria"), - invokeRpc(CordaRPCOps::wellKnownPartyFromX500Name), - invokeRpc(CordaRPCOps::notaryIdentities) - ) - driver(DriverParameters(extraCordappPackagesToScan = listOf("net.corda.finance"))) { - val bocManager = User("bocManager", "password1", permissions = setOf( - startFlow()) + commonPermissions) - val bigCorpCFO = User("bigCorpCFO", "password2", permissions = emptySet() + commonPermissions) - val (nodeBankOfCorda, nodeBigCorporation) = listOf( - startNode(providedName = BOC_NAME, rpcUsers = listOf(bocManager)), - startNode(providedName = BIGCORP_NAME, rpcUsers = listOf(bigCorpCFO)) - ).map { it.getOrThrow() } - - // Bank of Corda RPC Client - val bocClient = CordaRPCClient(nodeBankOfCorda.rpcAddress) - val bocProxy = bocClient.start("bocManager", "password1").proxy - - // Big Corporation RPC Client - val bigCorpClient = CordaRPCClient(nodeBigCorporation.rpcAddress) - val bigCorpProxy = bigCorpClient.start("bigCorpCFO", "password2").proxy - - // Register for Bank of Corda Vault updates - val criteria = QueryCriteria.VaultQueryCriteria(status = Vault.StateStatus.ALL) - val vaultUpdatesBoc = bocProxy.vaultTrackByCriteria(Cash.State::class.java, criteria).updates - - // Register for Big Corporation Vault updates - val vaultUpdatesBigCorp = bigCorpProxy.vaultTrackByCriteria(Cash.State::class.java, criteria).updates - - val bigCorporation = bigCorpProxy.wellKnownPartyFromX500Name(BIGCORP_NAME)!! - - // Kick-off actual Issuer Flow - val anonymous = true - bocProxy.startFlow(::CashIssueAndPaymentFlow, - 1000.DOLLARS, OpaqueBytes.of(1), - bigCorporation, - anonymous, - defaultNotaryIdentity).returnValue.getOrThrow() - - // Check Bank of Corda Vault Updates - vaultUpdatesBoc.expectEvents { - sequence( - // ISSUE - expect { update -> - require(update.consumed.isEmpty()) { "Expected 0 consumed states, actual: $update" } - require(update.produced.size == 1) { "Expected 1 produced states, actual: $update" } - }, - // MOVE - expect { update -> - require(update.consumed.size == 1) { "Expected 1 consumed states, actual: $update" } - require(update.produced.isEmpty()) { "Expected 0 produced states, actual: $update" } - } - ) - } - - // Check Big Corporation Vault Updates - vaultUpdatesBigCorp.expectEvents { - sequence( - // MOVE - expect { (consumed, produced) -> - require(consumed.isEmpty()) { consumed.size } - require(produced.size == 1) { produced.size } - } - ) - } - } - } -} \ No newline at end of file diff --git a/samples/bank-of-corda-demo/src/main/kotlin/net/corda/bank/BankOfCordaCordform.kt b/samples/bank-of-corda-demo/src/main/kotlin/net/corda/bank/BankOfCordaCordform.kt index 1e2d724dbc..c84434e94a 100644 --- a/samples/bank-of-corda-demo/src/main/kotlin/net/corda/bank/BankOfCordaCordform.kt +++ b/samples/bank-of-corda-demo/src/main/kotlin/net/corda/bank/BankOfCordaCordform.kt @@ -21,10 +21,17 @@ import kotlin.system.exitProcess val BIGCORP_NAME = CordaX500Name(organisation = "BigCorporation", locality = "New York", country = "US") private val NOTARY_NAME = CordaX500Name(organisation = "Notary Service", locality = "Zurich", country = "CH") -private const val BOC_RPC_PORT = 10006 +const val BOC_RPC_PORT = 10006 +const val BIGCORP_RPC_PORT = 10009 private const val BOC_RPC_ADMIN_PORT = 10015 private const val BOC_WEB_PORT = 10007 +const val BOC_RPC_USER = "bankUser" +const val BOC_RPC_PWD = "test" + +const val BIGCORP_RPC_USER = "bigCorpUser" +const val BIGCORP_RPC_PWD = "test" + class BankOfCordaCordform : CordformDefinition() { init { @@ -47,18 +54,18 @@ class BankOfCordaCordform : CordformDefinition() { adminAddress("localhost:$BOC_RPC_ADMIN_PORT") } webPort(BOC_WEB_PORT) - rpcUsers(User("bankUser", "test", setOf(all()))) + rpcUsers(User(BOC_RPC_USER, BOC_RPC_PWD, setOf(all()))) devMode(true) } node { name(BIGCORP_NAME) p2pPort(10008) rpcSettings { - address("localhost:10009") + address("localhost:$BIGCORP_RPC_PORT") adminAddress("localhost:10011") } webPort(10010) - rpcUsers(User("bigCorpUser", "test", setOf(all()))) + rpcUsers(User(BIGCORP_RPC_USER, BIGCORP_RPC_PWD, setOf(all()))) devMode(true) } } @@ -113,8 +120,7 @@ object IssueCash { return BankOfCordaClientApi.requestRPCIssue(NetworkHostAndPort("localhost", BOC_RPC_PORT), createParams(amount, NOTARY_NAME)) } - @VisibleForTesting - fun requestWebIssue(amount: Amount) { + private fun requestWebIssue(amount: Amount) { BankOfCordaClientApi.requestWebIssue(NetworkHostAndPort("localhost", BOC_WEB_PORT), createParams(amount, NOTARY_NAME)) } diff --git a/samples/bank-of-corda-demo/src/main/kotlin/net/corda/bank/api/BankOfCordaClientApi.kt b/samples/bank-of-corda-demo/src/main/kotlin/net/corda/bank/api/BankOfCordaClientApi.kt index 231e6781d9..3daf76c8f7 100644 --- a/samples/bank-of-corda-demo/src/main/kotlin/net/corda/bank/api/BankOfCordaClientApi.kt +++ b/samples/bank-of-corda-demo/src/main/kotlin/net/corda/bank/api/BankOfCordaClientApi.kt @@ -1,5 +1,7 @@ package net.corda.bank.api +import net.corda.bank.BOC_RPC_PWD +import net.corda.bank.BOC_RPC_USER import net.corda.bank.api.BankOfCordaWebApi.IssueRequestParams import net.corda.client.rpc.CordaRPCClient import net.corda.core.messaging.startFlow @@ -31,7 +33,7 @@ object BankOfCordaClientApi { fun requestRPCIssue(rpcAddress: NetworkHostAndPort, params: IssueRequestParams): SignedTransaction { val client = CordaRPCClient(rpcAddress) // TODO: privileged security controls required - client.start("bankUser", "test").use { connection -> + client.start(BOC_RPC_USER, BOC_RPC_PWD).use { connection -> val rpc = connection.proxy rpc.waitUntilNetworkReady().getOrThrow() diff --git a/testing/node-driver/src/main/kotlin/net/corda/testing/node/internal/demorun/CordformNodeRunner.kt b/testing/node-driver/src/main/kotlin/net/corda/testing/node/internal/demorun/CordformNodeRunner.kt index fa5b9b5150..225688a2fe 100644 --- a/testing/node-driver/src/main/kotlin/net/corda/testing/node/internal/demorun/CordformNodeRunner.kt +++ b/testing/node-driver/src/main/kotlin/net/corda/testing/node/internal/demorun/CordformNodeRunner.kt @@ -17,7 +17,7 @@ fun CordformDefinition.nodeRunner() = CordformNodeRunner(this) /** * A node runner creates and runs nodes for a given [[CordformDefinition]]. */ -class CordformNodeRunner(val cordformDefinition: CordformDefinition) { +class CordformNodeRunner(private val cordformDefinition: CordformDefinition) { private var extraPackagesToScan = emptyList() /** @@ -45,7 +45,7 @@ class CordformNodeRunner(val cordformDefinition: CordformDefinition) { * Deploy the nodes specified in the given [CordformDefinition] and then execute the given [block] once all the nodes * and webservers are up. After execution all these processes will be terminated. */ - fun deployAndRunNodesThen(block: () -> Unit) { + fun deployAndRunNodesAndThen(block: () -> Unit) { runNodes(waitForAllNodesToFinish = false, block = block) }