Skip to content

Commit 910965c

Browse files
authored
test: Scope shard/realm first to target network, system properties (#18963)
Signed-off-by: Matt Hess <[email protected]>
1 parent 529b2fe commit 910965c

21 files changed

+294
-113
lines changed

hedera-node/test-clients/build.gradle.kts

+6-1
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,12 @@ val prCheckNetSizeOverrides =
122122
)
123123

124124
tasks {
125-
prCheckTags.forEach { (taskName, _) -> register(taskName) { dependsOn("testSubprocess") } }
125+
prCheckTags.forEach { (taskName, _) ->
126+
register(taskName) {
127+
getByName(taskName).group = "hapi-test"
128+
dependsOn("testSubprocess")
129+
}
130+
}
126131
remoteCheckTags.forEach { (taskName, _) -> register(taskName) { dependsOn("testRemote") } }
127132
}
128133

hedera-node/test-clients/src/main/java/com/hedera/services/bdd/junit/SharedNetworkLauncherSessionListener.java

+17-5
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33

44
import static com.hedera.services.bdd.junit.extensions.NetworkTargetingExtension.REPEATABLE_KEY_GENERATOR;
55
import static com.hedera.services.bdd.junit.extensions.NetworkTargetingExtension.SHARED_NETWORK;
6+
import static com.hedera.services.bdd.spec.HapiPropertySourceStaticInitializer.REALM;
7+
import static com.hedera.services.bdd.spec.HapiPropertySourceStaticInitializer.SHARD;
68
import static java.util.Objects.requireNonNull;
79

