Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feature: update Iroha image version, recompiled executor and nft smart contract, added test for trigger metadata update event #409

Merged
merged 4 commits into from
Apr 22, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
133 changes: 108 additions & 25 deletions modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/TriggersTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,19 @@ import jp.co.soramitsu.iroha2.generated.AssetDefinitionId
import jp.co.soramitsu.iroha2.generated.AssetId
import jp.co.soramitsu.iroha2.generated.AssetValue
import jp.co.soramitsu.iroha2.generated.AssetValueType
import jp.co.soramitsu.iroha2.generated.DataEntityFilter
import jp.co.soramitsu.iroha2.generated.Duration
import jp.co.soramitsu.iroha2.generated.FilterOptOfDataEntityFilter
import jp.co.soramitsu.iroha2.generated.FilterOptOfOriginFilterOfTriggerEvent
import jp.co.soramitsu.iroha2.generated.FilterOptOfTriggerEventFilter
import jp.co.soramitsu.iroha2.generated.FilterOptOfTriggerFilter
import jp.co.soramitsu.iroha2.generated.InstructionExpr
import jp.co.soramitsu.iroha2.generated.Metadata
import jp.co.soramitsu.iroha2.generated.Name
import jp.co.soramitsu.iroha2.generated.OriginFilterOfTriggerEvent
import jp.co.soramitsu.iroha2.generated.Repeats
import jp.co.soramitsu.iroha2.generated.TriggerEventFilter
import jp.co.soramitsu.iroha2.generated.TriggerFilter
import jp.co.soramitsu.iroha2.generated.TriggerId
import jp.co.soramitsu.iroha2.generated.TriggeringFilterBox
import jp.co.soramitsu.iroha2.query.QueryBuilder
Expand Down Expand Up @@ -253,44 +261,89 @@ class TriggersTest : IrohaTest<Iroha2Client>() {
withTimeout(txTimeout) { d.await() }
}

// send some transactions to keep Iroha2 network busy
repeat(2) { i ->
client.sendTransaction {
accountId = ALICE_ACCOUNT_ID
setKeyValue(ALICE_ACCOUNT_ID, "test$i".asName(), "test$i".asValue())
buildSigned(ALICE_KEYPAIR)
}.also { d ->
withTimeout(txTimeout) { d.await() }
}
keepNetworkBusyAndCheckAssetDefinitionIds()

val testKey = "key"
val testValue = "value"
client.sendTransaction {
accountId = ALICE_ACCOUNT_ID
setKeyValue(triggerId, testKey.asName(), testValue.asValue())
buildSigned(ALICE_KEYPAIR)
}.also { d ->
withTimeout(txTimeout) { d.await() }
}
QueryBuilder.findAssetsByAccountId(ALICE_ACCOUNT_ID)
QueryBuilder.findTriggerById(triggerId)
.account(ALICE_ACCOUNT_ID)
.buildSigned(ALICE_KEYPAIR)
.let { query -> client.sendQuery(query) }
.also { assets ->
assert(assets.size > 1)
assert(assets.all { it.id.accountId == ALICE_ACCOUNT_ID })
assert(assets.any { it.id.definitionId == XOR_DEFINITION_ID })
assert(
assets.any {
it.id.definitionId == AssetDefinitionId(
"nft_number_1_for_alice".asName(),
DEFAULT_DOMAIN_ID,
)
},
)
}
.also { assertEquals(testValue, it.action.metadata.getStringValue(testKey)) }
}

