mirror of
https://github.com/corda/corda.git
synced 2025-02-06 11:09:18 +00:00
Add unit tests around vault update derivation
This commit is contained in:
parent
7eed258bcb
commit
f6aa672215
@ -2,6 +2,7 @@ package net.corda.node.services.vault
|
|||||||
|
|
||||||
import co.paralleluniverse.fibers.Suspendable
|
import co.paralleluniverse.fibers.Suspendable
|
||||||
import co.paralleluniverse.strands.Strand
|
import co.paralleluniverse.strands.Strand
|
||||||
|
import com.google.common.annotations.VisibleForTesting
|
||||||
import io.requery.PersistenceException
|
import io.requery.PersistenceException
|
||||||
import io.requery.TransactionIsolation
|
import io.requery.TransactionIsolation
|
||||||
import io.requery.kotlin.`in`
|
import io.requery.kotlin.`in`
|
||||||
@ -468,7 +469,8 @@ class NodeVaultService(private val services: ServiceHub, dataSourceProperties: P
|
|||||||
private fun deriveState(txState: TransactionState<Cash.State>, amount: Amount<Issued<Currency>>, owner: AbstractParty)
|
private fun deriveState(txState: TransactionState<Cash.State>, amount: Amount<Issued<Currency>>, owner: AbstractParty)
|
||||||
= txState.copy(data = txState.data.copy(amount = amount, owner = owner))
|
= txState.copy(data = txState.data.copy(amount = amount, owner = owner))
|
||||||
|
|
||||||
private fun makeUpdate(tx: WireTransaction, ourKeys: Set<PublicKey>): Vault.Update {
|
@VisibleForTesting
|
||||||
|
internal fun makeUpdate(tx: WireTransaction, ourKeys: Set<PublicKey>): Vault.Update {
|
||||||
val ourNewStates = tx.outputs.
|
val ourNewStates = tx.outputs.
|
||||||
filter { isRelevant(it.data, ourKeys) }.
|
filter { isRelevant(it.data, ourKeys) }.
|
||||||
map { tx.outRef<ContractState>(it.data) }
|
map { tx.outRef<ContractState>(it.data) }
|
||||||
@ -515,7 +517,8 @@ class NodeVaultService(private val services: ServiceHub, dataSourceProperties: P
|
|||||||
authorisedUpgrade.remove(stateAndRef.ref)
|
authorisedUpgrade.remove(stateAndRef.ref)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun isRelevant(state: ContractState, ourKeys: Set<PublicKey>) = when (state) {
|
@VisibleForTesting
|
||||||
|
internal fun isRelevant(state: ContractState, ourKeys: Set<PublicKey>) = when (state) {
|
||||||
is OwnableState -> state.owner.owningKey.containsAny(ourKeys)
|
is OwnableState -> state.owner.owningKey.containsAny(ourKeys)
|
||||||
is LinearState -> state.isRelevant(ourKeys)
|
is LinearState -> state.isRelevant(ourKeys)
|
||||||
else -> ourKeys.intersect(state.participants.map { it.owningKey }).isNotEmpty()
|
else -> ourKeys.intersect(state.participants.map { it.owningKey }).isNotEmpty()
|
||||||
|
@ -2,22 +2,20 @@ package net.corda.node.services.vault
|
|||||||
|
|
||||||
import net.corda.contracts.asset.Cash
|
import net.corda.contracts.asset.Cash
|
||||||
import net.corda.contracts.asset.DUMMY_CASH_ISSUER
|
import net.corda.contracts.asset.DUMMY_CASH_ISSUER
|
||||||
import net.corda.testing.contracts.fillWithSomeTestCash
|
|
||||||
import net.corda.core.contracts.*
|
import net.corda.core.contracts.*
|
||||||
|
import net.corda.core.crypto.generateKeyPair
|
||||||
import net.corda.core.identity.AnonymousParty
|
import net.corda.core.identity.AnonymousParty
|
||||||
import net.corda.core.node.services.StatesNotAvailableException
|
import net.corda.core.node.services.StatesNotAvailableException
|
||||||
|
import net.corda.core.node.services.Vault
|
||||||
import net.corda.core.node.services.VaultService
|
import net.corda.core.node.services.VaultService
|
||||||
import net.corda.core.node.services.unconsumedStates
|
import net.corda.core.node.services.unconsumedStates
|
||||||
import net.corda.core.utilities.OpaqueBytes
|
|
||||||
import net.corda.core.transactions.SignedTransaction
|
import net.corda.core.transactions.SignedTransaction
|
||||||
import net.corda.testing.DUMMY_NOTARY
|
import net.corda.core.transactions.TransactionBuilder
|
||||||
import net.corda.testing.LogHelper
|
import net.corda.core.utilities.OpaqueBytes
|
||||||
import net.corda.node.utilities.configureDatabase
|
import net.corda.node.utilities.configureDatabase
|
||||||
import net.corda.node.utilities.transaction
|
import net.corda.node.utilities.transaction
|
||||||
import net.corda.testing.BOC
|
import net.corda.testing.*
|
||||||
import net.corda.testing.BOC_KEY
|
import net.corda.testing.contracts.fillWithSomeTestCash
|
||||||
import net.corda.testing.MEGA_CORP
|
|
||||||
import net.corda.testing.MEGA_CORP_KEY
|
|
||||||
import net.corda.testing.node.MockServices
|
import net.corda.testing.node.MockServices
|
||||||
import net.corda.testing.node.makeTestDataSourceProperties
|
import net.corda.testing.node.makeTestDataSourceProperties
|
||||||
import org.assertj.core.api.Assertions.assertThat
|
import org.assertj.core.api.Assertions.assertThat
|
||||||
@ -31,7 +29,9 @@ import java.util.*
|
|||||||
import java.util.concurrent.CountDownLatch
|
import java.util.concurrent.CountDownLatch
|
||||||
import java.util.concurrent.Executors
|
import java.util.concurrent.Executors
|
||||||
import kotlin.test.assertEquals
|
import kotlin.test.assertEquals
|
||||||
|
import kotlin.test.assertFalse
|
||||||
import kotlin.test.assertNull
|
import kotlin.test.assertNull
|
||||||
|
import kotlin.test.assertTrue
|
||||||
|
|
||||||
class NodeVaultServiceTest {
|
class NodeVaultServiceTest {
|
||||||
lateinit var services: MockServices
|
lateinit var services: MockServices
|
||||||
@ -420,8 +420,58 @@ class NodeVaultServiceTest {
|
|||||||
|
|
||||||
services.recordTransactions(anotherTX)
|
services.recordTransactions(anotherTX)
|
||||||
|
|
||||||
vaultSvc.addNoteToTransaction(anotherTX.id, "GPB Sample Note 1")
|
vaultSvc.addNoteToTransaction(anotherTX.id, "GBP Sample Note 1")
|
||||||
assertEquals(1, vaultSvc.getTransactionNotes(anotherTX.id).count())
|
assertEquals(1, vaultSvc.getTransactionNotes(anotherTX.id).count())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `is ownable state relevant`() {
|
||||||
|
val service = (services.vaultService as NodeVaultService)
|
||||||
|
val amount = Amount(1000, Issued(BOC.ref(1), GBP))
|
||||||
|
val wellKnownCash = Cash.State(amount, services.myInfo.legalIdentity)
|
||||||
|
assertTrue { service.isRelevant(wellKnownCash, services.keyManagementService.keys) }
|
||||||
|
|
||||||
|
val anonymousIdentity = services.keyManagementService.freshKeyAndCert(services.myInfo.legalIdentityAndCert, false)
|
||||||
|
val anonymousCash = Cash.State(amount, anonymousIdentity.identity)
|
||||||
|
assertTrue { service.isRelevant(anonymousCash, services.keyManagementService.keys) }
|
||||||
|
|
||||||
|
val thirdPartyIdentity = AnonymousParty(generateKeyPair().public)
|
||||||
|
val thirdPartyCash = Cash.State(amount, thirdPartyIdentity)
|
||||||
|
assertFalse { service.isRelevant(thirdPartyCash, services.keyManagementService.keys) }
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Unit test linear state relevancy checks
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `make update`() {
|
||||||
|
val service = (services.vaultService as NodeVaultService)
|
||||||
|
val anonymousIdentity = services.keyManagementService.freshKeyAndCert(services.myInfo.legalIdentityAndCert, false)
|
||||||
|
val thirdPartyIdentity = AnonymousParty(generateKeyPair().public)
|
||||||
|
val amount = Amount(1000, Issued(BOC.ref(1), GBP))
|
||||||
|
|
||||||
|
// Issue then move some cash
|
||||||
|
val issueTx = TransactionBuilder(TransactionType.General, services.myInfo.legalIdentity).apply {
|
||||||
|
Cash().generateIssue(this,
|
||||||
|
amount, anonymousIdentity.identity, services.myInfo.legalIdentity)
|
||||||
|
}.toWireTransaction()
|
||||||
|
val cashState = StateAndRef(issueTx.outputs.single(), StateRef(issueTx.id, 0))
|
||||||
|
|
||||||
|
database.transaction {
|
||||||
|
val expected = Vault.Update(emptySet(), setOf(cashState), null)
|
||||||
|
val actual = service.makeUpdate(issueTx, setOf(anonymousIdentity.identity.owningKey))
|
||||||
|
assertEquals(expected, actual)
|
||||||
|
services.vaultService.notify(issueTx)
|
||||||
|
}
|
||||||
|
|
||||||
|
database.transaction {
|
||||||
|
val moveTx = TransactionBuilder(TransactionType.General, services.myInfo.legalIdentity).apply {
|
||||||
|
services.vaultService.generateSpend(this, Amount(1000, GBP), thirdPartyIdentity)
|
||||||
|
}.toWireTransaction()
|
||||||
|
|
||||||
|
val expected = Vault.Update(setOf(cashState), emptySet(), null)
|
||||||
|
val actual = service.makeUpdate(moveTx, setOf(anonymousIdentity.identity.owningKey))
|
||||||
|
assertEquals(expected, actual)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user