810
import com.hedera.services.bdd.junit.hedera.BlockNodeMode;
@@ -61,16 +63,16 @@ public void testPlanExecutionStarted(@NonNull final TestPlan testPlan) {
6163
embedding = embeddingMode();
6264
final HederaNetwork network =
6365
switch (embedding) {
64-
// Embedding is not applicable for a subprocess network
66+
// Embedding is not applicable for a subprocess network
6567
case NA -> {
6668
final boolean isRemote = Optional.ofNullable(System.getProperty("hapi.spec.remote"))
6769
.map(Boolean::parseBoolean)
6870
.orElse(false);
6971
yield isRemote ? sharedRemoteNetworkIfRequested() : sharedSubProcessNetwork();
7072
}
71-
// For the default Test task, we need to run some tests in concurrent embedded mode and
72-
// some in repeatable embedded mode, depending on the value of their @TargetEmbeddedMode
73-
// annotation; this PER_CLASS value supports that requirement
73+
// For the default Test task, we need to run some tests in concurrent embedded mode and
74+
// some in repeatable embedded mode, depending on the value of their @TargetEmbeddedMode
75+
// annotation; this PER_CLASS value supports that requirement
7476
case PER_CLASS -> null;
7577
case CONCURRENT -> EmbeddedNetwork.newSharedNetwork(EmbeddedMode.CONCURRENT);
7678
case REPEATABLE -> EmbeddedNetwork.newSharedNetwork(EmbeddedMode.REPEATABLE);
@@ -119,11 +121,20 @@ private HederaNetwork sharedSubProcessNetwork() {
119121
final int networkSize = Optional.ofNullable(System.getProperty("hapi.spec.network.size"))
120122
.map(Integer::parseInt)
121123
.orElse(CLASSIC_HAPI_TEST_NETWORK_SIZE);
124+
125+
final long shard = Optional.ofNullable(System.getProperty("hapi.spec.default.shard"))
126+
.map(Long::parseLong)
127+
.orElse((long) SHARD);
128+
final long realm = Optional.ofNullable(System.getProperty("hapi.spec.default.realm"))
129+
.map(Long::parseLong)
130+
.orElse(REALM);
131+
122132
final var initialPortProperty = System.getProperty("hapi.spec.initial.port");
123133
if (!initialPortProperty.isBlank()) {
124134
final var initialPort = Integer.parseInt(initialPortProperty);
125135
SubProcessNetwork.initializeNextPortsForNetwork(networkSize, initialPort);
126136
}
137+
127138
final var prepareUpgradeOffsetsProperty = System.getProperty("hapi.spec.prepareUpgradeOffsets");
128139
if (prepareUpgradeOffsetsProperty != null) {
129140
final List<Duration> offsets = Arrays.stream(prepareUpgradeOffsetsProperty.split(","))
@@ -135,7 +146,8 @@ private HederaNetwork sharedSubProcessNetwork() {
135146
HapiSpec.doDelayedPrepareUpgrades(offsets);
136147
}
137148
}
138-
SubProcessNetwork subProcessNetwork = (SubProcessNetwork) SubProcessNetwork.newSharedNetwork(networkSize);
149+
SubProcessNetwork subProcessNetwork =
150+
(SubProcessNetwork) SubProcessNetwork.newSharedNetwork(networkSize, shard, realm);
139151

140152
// Check for the blocknode mode system property
141153
String blockNodeModeProperty = System.getProperty("hapi.spec.blocknode.mode");

hedera-node/test-clients/src/main/java/com/hedera/services/bdd/junit/hedera/subprocess/SubProcessNetwork.java

+18-5
Original file line numberDiff line numberDiff line change
@@ -229,11 +229,11 @@ private SubProcessNetwork(@NonNull final String networkName, @NonNull final List
229229
* @param size the number of nodes in the network
230230
* @return the shared network
231231
*/
232-
public static synchronized HederaNetwork newSharedNetwork(final int size) {
232+
public static synchronized HederaNetwork newSharedNetwork(final int size, final long shard, final long realm) {
233233
if (NetworkTargetingExtension.SHARED_NETWORK.get() != null) {
234234
throw new UnsupportedOperationException("Only one shared network allowed per launcher session");
235235
}
236-
final var sharedNetwork = liveNetwork(SHARED_NETWORK_NAME, size);
236+
final var sharedNetwork = liveNetwork(SHARED_NETWORK_NAME, size, shard, realm);
237237
NetworkTargetingExtension.SHARED_NETWORK.set(sharedNetwork);
238238
return sharedNetwork;
239239
}
@@ -616,7 +616,9 @@ public void addNode(final long nodeId) {
616616
true,
617617
nextInternalGossipPort + (int) nodeId * 2,
618618
nextExternalGossipPort + (int) nodeId * 2,
619-
nextPrometheusPort + (int) nodeId),
619+
nextPrometheusPort + (int) nodeId,
620+
shardFrom(nodes),
621+
realmFrom(nodes)),
620622
GRPC_PINGER,
621623
PROMETHEUS_CLIENT);
622624
final var accountId = pendingNodeAccounts.remove(nodeId);
@@ -667,7 +669,8 @@ protected HapiPropertySource networkOverrides() {
667669
* @param size the number of nodes in the network
668670
* @return the network
669671
*/
670-
private static synchronized HederaNetwork liveNetwork(@NonNull final String name, final int size) {
672+
private static synchronized HederaNetwork liveNetwork(
673+
@NonNull final String name, final int size, final long shard, final long realm) {
671674
if (!nextPortsInitialized) {
672675
initializeNextPortsForNetwork(size);
673676
}
@@ -685,7 +688,9 @@ private static synchronized HederaNetwork liveNetwork(@NonNull final String name
685688
true,
686689
nextInternalGossipPort,
687690
nextExternalGossipPort,
688-
nextPrometheusPort),
691+
nextPrometheusPort,
692+
shard,
693+
realm),
689694
GRPC_PINGER,
690695
PROMETHEUS_CLIENT))
691696
.toList());
@@ -844,4 +849,12 @@ private int findAvailablePort() {
844849
}
845850
throw new RuntimeException("Could not find available port after 100 attempts");
846851
}
852+
853+
public static long shardFrom(final List<HederaNode> nodes) {
854+
return requireNonNull(nodes.getFirst()).getAccountId().shardNum();
855+
}
856+
857+
public static long realmFrom(final List<HederaNode> nodes) {
858+
return requireNonNull(nodes.getFirst()).getAccountId().realmNum();
859+
}
847860
}

hedera-node/test-clients/src/main/java/com/hedera/services/bdd/junit/hedera/utils/AddressBookUtils.java

+9-6
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
package com.hedera.services.bdd.junit.hedera.utils;
33

44
import static com.hedera.services.bdd.junit.hedera.utils.WorkingDirUtils.workingDirFor;
5-
import static com.hedera.services.bdd.spec.HapiPropertySourceStaticInitializer.SHARD_AND_REALM;
65
import static java.util.Objects.requireNonNull;
76
import static java.util.stream.Collectors.toMap;
87

