mirror of
https://github.com/corda/corda.git
synced 2025-01-18 02:39:51 +00:00
No IdentityServiceInternal as public param. Start nodes without params. Simpler MockServices ctors. (#2521)
* Removes IdentityServiceInternal as a public parameter to MockServices. * Reorders params to put non-default args first. Creates simpler default constructors. * Adds constructors for creating mock nodes by passing params.
This commit is contained in:
parent
49f75dab9c
commit
c9ade00de6
@ -58,19 +58,19 @@ class PartialMerkleTreeTest {
|
|||||||
hashed = nodes.map { it.serialize().sha256() }
|
hashed = nodes.map { it.serialize().sha256() }
|
||||||
expectedRoot = MerkleTree.getMerkleTree(hashed.toMutableList() + listOf(zeroHash, zeroHash)).hash
|
expectedRoot = MerkleTree.getMerkleTree(hashed.toMutableList() + listOf(zeroHash, zeroHash)).hash
|
||||||
merkleTree = MerkleTree.getMerkleTree(hashed)
|
merkleTree = MerkleTree.getMerkleTree(hashed)
|
||||||
testLedger = MockServices(emptyList(), rigorousMock<IdentityServiceInternal>().also {
|
testLedger = MockServices(emptyList(), MEGA_CORP.name, rigorousMock<IdentityServiceInternal>().also {
|
||||||
doReturn(MEGA_CORP).whenever(it).partyFromKey(MEGA_CORP_PUBKEY)
|
doReturn(MEGA_CORP).whenever(it).partyFromKey(MEGA_CORP_PUBKEY)
|
||||||
}, MEGA_CORP.name).ledger(DUMMY_NOTARY) {
|
}).ledger(DUMMY_NOTARY) {
|
||||||
unverifiedTransaction {
|
unverifiedTransaction {
|
||||||
attachments(Cash.PROGRAM_ID)
|
attachments(Cash.PROGRAM_ID)
|
||||||
output(Cash.PROGRAM_ID, "MEGA_CORP cash",
|
output(Cash.PROGRAM_ID, "MEGA_CORP cash",
|
||||||
Cash.State(
|
Cash.State(
|
||||||
amount = 1000.DOLLARS `issued by` MEGA_CORP.ref(1, 1),
|
amount = 1000.DOLLARS `issued by` MEGA_CORP.ref(1, 1),
|
||||||
owner = MEGA_CORP))
|
owner = MEGA_CORP))
|
||||||
output(Cash.PROGRAM_ID, "dummy cash 1",
|
output(Cash.PROGRAM_ID, "dummy cash 1",
|
||||||
Cash.State(
|
Cash.State(
|
||||||
amount = 900.DOLLARS `issued by` MEGA_CORP.ref(1, 1),
|
amount = 900.DOLLARS `issued by` MEGA_CORP.ref(1, 1),
|
||||||
owner = MINI_CORP))
|
owner = MINI_CORP))
|
||||||
}
|
}
|
||||||
transaction {
|
transaction {
|
||||||
attachments(Cash.PROGRAM_ID)
|
attachments(Cash.PROGRAM_ID)
|
||||||
|
@ -136,7 +136,7 @@ class CollectSignaturesFlowTests {
|
|||||||
@Test
|
@Test
|
||||||
fun `fails when not signed by initiator`() {
|
fun `fails when not signed by initiator`() {
|
||||||
val onePartyDummyContract = DummyContract.generateInitial(1337, notary, alice.ref(1))
|
val onePartyDummyContract = DummyContract.generateInitial(1337, notary, alice.ref(1))
|
||||||
val miniCorpServices = MockServices(listOf("net.corda.testing.contracts"), rigorousMock(), miniCorp)
|
val miniCorpServices = MockServices(listOf("net.corda.testing.contracts"), miniCorp, rigorousMock())
|
||||||
val ptx = miniCorpServices.signInitialTransaction(onePartyDummyContract)
|
val ptx = miniCorpServices.signInitialTransaction(onePartyDummyContract)
|
||||||
val flow = aliceNode.services.startFlow(CollectSignaturesFlow(ptx, emptySet()))
|
val flow = aliceNode.services.startFlow(CollectSignaturesFlow(ptx, emptySet()))
|
||||||
mockNet.runNetwork()
|
mockNet.runNetwork()
|
||||||
|
@ -62,8 +62,8 @@ class TransactionSerializationTests {
|
|||||||
val inputState = StateAndRef(TransactionState(TestCash.State(depositRef, 100.POUNDS, MEGA_CORP), TEST_CASH_PROGRAM_ID, DUMMY_NOTARY), fakeStateRef)
|
val inputState = StateAndRef(TransactionState(TestCash.State(depositRef, 100.POUNDS, MEGA_CORP), TEST_CASH_PROGRAM_ID, DUMMY_NOTARY), fakeStateRef)
|
||||||
val outputState = TransactionState(TestCash.State(depositRef, 600.POUNDS, MEGA_CORP), TEST_CASH_PROGRAM_ID, DUMMY_NOTARY)
|
val outputState = TransactionState(TestCash.State(depositRef, 600.POUNDS, MEGA_CORP), TEST_CASH_PROGRAM_ID, DUMMY_NOTARY)
|
||||||
val changeState = TransactionState(TestCash.State(depositRef, 400.POUNDS, MEGA_CORP), TEST_CASH_PROGRAM_ID, DUMMY_NOTARY)
|
val changeState = TransactionState(TestCash.State(depositRef, 400.POUNDS, MEGA_CORP), TEST_CASH_PROGRAM_ID, DUMMY_NOTARY)
|
||||||
val megaCorpServices = MockServices(listOf("net.corda.core.serialization"), rigorousMock(), MEGA_CORP.name, MEGA_CORP_KEY)
|
val megaCorpServices = MockServices(listOf("net.corda.core.serialization"), MEGA_CORP.name, rigorousMock(), MEGA_CORP_KEY)
|
||||||
val notaryServices = MockServices(listOf("net.corda.core.serialization"), rigorousMock(), DUMMY_NOTARY.name, DUMMY_NOTARY_KEY)
|
val notaryServices = MockServices(listOf("net.corda.core.serialization"), DUMMY_NOTARY.name, rigorousMock(), DUMMY_NOTARY_KEY)
|
||||||
lateinit var tx: TransactionBuilder
|
lateinit var tx: TransactionBuilder
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
@ -107,7 +107,7 @@ class TransactionSerializationTests {
|
|||||||
Command(TestCash.Commands.Move(), DUMMY_KEY_2.public))
|
Command(TestCash.Commands.Move(), DUMMY_KEY_2.public))
|
||||||
|
|
||||||
val ptx2 = notaryServices.signInitialTransaction(tx2)
|
val ptx2 = notaryServices.signInitialTransaction(tx2)
|
||||||
val dummyServices = MockServices(emptyList(), rigorousMock(), MEGA_CORP.name, DUMMY_KEY_2)
|
val dummyServices = MockServices(emptyList(), MEGA_CORP.name, rigorousMock(), DUMMY_KEY_2)
|
||||||
val stx2 = dummyServices.addSignature(ptx2)
|
val stx2 = dummyServices.addSignature(ptx2)
|
||||||
|
|
||||||
stx.copy(sigs = stx2.sigs).verifyRequiredSignatures()
|
stx.copy(sigs = stx2.sigs).verifyRequiredSignatures()
|
||||||
|
@ -29,9 +29,10 @@ class LedgerTransactionQueryTests {
|
|||||||
@JvmField
|
@JvmField
|
||||||
val testSerialization = SerializationEnvironmentRule()
|
val testSerialization = SerializationEnvironmentRule()
|
||||||
private val keyPair = generateKeyPair()
|
private val keyPair = generateKeyPair()
|
||||||
private val services = MockServices(emptyList(), rigorousMock<IdentityServiceInternal>().also {
|
private val services = MockServices(emptyList(), CordaX500Name("MegaCorp", "London", "GB"),
|
||||||
doReturn(null).whenever(it).partyFromKey(keyPair.public)
|
rigorousMock<IdentityServiceInternal>().also {
|
||||||
}, CordaX500Name("MegaCorp", "London", "GB"), keyPair)
|
doReturn(null).whenever(it).partyFromKey(keyPair.public)
|
||||||
|
}, keyPair)
|
||||||
private val identity: Party = services.myInfo.singleIdentity()
|
private val identity: Party = services.myInfo.singleIdentity()
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
|
@ -51,7 +51,8 @@ class TransactionEncumbranceTests {
|
|||||||
class DummyTimeLock : Contract {
|
class DummyTimeLock : Contract {
|
||||||
override fun verify(tx: LedgerTransaction) {
|
override fun verify(tx: LedgerTransaction) {
|
||||||
val timeLockInput = tx.inputsOfType<State>().singleOrNull() ?: return
|
val timeLockInput = tx.inputsOfType<State>().singleOrNull() ?: return
|
||||||
val time = tx.timeWindow?.untilTime ?: throw IllegalArgumentException("Transactions containing time-locks must have a time-window")
|
val time = tx.timeWindow?.untilTime
|
||||||
|
?: throw IllegalArgumentException("Transactions containing time-locks must have a time-window")
|
||||||
requireThat {
|
requireThat {
|
||||||
"the time specified in the time-lock has passed" using (time >= timeLockInput.validFrom)
|
"the time specified in the time-lock has passed" using (time >= timeLockInput.validFrom)
|
||||||
}
|
}
|
||||||
@ -64,9 +65,10 @@ class TransactionEncumbranceTests {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private val ledgerServices = MockServices(emptyList(), rigorousMock<IdentityServiceInternal>().also {
|
private val ledgerServices = MockServices(emptyList(), MEGA_CORP.name,
|
||||||
doReturn(MEGA_CORP).whenever(it).partyFromKey(MEGA_CORP_PUBKEY)
|
rigorousMock<IdentityServiceInternal>().also {
|
||||||
}, MEGA_CORP.name)
|
doReturn(MEGA_CORP).whenever(it).partyFromKey(MEGA_CORP_PUBKEY)
|
||||||
|
})
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `state can be encumbered`() {
|
fun `state can be encumbered`() {
|
||||||
|
@ -5,6 +5,7 @@ import com.nhaarman.mockito_kotlin.whenever
|
|||||||
import net.corda.core.contracts.TransactionVerificationException
|
import net.corda.core.contracts.TransactionVerificationException
|
||||||
import net.corda.core.crypto.generateKeyPair
|
import net.corda.core.crypto.generateKeyPair
|
||||||
import net.corda.core.identity.CordaX500Name
|
import net.corda.core.identity.CordaX500Name
|
||||||
|
import net.corda.core.node.services.IdentityService
|
||||||
import net.corda.core.utilities.days
|
import net.corda.core.utilities.days
|
||||||
import net.corda.finance.DOLLARS
|
import net.corda.finance.DOLLARS
|
||||||
import net.corda.finance.`issued by`
|
import net.corda.finance.`issued by`
|
||||||
@ -13,7 +14,6 @@ import net.corda.finance.contracts.CommercialPaper
|
|||||||
import net.corda.finance.contracts.ICommercialPaperState
|
import net.corda.finance.contracts.ICommercialPaperState
|
||||||
import net.corda.finance.contracts.asset.CASH
|
import net.corda.finance.contracts.asset.CASH
|
||||||
import net.corda.finance.contracts.asset.Cash
|
import net.corda.finance.contracts.asset.Cash
|
||||||
import net.corda.node.services.api.IdentityServiceInternal
|
|
||||||
import net.corda.testing.core.*
|
import net.corda.testing.core.*
|
||||||
import net.corda.testing.internal.rigorousMock
|
import net.corda.testing.internal.rigorousMock
|
||||||
import net.corda.testing.node.MockServices
|
import net.corda.testing.node.MockServices
|
||||||
@ -38,11 +38,11 @@ class CommercialPaperTest {
|
|||||||
@Rule
|
@Rule
|
||||||
@JvmField
|
@JvmField
|
||||||
val testSerialization = SerializationEnvironmentRule()
|
val testSerialization = SerializationEnvironmentRule()
|
||||||
private val ledgerServices = MockServices(emptyList(), rigorousMock<IdentityServiceInternal>().also {
|
private val ledgerServices = MockServices(emptyList(), MEGA_CORP.name, rigorousMock<IdentityService>().also {
|
||||||
doReturn(MEGA_CORP).whenever(it).partyFromKey(MEGA_CORP_PUBKEY)
|
doReturn(MEGA_CORP).whenever(it).partyFromKey(MEGA_CORP_PUBKEY)
|
||||||
doReturn(null).whenever(it).partyFromKey(BIG_CORP_PUBKEY)
|
doReturn(null).whenever(it).partyFromKey(BIG_CORP_PUBKEY)
|
||||||
doReturn(null).whenever(it).partyFromKey(ALICE_PUBKEY)
|
doReturn(null).whenever(it).partyFromKey(ALICE_PUBKEY)
|
||||||
}, MEGA_CORP.name)
|
})
|
||||||
|
|
||||||
// DOCSTART 1
|
// DOCSTART 1
|
||||||
fun getPaper(): ICommercialPaperState = CommercialPaper.State(
|
fun getPaper(): ICommercialPaperState = CommercialPaper.State(
|
||||||
|
@ -25,11 +25,12 @@ import java.time.LocalDate
|
|||||||
|
|
||||||
internal val DUMMY_NOTARY = TestIdentity(DUMMY_NOTARY_NAME, 20).party
|
internal val DUMMY_NOTARY = TestIdentity(DUMMY_NOTARY_NAME, 20).party
|
||||||
fun transaction(script: TransactionDSL<TransactionDSLInterpreter>.() -> EnforceVerifyOrFail) = run {
|
fun transaction(script: TransactionDSL<TransactionDSLInterpreter>.() -> EnforceVerifyOrFail) = run {
|
||||||
MockServices(listOf("net.corda.finance.contracts.universal"), rigorousMock<IdentityServiceInternal>().also {
|
MockServices(listOf("net.corda.finance.contracts.universal"), CordaX500Name("MegaCorp", "London", "GB"),
|
||||||
listOf(acmeCorp, highStreetBank, momAndPop).forEach { party ->
|
rigorousMock<IdentityServiceInternal>().also {
|
||||||
doReturn(null).whenever(it).partyFromKey(party.owningKey)
|
listOf(acmeCorp, highStreetBank, momAndPop).forEach { party ->
|
||||||
}
|
doReturn(null).whenever(it).partyFromKey(party.owningKey)
|
||||||
}, CordaX500Name("MegaCorp", "London", "GB")).transaction(DUMMY_NOTARY, script)
|
}
|
||||||
|
}).transaction(DUMMY_NOTARY, script)
|
||||||
}
|
}
|
||||||
|
|
||||||
class Cap {
|
class Cap {
|
||||||
@ -312,14 +313,15 @@ class Cap {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test @Ignore
|
@Test
|
||||||
|
@Ignore
|
||||||
fun `pretty print`() {
|
fun `pretty print`() {
|
||||||
println ( prettyPrint(contractInitial) )
|
println(prettyPrint(contractInitial))
|
||||||
|
|
||||||
println ( prettyPrint(contractAfterFixingFirst) )
|
println(prettyPrint(contractAfterFixingFirst))
|
||||||
|
|
||||||
println ( prettyPrint(contractAfterExecutionFirst) )
|
println(prettyPrint(contractAfterExecutionFirst))
|
||||||
|
|
||||||
println ( prettyPrint(contractAfterFixingFinal) )
|
println(prettyPrint(contractAfterFixingFinal))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -38,7 +38,7 @@ public class CashTestsJava {
|
|||||||
IdentityServiceInternal identityService = rigorousMock(IdentityServiceInternal.class);
|
IdentityServiceInternal identityService = rigorousMock(IdentityServiceInternal.class);
|
||||||
doReturn(MEGA_CORP.getParty()).when(identityService).partyFromKey(MEGA_CORP.getPublicKey());
|
doReturn(MEGA_CORP.getParty()).when(identityService).partyFromKey(MEGA_CORP.getPublicKey());
|
||||||
doReturn(MINI_CORP.getParty()).when(identityService).partyFromKey(MINI_CORP.getPublicKey());
|
doReturn(MINI_CORP.getParty()).when(identityService).partyFromKey(MINI_CORP.getPublicKey());
|
||||||
transaction(new MockServices(emptyList(), identityService, MEGA_CORP.getName()), DUMMY_NOTARY, tx -> {
|
transaction(new MockServices(emptyList(), MEGA_CORP.getName(), identityService), DUMMY_NOTARY, tx -> {
|
||||||
tx.attachment(Cash.PROGRAM_ID);
|
tx.attachment(Cash.PROGRAM_ID);
|
||||||
|
|
||||||
tx.input(Cash.PROGRAM_ID, inState);
|
tx.input(Cash.PROGRAM_ID, inState);
|
||||||
|
@ -78,8 +78,8 @@ class ObligationTests {
|
|||||||
beneficiary = CHARLIE
|
beneficiary = CHARLIE
|
||||||
)
|
)
|
||||||
private val outState = inState.copy(beneficiary = AnonymousParty(BOB_PUBKEY))
|
private val outState = inState.copy(beneficiary = AnonymousParty(BOB_PUBKEY))
|
||||||
private val miniCorpServices = MockServices(listOf("net.corda.finance.contracts.asset"), rigorousMock(), miniCorp)
|
private val miniCorpServices = MockServices(listOf("net.corda.finance.contracts.asset"), miniCorp, rigorousMock())
|
||||||
private val notaryServices = MockServices(emptyList(), rigorousMock(), MEGA_CORP.name, dummyNotary.keyPair)
|
private val notaryServices = MockServices(emptyList(), MEGA_CORP.name, rigorousMock(), dummyNotary.keyPair)
|
||||||
private val identityService = rigorousMock<IdentityServiceInternal>().also {
|
private val identityService = rigorousMock<IdentityServiceInternal>().also {
|
||||||
doReturn(null).whenever(it).partyFromKey(ALICE_PUBKEY)
|
doReturn(null).whenever(it).partyFromKey(ALICE_PUBKEY)
|
||||||
doReturn(null).whenever(it).partyFromKey(BOB_PUBKEY)
|
doReturn(null).whenever(it).partyFromKey(BOB_PUBKEY)
|
||||||
@ -87,8 +87,8 @@ class ObligationTests {
|
|||||||
doReturn(MEGA_CORP).whenever(it).partyFromKey(MEGA_CORP_PUBKEY)
|
doReturn(MEGA_CORP).whenever(it).partyFromKey(MEGA_CORP_PUBKEY)
|
||||||
doReturn(MINI_CORP).whenever(it).partyFromKey(MINI_CORP_PUBKEY)
|
doReturn(MINI_CORP).whenever(it).partyFromKey(MINI_CORP_PUBKEY)
|
||||||
}
|
}
|
||||||
private val mockService = MockServices(listOf("net.corda.finance.contracts.asset"), identityService, MEGA_CORP.name)
|
private val mockService = MockServices(listOf("net.corda.finance.contracts.asset"), MEGA_CORP.name, identityService)
|
||||||
private val ledgerServices get() = MockServices(emptyList(), identityService, MEGA_CORP.name)
|
private val ledgerServices get() = MockServices(emptyList(), MEGA_CORP.name, identityService)
|
||||||
private fun cashObligationTestRoots(
|
private fun cashObligationTestRoots(
|
||||||
group: LedgerDSL<TestTransactionDSLInterpreter, TestLedgerDSLInterpreter>
|
group: LedgerDSL<TestTransactionDSLInterpreter, TestLedgerDSLInterpreter>
|
||||||
) = group.apply {
|
) = group.apply {
|
||||||
|
@ -24,7 +24,7 @@ class ContractAttachmentSerializerTest {
|
|||||||
private lateinit var factory: SerializationFactory
|
private lateinit var factory: SerializationFactory
|
||||||
private lateinit var context: SerializationContext
|
private lateinit var context: SerializationContext
|
||||||
private lateinit var contextWithToken: SerializationContext
|
private lateinit var contextWithToken: SerializationContext
|
||||||
private val mockServices = MockServices(emptyList(), rigorousMock(), CordaX500Name("MegaCorp", "London", "GB"))
|
private val mockServices = MockServices(emptyList(), CordaX500Name("MegaCorp", "London", "GB"), rigorousMock())
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
fun setup() {
|
fun setup() {
|
||||||
|
@ -529,7 +529,7 @@ abstract class AbstractNode(val configuration: NodeConfiguration,
|
|||||||
* Builds node internal, advertised, and plugin services.
|
* Builds node internal, advertised, and plugin services.
|
||||||
* Returns a list of tokenizable services to be added to the serialisation context.
|
* Returns a list of tokenizable services to be added to the serialisation context.
|
||||||
*/
|
*/
|
||||||
private fun makeServices(keyPairs: Set<KeyPair>, schemaService: SchemaService, transactionStorage: WritableTransactionStorage, database: CordaPersistence, info: NodeInfo, identityService: IdentityServiceInternal, networkMapCache: NetworkMapCacheInternal, nodeProperties: NodePropertiesStore): MutableList<Any> {
|
private fun makeServices(keyPairs: Set<KeyPair>, schemaService: SchemaService, transactionStorage: WritableTransactionStorage, database: CordaPersistence, info: NodeInfo, identityService: IdentityService, networkMapCache: NetworkMapCacheInternal, nodeProperties: NodePropertiesStore): MutableList<Any> {
|
||||||
checkpointStorage = DBCheckpointStorage()
|
checkpointStorage = DBCheckpointStorage()
|
||||||
val metrics = MetricRegistry()
|
val metrics = MetricRegistry()
|
||||||
attachments = NodeAttachmentService(metrics, configuration.attachmentContentCacheSizeBytes, configuration.attachmentCacheBound)
|
attachments = NodeAttachmentService(metrics, configuration.attachmentContentCacheSizeBytes, configuration.attachmentCacheBound)
|
||||||
@ -630,7 +630,7 @@ abstract class AbstractNode(val configuration: NodeConfiguration,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected open fun makeKeyManagementService(identityService: IdentityServiceInternal, keyPairs: Set<KeyPair>): KeyManagementService {
|
protected open fun makeKeyManagementService(identityService: IdentityService, keyPairs: Set<KeyPair>): KeyManagementService {
|
||||||
return PersistentKeyManagementService(identityService, keyPairs)
|
return PersistentKeyManagementService(identityService, keyPairs)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,11 +4,11 @@ import net.corda.core.contracts.PartyAndReference
|
|||||||
import net.corda.core.crypto.toStringShort
|
import net.corda.core.crypto.toStringShort
|
||||||
import net.corda.core.identity.*
|
import net.corda.core.identity.*
|
||||||
import net.corda.core.internal.CertRole
|
import net.corda.core.internal.CertRole
|
||||||
|
import net.corda.core.node.services.IdentityService
|
||||||
import net.corda.core.node.services.UnknownAnonymousPartyException
|
import net.corda.core.node.services.UnknownAnonymousPartyException
|
||||||
import net.corda.core.serialization.SingletonSerializeAsToken
|
import net.corda.core.serialization.SingletonSerializeAsToken
|
||||||
import net.corda.core.utilities.contextLogger
|
import net.corda.core.utilities.contextLogger
|
||||||
import net.corda.core.utilities.trace
|
import net.corda.core.utilities.trace
|
||||||
import net.corda.node.services.api.IdentityServiceInternal
|
|
||||||
import net.corda.nodeapi.internal.crypto.X509Utilities
|
import net.corda.nodeapi.internal.crypto.X509Utilities
|
||||||
import net.corda.nodeapi.internal.crypto.x509Certificates
|
import net.corda.nodeapi.internal.crypto.x509Certificates
|
||||||
import java.security.InvalidAlgorithmParameterException
|
import java.security.InvalidAlgorithmParameterException
|
||||||
@ -25,7 +25,7 @@ import javax.annotation.concurrent.ThreadSafe
|
|||||||
// TODO There is duplicated logic between this and PersistentIdentityService
|
// TODO There is duplicated logic between this and PersistentIdentityService
|
||||||
@ThreadSafe
|
@ThreadSafe
|
||||||
class InMemoryIdentityService(identities: Array<out PartyAndCertificate>,
|
class InMemoryIdentityService(identities: Array<out PartyAndCertificate>,
|
||||||
override val trustRoot: X509Certificate) : SingletonSerializeAsToken(), IdentityServiceInternal {
|
override val trustRoot: X509Certificate) : SingletonSerializeAsToken(), IdentityService {
|
||||||
companion object {
|
companion object {
|
||||||
private val log = contextLogger()
|
private val log = contextLogger()
|
||||||
}
|
}
|
||||||
|
@ -3,9 +3,9 @@ package net.corda.node.services.keys
|
|||||||
import net.corda.core.crypto.*
|
import net.corda.core.crypto.*
|
||||||
import net.corda.core.identity.PartyAndCertificate
|
import net.corda.core.identity.PartyAndCertificate
|
||||||
import net.corda.core.internal.ThreadBox
|
import net.corda.core.internal.ThreadBox
|
||||||
|
import net.corda.core.node.services.IdentityService
|
||||||
import net.corda.core.node.services.KeyManagementService
|
import net.corda.core.node.services.KeyManagementService
|
||||||
import net.corda.core.serialization.SingletonSerializeAsToken
|
import net.corda.core.serialization.SingletonSerializeAsToken
|
||||||
import net.corda.node.services.api.IdentityServiceInternal
|
|
||||||
import org.bouncycastle.operator.ContentSigner
|
import org.bouncycastle.operator.ContentSigner
|
||||||
import java.security.KeyPair
|
import java.security.KeyPair
|
||||||
import java.security.PrivateKey
|
import java.security.PrivateKey
|
||||||
@ -25,7 +25,7 @@ import javax.annotation.concurrent.ThreadSafe
|
|||||||
* etc.
|
* etc.
|
||||||
*/
|
*/
|
||||||
@ThreadSafe
|
@ThreadSafe
|
||||||
class E2ETestKeyManagementService(val identityService: IdentityServiceInternal,
|
class E2ETestKeyManagementService(val identityService: IdentityService,
|
||||||
initialKeys: Set<KeyPair>) : SingletonSerializeAsToken(), KeyManagementService {
|
initialKeys: Set<KeyPair>) : SingletonSerializeAsToken(), KeyManagementService {
|
||||||
private class InnerState {
|
private class InnerState {
|
||||||
val keys = HashMap<PublicKey, PrivateKey>()
|
val keys = HashMap<PublicKey, PrivateKey>()
|
||||||
|
@ -3,6 +3,7 @@ package net.corda.node.services.keys
|
|||||||
import net.corda.core.crypto.Crypto
|
import net.corda.core.crypto.Crypto
|
||||||
import net.corda.core.identity.PartyAndCertificate
|
import net.corda.core.identity.PartyAndCertificate
|
||||||
import net.corda.core.internal.CertRole
|
import net.corda.core.internal.CertRole
|
||||||
|
import net.corda.core.node.services.IdentityService
|
||||||
import net.corda.core.utilities.days
|
import net.corda.core.utilities.days
|
||||||
import net.corda.node.services.api.IdentityServiceInternal
|
import net.corda.node.services.api.IdentityServiceInternal
|
||||||
import net.corda.nodeapi.internal.crypto.CertificateType
|
import net.corda.nodeapi.internal.crypto.CertificateType
|
||||||
@ -27,7 +28,7 @@ import java.time.Duration
|
|||||||
* @param revocationEnabled whether to check revocation status of certificates in the certificate path.
|
* @param revocationEnabled whether to check revocation status of certificates in the certificate path.
|
||||||
* @return X.509 certificate and path to the trust root.
|
* @return X.509 certificate and path to the trust root.
|
||||||
*/
|
*/
|
||||||
fun freshCertificate(identityService: IdentityServiceInternal,
|
fun freshCertificate(identityService: IdentityService,
|
||||||
subjectPublicKey: PublicKey,
|
subjectPublicKey: PublicKey,
|
||||||
issuer: PartyAndCertificate,
|
issuer: PartyAndCertificate,
|
||||||
issuerSigner: ContentSigner,
|
issuerSigner: ContentSigner,
|
||||||
@ -45,7 +46,11 @@ fun freshCertificate(identityService: IdentityServiceInternal,
|
|||||||
window)
|
window)
|
||||||
val ourCertPath = X509Utilities.buildCertPath(ourCertificate, issuer.certPath.x509Certificates)
|
val ourCertPath = X509Utilities.buildCertPath(ourCertificate, issuer.certPath.x509Certificates)
|
||||||
val anonymisedIdentity = PartyAndCertificate(ourCertPath)
|
val anonymisedIdentity = PartyAndCertificate(ourCertPath)
|
||||||
identityService.justVerifyAndRegisterIdentity(anonymisedIdentity)
|
if (identityService is IdentityServiceInternal) {
|
||||||
|
identityService.justVerifyAndRegisterIdentity(anonymisedIdentity)
|
||||||
|
} else {
|
||||||
|
identityService.verifyAndRegisterIdentity(anonymisedIdentity)
|
||||||
|
}
|
||||||
return anonymisedIdentity
|
return anonymisedIdentity
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,10 +2,10 @@ package net.corda.node.services.keys
|
|||||||
|
|
||||||
import net.corda.core.crypto.*
|
import net.corda.core.crypto.*
|
||||||
import net.corda.core.identity.PartyAndCertificate
|
import net.corda.core.identity.PartyAndCertificate
|
||||||
|
import net.corda.core.node.services.IdentityService
|
||||||
import net.corda.core.node.services.KeyManagementService
|
import net.corda.core.node.services.KeyManagementService
|
||||||
import net.corda.core.serialization.SingletonSerializeAsToken
|
import net.corda.core.serialization.SingletonSerializeAsToken
|
||||||
import net.corda.core.utilities.MAX_HASH_HEX_SIZE
|
import net.corda.core.utilities.MAX_HASH_HEX_SIZE
|
||||||
import net.corda.node.services.api.IdentityServiceInternal
|
|
||||||
import net.corda.node.utilities.AppendOnlyPersistentMap
|
import net.corda.node.utilities.AppendOnlyPersistentMap
|
||||||
import net.corda.nodeapi.internal.persistence.NODE_DATABASE_PREFIX
|
import net.corda.nodeapi.internal.persistence.NODE_DATABASE_PREFIX
|
||||||
import org.bouncycastle.operator.ContentSigner
|
import org.bouncycastle.operator.ContentSigner
|
||||||
@ -24,7 +24,7 @@ import javax.persistence.Lob
|
|||||||
*
|
*
|
||||||
* This class needs database transactions to be in-flight during method calls and init.
|
* This class needs database transactions to be in-flight during method calls and init.
|
||||||
*/
|
*/
|
||||||
class PersistentKeyManagementService(val identityService: IdentityServiceInternal,
|
class PersistentKeyManagementService(val identityService: IdentityService,
|
||||||
initialKeys: Set<KeyPair>) : SingletonSerializeAsToken(), KeyManagementService {
|
initialKeys: Set<KeyPair>) : SingletonSerializeAsToken(), KeyManagementService {
|
||||||
|
|
||||||
@Entity
|
@Entity
|
||||||
|
@ -9,6 +9,7 @@ import net.corda.core.identity.AbstractParty;
|
|||||||
import net.corda.core.identity.CordaX500Name;
|
import net.corda.core.identity.CordaX500Name;
|
||||||
import net.corda.core.identity.Party;
|
import net.corda.core.identity.Party;
|
||||||
import net.corda.core.messaging.DataFeed;
|
import net.corda.core.messaging.DataFeed;
|
||||||
|
import net.corda.core.node.services.IdentityService;
|
||||||
import net.corda.core.node.services.Vault;
|
import net.corda.core.node.services.Vault;
|
||||||
import net.corda.core.node.services.VaultQueryException;
|
import net.corda.core.node.services.VaultQueryException;
|
||||||
import net.corda.core.node.services.VaultService;
|
import net.corda.core.node.services.VaultService;
|
||||||
@ -70,13 +71,13 @@ public class VaultQueryJavaTests {
|
|||||||
@Before
|
@Before
|
||||||
public void setUp() throws CertificateException, InvalidAlgorithmParameterException {
|
public void setUp() throws CertificateException, InvalidAlgorithmParameterException {
|
||||||
List<String> cordappPackages = Arrays.asList("net.corda.testing.internal.vault", "net.corda.finance.contracts.asset", CashSchemaV1.class.getPackage().getName());
|
List<String> cordappPackages = Arrays.asList("net.corda.testing.internal.vault", "net.corda.finance.contracts.asset", CashSchemaV1.class.getPackage().getName());
|
||||||
IdentityServiceInternal identitySvc = makeTestIdentityService(MEGA_CORP.getIdentity(), DUMMY_CASH_ISSUER_INFO.getIdentity(), DUMMY_NOTARY.getIdentity());
|
IdentityService identitySvc = makeTestIdentityService(MEGA_CORP.getIdentity(), DUMMY_CASH_ISSUER_INFO.getIdentity(), DUMMY_NOTARY.getIdentity());
|
||||||
Pair<CordaPersistence, MockServices> databaseAndServices = makeTestDatabaseAndMockServices(
|
Pair<CordaPersistence, MockServices> databaseAndServices = makeTestDatabaseAndMockServices(
|
||||||
cordappPackages,
|
cordappPackages,
|
||||||
identitySvc,
|
identitySvc,
|
||||||
MEGA_CORP,
|
MEGA_CORP,
|
||||||
DUMMY_NOTARY.getKeyPair());
|
DUMMY_NOTARY.getKeyPair());
|
||||||
issuerServices = new MockServices(cordappPackages, rigorousMock(IdentityServiceInternal.class), DUMMY_CASH_ISSUER_INFO, BOC.getKeyPair());
|
issuerServices = new MockServices(cordappPackages, DUMMY_CASH_ISSUER_INFO, rigorousMock(IdentityServiceInternal.class), BOC.getKeyPair());
|
||||||
database = databaseAndServices.getFirst();
|
database = databaseAndServices.getFirst();
|
||||||
MockServices services = databaseAndServices.getSecond();
|
MockServices services = databaseAndServices.getSecond();
|
||||||
vaultFiller = new VaultFiller(services, DUMMY_NOTARY);
|
vaultFiller = new VaultFiller(services, DUMMY_NOTARY);
|
||||||
|
@ -105,7 +105,7 @@ class TwoPartyTradeFlowTests(private val anonymous: Boolean) {
|
|||||||
// allow interruption half way through.
|
// allow interruption half way through.
|
||||||
mockNet = InternalMockNetwork(threadPerNode = true, cordappPackages = cordappPackages)
|
mockNet = InternalMockNetwork(threadPerNode = true, cordappPackages = cordappPackages)
|
||||||
val ledgerIdentityService = rigorousMock<IdentityServiceInternal>()
|
val ledgerIdentityService = rigorousMock<IdentityServiceInternal>()
|
||||||
MockServices(cordappPackages, ledgerIdentityService, MEGA_CORP.name).ledger(DUMMY_NOTARY) {
|
MockServices(cordappPackages, MEGA_CORP.name, ledgerIdentityService).ledger(DUMMY_NOTARY) {
|
||||||
val notaryNode = mockNet.defaultNotaryNode
|
val notaryNode = mockNet.defaultNotaryNode
|
||||||
val aliceNode = mockNet.createPartyNode(ALICE_NAME)
|
val aliceNode = mockNet.createPartyNode(ALICE_NAME)
|
||||||
val bobNode = mockNet.createPartyNode(BOB_NAME)
|
val bobNode = mockNet.createPartyNode(BOB_NAME)
|
||||||
@ -157,7 +157,7 @@ class TwoPartyTradeFlowTests(private val anonymous: Boolean) {
|
|||||||
fun `trade cash for commercial paper fails using soft locking`() {
|
fun `trade cash for commercial paper fails using soft locking`() {
|
||||||
mockNet = InternalMockNetwork(threadPerNode = true, cordappPackages = cordappPackages)
|
mockNet = InternalMockNetwork(threadPerNode = true, cordappPackages = cordappPackages)
|
||||||
val ledgerIdentityService = rigorousMock<IdentityServiceInternal>()
|
val ledgerIdentityService = rigorousMock<IdentityServiceInternal>()
|
||||||
MockServices(cordappPackages, ledgerIdentityService, MEGA_CORP.name).ledger(DUMMY_NOTARY) {
|
MockServices(cordappPackages, MEGA_CORP.name, ledgerIdentityService).ledger(DUMMY_NOTARY) {
|
||||||
val notaryNode = mockNet.defaultNotaryNode
|
val notaryNode = mockNet.defaultNotaryNode
|
||||||
val aliceNode = mockNet.createPartyNode(ALICE_NAME)
|
val aliceNode = mockNet.createPartyNode(ALICE_NAME)
|
||||||
val bobNode = mockNet.createPartyNode(BOB_NAME)
|
val bobNode = mockNet.createPartyNode(BOB_NAME)
|
||||||
@ -215,7 +215,7 @@ class TwoPartyTradeFlowTests(private val anonymous: Boolean) {
|
|||||||
fun `shutdown and restore`() {
|
fun `shutdown and restore`() {
|
||||||
mockNet = InternalMockNetwork(cordappPackages = cordappPackages)
|
mockNet = InternalMockNetwork(cordappPackages = cordappPackages)
|
||||||
val ledgerIdentityService = rigorousMock<IdentityServiceInternal>()
|
val ledgerIdentityService = rigorousMock<IdentityServiceInternal>()
|
||||||
MockServices(cordappPackages, ledgerIdentityService, MEGA_CORP.name).ledger(DUMMY_NOTARY) {
|
MockServices(cordappPackages, MEGA_CORP.name, ledgerIdentityService).ledger(DUMMY_NOTARY) {
|
||||||
val notaryNode = mockNet.defaultNotaryNode
|
val notaryNode = mockNet.defaultNotaryNode
|
||||||
val aliceNode = mockNet.createPartyNode(ALICE_NAME)
|
val aliceNode = mockNet.createPartyNode(ALICE_NAME)
|
||||||
var bobNode = mockNet.createPartyNode(BOB_NAME)
|
var bobNode = mockNet.createPartyNode(BOB_NAME)
|
||||||
@ -508,7 +508,7 @@ class TwoPartyTradeFlowTests(private val anonymous: Boolean) {
|
|||||||
fun `dependency with error on buyer side`() {
|
fun `dependency with error on buyer side`() {
|
||||||
mockNet = InternalMockNetwork(cordappPackages = cordappPackages)
|
mockNet = InternalMockNetwork(cordappPackages = cordappPackages)
|
||||||
val ledgerIdentityService = rigorousMock<IdentityServiceInternal>()
|
val ledgerIdentityService = rigorousMock<IdentityServiceInternal>()
|
||||||
MockServices(cordappPackages, ledgerIdentityService, MEGA_CORP.name).ledger(DUMMY_NOTARY) {
|
MockServices(cordappPackages, MEGA_CORP.name, ledgerIdentityService).ledger(DUMMY_NOTARY) {
|
||||||
runWithError(ledgerIdentityService, true, false, "at least one cash input")
|
runWithError(ledgerIdentityService, true, false, "at least one cash input")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -517,7 +517,7 @@ class TwoPartyTradeFlowTests(private val anonymous: Boolean) {
|
|||||||
fun `dependency with error on seller side`() {
|
fun `dependency with error on seller side`() {
|
||||||
mockNet = InternalMockNetwork(cordappPackages = cordappPackages)
|
mockNet = InternalMockNetwork(cordappPackages = cordappPackages)
|
||||||
val ledgerIdentityService = rigorousMock<IdentityServiceInternal>()
|
val ledgerIdentityService = rigorousMock<IdentityServiceInternal>()
|
||||||
MockServices(cordappPackages, ledgerIdentityService, MEGA_CORP.name).ledger(DUMMY_NOTARY) {
|
MockServices(cordappPackages, MEGA_CORP.name, ledgerIdentityService).ledger(DUMMY_NOTARY) {
|
||||||
runWithError(ledgerIdentityService, false, true, "Issuances have a time-window")
|
runWithError(ledgerIdentityService, false, true, "Issuances have a time-window")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,7 @@ class KMSUtilsTests {
|
|||||||
val alice = getTestPartyAndCertificate(ALICE_NAME, aliceKey.public)
|
val alice = getTestPartyAndCertificate(ALICE_NAME, aliceKey.public)
|
||||||
val cordappPackages = emptyList<String>()
|
val cordappPackages = emptyList<String>()
|
||||||
val ledgerIdentityService = makeTestIdentityService(alice)
|
val ledgerIdentityService = makeTestIdentityService(alice)
|
||||||
val mockServices = MockServices(cordappPackages, ledgerIdentityService, alice.name, aliceKey)
|
val mockServices = MockServices(cordappPackages, alice.name, ledgerIdentityService, aliceKey)
|
||||||
val wellKnownIdentity = mockServices.myInfo.singleIdentityAndCert()
|
val wellKnownIdentity = mockServices.myInfo.singleIdentityAndCert()
|
||||||
val confidentialIdentity = mockServices.keyManagementService.freshKeyAndCert(wellKnownIdentity, false)
|
val confidentialIdentity = mockServices.keyManagementService.freshKeyAndCert(wellKnownIdentity, false)
|
||||||
val cert = confidentialIdentity.certificate
|
val cert = confidentialIdentity.certificate
|
||||||
|
@ -97,9 +97,9 @@ class HibernateConfigurationTest {
|
|||||||
@Before
|
@Before
|
||||||
fun setUp() {
|
fun setUp() {
|
||||||
val cordappPackages = listOf("net.corda.testing.internal.vault", "net.corda.finance.contracts.asset")
|
val cordappPackages = listOf("net.corda.testing.internal.vault", "net.corda.finance.contracts.asset")
|
||||||
bankServices = MockServices(cordappPackages, rigorousMock(), BOC.name, BOC_KEY)
|
bankServices = MockServices(cordappPackages, BOC.name, rigorousMock(), BOC_KEY)
|
||||||
issuerServices = MockServices(cordappPackages, rigorousMock(), dummyCashIssuer)
|
issuerServices = MockServices(cordappPackages, dummyCashIssuer, rigorousMock())
|
||||||
notaryServices = MockServices(cordappPackages, rigorousMock(), dummyNotary)
|
notaryServices = MockServices(cordappPackages, dummyNotary, rigorousMock())
|
||||||
notary = notaryServices.myInfo.singleIdentity()
|
notary = notaryServices.myInfo.singleIdentity()
|
||||||
val dataSourceProps = makeTestDataSourceProperties()
|
val dataSourceProps = makeTestDataSourceProperties()
|
||||||
val identityService = rigorousMock<IdentityService>().also { mock ->
|
val identityService = rigorousMock<IdentityService>().also { mock ->
|
||||||
@ -115,9 +115,9 @@ class HibernateConfigurationTest {
|
|||||||
hibernateConfig = database.hibernateConfig
|
hibernateConfig = database.hibernateConfig
|
||||||
|
|
||||||
// `consumeCash` expects we can self-notarise transactions
|
// `consumeCash` expects we can self-notarise transactions
|
||||||
services = object : MockServices(cordappPackages, rigorousMock<IdentityServiceInternal>().also {
|
services = object : MockServices(cordappPackages, BOB_NAME, rigorousMock<IdentityServiceInternal>().also {
|
||||||
doNothing().whenever(it).justVerifyAndRegisterIdentity(argThat { name == BOB_NAME })
|
doNothing().whenever(it).justVerifyAndRegisterIdentity(argThat { name == BOB_NAME })
|
||||||
}, BOB_NAME, generateKeyPair(), dummyNotary.keyPair) {
|
}, generateKeyPair(), dummyNotary.keyPair) {
|
||||||
override val vaultService = NodeVaultService(Clock.systemUTC(), keyManagementService, validatedTransactions, hibernateConfig)
|
override val vaultService = NodeVaultService(Clock.systemUTC(), keyManagementService, validatedTransactions, hibernateConfig)
|
||||||
override fun recordTransactions(statesToRecord: StatesToRecord, txs: Iterable<SignedTransaction>) {
|
override fun recordTransactions(statesToRecord: StatesToRecord, txs: Iterable<SignedTransaction>) {
|
||||||
for (stx in txs) {
|
for (stx in txs) {
|
||||||
|
@ -96,8 +96,8 @@ class NodeVaultServiceTest {
|
|||||||
vaultFiller = VaultFiller(services, dummyNotary)
|
vaultFiller = VaultFiller(services, dummyNotary)
|
||||||
// This is safe because MockServices only ever have a single identity
|
// This is safe because MockServices only ever have a single identity
|
||||||
identity = services.myInfo.singleIdentityAndCert()
|
identity = services.myInfo.singleIdentityAndCert()
|
||||||
issuerServices = MockServices(cordappPackages, rigorousMock(), dummyCashIssuer)
|
issuerServices = MockServices(cordappPackages, dummyCashIssuer, rigorousMock())
|
||||||
bocServices = MockServices(cordappPackages, rigorousMock(), bankOfCorda)
|
bocServices = MockServices(cordappPackages, bankOfCorda, rigorousMock())
|
||||||
services.identityService.verifyAndRegisterIdentity(DUMMY_CASH_ISSUER_IDENTITY)
|
services.identityService.verifyAndRegisterIdentity(DUMMY_CASH_ISSUER_IDENTITY)
|
||||||
services.identityService.verifyAndRegisterIdentity(BOC_IDENTITY)
|
services.identityService.verifyAndRegisterIdentity(BOC_IDENTITY)
|
||||||
}
|
}
|
||||||
@ -137,7 +137,7 @@ class NodeVaultServiceTest {
|
|||||||
assertThat(w1).hasSize(3)
|
assertThat(w1).hasSize(3)
|
||||||
|
|
||||||
val originalVault = vaultService
|
val originalVault = vaultService
|
||||||
val services2 = object : MockServices(emptyList(), rigorousMock(), MEGA_CORP.name) {
|
val services2 = object : MockServices(emptyList(), MEGA_CORP.name, rigorousMock()) {
|
||||||
override val vaultService: NodeVaultService get() = originalVault
|
override val vaultService: NodeVaultService get() = originalVault
|
||||||
override fun recordTransactions(statesToRecord: StatesToRecord, txs: Iterable<SignedTransaction>) {
|
override fun recordTransactions(statesToRecord: StatesToRecord, txs: Iterable<SignedTransaction>) {
|
||||||
for (stx in txs) {
|
for (stx in txs) {
|
||||||
@ -480,7 +480,7 @@ class NodeVaultServiceTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun addNoteToTransaction() {
|
fun addNoteToTransaction() {
|
||||||
val megaCorpServices = MockServices(cordappPackages, rigorousMock(), MEGA_CORP.name, MEGA_CORP_KEY)
|
val megaCorpServices = MockServices(cordappPackages, MEGA_CORP.name, rigorousMock(), MEGA_CORP_KEY)
|
||||||
database.transaction {
|
database.transaction {
|
||||||
val freshKey = identity.owningKey
|
val freshKey = identity.owningKey
|
||||||
|
|
||||||
@ -587,9 +587,9 @@ class NodeVaultServiceTest {
|
|||||||
val identity = services.myInfo.singleIdentityAndCert()
|
val identity = services.myInfo.singleIdentityAndCert()
|
||||||
assertEquals(services.identityService.partyFromKey(identity.owningKey), identity.party)
|
assertEquals(services.identityService.partyFromKey(identity.owningKey), identity.party)
|
||||||
val anonymousIdentity = services.keyManagementService.freshKeyAndCert(identity, false)
|
val anonymousIdentity = services.keyManagementService.freshKeyAndCert(identity, false)
|
||||||
val thirdPartyServices = MockServices(emptyList(), rigorousMock<IdentityServiceInternal>().also {
|
val thirdPartyServices = MockServices(emptyList(), MEGA_CORP.name, rigorousMock<IdentityServiceInternal>().also {
|
||||||
doNothing().whenever(it).justVerifyAndRegisterIdentity(argThat { name == MEGA_CORP.name })
|
doNothing().whenever(it).justVerifyAndRegisterIdentity(argThat { name == MEGA_CORP.name })
|
||||||
}, MEGA_CORP.name)
|
})
|
||||||
val thirdPartyIdentity = thirdPartyServices.keyManagementService.freshKeyAndCert(thirdPartyServices.myInfo.singleIdentityAndCert(), false)
|
val thirdPartyIdentity = thirdPartyServices.keyManagementService.freshKeyAndCert(thirdPartyServices.myInfo.singleIdentityAndCert(), false)
|
||||||
val amount = Amount(1000, Issued(BOC.ref(1), GBP))
|
val amount = Amount(1000, Issued(BOC.ref(1), GBP))
|
||||||
|
|
||||||
|
@ -115,7 +115,7 @@ class VaultQueryTests {
|
|||||||
services = databaseAndServices.second
|
services = databaseAndServices.second
|
||||||
vaultFiller = VaultFiller(services, dummyNotary)
|
vaultFiller = VaultFiller(services, dummyNotary)
|
||||||
vaultFillerCashNotary = VaultFiller(services, dummyNotary, CASH_NOTARY)
|
vaultFillerCashNotary = VaultFiller(services, dummyNotary, CASH_NOTARY)
|
||||||
notaryServices = MockServices(cordappPackages, rigorousMock(), dummyNotary, dummyCashIssuer.keyPair, BOC_KEY, MEGA_CORP_KEY)
|
notaryServices = MockServices(cordappPackages, dummyNotary, rigorousMock(), dummyCashIssuer.keyPair, BOC_KEY, MEGA_CORP_KEY)
|
||||||
identitySvc = services.identityService
|
identitySvc = services.identityService
|
||||||
// Register all of the identities we're going to use
|
// Register all of the identities we're going to use
|
||||||
(notaryServices.myInfo.legalIdentitiesAndCerts + BOC_IDENTITY + CASH_NOTARY_IDENTITY + MINI_CORP_IDENTITY + MEGA_CORP_IDENTITY).forEach { identity ->
|
(notaryServices.myInfo.legalIdentitiesAndCerts + BOC_IDENTITY + CASH_NOTARY_IDENTITY + MINI_CORP_IDENTITY + MEGA_CORP_IDENTITY).forEach { identity ->
|
||||||
@ -1344,15 +1344,15 @@ class VaultQueryTests {
|
|||||||
fun `unconsumed fungible assets for selected issuer parties`() {
|
fun `unconsumed fungible assets for selected issuer parties`() {
|
||||||
// GBP issuer
|
// GBP issuer
|
||||||
val gbpCashIssuerName = CordaX500Name(organisation = "British Pounds Cash Issuer", locality = "London", country = "GB")
|
val gbpCashIssuerName = CordaX500Name(organisation = "British Pounds Cash Issuer", locality = "London", country = "GB")
|
||||||
val gbpCashIssuerServices = MockServices(cordappPackages, rigorousMock(), gbpCashIssuerName, generateKeyPair())
|
val gbpCashIssuerServices = MockServices(cordappPackages, gbpCashIssuerName, rigorousMock(), generateKeyPair())
|
||||||
val gbpCashIssuer = gbpCashIssuerServices.myInfo.singleIdentityAndCert()
|
val gbpCashIssuer = gbpCashIssuerServices.myInfo.singleIdentityAndCert()
|
||||||
// USD issuer
|
// USD issuer
|
||||||
val usdCashIssuerName = CordaX500Name(organisation = "US Dollars Cash Issuer", locality = "New York", country = "US")
|
val usdCashIssuerName = CordaX500Name(organisation = "US Dollars Cash Issuer", locality = "New York", country = "US")
|
||||||
val usdCashIssuerServices = MockServices(cordappPackages, rigorousMock(), usdCashIssuerName, generateKeyPair())
|
val usdCashIssuerServices = MockServices(cordappPackages, usdCashIssuerName, rigorousMock(), generateKeyPair())
|
||||||
val usdCashIssuer = usdCashIssuerServices.myInfo.singleIdentityAndCert()
|
val usdCashIssuer = usdCashIssuerServices.myInfo.singleIdentityAndCert()
|
||||||
// CHF issuer
|
// CHF issuer
|
||||||
val chfCashIssuerName = CordaX500Name(organisation = "Swiss Francs Cash Issuer", locality = "Zurich", country = "CH")
|
val chfCashIssuerName = CordaX500Name(organisation = "Swiss Francs Cash Issuer", locality = "Zurich", country = "CH")
|
||||||
val chfCashIssuerServices = MockServices(cordappPackages, rigorousMock(), chfCashIssuerName, generateKeyPair())
|
val chfCashIssuerServices = MockServices(cordappPackages, chfCashIssuerName, rigorousMock(), generateKeyPair())
|
||||||
val chfCashIssuer = chfCashIssuerServices.myInfo.singleIdentityAndCert()
|
val chfCashIssuer = chfCashIssuerServices.myInfo.singleIdentityAndCert()
|
||||||
listOf(gbpCashIssuer, usdCashIssuer, chfCashIssuer).forEach { identity ->
|
listOf(gbpCashIssuer, usdCashIssuer, chfCashIssuer).forEach { identity ->
|
||||||
services.identityService.verifyAndRegisterIdentity(identity)
|
services.identityService.verifyAndRegisterIdentity(identity)
|
||||||
|
@ -78,8 +78,8 @@ class VaultWithCashTest {
|
|||||||
database = databaseAndServices.first
|
database = databaseAndServices.first
|
||||||
services = databaseAndServices.second
|
services = databaseAndServices.second
|
||||||
vaultFiller = VaultFiller(services, dummyNotary)
|
vaultFiller = VaultFiller(services, dummyNotary)
|
||||||
issuerServices = MockServices(cordappPackages, rigorousMock(), dummyCashIssuer, MEGA_CORP_KEY)
|
issuerServices = MockServices(cordappPackages, dummyCashIssuer, rigorousMock(), MEGA_CORP_KEY)
|
||||||
notaryServices = MockServices(cordappPackages, rigorousMock(), dummyNotary)
|
notaryServices = MockServices(cordappPackages, dummyNotary, rigorousMock())
|
||||||
notary = notaryServices.myInfo.legalIdentitiesAndCerts.single().party
|
notary = notaryServices.myInfo.legalIdentitiesAndCerts.single().party
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -109,7 +109,7 @@ class VaultWithCashTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `issue and spend total correctly and irrelevant ignored`() {
|
fun `issue and spend total correctly and irrelevant ignored`() {
|
||||||
val megaCorpServices = MockServices(cordappPackages, rigorousMock(), MEGA_CORP.name, MEGA_CORP_KEY)
|
val megaCorpServices = MockServices(cordappPackages, MEGA_CORP.name, rigorousMock(), MEGA_CORP_KEY)
|
||||||
val freshKey = services.keyManagementService.freshKey()
|
val freshKey = services.keyManagementService.freshKey()
|
||||||
|
|
||||||
val usefulTX =
|
val usefulTX =
|
||||||
|
@ -56,7 +56,7 @@ class NodeInterestRatesTest {
|
|||||||
EURIBOR 2016-03-15 2M = 0.111
|
EURIBOR 2016-03-15 2M = 0.111
|
||||||
""".trimIndent())
|
""".trimIndent())
|
||||||
private val dummyCashIssuer = TestIdentity(CordaX500Name("Cash issuer", "London", "GB"))
|
private val dummyCashIssuer = TestIdentity(CordaX500Name("Cash issuer", "London", "GB"))
|
||||||
private val services = MockServices(listOf("net.corda.finance.contracts.asset"), rigorousMock(), dummyCashIssuer, MEGA_CORP_KEY)
|
private val services = MockServices(listOf("net.corda.finance.contracts.asset"), dummyCashIssuer, rigorousMock(), MEGA_CORP_KEY)
|
||||||
// This is safe because MockServices only ever have a single identity
|
// This is safe because MockServices only ever have a single identity
|
||||||
private val identity = services.myInfo.singleIdentity()
|
private val identity = services.myInfo.singleIdentity()
|
||||||
|
|
||||||
|
@ -237,14 +237,14 @@ class IRSTests {
|
|||||||
@Rule
|
@Rule
|
||||||
@JvmField
|
@JvmField
|
||||||
val testSerialization = SerializationEnvironmentRule()
|
val testSerialization = SerializationEnvironmentRule()
|
||||||
private val megaCorpServices = MockServices(listOf("net.corda.irs.contract"), rigorousMock(), MEGA_CORP.name, MEGA_CORP_KEY)
|
private val megaCorpServices = MockServices(listOf("net.corda.irs.contract"), MEGA_CORP.name, rigorousMock(), MEGA_CORP_KEY)
|
||||||
private val miniCorpServices = MockServices(listOf("net.corda.irs.contract"), rigorousMock(), MINI_CORP.name, MINI_CORP_KEY)
|
private val miniCorpServices = MockServices(listOf("net.corda.irs.contract"), MINI_CORP.name, rigorousMock(), MINI_CORP_KEY)
|
||||||
private val notaryServices = MockServices(listOf("net.corda.irs.contract"), rigorousMock(), DUMMY_NOTARY.name, DUMMY_NOTARY_KEY)
|
private val notaryServices = MockServices(listOf("net.corda.irs.contract"), DUMMY_NOTARY.name, rigorousMock(), DUMMY_NOTARY_KEY)
|
||||||
private val ledgerServices
|
private val ledgerServices
|
||||||
get() = MockServices(emptyList(), rigorousMock<IdentityServiceInternal>().also {
|
get() = MockServices(emptyList(), MEGA_CORP.name, rigorousMock<IdentityServiceInternal>().also {
|
||||||
doReturn(MEGA_CORP).whenever(it).partyFromKey(MEGA_CORP_PUBKEY)
|
doReturn(MEGA_CORP).whenever(it).partyFromKey(MEGA_CORP_PUBKEY)
|
||||||
doReturn(null).whenever(it).partyFromKey(ORACLE_PUBKEY)
|
doReturn(null).whenever(it).partyFromKey(ORACLE_PUBKEY)
|
||||||
}, MEGA_CORP.name)
|
})
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun ok() {
|
fun ok() {
|
||||||
@ -341,11 +341,12 @@ class IRSTests {
|
|||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
fun generateIRSandFixSome() {
|
fun generateIRSandFixSome() {
|
||||||
val services = MockServices(listOf("net.corda.irs.contract"), rigorousMock<IdentityServiceInternal>().also {
|
val services = MockServices(listOf("net.corda.irs.contract"), MEGA_CORP.name,
|
||||||
listOf(MEGA_CORP, MINI_CORP).forEach { party ->
|
rigorousMock<IdentityServiceInternal>().also {
|
||||||
doReturn(party).whenever(it).partyFromKey(party.owningKey)
|
listOf(MEGA_CORP, MINI_CORP).forEach { party ->
|
||||||
}
|
doReturn(party).whenever(it).partyFromKey(party.owningKey)
|
||||||
}, MEGA_CORP.name)
|
}
|
||||||
|
})
|
||||||
var previousTXN = generateIRSTxn(1)
|
var previousTXN = generateIRSTxn(1)
|
||||||
previousTXN.toLedgerTransaction(services).verify()
|
previousTXN.toLedgerTransaction(services).verify()
|
||||||
services.recordTransactions(previousTXN)
|
services.recordTransactions(previousTXN)
|
||||||
@ -429,13 +430,13 @@ class IRSTests {
|
|||||||
input("irs post agreement")
|
input("irs post agreement")
|
||||||
val postAgreement = "irs post agreement".output<InterestRateSwap.State>()
|
val postAgreement = "irs post agreement".output<InterestRateSwap.State>()
|
||||||
output(IRS_PROGRAM_ID, "irs post first fixing",
|
output(IRS_PROGRAM_ID, "irs post first fixing",
|
||||||
postAgreement.copy(
|
postAgreement.copy(
|
||||||
postAgreement.fixedLeg,
|
postAgreement.fixedLeg,
|
||||||
postAgreement.floatingLeg,
|
postAgreement.floatingLeg,
|
||||||
postAgreement.calculation.applyFixing(ld, FixedRate(RatioUnit(bd))),
|
postAgreement.calculation.applyFixing(ld, FixedRate(RatioUnit(bd))),
|
||||||
postAgreement.common))
|
postAgreement.common))
|
||||||
command(ORACLE_PUBKEY,
|
command(ORACLE_PUBKEY,
|
||||||
InterestRateSwap.Commands.Refix(Fix(FixOf("ICE LIBOR", ld, Tenor("3M")), bd)))
|
InterestRateSwap.Commands.Refix(Fix(FixOf("ICE LIBOR", ld, Tenor("3M")), bd)))
|
||||||
timeWindow(TEST_TX_TIME)
|
timeWindow(TEST_TX_TIME)
|
||||||
this.verifies()
|
this.verifies()
|
||||||
}
|
}
|
||||||
@ -620,7 +621,7 @@ class IRSTests {
|
|||||||
// Templated tweak for reference. A corrent fixing applied should be ok
|
// Templated tweak for reference. A corrent fixing applied should be ok
|
||||||
tweak {
|
tweak {
|
||||||
command(ORACLE_PUBKEY,
|
command(ORACLE_PUBKEY,
|
||||||
InterestRateSwap.Commands.Refix(Fix(FixOf("ICE LIBOR", ld, Tenor("3M")), bd)))
|
InterestRateSwap.Commands.Refix(Fix(FixOf("ICE LIBOR", ld, Tenor("3M")), bd)))
|
||||||
timeWindow(TEST_TX_TIME)
|
timeWindow(TEST_TX_TIME)
|
||||||
output(IRS_PROGRAM_ID, newIRS)
|
output(IRS_PROGRAM_ID, newIRS)
|
||||||
this.verifies()
|
this.verifies()
|
||||||
@ -643,12 +644,12 @@ class IRSTests {
|
|||||||
val firstResetValue = newIRS.calculation.floatingLegPaymentSchedule[firstResetKey]
|
val firstResetValue = newIRS.calculation.floatingLegPaymentSchedule[firstResetKey]
|
||||||
val modifiedFirstResetValue = firstResetValue!!.copy(notional = Amount(firstResetValue.notional.quantity, Currency.getInstance("JPY")))
|
val modifiedFirstResetValue = firstResetValue!!.copy(notional = Amount(firstResetValue.notional.quantity, Currency.getInstance("JPY")))
|
||||||
output(IRS_PROGRAM_ID,
|
output(IRS_PROGRAM_ID,
|
||||||
newIRS.copy(
|
newIRS.copy(
|
||||||
newIRS.fixedLeg,
|
newIRS.fixedLeg,
|
||||||
newIRS.floatingLeg,
|
newIRS.floatingLeg,
|
||||||
newIRS.calculation.copy(floatingLegPaymentSchedule = newIRS.calculation.floatingLegPaymentSchedule.plus(
|
newIRS.calculation.copy(floatingLegPaymentSchedule = newIRS.calculation.floatingLegPaymentSchedule.plus(
|
||||||
Pair(firstResetKey, modifiedFirstResetValue))),
|
Pair(firstResetKey, modifiedFirstResetValue))),
|
||||||
newIRS.common))
|
newIRS.common))
|
||||||
this `fails with` "There is only one change in the IRS floating leg payment schedule"
|
this `fails with` "There is only one change in the IRS floating leg payment schedule"
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -660,12 +661,12 @@ class IRSTests {
|
|||||||
val latestReset = newIRS.calculation.floatingLegPaymentSchedule.filter { it.value.rate is FixedRate }.maxBy { it.key }
|
val latestReset = newIRS.calculation.floatingLegPaymentSchedule.filter { it.value.rate is FixedRate }.maxBy { it.key }
|
||||||
val modifiedLatestResetValue = latestReset!!.value.copy(notional = Amount(latestReset.value.notional.quantity, Currency.getInstance("JPY")))
|
val modifiedLatestResetValue = latestReset!!.value.copy(notional = Amount(latestReset.value.notional.quantity, Currency.getInstance("JPY")))
|
||||||
output(IRS_PROGRAM_ID,
|
output(IRS_PROGRAM_ID,
|
||||||
newIRS.copy(
|
newIRS.copy(
|
||||||
newIRS.fixedLeg,
|
newIRS.fixedLeg,
|
||||||
newIRS.floatingLeg,
|
newIRS.floatingLeg,
|
||||||
newIRS.calculation.copy(floatingLegPaymentSchedule = newIRS.calculation.floatingLegPaymentSchedule.plus(
|
newIRS.calculation.copy(floatingLegPaymentSchedule = newIRS.calculation.floatingLegPaymentSchedule.plus(
|
||||||
Pair(latestReset.key, modifiedLatestResetValue))),
|
Pair(latestReset.key, modifiedLatestResetValue))),
|
||||||
newIRS.common))
|
newIRS.common))
|
||||||
this `fails with` "The fix payment has the same currency as the notional"
|
this `fails with` "The fix payment has the same currency as the notional"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -687,11 +688,11 @@ class IRSTests {
|
|||||||
transaction("Agreement") {
|
transaction("Agreement") {
|
||||||
attachments(IRS_PROGRAM_ID)
|
attachments(IRS_PROGRAM_ID)
|
||||||
output(IRS_PROGRAM_ID, "irs post agreement1",
|
output(IRS_PROGRAM_ID, "irs post agreement1",
|
||||||
irs.copy(
|
irs.copy(
|
||||||
irs.fixedLeg,
|
irs.fixedLeg,
|
||||||
irs.floatingLeg,
|
irs.floatingLeg,
|
||||||
irs.calculation,
|
irs.calculation,
|
||||||
irs.common.copy(tradeID = "t1")))
|
irs.common.copy(tradeID = "t1")))
|
||||||
command(MEGA_CORP_PUBKEY, InterestRateSwap.Commands.Agree())
|
command(MEGA_CORP_PUBKEY, InterestRateSwap.Commands.Agree())
|
||||||
timeWindow(TEST_TX_TIME)
|
timeWindow(TEST_TX_TIME)
|
||||||
this.verifies()
|
this.verifies()
|
||||||
@ -700,12 +701,12 @@ class IRSTests {
|
|||||||
transaction("Agreement") {
|
transaction("Agreement") {
|
||||||
attachments(IRS_PROGRAM_ID)
|
attachments(IRS_PROGRAM_ID)
|
||||||
output(IRS_PROGRAM_ID, "irs post agreement2",
|
output(IRS_PROGRAM_ID, "irs post agreement2",
|
||||||
irs.copy(
|
irs.copy(
|
||||||
linearId = UniqueIdentifier("t2"),
|
linearId = UniqueIdentifier("t2"),
|
||||||
fixedLeg = irs.fixedLeg,
|
fixedLeg = irs.fixedLeg,
|
||||||
floatingLeg = irs.floatingLeg,
|
floatingLeg = irs.floatingLeg,
|
||||||
calculation = irs.calculation,
|
calculation = irs.calculation,
|
||||||
common = irs.common.copy(tradeID = "t2")))
|
common = irs.common.copy(tradeID = "t2")))
|
||||||
command(MEGA_CORP_PUBKEY, InterestRateSwap.Commands.Agree())
|
command(MEGA_CORP_PUBKEY, InterestRateSwap.Commands.Agree())
|
||||||
timeWindow(TEST_TX_TIME)
|
timeWindow(TEST_TX_TIME)
|
||||||
this.verifies()
|
this.verifies()
|
||||||
@ -717,25 +718,23 @@ class IRSTests {
|
|||||||
input("irs post agreement2")
|
input("irs post agreement2")
|
||||||
val postAgreement1 = "irs post agreement1".output<InterestRateSwap.State>()
|
val postAgreement1 = "irs post agreement1".output<InterestRateSwap.State>()
|
||||||
output(IRS_PROGRAM_ID, "irs post first fixing1",
|
output(IRS_PROGRAM_ID, "irs post first fixing1",
|
||||||
postAgreement1.copy(
|
postAgreement1.copy(
|
||||||
postAgreement1.fixedLeg,
|
postAgreement1.fixedLeg,
|
||||||
postAgreement1.floatingLeg,
|
postAgreement1.floatingLeg,
|
||||||
postAgreement1.calculation.applyFixing(ld1, FixedRate(RatioUnit(bd1))),
|
postAgreement1.calculation.applyFixing(ld1, FixedRate(RatioUnit(bd1))),
|
||||||
postAgreement1.common.copy(tradeID = "t1")))
|
postAgreement1.common.copy(tradeID = "t1")))
|
||||||
val postAgreement2 = "irs post agreement2".output<InterestRateSwap.State>()
|
val postAgreement2 = "irs post agreement2".output<InterestRateSwap.State>()
|
||||||
output(IRS_PROGRAM_ID, "irs post first fixing2",
|
output(IRS_PROGRAM_ID, "irs post first fixing2",
|
||||||
postAgreement2.copy(
|
postAgreement2.copy(
|
||||||
postAgreement2.fixedLeg,
|
postAgreement2.fixedLeg,
|
||||||
postAgreement2.floatingLeg,
|
postAgreement2.floatingLeg,
|
||||||
postAgreement2.calculation.applyFixing(ld1, FixedRate(RatioUnit(bd1))),
|
postAgreement2.calculation.applyFixing(ld1, FixedRate(RatioUnit(bd1))),
|
||||||
postAgreement2.common.copy(tradeID = "t2")))
|
postAgreement2.common.copy(tradeID = "t2")))
|
||||||
command(ORACLE_PUBKEY,
|
command(ORACLE_PUBKEY,
|
||||||
InterestRateSwap.Commands.Refix(Fix(FixOf("ICE LIBOR", ld1, Tenor("3M")), bd1)))
|
InterestRateSwap.Commands.Refix(Fix(FixOf("ICE LIBOR", ld1, Tenor("3M")), bd1)))
|
||||||
timeWindow(TEST_TX_TIME)
|
timeWindow(TEST_TX_TIME)
|
||||||
this.verifies()
|
this.verifies()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -46,8 +46,8 @@ class TransactionGraphSearchTests {
|
|||||||
* @param signer signer for the two transactions and their commands.
|
* @param signer signer for the two transactions and their commands.
|
||||||
*/
|
*/
|
||||||
fun buildTransactions(command: CommandData): GraphTransactionStorage {
|
fun buildTransactions(command: CommandData): GraphTransactionStorage {
|
||||||
val megaCorpServices = MockServices(listOf("net.corda.testing.contracts"), rigorousMock(), megaCorp)
|
val megaCorpServices = MockServices(listOf("net.corda.testing.contracts"), megaCorp, rigorousMock())
|
||||||
val notaryServices = MockServices(listOf("net.corda.testing.contracts"), rigorousMock(), dummyNotary)
|
val notaryServices = MockServices(listOf("net.corda.testing.contracts"), dummyNotary, rigorousMock())
|
||||||
val originBuilder = TransactionBuilder(dummyNotary.party)
|
val originBuilder = TransactionBuilder(dummyNotary.party)
|
||||||
.addOutputState(DummyState(random31BitValue()), DummyContract.PROGRAM_ID)
|
.addOutputState(DummyState(random31BitValue()), DummyContract.PROGRAM_ID)
|
||||||
.addCommand(command, megaCorp.publicKey)
|
.addCommand(command, megaCorp.publicKey)
|
||||||
|
@ -152,9 +152,45 @@ open class MockNetwork(
|
|||||||
/** Create a started node with the given parameters. **/
|
/** Create a started node with the given parameters. **/
|
||||||
fun createNode(parameters: MockNodeParameters = MockNodeParameters()): StartedMockNode = StartedMockNode.create(internalMockNetwork.createNode(parameters))
|
fun createNode(parameters: MockNodeParameters = MockNodeParameters()): StartedMockNode = StartedMockNode.create(internalMockNetwork.createNode(parameters))
|
||||||
|
|
||||||
|
/** Create a started node with the given parameters.
|
||||||
|
* @param legalName the node's legal name.
|
||||||
|
* @param forcedID a unique identifier for the node.
|
||||||
|
* @param entropyRoot the initial entropy value to use when generating keys. Defaults to an (insecure) random value,
|
||||||
|
* but can be overridden to cause nodes to have stable or colliding identity/service keys.
|
||||||
|
* @param configOverrides add/override behaviour of the [NodeConfiguration] mock object.
|
||||||
|
* @param version the mock node's platform, release, revision and vendor versions.
|
||||||
|
*/
|
||||||
|
@JvmOverloads
|
||||||
|
fun createNode(legalName: CordaX500Name? = null,
|
||||||
|
forcedID: Int? = null,
|
||||||
|
entropyRoot: BigInteger = BigInteger.valueOf(random63BitValue()),
|
||||||
|
configOverrides: (NodeConfiguration) -> Any? = {},
|
||||||
|
version: VersionInfo = MockServices.MOCK_VERSION_INFO): StartedMockNode {
|
||||||
|
val parameters = MockNodeParameters(forcedID, legalName, entropyRoot, configOverrides, version)
|
||||||
|
return StartedMockNode.create(internalMockNetwork.createNode(parameters))
|
||||||
|
}
|
||||||
|
|
||||||
/** Create an unstarted node with the given parameters. **/
|
/** Create an unstarted node with the given parameters. **/
|
||||||
fun createUnstartedNode(parameters: MockNodeParameters = MockNodeParameters()): UnstartedMockNode = UnstartedMockNode.create(internalMockNetwork.createUnstartedNode(parameters))
|
fun createUnstartedNode(parameters: MockNodeParameters = MockNodeParameters()): UnstartedMockNode = UnstartedMockNode.create(internalMockNetwork.createUnstartedNode(parameters))
|
||||||
|
|
||||||
|
/** Create an unstarted node with the given parameters.
|
||||||
|
* @param legalName the node's legal name.
|
||||||
|
* @param forcedID a unique identifier for the node.
|
||||||
|
* @param entropyRoot the initial entropy value to use when generating keys. Defaults to an (insecure) random value,
|
||||||
|
* but can be overridden to cause nodes to have stable or colliding identity/service keys.
|
||||||
|
* @param configOverrides add/override behaviour of the [NodeConfiguration] mock object.
|
||||||
|
* @param version the mock node's platform, release, revision and vendor versions.
|
||||||
|
*/
|
||||||
|
@JvmOverloads
|
||||||
|
fun createUnstartedNode(legalName: CordaX500Name? = null,
|
||||||
|
forcedID: Int? = null,
|
||||||
|
entropyRoot: BigInteger = BigInteger.valueOf(random63BitValue()),
|
||||||
|
configOverrides: (NodeConfiguration) -> Any? = {},
|
||||||
|
version: VersionInfo = MockServices.MOCK_VERSION_INFO): UnstartedMockNode {
|
||||||
|
val parameters = MockNodeParameters(forcedID, legalName, entropyRoot, configOverrides, version)
|
||||||
|
return UnstartedMockNode.create(internalMockNetwork.createUnstartedNode(parameters))
|
||||||
|
}
|
||||||
|
|
||||||
/** Start all nodes that aren't already started. **/
|
/** Start all nodes that aren't already started. **/
|
||||||
fun startNodes() = internalMockNetwork.startNodes()
|
fun startNodes() = internalMockNetwork.startNodes()
|
||||||
|
|
||||||
|
@ -18,7 +18,6 @@ import net.corda.core.transactions.SignedTransaction
|
|||||||
import net.corda.node.VersionInfo
|
import net.corda.node.VersionInfo
|
||||||
import net.corda.node.internal.configureDatabase
|
import net.corda.node.internal.configureDatabase
|
||||||
import net.corda.node.internal.cordapp.CordappLoader
|
import net.corda.node.internal.cordapp.CordappLoader
|
||||||
import net.corda.node.services.api.IdentityServiceInternal
|
|
||||||
import net.corda.node.services.api.SchemaService
|
import net.corda.node.services.api.SchemaService
|
||||||
import net.corda.node.services.api.VaultServiceInternal
|
import net.corda.node.services.api.VaultServiceInternal
|
||||||
import net.corda.node.services.api.WritableTransactionStorage
|
import net.corda.node.services.api.WritableTransactionStorage
|
||||||
@ -61,7 +60,7 @@ fun makeTestIdentityService(vararg identities: PartyAndCertificate) = InMemoryId
|
|||||||
open class MockServices private constructor(
|
open class MockServices private constructor(
|
||||||
cordappLoader: CordappLoader,
|
cordappLoader: CordappLoader,
|
||||||
override val validatedTransactions: WritableTransactionStorage,
|
override val validatedTransactions: WritableTransactionStorage,
|
||||||
override val identityService: IdentityServiceInternal,
|
override val identityService: IdentityService,
|
||||||
private val initialIdentity: TestIdentity,
|
private val initialIdentity: TestIdentity,
|
||||||
private val moreKeys: Array<out KeyPair>
|
private val moreKeys: Array<out KeyPair>
|
||||||
) : ServiceHub, StateLoader by validatedTransactions {
|
) : ServiceHub, StateLoader by validatedTransactions {
|
||||||
@ -90,13 +89,13 @@ open class MockServices private constructor(
|
|||||||
* Makes database and mock services appropriate for unit tests.
|
* Makes database and mock services appropriate for unit tests.
|
||||||
*
|
*
|
||||||
* @param moreKeys a list of additional [KeyPair] instances to be used by [MockServices].
|
* @param moreKeys a list of additional [KeyPair] instances to be used by [MockServices].
|
||||||
* @param identityService an instance of [IdentityServiceInternal], see [makeTestIdentityService].
|
* @param identityService an instance of [IdentityService], see [makeTestIdentityService].
|
||||||
* @param initialIdentity the first (typically sole) identity the services will represent.
|
* @param initialIdentity the first (typically sole) identity the services will represent.
|
||||||
* @return a pair where the first element is the instance of [CordaPersistence] and the second is [MockServices].
|
* @return a pair where the first element is the instance of [CordaPersistence] and the second is [MockServices].
|
||||||
*/
|
*/
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun makeTestDatabaseAndMockServices(cordappPackages: List<String>,
|
fun makeTestDatabaseAndMockServices(cordappPackages: List<String>,
|
||||||
identityService: IdentityServiceInternal,
|
identityService: IdentityService,
|
||||||
initialIdentity: TestIdentity,
|
initialIdentity: TestIdentity,
|
||||||
vararg moreKeys: KeyPair): Pair<CordaPersistence, MockServices> {
|
vararg moreKeys: KeyPair): Pair<CordaPersistence, MockServices> {
|
||||||
val cordappLoader = CordappLoader.createWithTestPackages(cordappPackages)
|
val cordappLoader = CordappLoader.createWithTestPackages(cordappPackages)
|
||||||
@ -128,7 +127,7 @@ open class MockServices private constructor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private constructor(cordappLoader: CordappLoader, identityService: IdentityServiceInternal,
|
private constructor(cordappLoader: CordappLoader, identityService: IdentityService,
|
||||||
initialIdentity: TestIdentity, moreKeys: Array<out KeyPair>)
|
initialIdentity: TestIdentity, moreKeys: Array<out KeyPair>)
|
||||||
: this(cordappLoader, MockTransactionStorage(), identityService, initialIdentity, moreKeys)
|
: this(cordappLoader, MockTransactionStorage(), identityService, initialIdentity, moreKeys)
|
||||||
|
|
||||||
@ -137,37 +136,42 @@ open class MockServices private constructor(
|
|||||||
* (you can get one from [makeTestIdentityService]) and represents the given identity.
|
* (you can get one from [makeTestIdentityService]) and represents the given identity.
|
||||||
*/
|
*/
|
||||||
@JvmOverloads
|
@JvmOverloads
|
||||||
constructor(cordappPackages: List<String>, identityService: IdentityServiceInternal = makeTestIdentityService(), initialIdentity: TestIdentity, vararg moreKeys: KeyPair) : this(CordappLoader.createWithTestPackages(cordappPackages), identityService, initialIdentity, moreKeys)
|
constructor(cordappPackages: List<String>, initialIdentity: TestIdentity, identityService: IdentityService = makeTestIdentityService(), vararg moreKeys: KeyPair) : this(CordappLoader.createWithTestPackages(cordappPackages), identityService, initialIdentity, moreKeys)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a mock [ServiceHub] that looks for app code in the given package names, uses the provided identity service
|
* Create a mock [ServiceHub] that looks for app code in the given package names, uses the provided identity service
|
||||||
* (you can get one from [makeTestIdentityService]) and represents the given identity.
|
* (you can get one from [makeTestIdentityService]) and represents the given identity.
|
||||||
*/
|
*/
|
||||||
@JvmOverloads
|
@JvmOverloads
|
||||||
constructor(cordappPackages: List<String>, identityService: IdentityServiceInternal = makeTestIdentityService(), initialIdentityName: CordaX500Name, key: KeyPair, vararg moreKeys: KeyPair) : this(cordappPackages, identityService, TestIdentity(initialIdentityName, key), *moreKeys)
|
constructor(cordappPackages: List<String>, initialIdentityName: CordaX500Name, identityService: IdentityService = makeTestIdentityService(), key: KeyPair, vararg moreKeys: KeyPair) : this(cordappPackages, TestIdentity(initialIdentityName, key), identityService, *moreKeys)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a mock [ServiceHub] that can't load CorDapp code, which uses the provided identity service
|
* Create a mock [ServiceHub] that can't load CorDapp code, which uses the provided identity service
|
||||||
* (you can get one from [makeTestIdentityService]) and which represents the given identity.
|
* (you can get one from [makeTestIdentityService]) and which represents the given identity.
|
||||||
*/
|
*/
|
||||||
@JvmOverloads
|
@JvmOverloads
|
||||||
constructor(cordappPackages: List<String>, identityService: IdentityServiceInternal = makeTestIdentityService(), initialIdentityName: CordaX500Name) : this(cordappPackages, identityService, TestIdentity(initialIdentityName))
|
constructor(cordappPackages: List<String>, initialIdentityName: CordaX500Name, identityService: IdentityService = makeTestIdentityService()) : this(cordappPackages, TestIdentity(initialIdentityName), identityService)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a mock [ServiceHub] that can't load CorDapp code, and which uses a default service identity.
|
||||||
|
*/
|
||||||
|
constructor(cordappPackages: List<String>): this(cordappPackages, CordaX500Name("TestIdentity", "", "GB"), makeTestIdentityService())
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a mock [ServiceHub] which uses the package of the caller to find CorDapp code. It uses the provided identity service
|
* Create a mock [ServiceHub] which uses the package of the caller to find CorDapp code. It uses the provided identity service
|
||||||
* (you can get one from [makeTestIdentityService]) and which represents the given identity.
|
* (you can get one from [makeTestIdentityService]) and which represents the given identity.
|
||||||
*/
|
*/
|
||||||
@JvmOverloads
|
@JvmOverloads
|
||||||
constructor(identityService: IdentityServiceInternal = makeTestIdentityService(), initialIdentityName: CordaX500Name, key: KeyPair, vararg moreKeys: KeyPair)
|
constructor(initialIdentityName: CordaX500Name, identityService: IdentityService = makeTestIdentityService(), key: KeyPair, vararg moreKeys: KeyPair)
|
||||||
: this(listOf(getCallerPackage()), identityService, TestIdentity(initialIdentityName, key), *moreKeys)
|
: this(listOf(getCallerPackage()), TestIdentity(initialIdentityName, key), identityService, *moreKeys)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a mock [ServiceHub] which uses the package of the caller to find CorDapp code. It uses the provided identity service
|
* Create a mock [ServiceHub] which uses the package of the caller to find CorDapp code. It uses the provided identity service
|
||||||
* (you can get one from [makeTestIdentityService]) and which represents the given identity. It has no keys.
|
* (you can get one from [makeTestIdentityService]) and which represents the given identity. It has no keys.
|
||||||
*/
|
*/
|
||||||
@JvmOverloads
|
@JvmOverloads
|
||||||
constructor(identityService: IdentityServiceInternal = makeTestIdentityService(), initialIdentityName: CordaX500Name)
|
constructor(initialIdentityName: CordaX500Name, identityService: IdentityService = makeTestIdentityService())
|
||||||
: this(listOf(getCallerPackage()), identityService, TestIdentity(initialIdentityName))
|
: this(listOf(getCallerPackage()), TestIdentity(initialIdentityName), identityService)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A helper constructor that requires at least one test identity to be registered, and which takes the package of
|
* A helper constructor that requires at least one test identity to be registered, and which takes the package of
|
||||||
@ -177,10 +181,17 @@ open class MockServices private constructor(
|
|||||||
*/
|
*/
|
||||||
constructor(firstIdentity: TestIdentity, vararg moreIdentities: TestIdentity) : this(
|
constructor(firstIdentity: TestIdentity, vararg moreIdentities: TestIdentity) : this(
|
||||||
listOf(getCallerPackage()),
|
listOf(getCallerPackage()),
|
||||||
|
firstIdentity,
|
||||||
makeTestIdentityService(*listOf(firstIdentity, *moreIdentities).map { it.identity }.toTypedArray()),
|
makeTestIdentityService(*listOf(firstIdentity, *moreIdentities).map { it.identity }.toTypedArray()),
|
||||||
firstIdentity, firstIdentity.keyPair
|
firstIdentity.keyPair
|
||||||
)
|
)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a mock [ServiceHub] which uses the package of the caller to find CorDapp code. It uses a default service
|
||||||
|
* identity.
|
||||||
|
*/
|
||||||
|
constructor(): this(listOf(getCallerPackage()), CordaX500Name("TestIdentity", "", "GB"), makeTestIdentityService())
|
||||||
|
|
||||||
override fun recordTransactions(statesToRecord: StatesToRecord, txs: Iterable<SignedTransaction>) {
|
override fun recordTransactions(statesToRecord: StatesToRecord, txs: Iterable<SignedTransaction>) {
|
||||||
txs.forEach {
|
txs.forEach {
|
||||||
validatedTransactions.addTransaction(it)
|
validatedTransactions.addTransaction(it)
|
||||||
@ -218,7 +229,7 @@ open class MockServices private constructor(
|
|||||||
override fun registerUnloadHandler(runOnStop: () -> Unit) = throw UnsupportedOperationException()
|
override fun registerUnloadHandler(runOnStop: () -> Unit) = throw UnsupportedOperationException()
|
||||||
}
|
}
|
||||||
|
|
||||||
class MockKeyManagementService(val identityService: IdentityServiceInternal,
|
class MockKeyManagementService(val identityService: IdentityService,
|
||||||
vararg initialKeys: KeyPair) : SingletonSerializeAsToken(), KeyManagementService {
|
vararg initialKeys: KeyPair) : SingletonSerializeAsToken(), KeyManagementService {
|
||||||
private val keyStore: MutableMap<PublicKey, PrivateKey> = initialKeys.associateByTo(HashMap(), { it.public }, { it.private })
|
private val keyStore: MutableMap<PublicKey, PrivateKey> = initialKeys.associateByTo(HashMap(), { it.public }, { it.private })
|
||||||
|
|
||||||
|
@ -7,7 +7,6 @@ import com.nhaarman.mockito_kotlin.whenever
|
|||||||
import net.corda.core.DoNotImplement
|
import net.corda.core.DoNotImplement
|
||||||
import net.corda.core.crypto.Crypto
|
import net.corda.core.crypto.Crypto
|
||||||
import net.corda.core.crypto.random63BitValue
|
import net.corda.core.crypto.random63BitValue
|
||||||
import net.corda.core.flows.FlowLogic
|
|
||||||
import net.corda.core.identity.CordaX500Name
|
import net.corda.core.identity.CordaX500Name
|
||||||
import net.corda.core.identity.Party
|
import net.corda.core.identity.Party
|
||||||
import net.corda.core.identity.PartyAndCertificate
|
import net.corda.core.identity.PartyAndCertificate
|
||||||
@ -29,10 +28,8 @@ import net.corda.core.utilities.contextLogger
|
|||||||
import net.corda.core.utilities.seconds
|
import net.corda.core.utilities.seconds
|
||||||
import net.corda.node.VersionInfo
|
import net.corda.node.VersionInfo
|
||||||
import net.corda.node.internal.AbstractNode
|
import net.corda.node.internal.AbstractNode
|
||||||
import net.corda.node.internal.InitiatedFlowFactory
|
|
||||||
import net.corda.node.internal.StartedNode
|
import net.corda.node.internal.StartedNode
|
||||||
import net.corda.node.internal.cordapp.CordappLoader
|
import net.corda.node.internal.cordapp.CordappLoader
|
||||||
import net.corda.node.services.api.IdentityServiceInternal
|
|
||||||
import net.corda.node.services.api.NodePropertiesStore
|
import net.corda.node.services.api.NodePropertiesStore
|
||||||
import net.corda.node.services.api.SchemaService
|
import net.corda.node.services.api.SchemaService
|
||||||
import net.corda.node.services.config.*
|
import net.corda.node.services.config.*
|
||||||
@ -49,17 +46,14 @@ import net.corda.nodeapi.internal.network.NetworkParametersCopier
|
|||||||
import net.corda.nodeapi.internal.persistence.CordaPersistence
|
import net.corda.nodeapi.internal.persistence.CordaPersistence
|
||||||
import net.corda.nodeapi.internal.persistence.DatabaseConfig
|
import net.corda.nodeapi.internal.persistence.DatabaseConfig
|
||||||
import net.corda.testing.common.internal.testNetworkParameters
|
import net.corda.testing.common.internal.testNetworkParameters
|
||||||
import net.corda.testing.core.DUMMY_NOTARY_NAME
|
|
||||||
import net.corda.testing.core.setGlobalSerialization
|
import net.corda.testing.core.setGlobalSerialization
|
||||||
import net.corda.testing.internal.rigorousMock
|
import net.corda.testing.internal.rigorousMock
|
||||||
import net.corda.testing.internal.testThreadFactory
|
import net.corda.testing.internal.testThreadFactory
|
||||||
|
import net.corda.testing.node.*
|
||||||
import net.corda.testing.node.MockServices.Companion.MOCK_VERSION_INFO
|
import net.corda.testing.node.MockServices.Companion.MOCK_VERSION_INFO
|
||||||
import net.corda.testing.node.MockServices.Companion.makeTestDataSourceProperties
|
import net.corda.testing.node.MockServices.Companion.makeTestDataSourceProperties
|
||||||
import net.corda.testing.core.setGlobalSerialization
|
|
||||||
import net.corda.testing.node.*
|
|
||||||
import org.apache.activemq.artemis.utils.ReusableLatch
|
import org.apache.activemq.artemis.utils.ReusableLatch
|
||||||
import org.apache.sshd.common.util.security.SecurityUtils
|
import org.apache.sshd.common.util.security.SecurityUtils
|
||||||
import rx.Observable
|
|
||||||
import rx.internal.schedulers.CachedThreadScheduler
|
import rx.internal.schedulers.CachedThreadScheduler
|
||||||
import java.math.BigInteger
|
import java.math.BigInteger
|
||||||
import java.nio.file.Path
|
import java.nio.file.Path
|
||||||
@ -281,7 +275,7 @@ open class InternalMockNetwork(private val cordappPackages: List<String>,
|
|||||||
network = messagingServiceSpy
|
network = messagingServiceSpy
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun makeKeyManagementService(identityService: IdentityServiceInternal, keyPairs: Set<KeyPair>): KeyManagementService {
|
override fun makeKeyManagementService(identityService: IdentityService, keyPairs: Set<KeyPair>): KeyManagementService {
|
||||||
return E2ETestKeyManagementService(identityService, keyPairs)
|
return E2ETestKeyManagementService(identityService, keyPairs)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -28,7 +28,7 @@ data class NotariseCommand(val issueTx: SignedTransaction, val moveTx: SignedTra
|
|||||||
val dummyNotarisationTest = LoadTest<NotariseCommand, Unit>(
|
val dummyNotarisationTest = LoadTest<NotariseCommand, Unit>(
|
||||||
"Notarising dummy transactions",
|
"Notarising dummy transactions",
|
||||||
generate = { _, _ ->
|
generate = { _, _ ->
|
||||||
val issuerServices = MockServices(emptyList(), makeTestIdentityService(megaCorp.identity, miniCorp.identity, dummyCashIssuer.identity, dummyNotary.identity), megaCorp.name, dummyCashIssuer.keyPair)
|
val issuerServices = MockServices(emptyList(), megaCorp.name, makeTestIdentityService(megaCorp.identity, miniCorp.identity, dummyCashIssuer.identity, dummyNotary.identity), dummyCashIssuer.keyPair)
|
||||||
val generateTx = Generator.pickOne(simpleNodes).flatMap { node ->
|
val generateTx = Generator.pickOne(simpleNodes).flatMap { node ->
|
||||||
Generator.int().map {
|
Generator.int().map {
|
||||||
val issueBuilder = DummyContract.generateInitial(it, notary.info.legalIdentities[0], DUMMY_CASH_ISSUER) // TODO notary choice
|
val issueBuilder = DummyContract.generateInitial(it, notary.info.legalIdentities[0], DUMMY_CASH_ISSUER) // TODO notary choice
|
||||||
|
Loading…
Reference in New Issue
Block a user