mirror of
https://github.com/corda/corda.git
synced 2025-06-19 07:38:22 +00:00
ENT-1906: Publish corda-deterministic-verifier artifact for testing cordapps. (#3910)
This commit is contained in:
@ -331,6 +331,7 @@ bintrayConfig {
|
|||||||
'corda-rpc',
|
'corda-rpc',
|
||||||
'corda-core',
|
'corda-core',
|
||||||
'corda-core-deterministic',
|
'corda-core-deterministic',
|
||||||
|
'corda-deterministic-verifier',
|
||||||
'corda-djvm',
|
'corda-djvm',
|
||||||
'corda',
|
'corda',
|
||||||
'corda-finance',
|
'corda-finance',
|
||||||
|
@ -11,8 +11,8 @@ def javaHome = System.getProperty('java.home')
|
|||||||
def jarBaseName = "corda-${project.name}".toString()
|
def jarBaseName = "corda-${project.name}".toString()
|
||||||
|
|
||||||
configurations {
|
configurations {
|
||||||
runtimeLibraries
|
deterministicLibraries
|
||||||
runtimeArtifacts.extendsFrom runtimeLibraries
|
deterministicArtifacts.extendsFrom deterministicLibraries
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
@ -20,14 +20,14 @@ dependencies {
|
|||||||
|
|
||||||
// Configure these by hand. It should be a minimal subset of core's dependencies,
|
// Configure these by hand. It should be a minimal subset of core's dependencies,
|
||||||
// and without any obviously non-deterministic ones such as Hibernate.
|
// and without any obviously non-deterministic ones such as Hibernate.
|
||||||
runtimeLibraries "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
|
deterministicLibraries "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
|
||||||
runtimeLibraries "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
|
deterministicLibraries "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
|
||||||
runtimeLibraries "org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final"
|
deterministicLibraries "org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final"
|
||||||
runtimeLibraries "org.bouncycastle:bcprov-jdk15on:$bouncycastle_version"
|
deterministicLibraries "org.bouncycastle:bcprov-jdk15on:$bouncycastle_version"
|
||||||
runtimeLibraries "org.bouncycastle:bcpkix-jdk15on:$bouncycastle_version"
|
deterministicLibraries "org.bouncycastle:bcpkix-jdk15on:$bouncycastle_version"
|
||||||
runtimeLibraries "com.google.code.findbugs:jsr305:$jsr305_version"
|
deterministicLibraries "com.google.code.findbugs:jsr305:$jsr305_version"
|
||||||
runtimeLibraries "net.i2p.crypto:eddsa:$eddsa_version"
|
deterministicLibraries "net.i2p.crypto:eddsa:$eddsa_version"
|
||||||
runtimeLibraries "org.slf4j:slf4j-api:$slf4j_version"
|
deterministicLibraries "org.slf4j:slf4j-api:$slf4j_version"
|
||||||
}
|
}
|
||||||
|
|
||||||
jar {
|
jar {
|
||||||
@ -112,7 +112,7 @@ task determinise(type: ProGuardTask) {
|
|||||||
|
|
||||||
libraryjars file("$javaHome/lib/rt.jar")
|
libraryjars file("$javaHome/lib/rt.jar")
|
||||||
libraryjars file("$javaHome/lib/jce.jar")
|
libraryjars file("$javaHome/lib/jce.jar")
|
||||||
configurations.runtimeLibraries.forEach {
|
configurations.deterministicLibraries.forEach {
|
||||||
libraryjars it, filter: '!META-INF/versions/**'
|
libraryjars it, filter: '!META-INF/versions/**'
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -152,7 +152,7 @@ task checkDeterminism(type: ProGuardTask, dependsOn: jdkTask) {
|
|||||||
|
|
||||||
libraryjars deterministic_rt_jar
|
libraryjars deterministic_rt_jar
|
||||||
|
|
||||||
configurations.runtimeLibraries.forEach {
|
configurations.deterministicLibraries.forEach {
|
||||||
libraryjars it, filter: '!META-INF/versions/**'
|
libraryjars it, filter: '!META-INF/versions/**'
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -173,12 +173,12 @@ assemble.dependsOn checkDeterminism
|
|||||||
|
|
||||||
def deterministicJar = metafix.outputs.files.singleFile
|
def deterministicJar = metafix.outputs.files.singleFile
|
||||||
artifacts {
|
artifacts {
|
||||||
runtimeArtifacts file: deterministicJar, name: jarBaseName, type: 'jar', extension: 'jar', builtBy: metafix
|
deterministicArtifacts file: deterministicJar, name: jarBaseName, type: 'jar', extension: 'jar', builtBy: metafix
|
||||||
publish file: deterministicJar, name: jarBaseName, type: 'jar', extension: 'jar', builtBy: metafix
|
publish file: deterministicJar, name: jarBaseName, type: 'jar', extension: 'jar', builtBy: metafix
|
||||||
}
|
}
|
||||||
|
|
||||||
publish {
|
publish {
|
||||||
dependenciesFrom configurations.runtimeArtifacts
|
dependenciesFrom configurations.deterministicArtifacts
|
||||||
publishSources = false
|
publishSources = false
|
||||||
publishJavadoc = false
|
publishJavadoc = false
|
||||||
name jarBaseName
|
name jarBaseName
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
apply plugin: 'kotlin'
|
apply plugin: 'kotlin'
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
testCompile project(path: ':core-deterministic', configuration: 'runtimeArtifacts')
|
testCompile project(path: ':core-deterministic', configuration: 'deterministicArtifacts')
|
||||||
testCompile project(path: ':serialization-deterministic', configuration: 'runtimeArtifacts')
|
testCompile project(path: ':serialization-deterministic', configuration: 'deterministicArtifacts')
|
||||||
|
testCompile project(path: ':core-deterministic:testing:verifier', configuration: 'deterministicArtifacts')
|
||||||
testCompile project(path: ':core-deterministic:testing:data', configuration: 'testData')
|
testCompile project(path: ':core-deterministic:testing:data', configuration: 'testData')
|
||||||
testCompile project(':core-deterministic:testing:common')
|
|
||||||
testCompile(project(':finance')) {
|
testCompile(project(':finance')) {
|
||||||
transitive = false
|
transitive = false
|
||||||
}
|
}
|
||||||
|
@ -1,16 +0,0 @@
|
|||||||
apply from: '../../../deterministic.gradle'
|
|
||||||
apply plugin: 'idea'
|
|
||||||
|
|
||||||
dependencies {
|
|
||||||
compileOnly project(path: ':core-deterministic', configuration: 'runtimeArtifacts')
|
|
||||||
compileOnly project(path: ':serialization-deterministic', configuration: 'runtimeArtifacts')
|
|
||||||
compileOnly "junit:junit:$junit_version"
|
|
||||||
}
|
|
||||||
|
|
||||||
idea {
|
|
||||||
module {
|
|
||||||
if (project.hasProperty("deterministic_idea_sdk")) {
|
|
||||||
jdkName project.property("deterministic_idea_sdk") as String
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -8,7 +8,7 @@ dependencies {
|
|||||||
testCompile project(':core')
|
testCompile project(':core')
|
||||||
testCompile project(':finance')
|
testCompile project(':finance')
|
||||||
testCompile project(':node-driver')
|
testCompile project(':node-driver')
|
||||||
testCompile project(':core-deterministic:testing:common')
|
testCompile project(path: ':core-deterministic:testing:verifier', configuration: 'runtimeArtifacts')
|
||||||
|
|
||||||
testCompile "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
|
testCompile "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
|
||||||
testCompile "org.jetbrains.kotlin:kotlin-reflect"
|
testCompile "org.jetbrains.kotlin:kotlin-reflect"
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
package net.corda.deterministic.data
|
package net.corda.deterministic.data
|
||||||
|
|
||||||
import net.corda.core.serialization.deserialize
|
import net.corda.core.serialization.deserialize
|
||||||
import net.corda.deterministic.common.LocalSerializationRule
|
import net.corda.deterministic.verifier.LocalSerializationRule
|
||||||
import net.corda.deterministic.common.TransactionVerificationRequest
|
import net.corda.deterministic.verifier.TransactionVerificationRequest
|
||||||
import org.junit.Before
|
import org.junit.Before
|
||||||
import org.junit.Rule
|
import org.junit.Rule
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
|
@ -7,9 +7,9 @@ import net.corda.core.identity.AnonymousParty
|
|||||||
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.serialization.serialize
|
import net.corda.core.serialization.serialize
|
||||||
import net.corda.deterministic.common.MockContractAttachment
|
import net.corda.deterministic.verifier.MockContractAttachment
|
||||||
import net.corda.deterministic.common.SampleCommandData
|
import net.corda.deterministic.verifier.SampleCommandData
|
||||||
import net.corda.deterministic.common.TransactionVerificationRequest
|
import net.corda.deterministic.verifier.TransactionVerificationRequest
|
||||||
import net.corda.finance.POUNDS
|
import net.corda.finance.POUNDS
|
||||||
import net.corda.finance.`issued by`
|
import net.corda.finance.`issued by`
|
||||||
import net.corda.finance.contracts.asset.Cash.*
|
import net.corda.finance.contracts.asset.Cash.*
|
||||||
|
@ -3,7 +3,7 @@ package net.corda.deterministic.crypto
|
|||||||
import net.corda.core.crypto.*
|
import net.corda.core.crypto.*
|
||||||
import net.corda.deterministic.KeyStoreProvider
|
import net.corda.deterministic.KeyStoreProvider
|
||||||
import net.corda.deterministic.CheatingSecurityProvider
|
import net.corda.deterministic.CheatingSecurityProvider
|
||||||
import net.corda.deterministic.common.LocalSerializationRule
|
import net.corda.deterministic.verifier.LocalSerializationRule
|
||||||
import org.junit.*
|
import org.junit.*
|
||||||
import org.junit.rules.RuleChain
|
import org.junit.rules.RuleChain
|
||||||
import java.security.*
|
import java.security.*
|
||||||
|
@ -1,29 +1,29 @@
|
|||||||
package net.corda.deterministic.txverify
|
package net.corda.deterministic.txverify
|
||||||
|
|
||||||
import net.corda.deterministic.bytesOfResource
|
import net.corda.deterministic.bytesOfResource
|
||||||
import net.corda.deterministic.common.LocalSerializationRule
|
import net.corda.deterministic.verifier.LocalSerializationRule
|
||||||
import net.corda.deterministic.common.verifyInEnclave
|
import net.corda.deterministic.verifier.verifyTransaction
|
||||||
import net.corda.finance.contracts.asset.Cash.Commands.*
|
import net.corda.finance.contracts.asset.Cash.Commands.*
|
||||||
import org.assertj.core.api.Assertions.assertThat
|
import org.assertj.core.api.Assertions.assertThat
|
||||||
import org.junit.ClassRule
|
import org.junit.ClassRule
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
import kotlin.test.assertFailsWith
|
import kotlin.test.assertFailsWith
|
||||||
|
|
||||||
class EnclaveletTest {
|
class VerifyTransactionTest {
|
||||||
companion object {
|
companion object {
|
||||||
@ClassRule
|
@ClassRule
|
||||||
@JvmField
|
@JvmField
|
||||||
val serialization = LocalSerializationRule(EnclaveletTest::class)
|
val serialization = LocalSerializationRule(VerifyTransactionTest::class)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun success() {
|
fun success() {
|
||||||
verifyInEnclave(bytesOfResource("txverify/tx-success.bin"))
|
verifyTransaction(bytesOfResource("txverify/tx-success.bin"))
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun failure() {
|
fun failure() {
|
||||||
val e = assertFailsWith<Exception> { verifyInEnclave(bytesOfResource("txverify/tx-failure.bin")) }
|
val e = assertFailsWith<Exception> { verifyTransaction(bytesOfResource("txverify/tx-failure.bin")) }
|
||||||
assertThat(e).hasMessageContaining("Required ${Move::class.java.canonicalName} command")
|
assertThat(e).hasMessageContaining("Required ${Move::class.java.canonicalName} command")
|
||||||
}
|
}
|
||||||
}
|
}
|
48
core-deterministic/testing/verifier/build.gradle
Normal file
48
core-deterministic/testing/verifier/build.gradle
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
apply plugin: 'java-library'
|
||||||
|
apply from: '../../../deterministic.gradle'
|
||||||
|
apply plugin: 'net.corda.plugins.publish-utils'
|
||||||
|
apply plugin: 'com.jfrog.artifactory'
|
||||||
|
apply plugin: 'idea'
|
||||||
|
|
||||||
|
description 'Test utilities for deterministic contract verification'
|
||||||
|
|
||||||
|
configurations {
|
||||||
|
deterministicArtifacts
|
||||||
|
runtimeArtifacts.extendsFrom api
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
deterministicArtifacts project(path: ':serialization-deterministic', configuration: 'deterministicArtifacts')
|
||||||
|
deterministicArtifacts project(path: ':core-deterministic', configuration: 'deterministicArtifacts')
|
||||||
|
|
||||||
|
runtimeArtifacts project(':serialization')
|
||||||
|
runtimeArtifacts project(':core')
|
||||||
|
|
||||||
|
// Compile against the deterministic artifacts to ensure that we use only the deterministic API subset.
|
||||||
|
compileOnly configurations.deterministicArtifacts
|
||||||
|
api "junit:junit:$junit_version"
|
||||||
|
}
|
||||||
|
|
||||||
|
jar {
|
||||||
|
baseName 'corda-deterministic-verifier'
|
||||||
|
}
|
||||||
|
|
||||||
|
artifacts {
|
||||||
|
deterministicArtifacts jar
|
||||||
|
runtimeArtifacts jar
|
||||||
|
publish jar
|
||||||
|
}
|
||||||
|
|
||||||
|
publish {
|
||||||
|
// Our published POM will contain dependencies on the non-deterministic Corda artifacts.
|
||||||
|
dependenciesFrom configurations.runtimeArtifacts
|
||||||
|
name jar.baseName
|
||||||
|
}
|
||||||
|
|
||||||
|
idea {
|
||||||
|
module {
|
||||||
|
if (project.hasProperty("deterministic_idea_sdk")) {
|
||||||
|
jdkName project.property("deterministic_idea_sdk") as String
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
package net.corda.deterministic.common
|
package net.corda.deterministic.verifier
|
||||||
|
|
||||||
import net.corda.core.serialization.ClassWhitelist
|
import net.corda.core.serialization.ClassWhitelist
|
||||||
import net.corda.core.serialization.SerializationContext
|
import net.corda.core.serialization.SerializationContext
|
@ -1,4 +1,4 @@
|
|||||||
package net.corda.deterministic.common
|
package net.corda.deterministic.verifier
|
||||||
|
|
||||||
import net.corda.core.contracts.Attachment
|
import net.corda.core.contracts.Attachment
|
||||||
import net.corda.core.contracts.ContractClassName
|
import net.corda.core.contracts.ContractClassName
|
@ -1,5 +1,5 @@
|
|||||||
@file:JvmName("SampleData")
|
@file:JvmName("SampleData")
|
||||||
package net.corda.deterministic.common
|
package net.corda.deterministic.verifier
|
||||||
|
|
||||||
import net.corda.core.contracts.TypeOnlyCommandData
|
import net.corda.core.contracts.TypeOnlyCommandData
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
package net.corda.deterministic.common
|
package net.corda.deterministic.verifier
|
||||||
|
|
||||||
import net.corda.core.contracts.Attachment
|
import net.corda.core.contracts.Attachment
|
||||||
import net.corda.core.contracts.ContractAttachment
|
import net.corda.core.contracts.ContractAttachment
|
@ -1,5 +1,5 @@
|
|||||||
@file:JvmName("Enclavelet")
|
@file:JvmName("Verifier")
|
||||||
package net.corda.deterministic.common
|
package net.corda.deterministic.verifier
|
||||||
|
|
||||||
import net.corda.core.serialization.deserialize
|
import net.corda.core.serialization.deserialize
|
||||||
import net.corda.core.transactions.LedgerTransaction
|
import net.corda.core.transactions.LedgerTransaction
|
||||||
@ -11,7 +11,7 @@ import net.corda.core.transactions.LedgerTransaction
|
|||||||
* TODO: Transaction data is meant to be encrypted under an enclave-private key.
|
* TODO: Transaction data is meant to be encrypted under an enclave-private key.
|
||||||
*/
|
*/
|
||||||
@Throws(Exception::class)
|
@Throws(Exception::class)
|
||||||
fun verifyInEnclave(reqBytes: ByteArray) {
|
fun verifyTransaction(reqBytes: ByteArray) {
|
||||||
deserialize(reqBytes).verify()
|
deserialize(reqBytes).verify()
|
||||||
}
|
}
|
||||||
|
|
@ -49,6 +49,5 @@ artifacts {
|
|||||||
|
|
||||||
publish {
|
publish {
|
||||||
dependenciesFrom configurations.shadow
|
dependenciesFrom configurations.shadow
|
||||||
disableDefaultJar true
|
|
||||||
name shadowJar.baseName
|
name shadowJar.baseName
|
||||||
}
|
}
|
||||||
|
@ -11,8 +11,8 @@ def javaHome = System.getProperty('java.home')
|
|||||||
def jarBaseName = "corda-${project.name}".toString()
|
def jarBaseName = "corda-${project.name}".toString()
|
||||||
|
|
||||||
configurations {
|
configurations {
|
||||||
runtimeLibraries
|
deterministicLibraries
|
||||||
runtimeArtifacts.extendsFrom runtimeLibraries
|
deterministicArtifacts.extendsFrom deterministicLibraries
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
@ -20,10 +20,10 @@ dependencies {
|
|||||||
|
|
||||||
// Configure these by hand. It should be a minimal subset of dependencies,
|
// Configure these by hand. It should be a minimal subset of dependencies,
|
||||||
// and without any obviously non-deterministic ones such as Hibernate.
|
// and without any obviously non-deterministic ones such as Hibernate.
|
||||||
runtimeLibraries project(path: ':core-deterministic', configuration: 'runtimeArtifacts')
|
deterministicLibraries project(path: ':core-deterministic', configuration: 'deterministicArtifacts')
|
||||||
runtimeLibraries "org.apache.qpid:proton-j:$protonj_version"
|
deterministicLibraries "org.apache.qpid:proton-j:$protonj_version"
|
||||||
runtimeLibraries "org.iq80.snappy:snappy:$snappy_version"
|
deterministicLibraries "org.iq80.snappy:snappy:$snappy_version"
|
||||||
runtimeLibraries "com.google.guava:guava:$guava_version"
|
deterministicLibraries "com.google.guava:guava:$guava_version"
|
||||||
}
|
}
|
||||||
|
|
||||||
jar {
|
jar {
|
||||||
@ -108,7 +108,7 @@ task determinise(type: ProGuardTask) {
|
|||||||
|
|
||||||
libraryjars file("$javaHome/lib/rt.jar")
|
libraryjars file("$javaHome/lib/rt.jar")
|
||||||
libraryjars file("$javaHome/lib/jce.jar")
|
libraryjars file("$javaHome/lib/jce.jar")
|
||||||
configurations.runtimeLibraries.forEach {
|
configurations.deterministicLibraries.forEach {
|
||||||
libraryjars it, filter: '!META-INF/versions/**'
|
libraryjars it, filter: '!META-INF/versions/**'
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -142,7 +142,7 @@ task checkDeterminism(type: ProGuardTask, dependsOn: jdkTask) {
|
|||||||
|
|
||||||
libraryjars deterministic_rt_jar
|
libraryjars deterministic_rt_jar
|
||||||
|
|
||||||
configurations.runtimeLibraries.forEach {
|
configurations.deterministicLibraries.forEach {
|
||||||
libraryjars it, filter: '!META-INF/versions/**'
|
libraryjars it, filter: '!META-INF/versions/**'
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -162,12 +162,12 @@ assemble.dependsOn checkDeterminism
|
|||||||
|
|
||||||
def deterministicJar = metafix.outputs.files.singleFile
|
def deterministicJar = metafix.outputs.files.singleFile
|
||||||
artifacts {
|
artifacts {
|
||||||
runtimeArtifacts file: deterministicJar, name: jarBaseName, type: 'jar', extension: 'jar', builtBy: metafix
|
deterministicArtifacts file: deterministicJar, name: jarBaseName, type: 'jar', extension: 'jar', builtBy: metafix
|
||||||
publish file: deterministicJar, name: jarBaseName, type: 'jar', extension: 'jar', builtBy: metafix
|
publish file: deterministicJar, name: jarBaseName, type: 'jar', extension: 'jar', builtBy: metafix
|
||||||
}
|
}
|
||||||
|
|
||||||
publish {
|
publish {
|
||||||
dependenciesFrom configurations.runtimeArtifacts
|
dependenciesFrom configurations.deterministicArtifacts
|
||||||
publishSources = false
|
publishSources = false
|
||||||
publishJavadoc = false
|
publishJavadoc = false
|
||||||
name jarBaseName
|
name jarBaseName
|
||||||
|
@ -63,7 +63,7 @@ include 'serialization'
|
|||||||
if (JavaVersion.current() == JavaVersion.VERSION_1_8) {
|
if (JavaVersion.current() == JavaVersion.VERSION_1_8) {
|
||||||
include 'core-deterministic'
|
include 'core-deterministic'
|
||||||
include 'core-deterministic:testing'
|
include 'core-deterministic:testing'
|
||||||
include 'core-deterministic:testing:common'
|
|
||||||
include 'core-deterministic:testing:data'
|
include 'core-deterministic:testing:data'
|
||||||
|
include 'core-deterministic:testing:verifier'
|
||||||
include 'serialization-deterministic'
|
include 'serialization-deterministic'
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user