@Test
@WithIroha([AliceHas100XorAndPermissionToBurn::class])
@Story("Wasm trigger mints NFT for every user when trigger metadata is updated")
@SdkTestId("wasm_trigger_to_mint_nft_for_every_user_on_update_trigger_metadata_event")
fun `wasm trigger to mint nft for every user on update trigger metadata event`(): Unit = runBlocking {
val wasmTriggerId = TriggerId(name = "wasm_trigger".asName())
val setKeyValueTriggerId = TriggerId(name = "update_trigger".asName())

val filter = TriggeringFilterBox.Data(
FilterOptOfDataEntityFilter.BySome(
DataEntityFilter.ByTrigger(
FilterOptOfTriggerFilter.BySome(
TriggerFilter(
FilterOptOfOriginFilterOfTriggerEvent.BySome(
OriginFilterOfTriggerEvent(
wasmTriggerId,
),
),
FilterOptOfTriggerEventFilter.BySome(
TriggerEventFilter.ByMetadataInserted(),
),
),
),
),
),
)

val wasm = this.javaClass.classLoader
.getResource("create_nft_for_alice_smartcontract.wasm")
.readBytes()

client.sendTransaction {
accountId = ALICE_ACCOUNT_ID
registerWasmTrigger(
wasmTriggerId,
wasm,
Repeats.Indefinitely(),
ALICE_ACCOUNT_ID,
Metadata(mapOf()),
filter,
)
buildSigned(ALICE_KEYPAIR)
}.also { d ->
withTimeout(txTimeout) { d.await() }
}

val testKey = "key"
val testValue = "value"
client.sendTransaction {
accountId = ALICE_ACCOUNT_ID
setKeyValue(triggerId, testKey.asName(), testValue.asValue())
registerExecutableTrigger(
setKeyValueTriggerId,
listOf(Instructions.setKeyValue(wasmTriggerId, testKey.asName(), testValue.asValue())),
Repeats.Exactly(1L),
ALICE_ACCOUNT_ID,
)
executeTrigger(setKeyValueTriggerId)
buildSigned(ALICE_KEYPAIR)
}.also { d ->
withTimeout(txTimeout) { d.await() }
}
QueryBuilder.findTriggerById(triggerId)

keepNetworkBusyAndCheckAssetDefinitionIds()

QueryBuilder.findTriggerById(wasmTriggerId)
.account(ALICE_ACCOUNT_ID)
.buildSigned(ALICE_KEYPAIR)
.let { query -> client.sendQuery(query) }
Expand Down Expand Up @@ -416,4 +469,34 @@ class TriggersTest : IrohaTest<Iroha2Client>() {
.map { (it?.value as AssetValue.Quantity).u32 }
.first()
}

private suspend fun keepNetworkBusyAndCheckAssetDefinitionIds() {
// send some transactions to keep Iroha2 network busy
repeat(2) { i ->
client.sendTransaction {
accountId = ALICE_ACCOUNT_ID
setKeyValue(ALICE_ACCOUNT_ID, "test$i".asName(), "test$i".asValue())
buildSigned(ALICE_KEYPAIR)
}.also { d ->
withTimeout(txTimeout) { d.await() }
}
}
QueryBuilder.findAssetsByAccountId(ALICE_ACCOUNT_ID)
.account(ALICE_ACCOUNT_ID)
.buildSigned(ALICE_KEYPAIR)
.let { query -> client.sendQuery(query) }
.also { assets ->
assert(assets.size > 1)
assert(assets.all { it.id.accountId == ALICE_ACCOUNT_ID })
assert(assets.any { it.id.definitionId == XOR_DEFINITION_ID })
assert(
assets.any {
it.id.definitionId == AssetDefinitionId(
"nft_number_1_for_alice".asName(),
DEFAULT_DOMAIN_ID,
)
},
)
}
}
}
Binary file not shown.
Binary file modified modules/client/src/test/resources/executor.wasm
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ open class IrohaContainer : GenericContainer<IrohaContainer> {
}.let { DockerImageName.parse(it) }

const val NETWORK_ALIAS = "iroha"
const val DEFAULT_IMAGE_TAG = "sha256:cb9aefba9a2c56c40bdb84c4438c27c9769c1e2f56f1caa624f3561b19c0c2c4"
const val DEFAULT_IMAGE_TAG = "sha256:4dfa7012d79479770e42a9d72ff04436da28cea71863a13907a4f6592e9c0d12"
const val DEFAULT_IMAGE_NAME = "hyperledger/iroha2"
const val DEFAULT_EXECUTOR_FILE_NAME = "executor.wasm"
const val DEFAULT_GENESIS_FILE_NAME = "genesis.json"
Expand Down
Loading