@@ -115,6 +114,9 @@ public static String configTxtForLocal(
115114
.append("app, HederaNode.jar\n\n#The following nodes make up this network\n");
116115
var maxNodeId = 0L;
117116
for (final var node : nodes) {
117+
final var accountId = node.getAccountId();
118+
final var fqAccId =
119+
String.format("%d.%d.%d", accountId.shardNum(), accountId.realmNum(), accountId.accountNum());
118120
sb.append("address, ")
119121
.append(node.getNodeId())
120122
.append(", ")
@@ -129,8 +131,7 @@ public static String configTxtForLocal(
129131
.append(", 127.0.0.1, ")
130132
.append(nextExternalGossipPort + (node.getNodeId() * 2))
131133
.append(", ")
132-
.append(SHARD_AND_REALM)
133-
.append(node.getAccountId().accountNumOrThrow())
134+
.append(fqAccId)
134135
.append('\n');
135136
maxNodeId = Math.max(node.getNodeId(), maxNodeId);
136137
}
@@ -163,15 +164,17 @@ public static NodeMetadata classicMetadataFor(
163164
final boolean nextNodeOperatorPortEnabled,
164165
final int nextGossipPort,
165166
final int nextGossipTlsPort,
166-
final int nextPrometheusPort) {
167+
final int nextPrometheusPort,
168+
final long shard,
169+
final long realm) {
167170
requireNonNull(host);
168171
requireNonNull(networkName);
169172
return new NodeMetadata(
170173
nodeId,
171174
CLASSIC_NODE_NAMES[nodeId],
172175
AccountID.newBuilder()
173-
.shardNum(Long.parseLong(SHARD))
174-
.realmNum(Long.parseLong(REALM))
176+
.shardNum(shard)
177+
.realmNum(realm)
175178
.accountNum(CLASSIC_FIRST_NODE_ACCOUNT_NUM + nodeId)
176179
.build(),
177180
host,

hedera-node/test-clients/src/main/java/com/hedera/services/bdd/junit/support/RecordStreamValidator.java

+4
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,8 @@ default void validateFiles(List<RecordStreamFile> files) {
2424
default void validateRecordsAndSidecars(List<RecordWithSidecars> records) {
2525
// No-op
2626
}
27+
28+
default void validateRecordsAndSidecars(List<RecordWithSidecars> records, long shard, long realm) {
29+
// No-op
30+
}
2731
}

hedera-node/test-clients/src/main/java/com/hedera/services/bdd/junit/support/validators/BalanceReconciliationValidator.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,12 @@ public class BalanceReconciliationValidator implements RecordStreamValidator {
3232

3333
@Override
3434
@SuppressWarnings("java:S106")
35-
public void validateRecordsAndSidecars(final List<RecordWithSidecars> recordsWithSidecars) {
35+
public void validateRecordsAndSidecars(final List<RecordWithSidecars> recordsWithSidecars, long shard, long realm) {
3636
getExpectedBalanceFrom(recordsWithSidecars);
3737
System.out.println("Expected balances: " + expectedBalances);
3838

3939
final var validationSpecs = TestBase.extractContextualizedSpecsFrom(
40-
List.of(() -> new BalanceValidation(expectedBalances, accountClassifier)),
40+
List.of(() -> new BalanceValidation(expectedBalances, accountClassifier, shard, realm)),
4141
TestBase::contextualizedSpecsFromConcurrent);
4242
concurrentExecutionOf(validationSpecs);
4343
}

hedera-node/test-clients/src/main/java/com/hedera/services/bdd/spec/HapiPropertySource.java

+49-8
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@
3838
import java.util.Arrays;
3939
import java.util.List;
4040
import java.util.Map;
41+
import java.util.Objects;
42+
import java.util.Optional;
4143
import java.util.concurrent.TimeUnit;
4244
import java.util.stream.Stream;
4345
import org.hiero.base.utility.CommonUtils;
@@ -93,7 +95,7 @@ default HapiSpec.UTF8Mode getUTF8Mode(String property) {
9395

9496
default FileID getFile(String property) {
9597
try {
96-
return asFile(get("default.shard"), get("default.realm"), get(property));
98+
return asFile(getShard(), getRealm(), Long.parseLong(get(property)));
9799
} catch (Exception ignore) {
98100
}
99101
return FileID.getDefaultInstance();
@@ -111,7 +113,7 @@ default AccountID getAccount(String property) {
111113
}
112114

113115
try {
114-
return asAccount(get("default.shard"), get("default.realm"), get(property));
116+
return asAccount(getShard(), getRealm(), Long.parseLong(value));
115117
} catch (Exception ignore) {
116118
}
117119

@@ -145,14 +147,28 @@ default ContractID getContract(String property) {
145147
return ContractID.getDefaultInstance();
146148
}
147149

150+
@Deprecated
148151
default RealmID getRealm(String property) {
149152
return RealmID.newBuilder().setRealmNum(Long.parseLong(get(property))).build();
150153
}
151154

155+
default long getRealm() {
156+
return Optional.ofNullable(get("hapi.spec.default.realm"))
157+
.map(Long::parseLong)
158+
.orElse(realm);
159+
}
160+
161+
@Deprecated
152162
default ShardID getShard(String property) {
153163
return ShardID.newBuilder().setShardNum(Long.parseLong(get(property))).build();
154164
}
155165

166+
default long getShard() {
167+
return Optional.ofNullable(get("hapi.spec.default.shard"))
168+
.map(Long::parseLong)
169+
.orElse((long) shard);
170+
}
171+
156172
default TimeUnit getTimeUnit(String property) {
157173
return TimeUnit.valueOf(get(property));
158174
}
@@ -221,6 +237,7 @@ default HapiSpec.SpecStatus getSpecStatus(String property) {
221237

222238
static HapiPropertySource[] asSources(Object... sources) {
223239
return Stream.of(sources)
240+
.filter(Objects::nonNull)
224241
.map(s -> (s instanceof HapiPropertySource)
225242
? s
226243
: ((s instanceof Map) ? new MapPropertySource((Map) s) : new JutilPropertySource((String) s)))
@@ -250,10 +267,14 @@ static AccountID asAccount(String v) {
250267
}
251268

252269
static AccountID asAccount(String shard, String realm, String num) {
270+
return asAccount(Long.parseLong(shard), Long.parseLong(realm), Long.parseLong(num));
271+
}
272+
273+
static AccountID asAccount(long shard, long realm, long num) {
253274
return AccountID.newBuilder()
254-
.setShardNum(Long.parseLong(shard))
255-
.setRealmNum(Long.parseLong(realm))
256-
.setAccountNum(Long.parseLong(num))
275+
.setShardNum(shard)
276+
.setRealmNum(realm)
277+
.setAccountNum(num)
257278
.build();
258279
}
259280

@@ -266,10 +287,14 @@ static ContractID asContract(String shard, String realm, String num) {
266287
}
267288

268289
static FileID asFile(String shard, String realm, String num) {
290+
return asFile(Long.parseLong(shard), Long.parseLong(realm), Long.parseLong(num));
291+
}
292+
293+
static FileID asFile(long shard, long realm, long num) {
269294
return FileID.newBuilder()
270-
.setShardNum(Long.parseLong(shard))
271-
.setRealmNum(Long.parseLong(realm))
272-
.setFileNum(Long.parseLong(num))
295+
.setShardNum(shard)
296+
.setRealmNum(realm)
297+
.setFileNum(num)
273298
.build();
274299
}
275300

@@ -454,6 +479,14 @@ static long[] asDotDelimitedLongArray(String s) {
454479
return Stream.of(parts).mapToLong(Long::valueOf).toArray();
455480
}
456481

482+
static ShardID asShard(long v) {
483+
return ShardID.newBuilder().setShardNum(v).build();
484+
}
485+
486+
static RealmID asRealm(long v) {
487+
return RealmID.newBuilder().setRealmNum(v).build();
488+
}
489+
457490
static byte[] asSolidityAddress(final AccountID accountId) {
458491
return asSolidityAddress((int) accountId.getShardNum(), accountId.getRealmNum(), accountId.getAccountNum());
459492
}
@@ -529,6 +562,14 @@ static String literalIdFromHexedMirrorAddress(final String hexedEvm) {
529562
.build());
530563
}
531564

565+
static String asEntityString(final long shard, final long realm, final long num) {
566+
return String.format(ENTITY_STRING, shard, realm, num);
567+
}
568+
569+
static String asEntityString(final long shard, final long realm, final String num) {
570+
return String.format("%d.%d.%s", shard, realm, num);
571+
}
572+
532573
static String asEntityString(final long num) {
533574
return String.format(ENTITY_STRING, shard, realm, num);
534575
}

0 commit comments

Comments
 (0)