mirror of
https://github.com/corda/corda.git
synced 2025-01-31 08:25:50 +00:00
Added vault query as tokenizable service. (#926)
* Added vault query as tokenizable service. * Add JUnit test to test access of vault query service within a flow. * Improved JUnit test to correctly validate tokenizable behaviour. * Minor cleanup
This commit is contained in:
parent
c6d1274e47
commit
4139cf497d
@ -475,7 +475,7 @@ abstract class AbstractNode(open val configuration: NodeConfiguration,
|
|||||||
keyManagement = makeKeyManagementService(identity)
|
keyManagement = makeKeyManagementService(identity)
|
||||||
scheduler = NodeSchedulerService(services, database, unfinishedSchedules = busyNodeLatch)
|
scheduler = NodeSchedulerService(services, database, unfinishedSchedules = busyNodeLatch)
|
||||||
|
|
||||||
val tokenizableServices = mutableListOf(storage, network, vault, keyManagement, identity, platformClock, scheduler)
|
val tokenizableServices = mutableListOf(storage, network, vault, vaultQuery, keyManagement, identity, platformClock, scheduler)
|
||||||
makeAdvertisedServices(tokenizableServices)
|
makeAdvertisedServices(tokenizableServices)
|
||||||
return tokenizableServices
|
return tokenizableServices
|
||||||
}
|
}
|
||||||
|
@ -5,18 +5,18 @@ import co.paralleluniverse.fibers.Suspendable
|
|||||||
import com.google.common.util.concurrent.ListenableFuture
|
import com.google.common.util.concurrent.ListenableFuture
|
||||||
import net.corda.contracts.asset.Cash
|
import net.corda.contracts.asset.Cash
|
||||||
import net.corda.core.*
|
import net.corda.core.*
|
||||||
|
import net.corda.core.contracts.ContractState
|
||||||
import net.corda.core.contracts.DOLLARS
|
import net.corda.core.contracts.DOLLARS
|
||||||
import net.corda.core.contracts.DummyState
|
import net.corda.core.contracts.DummyState
|
||||||
|
import net.corda.core.contracts.StateAndRef
|
||||||
import net.corda.core.crypto.SecureHash
|
import net.corda.core.crypto.SecureHash
|
||||||
import net.corda.core.crypto.generateKeyPair
|
import net.corda.core.crypto.generateKeyPair
|
||||||
import net.corda.core.flows.FlowException
|
import net.corda.core.flows.*
|
||||||
import net.corda.core.flows.FlowLogic
|
|
||||||
import net.corda.core.flows.FlowSessionException
|
|
||||||
import net.corda.core.flows.InitiatingFlow
|
|
||||||
import net.corda.core.identity.Party
|
import net.corda.core.identity.Party
|
||||||
import net.corda.core.messaging.MessageRecipients
|
import net.corda.core.messaging.MessageRecipients
|
||||||
import net.corda.core.node.services.PartyInfo
|
import net.corda.core.node.services.PartyInfo
|
||||||
import net.corda.core.node.services.ServiceInfo
|
import net.corda.core.node.services.ServiceInfo
|
||||||
|
import net.corda.core.node.services.queryBy
|
||||||
import net.corda.core.node.services.unconsumedStates
|
import net.corda.core.node.services.unconsumedStates
|
||||||
import net.corda.core.serialization.OpaqueBytes
|
import net.corda.core.serialization.OpaqueBytes
|
||||||
import net.corda.core.serialization.deserialize
|
import net.corda.core.serialization.deserialize
|
||||||
@ -597,6 +597,21 @@ class FlowFrameworkTests {
|
|||||||
assertThatThrownBy { result.getOrThrow() }.hasMessageContaining("Vault").hasMessageContaining("private method")
|
assertThatThrownBy { result.getOrThrow() }.hasMessageContaining("Vault").hasMessageContaining("private method")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `verify vault query service is tokenizable by force checkpointing within a flow`() {
|
||||||
|
val ptx = TransactionBuilder(notary = notary1.info.notaryIdentity)
|
||||||
|
ptx.addOutputState(DummyState())
|
||||||
|
val stx = node1.services.signInitialTransaction(ptx)
|
||||||
|
|
||||||
|
node1.registerFlowFactory(VaultQueryFlow::class) {
|
||||||
|
WaitingFlows.Committer(it)
|
||||||
|
}
|
||||||
|
val result = node2.services.startFlow(VaultQueryFlow(stx, node1.info.legalIdentity)).resultFuture
|
||||||
|
|
||||||
|
mockNet.runNetwork()
|
||||||
|
assertThat(result.getOrThrow()).isEmpty()
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `customised client flow`() {
|
fun `customised client flow`() {
|
||||||
val receiveFlowFuture = node2.registerFlowFactory(SendFlow::class) { ReceiveFlow(it) }
|
val receiveFlowFuture = node2.registerFlowFactory(SendFlow::class) { ReceiveFlow(it) }
|
||||||
@ -863,6 +878,19 @@ class FlowFrameworkTests {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@InitiatingFlow
|
||||||
|
private class VaultQueryFlow(val stx: SignedTransaction, val otherParty: Party) : FlowLogic<List<StateAndRef<ContractState>>>() {
|
||||||
|
@Suspendable
|
||||||
|
override fun call(): List<StateAndRef<ContractState>> {
|
||||||
|
send(otherParty, stx)
|
||||||
|
// hold onto reference here to force checkpoint of vaultQueryService and thus
|
||||||
|
// prove it is registered as a tokenizableService in the node
|
||||||
|
val vaultQuerySvc = serviceHub.vaultQueryService
|
||||||
|
waitForLedgerCommit(stx.id)
|
||||||
|
return vaultQuerySvc.queryBy<ContractState>().states
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@InitiatingFlow(version = 2)
|
@InitiatingFlow(version = 2)
|
||||||
private class UpgradedFlow(val otherParty: Party) : FlowLogic<Any>() {
|
private class UpgradedFlow(val otherParty: Party) : FlowLogic<Any>() {
|
||||||
@Suspendable
|
@Suspendable
|
||||||
|
Loading…
x
Reference in New Issue
Block a user