Skip to content

Commit a1f5569

Browse files
authored
Merge pull request #88 from iExecBlockchainComputing/bugfix/test-match-orders
Update implementation to test `BrokerService#fireMatchOrders`
2 parents 16be941 + 54fc852 commit a1f5569

File tree

3 files changed

+45
-14
lines changed

3 files changed

+45
-14
lines changed

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ All notable changes to this project will be documented in this file.
77
### New Features
88
- Enable Prometheus actuator. (#79)
99
- Rework `QueueService` with a thread pool based on a `PriorityBlockingQueue`. (#84)
10-
- Do not use `broker` to match ordes on chain. (#87)
10+
- Do not use `broker` to match ordes on chain. (#87 #88)
1111
### Bug Fixes
1212
- Fix security rule to access Swagger API. (#79)
1313
### Dependency Upgrades

src/main/java/com/iexec/blockchain/broker/BrokerService.java

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import com.iexec.blockchain.tool.IexecHubService;
2020
import com.iexec.common.sdk.broker.BrokerOrder;
2121
import com.iexec.commons.poco.chain.ChainAccount;
22-
import com.iexec.commons.poco.contract.generated.IexecHubContract;
2322
import com.iexec.commons.poco.order.AppOrder;
2423
import com.iexec.commons.poco.order.DatasetOrder;
2524
import com.iexec.commons.poco.order.RequestOrder;
@@ -29,7 +28,10 @@
2928
import org.apache.commons.lang3.StringUtils;
3029
import org.springframework.context.annotation.Profile;
3130
import org.springframework.stereotype.Service;
31+
import org.web3j.crypto.Hash;
32+
import org.web3j.protocol.core.methods.response.Log;
3233
import org.web3j.protocol.core.methods.response.TransactionReceipt;
34+
import org.web3j.utils.Numeric;
3335

3436
import java.math.BigInteger;
3537
import java.text.MessageFormat;
@@ -43,6 +45,8 @@
4345
@Profile("itest")
4446
public class BrokerService {
4547

48+
static final String SCHEDULER_NOTICE = Hash.sha3String("SchedulerNotice(address,bytes32)");
49+
4650
private final IexecHubService iexecHubService;
4751

4852

@@ -130,7 +134,7 @@ Optional<String> fireMatchOrders(
130134
WorkerpoolOrder workerpoolOrder,
131135
RequestOrder requestOrder) {
132136
try {
133-
TransactionReceipt receipt = iexecHubService.
137+
final TransactionReceipt receipt = iexecHubService.
134138
getHubContract()
135139
.matchOrders(
136140
appOrder.toHubContract(),
@@ -141,17 +145,18 @@ Optional<String> fireMatchOrders(
141145
log.info("block {}, hash {}, status {}", receipt.getBlockNumber(), receipt.getTransactionHash(), receipt.getStatus());
142146
log.info("logs count {}", receipt.getLogs().size());
143147

144-
String workerpoolAddress = workerpoolOrder.getWorkerpool();
145-
List<String> events = IexecHubContract.getSchedulerNoticeEvents(receipt)
146-
.stream()
147-
.filter(event -> workerpoolAddress.equals(event.workerpool))
148-
.map(event -> BytesUtils.bytesToString(event.dealid))
148+
final String workerpoolAddress = Numeric.toHexStringWithPrefixZeroPadded(
149+
Numeric.toBigInt(workerpoolOrder.getWorkerpool()), 64);
150+
final List<String> expectedTopics = List.of(SCHEDULER_NOTICE, workerpoolAddress);
151+
List<String> events = receipt.getLogs().stream()
152+
.filter(log -> expectedTopics.equals(log.getTopics()))
153+
.map(Log::getData)
149154
.collect(Collectors.toList());
150-
log.info("events count {}", events.size());
155+
log.info("logs {}", events);
151156
if (events.size() != 1) {
152157
throw new IllegalStateException("A single deal should have been created, not " + events.size());
153158
}
154-
String dealId = events.get(0);
159+
final String dealId = events.get(0);
155160
log.info("Matched orders [chainDealId:{}, tx:{}]", dealId, receipt.getTransactionHash());
156161
return Optional.of(dealId);
157162
} catch (Exception e) {

src/test/java/com/iexec/blockchain/broker/BrokerServiceTests.java

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,17 @@
3333
import org.web3j.crypto.ECKeyPair;
3434
import org.web3j.crypto.Keys;
3535
import org.web3j.protocol.core.RemoteFunctionCall;
36+
import org.web3j.protocol.core.methods.response.Log;
3637
import org.web3j.protocol.core.methods.response.TransactionReceipt;
38+
import org.web3j.utils.Numeric;
3739

3840
import java.io.IOException;
3941
import java.math.BigInteger;
4042
import java.text.MessageFormat;
43+
import java.util.List;
4144
import java.util.Optional;
4245

46+
import static com.iexec.blockchain.broker.BrokerService.SCHEDULER_NOTICE;
4347
import static org.assertj.core.api.Assertions.assertThat;
4448
import static org.assertj.core.api.Assertions.assertThatThrownBy;
4549
import static org.mockito.ArgumentMatchers.any;
@@ -426,8 +430,6 @@ void shouldFailToMatchOrdersWithDataset() throws Exception {
426430
when(remoteCall.send()).thenThrow(IOException.class);
427431
assertThat(brokerService.fireMatchOrders(appOrder, datasetOrder,workerpoolOrder, requestOrder))
428432
.isEmpty();
429-
assertThat(brokerService.fireMatchOrders(appOrder, datasetOrder, workerpoolOrder, requestOrder))
430-
.isEmpty();
431433
}
432434

433435
@Test
@@ -443,10 +445,34 @@ void shouldFailToMatchOrdersWithoutDataset() throws Exception {
443445
when(remoteCall.send()).thenThrow(IOException.class);
444446
assertThat(brokerService.fireMatchOrders(appOrder, datasetOrder,workerpoolOrder, requestOrder))
445447
.isEmpty();
446-
assertThat(brokerService.fireMatchOrders(appOrder, datasetOrder, workerpoolOrder, requestOrder))
447-
.isEmpty();
448448
}
449449

450+
@Test
451+
void shouldMatchOrdersWithDataset() throws Exception {
452+
String dealId = "dealId";
453+
AppOrder appOrder = generateAppOrder();
454+
DatasetOrder datasetOrder = generateDatasetOrder(true);
455+
WorkerpoolOrder workerpoolOrder = generateWorkerpoolOrder();
456+
RequestOrder requestOrder = generateRequestOrder(
457+
appOrder, datasetOrder, workerpoolOrder);
458+
IexecHubContract iexecHubContract = mock(IexecHubContract.class);
459+
when(iexecHubService.getHubContract()).thenReturn(iexecHubContract);
460+
when(iexecHubContract.matchOrders(any(), any(), any(), any())).thenReturn(remoteCall);
461+
String workerpoolAddress = Numeric.toHexStringWithPrefixZeroPadded(
462+
Numeric.toBigInt(workerpoolOrder.getWorkerpool()), 64);
463+
Log web3Log = new Log();
464+
web3Log.setData(dealId);
465+
web3Log.setTopics(List.of(SCHEDULER_NOTICE, workerpoolAddress));
466+
TransactionReceipt receipt = new TransactionReceipt();
467+
receipt.setTransactionHash("txHash");
468+
receipt.setBlockNumber("0x1");
469+
receipt.setStatus("1");
470+
receipt.setLogs(List.of(web3Log));
471+
when(remoteCall.send()).thenReturn(receipt);
472+
assertThat(brokerService.fireMatchOrders(appOrder, datasetOrder,workerpoolOrder, requestOrder))
473+
.isNotEmpty()
474+
.contains(dealId);
475+
}
450476
//endregion
451477

452478
//region hasRequesterAcceptedPrices

0 commit comments

Comments
 (0)