CORE-15541: release ga builds prep (#61)
* CORE-15561: Use Beta versions of the CSDE gradle plugin (#58) * CORE-15572: deleted stale todo comment (#59) * CORE-15541: release ga-rc12 prep * CORE:15541: update combined worker version to RC12 * CORE-15541: release ga build prep --------- Co-authored-by: Tony Lawson <tony.lawson@r3.com>
This commit is contained in:
parent
bb380544d6
commit
15f1043a39
17
build.gradle
17
build.gradle
@ -32,7 +32,6 @@ allprojects {
|
|||||||
cordaDbContainerName = "CSDEpostgresql"
|
cordaDbContainerName = "CSDEpostgresql"
|
||||||
cordaBinDir = "${System.getProperty("user.home")}/.corda/corda5"
|
cordaBinDir = "${System.getProperty("user.home")}/.corda/corda5"
|
||||||
cordaCliBinDir = "${System.getProperty("user.home")}/.corda/cli"
|
cordaCliBinDir = "${System.getProperty("user.home")}/.corda/cli"
|
||||||
cpiUploadTimeout = cpiUploadDefault
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Declare the set of Java compiler options we need to build a CorDapp.
|
// Declare the set of Java compiler options we need to build a CorDapp.
|
||||||
@ -47,22 +46,6 @@ allprojects {
|
|||||||
// All dependencies are held in Maven Central
|
// All dependencies are held in Maven Central
|
||||||
mavenLocal()
|
mavenLocal()
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
|
|
||||||
// R3 Internal repositories for dev
|
|
||||||
// Repository provides Corda 5 binaries that implement Corda-API.
|
|
||||||
// These will be made publicly available.
|
|
||||||
// Final location to be decided.
|
|
||||||
// Repository subject to change
|
|
||||||
maven {
|
|
||||||
url = "$artifactoryContextUrl/corda-os-maven"
|
|
||||||
authentication {
|
|
||||||
basic(BasicAuthentication)
|
|
||||||
}
|
|
||||||
credentials {
|
|
||||||
username = findProperty('cordaArtifactoryUsername') ?: System.getenv('CORDA_ARTIFACTORY_USERNAME')
|
|
||||||
password = findProperty('cordaArtifactoryPassword') ?: System.getenv('CORDA_ARTIFACTORY_PASSWORD')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks.withType(Test).configureEach {
|
tasks.withType(Test).configureEach {
|
||||||
|
@ -1,38 +1,32 @@
|
|||||||
-----BEGIN CERTIFICATE-----
|
-----BEGIN CERTIFICATE-----
|
||||||
MIIGsDCCBJigAwIBAgIQCK1AsmDSnEyfXs2pvZOu2TANBgkqhkiG9w0BAQwFADBi
|
MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi
|
||||||
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
|
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
|
||||||
d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg
|
d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg
|
||||||
RzQwHhcNMjEwNDI5MDAwMDAwWhcNMzYwNDI4MjM1OTU5WjBpMQswCQYDVQQGEwJV
|
RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV
|
||||||
UzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRy
|
UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu
|
||||||
dXN0ZWQgRzQgQ29kZSBTaWduaW5nIFJTQTQwOTYgU0hBMzg0IDIwMjEgQ0ExMIIC
|
Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG
|
||||||
IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA1bQvQtAorXi3XdU5WRuxiEL1
|
SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y
|
||||||
M4zrPYGXcMW7xIUmMJ+kjmjYXPXrNCQH4UtP03hD9BfXHtr50tVnGlJPDqFX/IiZ
|
ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If
|
||||||
wZHMgQM+TXAkZLON4gh9NH1MgFcSa0OamfLFOx/y78tHWhOmTLMBICXzENOLsvsI
|
xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV
|
||||||
8IrgnQnAZaf6mIBJNYc9URnokCF4RS6hnyzhGMIazMXuk0lwQjKP+8bqHPNlaJGi
|
ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO
|
||||||
TUyCEUhSaN4QvRRXXegYE2XFf7JPhSxIpFaENdb5LpyqABXRN/4aBpTCfMjqGzLm
|
DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ
|
||||||
ysL0p6MDDnSlrzm2q2AS4+jWufcx4dyt5Big2MEjR0ezoQ9uo6ttmAaDG7dqZy3S
|
jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/
|
||||||
vUQakhCBj7A7CdfHmzJawv9qYFSLScGT7eG0XOBv6yb5jNWy+TgQ5urOkfW+0/tv
|
CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi
|
||||||
k2E0XLyTRSiDNipmKF+wc86LJiUGsoPUXPYVGUztYuBeM/Lo6OwKp7ADK5GyNnm+
|
EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM
|
||||||
960IHnWmZcy740hQ83eRGv7bUKJGyGFYmPV8AhY8gyitOYbs1LcNU9D4R+Z1MI3s
|
fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY
|
||||||
MJN2FKZbS110YU0/EpF23r9Yy3IQKUHw1cVtJnZoEUETWJrcJisB9IlNWdt4z4FK
|
uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK
|
||||||
PkBHX8mBUHOFECMhWWCKZFTBzCEa6DgZfGYczXg4RTCZT/9jT0y7qg0IU0F8WD1H
|
chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t
|
||||||
s/q27IwyCQLMbDwMVhECAwEAAaOCAVkwggFVMBIGA1UdEwEB/wQIMAYBAf8CAQAw
|
9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
|
||||||
HQYDVR0OBBYEFGg34Ou2O/hfEYb7/mF7CIhl9E5CMB8GA1UdIwQYMBaAFOzX44LS
|
hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD
|
||||||
cV1kTN8uZz/nupiuHA9PMA4GA1UdDwEB/wQEAwIBhjATBgNVHSUEDDAKBggrBgEF
|
ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2
|
||||||
BQcDAzB3BggrBgEFBQcBAQRrMGkwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRp
|
SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd
|
||||||
Z2ljZXJ0LmNvbTBBBggrBgEFBQcwAoY1aHR0cDovL2NhY2VydHMuZGlnaWNlcnQu
|
+SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc
|
||||||
Y29tL0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5jcnQwQwYDVR0fBDwwOjA4oDagNIYy
|
fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa
|
||||||
aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5j
|
sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N
|
||||||
cmwwHAYDVR0gBBUwEzAHBgVngQwBAzAIBgZngQwBBAEwDQYJKoZIhvcNAQEMBQAD
|
cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N
|
||||||
ggIBADojRD2NCHbuj7w6mdNW4AIapfhINPMstuZ0ZveUcrEAyq9sMCcTEp6QRJ9L
|
0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie
|
||||||
/Z6jfCbVN7w6XUhtldU/SfQnuxaBRVD9nL22heB2fjdxyyL3WqqQz/WTauPrINHV
|
4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI
|
||||||
UHmImoqKwba9oUgYftzYgBoRGRjNYZmBVvbJ43bnxOQbX0P4PpT/djk9ntSZz0rd
|
r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1
|
||||||
KOtfJqGVWEjVGv7XJz/9kNF2ht0csGBc8w2o7uCJob054ThO2m67Np375SFTWsPK
|
/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm
|
||||||
6Wrxoj7bQ7gzyE84FJKZ9d3OVG3ZXQIUH0AzfAPilbLCIXVzUstG2MQ0HKKlS43N
|
gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+
|
||||||
b3Y3LIU/Gs4m6Ri+kAewQ3+ViCCCcPDMyu/9KTVcH4k4Vfc3iosJocsL6TEa/y4Z
|
|
||||||
XDlx4b6cpwoG1iZnt5LmTl/eeqxJzy6kdJKt2zyknIYf48FWGysj/4+16oh7cGvm
|
|
||||||
oLr9Oj9FpsToFpFSi0HASIRLlk2rREDjjfAVKM7t8RhWByovEMQMCGQ8M4+uKIw8
|
|
||||||
y4+ICw2/O/TOHnuO77Xry7fwdxPm5yg/rBKupS8ibEH5glwVZsxsDsrFhsP2JjMM
|
|
||||||
B0ug0wcCampAMEhLNKhRILutG4UI4lkNbcoFUCvqShyepf2gpx8GdOfy1lKQ/a+F
|
|
||||||
SCH5Vzu0nAPthkX0tGFuv2jiJmCG6sivqf6UHedjGzqGVnhO
|
|
||||||
-----END CERTIFICATE-----
|
-----END CERTIFICATE-----
|
||||||
|
@ -39,23 +39,16 @@ dependencies {
|
|||||||
// The CorDapp uses the slf4j logging framework. Corda-API provides this so we need a 'cordaProvided' declaration.
|
// The CorDapp uses the slf4j logging framework. Corda-API provides this so we need a 'cordaProvided' declaration.
|
||||||
cordaProvided 'org.slf4j:slf4j-api'
|
cordaProvided 'org.slf4j:slf4j-api'
|
||||||
|
|
||||||
// This are shared so should be here.
|
|
||||||
// Dependencies Required By Test Tooling
|
|
||||||
// Todo: these are commented out as the simulator UTXO work has not been merged into Gecko yet.
|
|
||||||
// testImplementation "net.corda:corda-simulator-api:$simulatorVersion"
|
|
||||||
// testRuntimeOnly "net.corda:corda-simulator-runtime:$simulatorVersion"
|
|
||||||
|
|
||||||
// 3rd party libraries
|
// 3rd party libraries
|
||||||
// Required
|
// Required
|
||||||
testImplementation "org.slf4j:slf4j-simple:2.0.0"
|
testImplementation "org.slf4j:slf4j-simple:2.0.0"
|
||||||
testImplementation "org.junit.jupiter:junit-jupiter:$junitVersion"
|
testImplementation "org.junit.jupiter:junit-jupiter:$junitVersion"
|
||||||
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$junitVersion"
|
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$junitVersion"
|
||||||
|
|
||||||
// Optional but used by exmaple tests.
|
// Optional but used by example tests.
|
||||||
testImplementation "org.mockito:mockito-core:$mockitoVersion"
|
testImplementation "org.mockito:mockito-core:$mockitoVersion"
|
||||||
testImplementation "org.mockito.kotlin:mockito-kotlin:$mockitoKotlinVersion"
|
testImplementation "org.mockito.kotlin:mockito-kotlin:$mockitoKotlinVersion"
|
||||||
testImplementation "org.hamcrest:hamcrest-library:$hamcrestVersion"
|
testImplementation "org.hamcrest:hamcrest-library:$hamcrestVersion"
|
||||||
testImplementation "com.r3.corda.ledger.utxo:contract-testing:$contractTestingVersion"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// The CordApp section.
|
// The CordApp section.
|
||||||
|
@ -1,158 +0,0 @@
|
|||||||
package com.r3.developers.csdetemplate.utxoexample.contracts;
|
|
||||||
|
|
||||||
import com.r3.corda.ledger.utxo.testing.ContractTest;
|
|
||||||
import com.r3.developers.csdetemplate.utxoexample.states.ChatState;
|
|
||||||
import net.corda.v5.ledger.utxo.Command;
|
|
||||||
import net.corda.v5.ledger.utxo.StateAndRef;
|
|
||||||
import net.corda.v5.ledger.utxo.transaction.UtxoSignedTransaction;
|
|
||||||
import org.junit.jupiter.api.Test;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
import static com.r3.developers.csdetemplate.utxoexample.contracts.ChatContract.*;
|
|
||||||
import static java.util.Collections.emptyList;
|
|
||||||
|
|
||||||
public class ChatContractCreateCommandTest extends ContractTest {
|
|
||||||
|
|
||||||
protected ChatState outputChatState = new ChatState(
|
|
||||||
UUID.randomUUID(),
|
|
||||||
"aliceChatName",
|
|
||||||
aliceName,
|
|
||||||
"aliceChatMessage",
|
|
||||||
List.of(aliceKey, bobKey)
|
|
||||||
);
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void happyPath() {
|
|
||||||
UtxoSignedTransaction transaction = getLedgerService()
|
|
||||||
.createTransactionBuilder()
|
|
||||||
.addOutputState(outputChatState)
|
|
||||||
.addCommand(new ChatContract.Create())
|
|
||||||
.addSignatories(outputChatState.participants)
|
|
||||||
.toSignedTransaction();
|
|
||||||
assertVerifies(transaction);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void missingCommand() {
|
|
||||||
UtxoSignedTransaction transaction = getLedgerService()
|
|
||||||
.createTransactionBuilder()
|
|
||||||
.addOutputState(outputChatState)
|
|
||||||
.toSignedTransaction();
|
|
||||||
assertFailsWith(transaction, "Failed requirement: " + REQUIRE_SINGLE_COMMAND);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void shouldNotAcceptUnknownCommand() {
|
|
||||||
class MyDummyCommand implements Command {
|
|
||||||
}
|
|
||||||
|
|
||||||
UtxoSignedTransaction transaction = getLedgerService()
|
|
||||||
.createTransactionBuilder()
|
|
||||||
.addOutputState(outputChatState)
|
|
||||||
.addCommand(new MyDummyCommand())
|
|
||||||
.addSignatories(outputChatState.participants)
|
|
||||||
.toSignedTransaction();
|
|
||||||
|
|
||||||
assertFailsWith(transaction, UNKNOWN_COMMAND);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void outputStateCannotHaveZeroParticipants() {
|
|
||||||
ChatState state = new ChatState(
|
|
||||||
UUID.randomUUID(),
|
|
||||||
"myChatName",
|
|
||||||
aliceName,
|
|
||||||
"myChatMessage",
|
|
||||||
emptyList()
|
|
||||||
);
|
|
||||||
UtxoSignedTransaction transaction = getLedgerService()
|
|
||||||
.createTransactionBuilder()
|
|
||||||
.addOutputState(state)
|
|
||||||
.addCommand(new ChatContract.Create())
|
|
||||||
.toSignedTransaction();
|
|
||||||
assertFailsWith(transaction, "Failed requirement: " + OUTPUT_STATE_SHOULD_ONLY_HAVE_TWO_PARTICIPANTS);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void outputStateCannotHaveOneParticipant() {
|
|
||||||
ChatState state = new ChatState(
|
|
||||||
UUID.randomUUID(),
|
|
||||||
"myChatName",
|
|
||||||
aliceName,
|
|
||||||
"myChatMessage",
|
|
||||||
List.of(aliceKey)
|
|
||||||
);
|
|
||||||
UtxoSignedTransaction transaction = getLedgerService()
|
|
||||||
.createTransactionBuilder()
|
|
||||||
.addOutputState(state)
|
|
||||||
.addCommand(new ChatContract.Create())
|
|
||||||
.toSignedTransaction();
|
|
||||||
assertFailsWith(transaction, "Failed requirement: " + OUTPUT_STATE_SHOULD_ONLY_HAVE_TWO_PARTICIPANTS);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void outputStateCannotHaveThreeParticipants() {
|
|
||||||
ChatState state = new ChatState(
|
|
||||||
UUID.randomUUID(),
|
|
||||||
"myChatName",
|
|
||||||
aliceName,
|
|
||||||
"myChatMessage",
|
|
||||||
List.of(aliceKey, bobKey, charlieKey)
|
|
||||||
);
|
|
||||||
UtxoSignedTransaction transaction = getLedgerService()
|
|
||||||
.createTransactionBuilder()
|
|
||||||
.addOutputState(state)
|
|
||||||
.addCommand(new ChatContract.Create())
|
|
||||||
.toSignedTransaction();
|
|
||||||
assertFailsWith(transaction, "Failed requirement: " + OUTPUT_STATE_SHOULD_ONLY_HAVE_TWO_PARTICIPANTS);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void outputStateMustBeSigned() {
|
|
||||||
UtxoSignedTransaction transaction = getLedgerService()
|
|
||||||
.createTransactionBuilder()
|
|
||||||
.addOutputState(outputChatState)
|
|
||||||
.addCommand(new ChatContract.Create())
|
|
||||||
.toSignedTransaction();
|
|
||||||
assertFailsWith(transaction, "Failed requirement: " + TRANSACTION_SHOULD_BE_SIGNED_BY_ALL_PARTICIPANTS);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void outputStateCannotBeSignedByOnlyOneParticipant() {
|
|
||||||
UtxoSignedTransaction transaction = getLedgerService()
|
|
||||||
.createTransactionBuilder()
|
|
||||||
.addOutputState(outputChatState)
|
|
||||||
.addCommand(new ChatContract.Create())
|
|
||||||
.addSignatories(outputChatState.participants.get(0))
|
|
||||||
.toSignedTransaction();
|
|
||||||
assertFailsWith(transaction, "Failed requirement: " + TRANSACTION_SHOULD_BE_SIGNED_BY_ALL_PARTICIPANTS);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void shouldNotIncludeInputState() {
|
|
||||||
happyPath(); // generate an existing state to search for
|
|
||||||
StateAndRef<ChatState> existingState = getLedgerService().findUnconsumedStatesByType(ChatState.class).get(0); // doesn't matter which as this will fail validation
|
|
||||||
UtxoSignedTransaction transaction = getLedgerService()
|
|
||||||
.createTransactionBuilder()
|
|
||||||
.addInputState(existingState.getRef())
|
|
||||||
.addOutputState(outputChatState)
|
|
||||||
.addCommand(new ChatContract.Create())
|
|
||||||
.addSignatories(outputChatState.participants)
|
|
||||||
.toSignedTransaction();
|
|
||||||
assertFailsWith(transaction, "Failed requirement: " + CREATE_COMMAND_SHOULD_HAVE_NO_INPUT_STATES);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void shouldNotHaveTwoOutputStates() {
|
|
||||||
UtxoSignedTransaction transaction = getLedgerService()
|
|
||||||
.createTransactionBuilder()
|
|
||||||
.addOutputState(outputChatState)
|
|
||||||
.addOutputState(outputChatState)
|
|
||||||
.addCommand(new ChatContract.Create())
|
|
||||||
.addSignatories(outputChatState.participants)
|
|
||||||
.toSignedTransaction();
|
|
||||||
assertFailsWith(transaction, "Failed requirement: " + CREATE_COMMAND_SHOULD_HAVE_ONLY_ONE_OUTPUT_STATE);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,175 +0,0 @@
|
|||||||
package com.r3.developers.csdetemplate.utxoexample.contracts;
|
|
||||||
|
|
||||||
import com.r3.corda.ledger.utxo.testing.ContractTest;
|
|
||||||
import com.r3.developers.csdetemplate.utxoexample.states.ChatState;
|
|
||||||
import net.corda.v5.ledger.utxo.StateAndRef;
|
|
||||||
import net.corda.v5.ledger.utxo.transaction.UtxoSignedTransaction;
|
|
||||||
import org.junit.jupiter.api.Test;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
import static com.r3.developers.csdetemplate.utxoexample.contracts.ChatContract.*;
|
|
||||||
|
|
||||||
public class ChatContractUpdateCommandTest extends ContractTest {
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
private StateAndRef<ChatState> createInitialChatState() {
|
|
||||||
ChatState outputChatState = new ChatContractCreateCommandTest().outputChatState;
|
|
||||||
UtxoSignedTransaction transaction = getLedgerService()
|
|
||||||
.createTransactionBuilder()
|
|
||||||
.addOutputState(outputChatState)
|
|
||||||
.addCommand(new ChatContract.Create())
|
|
||||||
.addSignatories(outputChatState.participants)
|
|
||||||
.toSignedTransaction();
|
|
||||||
transaction.toLedgerTransaction();
|
|
||||||
return (StateAndRef<ChatState>) transaction.getOutputStateAndRefs().get(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void happyPath() {
|
|
||||||
StateAndRef<ChatState> existingState = createInitialChatState();
|
|
||||||
ChatState updatedOutputChatState = existingState.getState().getContractState().updateMessage(bobName, "bobResponse");
|
|
||||||
UtxoSignedTransaction transaction = getLedgerService()
|
|
||||||
.createTransactionBuilder()
|
|
||||||
.addInputState(existingState.getRef())
|
|
||||||
.addOutputState(updatedOutputChatState)
|
|
||||||
.addCommand(new ChatContract.Update())
|
|
||||||
.addSignatories(updatedOutputChatState.participants)
|
|
||||||
.toSignedTransaction();
|
|
||||||
assertVerifies(transaction);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void shouldNotHaveNoInputState() {
|
|
||||||
StateAndRef<ChatState> existingState = createInitialChatState();
|
|
||||||
ChatState updatedOutputChatState = existingState.getState().getContractState().updateMessage(bobName, "bobResponse");
|
|
||||||
UtxoSignedTransaction transaction = getLedgerService()
|
|
||||||
.createTransactionBuilder()
|
|
||||||
.addOutputState(updatedOutputChatState)
|
|
||||||
.addCommand(new ChatContract.Update())
|
|
||||||
.addSignatories(updatedOutputChatState.participants)
|
|
||||||
.toSignedTransaction();
|
|
||||||
assertFailsWith(transaction, "Failed requirement: " + UPDATE_COMMAND_SHOULD_HAVE_ONLY_ONE_INPUT_STATE);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void shouldNotHaveTwoInputStates() {
|
|
||||||
StateAndRef<ChatState> existingState = createInitialChatState();
|
|
||||||
ChatState updatedOutputChatState = existingState.getState().getContractState().updateMessage(bobName, "bobResponse");
|
|
||||||
UtxoSignedTransaction transaction = getLedgerService()
|
|
||||||
.createTransactionBuilder()
|
|
||||||
.addInputState(existingState.getRef())
|
|
||||||
.addInputState(existingState.getRef())
|
|
||||||
.addOutputState(updatedOutputChatState)
|
|
||||||
.addCommand(new ChatContract.Update())
|
|
||||||
.addSignatories(updatedOutputChatState.participants)
|
|
||||||
.toSignedTransaction();
|
|
||||||
assertFailsWith(transaction, "Failed requirement: " + UPDATE_COMMAND_SHOULD_HAVE_ONLY_ONE_INPUT_STATE);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void shouldNotHaveTwoOutputStates() {
|
|
||||||
StateAndRef<ChatState> existingState = createInitialChatState();
|
|
||||||
ChatState updatedOutputChatState = existingState.getState().getContractState().updateMessage(bobName, "bobResponse");
|
|
||||||
UtxoSignedTransaction transaction = getLedgerService()
|
|
||||||
.createTransactionBuilder()
|
|
||||||
.addInputState(existingState.getRef())
|
|
||||||
.addOutputState(updatedOutputChatState)
|
|
||||||
.addOutputState(updatedOutputChatState)
|
|
||||||
.addCommand(new ChatContract.Update())
|
|
||||||
.addSignatories(updatedOutputChatState.participants)
|
|
||||||
.toSignedTransaction();
|
|
||||||
assertFailsWith(transaction, "Failed requirement: " + UPDATE_COMMAND_SHOULD_HAVE_ONLY_ONE_OUTPUT_STATE);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void idShouldNotChange() {
|
|
||||||
StateAndRef<ChatState> existingState = createInitialChatState();
|
|
||||||
ChatState esDetails = existingState.getState().getContractState();
|
|
||||||
ChatState updatedOutputChatState = new ChatState(
|
|
||||||
UUID.randomUUID(),
|
|
||||||
esDetails.getChatName(),
|
|
||||||
bobName,
|
|
||||||
"bobResponse",
|
|
||||||
esDetails.getParticipants()
|
|
||||||
);
|
|
||||||
UtxoSignedTransaction transaction = getLedgerService()
|
|
||||||
.createTransactionBuilder()
|
|
||||||
.addInputState(existingState.getRef())
|
|
||||||
.addOutputState(updatedOutputChatState)
|
|
||||||
.addCommand(new ChatContract.Update())
|
|
||||||
.addSignatories(updatedOutputChatState.participants)
|
|
||||||
.toSignedTransaction();
|
|
||||||
assertFailsWith(transaction, "Failed requirement: " + UPDATE_COMMAND_ID_SHOULD_NOT_CHANGE);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void chatNameShouldNotChange() {
|
|
||||||
StateAndRef<ChatState> existingState = createInitialChatState();
|
|
||||||
ChatState esDetails = existingState.getState().getContractState();
|
|
||||||
ChatState updatedOutputChatState = new ChatState(
|
|
||||||
esDetails.getId(),
|
|
||||||
"newName",
|
|
||||||
bobName,
|
|
||||||
"bobResponse",
|
|
||||||
esDetails.getParticipants()
|
|
||||||
);
|
|
||||||
UtxoSignedTransaction transaction = getLedgerService()
|
|
||||||
.createTransactionBuilder()
|
|
||||||
.addInputState(existingState.getRef())
|
|
||||||
.addOutputState(updatedOutputChatState)
|
|
||||||
.addCommand(new ChatContract.Update())
|
|
||||||
.addSignatories(updatedOutputChatState.participants)
|
|
||||||
.toSignedTransaction();
|
|
||||||
assertFailsWith(transaction, "Failed requirement: " + UPDATE_COMMAND_CHATNAME_SHOULD_NOT_CHANGE);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void participantsShouldNotChange() {
|
|
||||||
StateAndRef<ChatState> existingState = createInitialChatState();
|
|
||||||
ChatState esDetails = existingState.getState().getContractState();
|
|
||||||
ChatState updatedOutputChatState = new ChatState(
|
|
||||||
esDetails.getId(),
|
|
||||||
esDetails.getChatName(),
|
|
||||||
bobName,
|
|
||||||
"bobResponse",
|
|
||||||
List.of(bobKey, charlieKey)
|
|
||||||
);
|
|
||||||
UtxoSignedTransaction transaction = getLedgerService()
|
|
||||||
.createTransactionBuilder()
|
|
||||||
.addInputState(existingState.getRef())
|
|
||||||
.addOutputState(updatedOutputChatState)
|
|
||||||
.addCommand(new ChatContract.Update())
|
|
||||||
.addSignatories(updatedOutputChatState.participants)
|
|
||||||
.toSignedTransaction();
|
|
||||||
assertFailsWith(transaction, "Failed requirement: " + UPDATE_COMMAND_PARTICIPANTS_SHOULD_NOT_CHANGE);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void outputStateMustBeSigned() {
|
|
||||||
StateAndRef<ChatState> existingState = createInitialChatState();
|
|
||||||
ChatState updatedOutputChatState = existingState.getState().getContractState().updateMessage(bobName, "bobResponse");
|
|
||||||
UtxoSignedTransaction transaction = getLedgerService()
|
|
||||||
.createTransactionBuilder()
|
|
||||||
.addInputState(existingState.getRef())
|
|
||||||
.addOutputState(updatedOutputChatState)
|
|
||||||
.addCommand(new ChatContract.Update())
|
|
||||||
.toSignedTransaction();
|
|
||||||
assertFailsWith(transaction, "Failed requirement: " + TRANSACTION_SHOULD_BE_SIGNED_BY_ALL_PARTICIPANTS);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void outputStateCannotBeSignedByOnlyOneParticipant() {
|
|
||||||
StateAndRef<ChatState> existingState = createInitialChatState();
|
|
||||||
ChatState updatedOutputChatState = existingState.getState().getContractState().updateMessage(bobName, "bobResponse");
|
|
||||||
UtxoSignedTransaction transaction = getLedgerService()
|
|
||||||
.createTransactionBuilder()
|
|
||||||
.addInputState(existingState.getRef())
|
|
||||||
.addOutputState(updatedOutputChatState)
|
|
||||||
.addCommand(new ChatContract.Update())
|
|
||||||
.addSignatories(updatedOutputChatState.participants.get(0))
|
|
||||||
.toSignedTransaction();
|
|
||||||
assertFailsWith(transaction, "Failed requirement: " + TRANSACTION_SHOULD_BE_SIGNED_BY_ALL_PARTICIPANTS);
|
|
||||||
}
|
|
||||||
}
|
|
@ -2,20 +2,20 @@ kotlin.code.style=official
|
|||||||
|
|
||||||
# Specify the version of the Corda-API to use.
|
# Specify the version of the Corda-API to use.
|
||||||
# This needs to match the version supported by the Corda Cluster the CorDapp will run on.
|
# This needs to match the version supported by the Corda Cluster the CorDapp will run on.
|
||||||
cordaApiVersion=5.0.0.763-Iguana1.0
|
cordaApiVersion=5.0.0.765
|
||||||
|
|
||||||
# Specify the version of the notary plugins to use.
|
# Specify the version of the notary plugins to use.
|
||||||
# Currently packaged as part of corda-runtime-os, so should be set to a corda-runtime-os version.
|
# Currently packaged as part of corda-runtime-os, so should be set to a corda-runtime-os version.
|
||||||
cordaNotaryPluginsVersion=5.0.0.0-Iguana1.0
|
cordaNotaryPluginsVersion=5.0.0.0
|
||||||
|
|
||||||
# Specify the version of the Combined Worker to use
|
# Specify the version of the Combined Worker to use
|
||||||
combinedWorkerJarVersion=5.0.0.0-Iguana1.0
|
combinedWorkerJarVersion=5.0.0.0
|
||||||
|
|
||||||
# Specify the version of the cordapp-cpb and cordapp-cpk plugins
|
# Specify the version of the cordapp-cpb and cordapp-cpk plugins
|
||||||
cordaPluginsVersion=7.0.3
|
cordaPluginsVersion=7.0.3
|
||||||
|
|
||||||
# Specify the version of the CSDE gradle plugin to use
|
# Specify the version of the CSDE gradle plugin to use
|
||||||
csdePluginVersion=1.2.0-alpha-+
|
csdePluginVersion=1.1.0
|
||||||
|
|
||||||
# Specify the name of the workflows module
|
# Specify the name of the workflows module
|
||||||
workflowsModule=workflows
|
workflowsModule=workflows
|
||||||
@ -35,13 +35,3 @@ junitVersion = 5.8.2
|
|||||||
mockitoKotlinVersion=4.0.0
|
mockitoKotlinVersion=4.0.0
|
||||||
mockitoVersion=4.6.1
|
mockitoVersion=4.6.1
|
||||||
hamcrestVersion=2.2
|
hamcrestVersion=2.2
|
||||||
contractTestingVersion=0.9.0-beta-+
|
|
||||||
|
|
||||||
# Specify the maximum amount of time allowed for the CPI upload
|
|
||||||
# As your CorDapp grows you might need to increase this
|
|
||||||
# Value is in milliseconds
|
|
||||||
cpiUploadDefault=10000
|
|
||||||
|
|
||||||
# R3 internal repository
|
|
||||||
# Use this version when pointing to artefacts in artifactory that have not been published to S3
|
|
||||||
artifactoryContextUrl=https://software.r3.com/artifactory
|
|
||||||
|
@ -4,16 +4,6 @@ pluginManagement {
|
|||||||
gradlePluginPortal()
|
gradlePluginPortal()
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
mavenLocal()
|
mavenLocal()
|
||||||
maven {
|
|
||||||
url = "$artifactoryContextUrl/corda-os-maven"
|
|
||||||
authentication {
|
|
||||||
basic(BasicAuthentication)
|
|
||||||
}
|
|
||||||
credentials {
|
|
||||||
username = settings.ext.find('cordaArtifactoryUsername') ?: System.getenv('CORDA_ARTIFACTORY_USERNAME')
|
|
||||||
password = settings.ext.find('cordaArtifactoryPassword') ?: System.getenv('CORDA_ARTIFACTORY_PASSWORD')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// The plugin dependencies with versions of the plugins congruent with the specified CorDapp plugin version,
|
// The plugin dependencies with versions of the plugins congruent with the specified CorDapp plugin version,
|
||||||
|
@ -40,12 +40,6 @@ dependencies {
|
|||||||
// The CorDapp uses the slf4j logging framework. Corda-API provides this so we need a 'cordaProvided' declaration.
|
// The CorDapp uses the slf4j logging framework. Corda-API provides this so we need a 'cordaProvided' declaration.
|
||||||
cordaProvided 'org.slf4j:slf4j-api'
|
cordaProvided 'org.slf4j:slf4j-api'
|
||||||
|
|
||||||
// This are shared so should be here.
|
|
||||||
// Dependencies Required By Test Tooling
|
|
||||||
// Todo: these are commented out as the simulator UTXO work has not been merged into Gecko yet.
|
|
||||||
// testImplementation "net.corda:corda-simulator-api:$simulatorVersion"
|
|
||||||
// testRuntimeOnly "net.corda:corda-simulator-runtime:$simulatorVersion"
|
|
||||||
|
|
||||||
// 3rd party libraries
|
// 3rd party libraries
|
||||||
// Required
|
// Required
|
||||||
testImplementation "org.slf4j:slf4j-simple:2.0.0"
|
testImplementation "org.slf4j:slf4j-simple:2.0.0"
|
||||||
|
Loading…
Reference in New Issue
Block a user