From 131dd7f7ca3fc08aefc07bd7b726212ab8e65153 Mon Sep 17 00:00:00 2001 From: Jeremy Bernard Date: Mon, 15 Dec 2025 14:01:17 +0100 Subject: [PATCH 1/2] feat: run tests against PoCo v6.2.0 --- docker-compose.yml | 2 +- .../commons/poco/itest/MatchOrdersTests.java | 60 +++++++++++++++++-- .../commons/poco/itest/OrdersService.java | 34 ++++++++--- .../commons/poco/itest/Web3jTestService.java | 2 +- 4 files changed, 84 insertions(+), 14 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index f195245..de104ba 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,5 +1,5 @@ services: poco-chain: - image: docker-regis.iex.ec/poco-chain:1.1.0-poco-v6.1.0-contracts-voucher-v1.0.0-nethermind + image: docker-regis.iex.ec/poco-chain:1.2.2-poco-v6.2.0-contracts-nethermind expose: - "8545" diff --git a/src/test/java/com/iexec/commons/poco/itest/MatchOrdersTests.java b/src/test/java/com/iexec/commons/poco/itest/MatchOrdersTests.java index 16fea28..434d571 100644 --- a/src/test/java/com/iexec/commons/poco/itest/MatchOrdersTests.java +++ b/src/test/java/com/iexec/commons/poco/itest/MatchOrdersTests.java @@ -27,6 +27,9 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import org.testcontainers.containers.ComposeContainer; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; @@ -37,6 +40,7 @@ import org.web3j.crypto.exception.CipherException; import org.web3j.protocol.core.methods.response.TransactionReceipt; import org.web3j.protocol.exceptions.JsonRpcError; +import org.web3j.utils.Numeric; import java.io.File; import java.io.IOException; @@ -45,14 +49,14 @@ import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; +import java.util.stream.Stream; import static com.iexec.commons.poco.encoding.MatchOrdersDataEncoder.encodeAssertDatasetDealCompatibility; import static com.iexec.commons.poco.itest.ChainTests.SERVICE_NAME; import static com.iexec.commons.poco.itest.ChainTests.SERVICE_PORT; import static com.iexec.commons.poco.itest.IexecHubTestService.*; import static com.iexec.commons.poco.itest.Web3jTestService.MINING_TIMEOUT; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.assertj.core.api.Assertions.*; import static org.awaitility.Awaitility.await; @Slf4j @@ -237,6 +241,55 @@ void shouldMatchOrdersWithoutDataset() throws IOException { } } + @ParameterizedTest + @MethodSource("provideValidTags") + void shouldMatchOrdersWithValidTags(final String appTag, final String datasetTag, final String requestTag, final String workerpoolTag) throws IOException { + final Map deployedAddresses = iexecHubService.deployAssets(); + final AppOrder signedAppOrder = ordersService.buildSignedAppOrder(deployedAddresses.get("app"), formatTag(appTag)); + final DatasetOrder signedDatasetOrder = ordersService.buildSignedDatasetOrder(deployedAddresses.get("dataset"), formatTag(datasetTag)); + final WorkerpoolOrder signedWorkerpoolOrder = ordersService.buildSignedWorkerpoolOrder(deployedAddresses.get("workerpool"), BigInteger.ONE, formatTag(workerpoolTag)); + final RequestOrder signedRequestOrder = ordersService.buildSignedRequestOrder( + signedAppOrder, signedDatasetOrder, signedWorkerpoolOrder, BigInteger.ONE, formatTag(requestTag)); + + final String matchOrdersTxData = MatchOrdersDataEncoder.encode(signedAppOrder, signedDatasetOrder, signedWorkerpoolOrder, signedRequestOrder); + assertThatNoException().isThrownBy(() -> signerService.estimateGas(IEXEC_HUB_ADDRESS, matchOrdersTxData)); + } + + static Stream provideValidTags() { + return Stream.of( + Arguments.of("0x1", "0x1", "0x1", "0x1"), + Arguments.of("0x1", "0x1", "0x0", "0x1"), + Arguments.of("0x1", "0x0", "0x1", "0x1"), + Arguments.of("0x1", "0x0", "0x0", "0x1"), + Arguments.of("0x0", "0x0", "0x0", "0x1")); + } + + @ParameterizedTest + @MethodSource("provideInvalidTags") + void shouldNotMatchOrdersWithInvalidTags(final String appTag, final String datasetTag, final String requestTag, final String workerpoolTag) throws IOException { + final Map deployedAddresses = iexecHubService.deployAssets(); + final AppOrder signedAppOrder = ordersService.buildSignedAppOrder(deployedAddresses.get("app"), formatTag(appTag)); + final DatasetOrder signedDatasetOrder = ordersService.buildSignedDatasetOrder(deployedAddresses.get("dataset"), formatTag(datasetTag)); + final WorkerpoolOrder signedWorkerpoolOrder = ordersService.buildSignedWorkerpoolOrder(deployedAddresses.get("workerpool"), BigInteger.ONE, formatTag(workerpoolTag)); + final RequestOrder signedRequestOrder = ordersService.buildSignedRequestOrder( + signedAppOrder, signedDatasetOrder, signedWorkerpoolOrder, BigInteger.ONE, formatTag(requestTag)); + + final String matchOrdersTxData = MatchOrdersDataEncoder.encode(signedAppOrder, signedDatasetOrder, signedWorkerpoolOrder, signedRequestOrder); + assertThatThrownBy(() -> signerService.estimateGas(IEXEC_HUB_ADDRESS, matchOrdersTxData)) + .isInstanceOf(JsonRpcError.class) + .hasMessage("iExecV5-matchOrders-0x07"); + } + + private String formatTag(final String hexTag) { + return Numeric.toHexStringWithPrefixZeroPadded(Numeric.toBigInt(hexTag), 64); + } + + static Stream provideInvalidTags() { + return Stream.of( + Arguments.of("0x0", "0x0", "0x1", "0x1"), + Arguments.of("0x0", "0x1", "0x0", "0x1")); + } + // region utils private DatasetOrder.DatasetOrderBuilder getValidOrderBuilder(final String datasetAddress) { return DatasetOrder.builder() @@ -257,8 +310,7 @@ private Map getInvalidOrders(final String datasetAddress) Map.entry(getValidOrderBuilder(datasetAddress).apprestrict(IEXEC_HUB_ADDRESS).build(), "App restriction not satisfied"), Map.entry(getValidOrderBuilder(datasetAddress).workerpoolrestrict(IEXEC_HUB_ADDRESS).build(), "Workerpool restriction not satisfied"), Map.entry(getValidOrderBuilder(datasetAddress).requesterrestrict(IEXEC_HUB_ADDRESS).build(), "Requester restriction not satisfied"), - Map.entry(getValidOrderBuilder(datasetAddress).tag(OrderTag.TEE_GRAMINE.getValue()).build(), "Tag compatibility not satisfied"), - Map.entry(getValidOrderBuilder(datasetAddress).tag(OrderTag.TEE_TDX.getValue()).build(), "Tag compatibility not satisfied") + Map.entry(getValidOrderBuilder(datasetAddress).tag("0xFF").build(), "Tag compatibility not satisfied") ); } diff --git a/src/test/java/com/iexec/commons/poco/itest/OrdersService.java b/src/test/java/com/iexec/commons/poco/itest/OrdersService.java index e82b18e..2904dd6 100644 --- a/src/test/java/com/iexec/commons/poco/itest/OrdersService.java +++ b/src/test/java/com/iexec/commons/poco/itest/OrdersService.java @@ -47,12 +47,16 @@ public OrdersService(final EIP712Domain domain, final SignerService signerServic this.signerService = signerService; } - public AppOrder buildSignedAppOrder(String appAddress) { + public AppOrder buildSignedAppOrder(final String appAddress) { + return buildSignedAppOrder(appAddress, OrderTag.TEE_SCONE.getValue()); + } + + public AppOrder buildSignedAppOrder(final String appAddress, final String tag) { final AppOrder appOrder = AppOrder.builder() .app(appAddress) .appprice(BigInteger.ZERO) .volume(BigInteger.ONE) - .tag(OrderTag.TEE_SCONE.getValue()) + .tag(tag) .datasetrestrict(BytesUtils.EMPTY_ADDRESS) .workerpoolrestrict(BytesUtils.EMPTY_ADDRESS) .requesterrestrict(BytesUtils.EMPTY_ADDRESS) @@ -61,12 +65,16 @@ public AppOrder buildSignedAppOrder(String appAddress) { return (AppOrder) signerService.signOrderForDomain(appOrder, domain); } - public DatasetOrder buildSignedDatasetOrder(String datasetAddress) { + public DatasetOrder buildSignedDatasetOrder(final String datasetAddress) { + return buildSignedDatasetOrder(datasetAddress, OrderTag.TEE_SCONE.getValue()); + } + + public DatasetOrder buildSignedDatasetOrder(final String datasetAddress, final String tag) { final DatasetOrder datasetOrder = DatasetOrder.builder() .dataset(datasetAddress) .datasetprice(BigInteger.ZERO) .volume(BigInteger.ONE) - .tag(OrderTag.TEE_SCONE.getValue()) + .tag(tag) .apprestrict(BytesUtils.EMPTY_ADDRESS) .workerpoolrestrict(BytesUtils.EMPTY_ADDRESS) .requesterrestrict(BytesUtils.EMPTY_ADDRESS) @@ -75,12 +83,16 @@ public DatasetOrder buildSignedDatasetOrder(String datasetAddress) { return (DatasetOrder) signerService.signOrderForDomain(datasetOrder, domain); } - public WorkerpoolOrder buildSignedWorkerpoolOrder(String workerpoolAddress, BigInteger trust) { + public WorkerpoolOrder buildSignedWorkerpoolOrder(final String workerpoolAddress, final BigInteger trust) { + return buildSignedWorkerpoolOrder(workerpoolAddress, trust, OrderTag.TEE_SCONE.getValue()); + } + + public WorkerpoolOrder buildSignedWorkerpoolOrder(final String workerpoolAddress, final BigInteger trust, final String tag) { final WorkerpoolOrder workerpoolOrder = WorkerpoolOrder.builder() .workerpool(workerpoolAddress) .workerpoolprice(BigInteger.ZERO) .volume(BigInteger.ONE) - .tag(OrderTag.TEE_SCONE.getValue()) + .tag(tag) .category(BigInteger.ZERO) .trust(trust) .apprestrict(BytesUtils.EMPTY_ADDRESS) @@ -91,7 +103,13 @@ public WorkerpoolOrder buildSignedWorkerpoolOrder(String workerpoolAddress, BigI return (WorkerpoolOrder) signerService.signOrderForDomain(workerpoolOrder, domain); } - public RequestOrder buildSignedRequestOrder(AppOrder appOrder, DatasetOrder datasetOrder, WorkerpoolOrder workerpoolOrder, BigInteger trust) { + public RequestOrder buildSignedRequestOrder( + final AppOrder appOrder, final DatasetOrder datasetOrder, final WorkerpoolOrder workerpoolOrder, final BigInteger trust) { + return buildSignedRequestOrder(appOrder, datasetOrder, workerpoolOrder, trust, OrderTag.TEE_SCONE.getValue()); + } + + public RequestOrder buildSignedRequestOrder( + final AppOrder appOrder, final DatasetOrder datasetOrder, final WorkerpoolOrder workerpoolOrder, final BigInteger trust, final String tag) { final TreeMap iexecSecrets = new TreeMap<>(Map.of( "1", "first-secret", "2", "second-secret", @@ -111,7 +129,7 @@ public RequestOrder buildSignedRequestOrder(AppOrder appOrder, DatasetOrder data .workerpoolmaxprice(workerpoolOrder.getWorkerpoolprice()) .requester(signerService.getAddress()) .volume(BigInteger.ONE) - .tag(OrderTag.TEE_SCONE.getValue()) + .tag(tag) .category(BigInteger.ZERO) .trust(trust) .beneficiary(signerService.getAddress()) diff --git a/src/test/java/com/iexec/commons/poco/itest/Web3jTestService.java b/src/test/java/com/iexec/commons/poco/itest/Web3jTestService.java index 2b3be44..195a7c5 100644 --- a/src/test/java/com/iexec/commons/poco/itest/Web3jTestService.java +++ b/src/test/java/com/iexec/commons/poco/itest/Web3jTestService.java @@ -42,7 +42,7 @@ public Web3jTestService(String chainNodeAddress) { } public Web3jTestService(String chainNodeAddress, float gasPriceMultiplier, long gasPriceCap) { - this(chainNodeAddress, gasPriceMultiplier, gasPriceCap, true); + this(chainNodeAddress, gasPriceMultiplier, gasPriceCap, false); } public Web3jTestService(String chainNodeAddress, float gasPriceMultiplier, long gasPriceCap, boolean isSidechain) { From 93dce3a99a806c87d068407e99486a59ca83d2ea Mon Sep 17 00:00:00 2001 From: Jeremy Bernard Date: Mon, 15 Dec 2025 18:24:46 +0100 Subject: [PATCH 2/2] test: remove unnecessary formatting --- .../commons/poco/itest/MatchOrdersTests.java | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/src/test/java/com/iexec/commons/poco/itest/MatchOrdersTests.java b/src/test/java/com/iexec/commons/poco/itest/MatchOrdersTests.java index 434d571..e540ec5 100644 --- a/src/test/java/com/iexec/commons/poco/itest/MatchOrdersTests.java +++ b/src/test/java/com/iexec/commons/poco/itest/MatchOrdersTests.java @@ -40,7 +40,6 @@ import org.web3j.crypto.exception.CipherException; import org.web3j.protocol.core.methods.response.TransactionReceipt; import org.web3j.protocol.exceptions.JsonRpcError; -import org.web3j.utils.Numeric; import java.io.File; import java.io.IOException; @@ -245,11 +244,11 @@ void shouldMatchOrdersWithoutDataset() throws IOException { @MethodSource("provideValidTags") void shouldMatchOrdersWithValidTags(final String appTag, final String datasetTag, final String requestTag, final String workerpoolTag) throws IOException { final Map deployedAddresses = iexecHubService.deployAssets(); - final AppOrder signedAppOrder = ordersService.buildSignedAppOrder(deployedAddresses.get("app"), formatTag(appTag)); - final DatasetOrder signedDatasetOrder = ordersService.buildSignedDatasetOrder(deployedAddresses.get("dataset"), formatTag(datasetTag)); - final WorkerpoolOrder signedWorkerpoolOrder = ordersService.buildSignedWorkerpoolOrder(deployedAddresses.get("workerpool"), BigInteger.ONE, formatTag(workerpoolTag)); + final AppOrder signedAppOrder = ordersService.buildSignedAppOrder(deployedAddresses.get("app"), appTag); + final DatasetOrder signedDatasetOrder = ordersService.buildSignedDatasetOrder(deployedAddresses.get("dataset"), datasetTag); + final WorkerpoolOrder signedWorkerpoolOrder = ordersService.buildSignedWorkerpoolOrder(deployedAddresses.get("workerpool"), BigInteger.ONE, workerpoolTag); final RequestOrder signedRequestOrder = ordersService.buildSignedRequestOrder( - signedAppOrder, signedDatasetOrder, signedWorkerpoolOrder, BigInteger.ONE, formatTag(requestTag)); + signedAppOrder, signedDatasetOrder, signedWorkerpoolOrder, BigInteger.ONE, requestTag); final String matchOrdersTxData = MatchOrdersDataEncoder.encode(signedAppOrder, signedDatasetOrder, signedWorkerpoolOrder, signedRequestOrder); assertThatNoException().isThrownBy(() -> signerService.estimateGas(IEXEC_HUB_ADDRESS, matchOrdersTxData)); @@ -268,11 +267,11 @@ static Stream provideValidTags() { @MethodSource("provideInvalidTags") void shouldNotMatchOrdersWithInvalidTags(final String appTag, final String datasetTag, final String requestTag, final String workerpoolTag) throws IOException { final Map deployedAddresses = iexecHubService.deployAssets(); - final AppOrder signedAppOrder = ordersService.buildSignedAppOrder(deployedAddresses.get("app"), formatTag(appTag)); - final DatasetOrder signedDatasetOrder = ordersService.buildSignedDatasetOrder(deployedAddresses.get("dataset"), formatTag(datasetTag)); - final WorkerpoolOrder signedWorkerpoolOrder = ordersService.buildSignedWorkerpoolOrder(deployedAddresses.get("workerpool"), BigInteger.ONE, formatTag(workerpoolTag)); + final AppOrder signedAppOrder = ordersService.buildSignedAppOrder(deployedAddresses.get("app"), appTag); + final DatasetOrder signedDatasetOrder = ordersService.buildSignedDatasetOrder(deployedAddresses.get("dataset"), datasetTag); + final WorkerpoolOrder signedWorkerpoolOrder = ordersService.buildSignedWorkerpoolOrder(deployedAddresses.get("workerpool"), BigInteger.ONE, workerpoolTag); final RequestOrder signedRequestOrder = ordersService.buildSignedRequestOrder( - signedAppOrder, signedDatasetOrder, signedWorkerpoolOrder, BigInteger.ONE, formatTag(requestTag)); + signedAppOrder, signedDatasetOrder, signedWorkerpoolOrder, BigInteger.ONE, requestTag); final String matchOrdersTxData = MatchOrdersDataEncoder.encode(signedAppOrder, signedDatasetOrder, signedWorkerpoolOrder, signedRequestOrder); assertThatThrownBy(() -> signerService.estimateGas(IEXEC_HUB_ADDRESS, matchOrdersTxData)) @@ -280,10 +279,6 @@ void shouldNotMatchOrdersWithInvalidTags(final String appTag, final String datas .hasMessage("iExecV5-matchOrders-0x07"); } - private String formatTag(final String hexTag) { - return Numeric.toHexStringWithPrefixZeroPadded(Numeric.toBigInt(hexTag), 64); - } - static Stream provideInvalidTags() { return Stream.of( Arguments.of("0x0", "0x0", "0x1", "0x1"),