You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by tk...@apache.org on 2025/10/17 10:10:29 UTC
(ignite-3) 01/01: IGNITE-26752 wip
This is an automated email from the ASF dual-hosted git repository.
tkalkirill pushed a commit to branch ignite-26752
in repository https://gitbox.apache.org/repos/asf/ignite-3.git
commit 99cd4bed6ee7da6d653e8ee7573df6a36c0bcf78
Author: Kirill Tkalenko <tk...@yandex.ru>
AuthorDate: Fri Oct 17 13:10:08 2025 +0300
IGNITE-26752 wip
---
modules/arch-test/build.gradle | 1 +
.../RaftCommandsUnitCompatibilityArchTest.java | 131 +++++++++++++++++++++
.../commands/CmgCommandsCompatibilityTest.java | 9 ++
.../MetastorageCommandsCompatibilityTest.java | 16 +++
.../PartitionCommandsCompatibilityTest.java | 11 ++
.../raft/BaseCommandsCompatibilityTest.java | 12 ++
.../ReplicatorCommandsCompatibilityTest.java | 2 +
.../tx/message/TxCommandsCompatibilityTest.java | 1 +
8 files changed, 183 insertions(+)
diff --git a/modules/arch-test/build.gradle b/modules/arch-test/build.gradle
index 584d8ee2661..995271a6ab1 100644
--- a/modules/arch-test/build.gradle
+++ b/modules/arch-test/build.gradle
@@ -37,6 +37,7 @@ dependencies {
testImplementation libs.archunit.core
testImplementation libs.archunit.junit5
testImplementation testFixtures(project(':ignite-core'))
+ testImplementation testFixtures(project(':ignite-raft'))
}
tasks.withType(Test).configureEach {
diff --git a/modules/arch-test/src/test/java/org/apache/ignite/internal/RaftCommandsUnitCompatibilityArchTest.java b/modules/arch-test/src/test/java/org/apache/ignite/internal/RaftCommandsUnitCompatibilityArchTest.java
new file mode 100644
index 00000000000..41087d9477f
--- /dev/null
+++ b/modules/arch-test/src/test/java/org/apache/ignite/internal/RaftCommandsUnitCompatibilityArchTest.java
@@ -0,0 +1,131 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal;
+
+import static com.tngtech.archunit.base.DescribedPredicate.and;
+import static com.tngtech.archunit.core.domain.properties.CanBeAnnotated.Predicates.annotatedWith;
+import static com.tngtech.archunit.core.importer.ImportOption.Predefined.DO_NOT_INCLUDE_TESTS;
+import static com.tngtech.archunit.core.importer.ImportOption.Predefined.DO_NOT_INCLUDE_TEST_FIXTURES;
+import static com.tngtech.archunit.lang.SimpleConditionEvent.violated;
+import static java.util.stream.Collectors.toSet;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.empty;
+import static org.hamcrest.Matchers.not;
+
+import com.tngtech.archunit.core.domain.JavaClass;
+import com.tngtech.archunit.core.domain.JavaClasses;
+import com.tngtech.archunit.core.domain.JavaMethod;
+import com.tngtech.archunit.core.importer.ClassFileImporter;
+import com.tngtech.archunit.junit.AnalyzeClasses;
+import com.tngtech.archunit.junit.ArchTest;
+import com.tngtech.archunit.lang.ArchCondition;
+import com.tngtech.archunit.lang.ArchRule;
+import com.tngtech.archunit.lang.ConditionEvents;
+import com.tngtech.archunit.lang.syntax.ArchRuleDefinition;
+import java.util.List;
+import java.util.Set;
+import org.apache.ignite.internal.network.annotations.Transferable;
+import org.apache.ignite.internal.raft.BaseCommandsCompatibilityTest;
+import org.apache.ignite.internal.raft.BaseCommandsCompatibilityTest.TestCommand;
+import org.apache.ignite.internal.raft.Command;
+import org.apache.ignite.lang.IgniteTestImportOption;
+import org.apache.ignite.lang.LocationProvider.RootLocationProvider;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+
+/**
+ * Tests that all unit commands are tested for backward compatibility.
+ */
+@AnalyzeClasses(
+ packages = "org.apache.ignite",
+ importOptions = IgniteTestImportOption.class,
+ locations = RootLocationProvider.class
+)
+public class RaftCommandsUnitCompatibilityArchTest {
+ @ArchTest
+ void test(JavaClasses classes) {
+ Set<String> raftCommands = toClassNames(collectRaftCommands());
+
+ assertThat(raftCommands, not(empty()));
+
+ ArchRule archRule = ArchRuleDefinition.classes()
+ .that()
+ .areAssignableTo(BaseCommandsCompatibilityTest.class)
+ .and()
+ .containAnyMethodsThat(and(
+ annotatedWith(TestCommand.class),
+ annotatedWith(Test.class).or(annotatedWith(ParameterizedTest.class))
+ ))
+ .should(shouldContainsTestMethodsForRaftCommands(raftCommands));
+
+ archRule.check(classes);
+
+ assertThat(
+ "There are still some raft commands that haven't been tested; for example, see the successors of "
+ + BaseCommandsCompatibilityTest.class.getName(),
+ raftCommands,
+ empty()
+ );
+ }
+
+ private static ArchCondition<JavaClass> shouldContainsTestMethodsForRaftCommands(Set<String> raftCommands) {
+ return new ArchCondition<>("should contain test methods for raft commands") {
+ @Override
+ public void check(JavaClass item, ConditionEvents events) {
+ System.out.println("Checking class: " + item.getName());
+
+ for (JavaMethod method : item.getMethods()) {
+ if (hasTestMethodTestCommand(method)) {
+ String testedRaftCommandClass = method.getAnnotationOfType(TestCommand.class).value().getName();
+
+ if (!raftCommands.remove(testedRaftCommandClass)) {
+ events.add(violated(
+ method,
+ "another method is already testing the command: " + testedRaftCommandClass
+ ));
+ }
+ }
+ }
+ }
+ };
+ }
+
+ private static Set<JavaClass> collectRaftCommands() {
+ // Uses its own JavaClasses to avoid OutOfMemoryError from a large number of classes.
+ JavaClasses classes = new ClassFileImporter()
+ .withImportOptions(List.of(DO_NOT_INCLUDE_TESTS, DO_NOT_INCLUDE_TEST_FIXTURES))
+ .importPackages("org.apache.ignite");
+
+ JavaClass raftCommandJavaClass = classes.get(Command.class);
+
+ return classes.stream()
+ .filter(JavaClass::isInterface)
+ .filter(javaClass -> javaClass.isAnnotatedWith(Transferable.class))
+ .filter(javaClass -> javaClass.getAllRawInterfaces().contains(raftCommandJavaClass))
+ .collect(toSet());
+ }
+
+ private static Set<String> toClassNames(Set<JavaClass> classes) {
+ return classes.stream().map(JavaClass::getName).collect(toSet());
+ }
+
+ private static boolean hasTestMethodTestCommand(JavaMethod method) {
+ return method.isAnnotatedWith(TestCommand.class)
+ && (method.isAnnotatedWith(Test.class) || method.isAnnotatedWith(ParameterizedTest.class));
+ }
+}
diff --git a/modules/cluster-management/src/test/java/org/apache/ignite/internal/cluster/management/raft/commands/CmgCommandsCompatibilityTest.java b/modules/cluster-management/src/test/java/org/apache/ignite/internal/cluster/management/raft/commands/CmgCommandsCompatibilityTest.java
index c7974d80b64..25cc3ebbac8 100644
--- a/modules/cluster-management/src/test/java/org/apache/ignite/internal/cluster/management/raft/commands/CmgCommandsCompatibilityTest.java
+++ b/modules/cluster-management/src/test/java/org/apache/ignite/internal/cluster/management/raft/commands/CmgCommandsCompatibilityTest.java
@@ -61,6 +61,7 @@ public class CmgCommandsCompatibilityTest extends BaseCommandsCompatibilityTest
}
@Test
+ @TestCommand(ChangeMetaStorageInfoCommand.class)
void testChangeMetaStorageInfoCommand() {
ChangeMetaStorageInfoCommand command = decodeCommand("CDADCG1zTm9kZTIIbXNOb2RlMQEr");
@@ -69,6 +70,7 @@ public class CmgCommandsCompatibilityTest extends BaseCommandsCompatibilityTest
}
@Test
+ @TestCommand(InitCmgStateCommand.class)
void testInitCmgStateCommand() {
InitCmgStateCommand command = decodeCommand(
"CCkIPgg/AAAAAAAAAAAqAAAAAAAAAEUNY2x1c3Rlck5hbWUxAwljbWdOb2RlMQljbWdOb2RlMgIAAAAAAAAAACoAAAAAAAAARQxpbml0Q29uZmlnMQMIbXNOb"
@@ -81,6 +83,7 @@ public class CmgCommandsCompatibilityTest extends BaseCommandsCompatibilityTest
}
@Test
+ @TestCommand(JoinReadyCommand.class)
void testJoinReadyCommand() {
JoinReadyCommand command = decodeCommand(
"CC0IPQZob3N0MQAAAAAAAAAAKgAAAAAAAABFBm5hbWUx6QcCCXByb2ZpbGUxAghzeXNLZXkxCHN5c1ZhbDECCXVzZXJLZXkxCXVzZXJWYWwx"
@@ -90,6 +93,7 @@ public class CmgCommandsCompatibilityTest extends BaseCommandsCompatibilityTest
}
@Test
+ @TestCommand(JoinRequestCommand.class)
void testJoinRequestCommand() {
JoinRequestCommand command = decodeCommand(
"CCwIPwAAAAAAAAAAKgAAAAAAAABFDWNsdXN0ZXJOYW1lMQg9Bmhvc3QxAAAAAAAAAAAqAAAAAAAAAEUGbmFtZTHpBwIJcHJvZmlsZTECCHN5c0tleTEIc3lzV"
@@ -102,6 +106,7 @@ public class CmgCommandsCompatibilityTest extends BaseCommandsCompatibilityTest
}
@Test
+ @TestCommand(NodesLeaveCommand.class)
void testNodesLeaveCommand() {
NodesLeaveCommand command = decodeCommand(
"CC4CCD0GaG9zdDEAAAAAAAAAACoAAAAAAAAARQZuYW1lMekHAglwcm9maWxlMQIIc3lzS2V5MQhzeXNWYWwxAgl1c2VyS2V5MQl1c2VyVmFsMQ=="
@@ -111,6 +116,7 @@ public class CmgCommandsCompatibilityTest extends BaseCommandsCompatibilityTest
}
@Test
+ @TestCommand(ReadLogicalTopologyCommand.class)
void testReadLogicalTopologyCommand() {
Command command = decodeCommand("CCs=");
@@ -118,6 +124,7 @@ public class CmgCommandsCompatibilityTest extends BaseCommandsCompatibilityTest
}
@Test
+ @TestCommand(ReadMetaStorageInfoCommand.class)
void testReadMetaStorageInfoCommand() {
Command command = decodeCommand("CEM=");
@@ -125,6 +132,7 @@ public class CmgCommandsCompatibilityTest extends BaseCommandsCompatibilityTest
}
@Test
+ @TestCommand(ReadStateCommand.class)
void testReadStateCommand() {
Command command = decodeCommand("CCo=");
@@ -132,6 +140,7 @@ public class CmgCommandsCompatibilityTest extends BaseCommandsCompatibilityTest
}
@Test
+ @TestCommand(ReadValidatedNodesCommand.class)
void testReadValidatedNodesCommand() {
Command command = decodeCommand("CC8=");
diff --git a/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/command/MetastorageCommandsCompatibilityTest.java b/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/command/MetastorageCommandsCompatibilityTest.java
index e382ac99ce4..ba92657a534 100644
--- a/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/command/MetastorageCommandsCompatibilityTest.java
+++ b/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/command/MetastorageCommandsCompatibilityTest.java
@@ -78,6 +78,7 @@ public class MetastorageCommandsCompatibilityTest extends BaseCommandsCompatibil
}
@Test
+ @TestCommand(CompactionCommand.class)
void testCompactionCommand() {
CompactionCommand command = decodeCommand("cEkrR0Y=");
@@ -87,6 +88,7 @@ public class MetastorageCommandsCompatibilityTest extends BaseCommandsCompatibil
}
@Test
+ @TestCommand(EvictIdempotentCommandsCacheCommand.class)
void testEvictIdempotentCommandsCacheCommand() {
EvictIdempotentCommandsCacheCommand command = decodeCommand("cEhlR0Y=");
@@ -96,6 +98,7 @@ public class MetastorageCommandsCompatibilityTest extends BaseCommandsCompatibil
}
@Test
+ @TestCommand(GetAllCommand.class)
void testGetAllCommand() {
GetAllCommand command = decodeCommand("cB8DAwVrZXkxAwVrZXkyKw==");
@@ -104,6 +107,7 @@ public class MetastorageCommandsCompatibilityTest extends BaseCommandsCompatibil
}
@Test
+ @TestCommand(GetChecksumCommand.class)
void testGetChecksumCommand() {
GetChecksumCommand command = decodeCommand("cCMr");
@@ -111,6 +115,7 @@ public class MetastorageCommandsCompatibilityTest extends BaseCommandsCompatibil
}
@Test
+ @TestCommand(GetCommand.class)
void testGetCommand() {
GetCommand command = decodeCommand("cBUDBWtleTEr");
@@ -119,6 +124,7 @@ public class MetastorageCommandsCompatibilityTest extends BaseCommandsCompatibil
}
@Test
+ @TestCommand(GetCurrentRevisionsCommand.class)
void testGetCurrentRevisionsCommand() {
Command command = decodeCommand("cCI=");
@@ -126,6 +132,7 @@ public class MetastorageCommandsCompatibilityTest extends BaseCommandsCompatibil
}
@Test
+ @TestCommand(GetPrefixCommand.class)
void testGetPrefixCommand() {
GetPrefixCommand command = decodeCommand("cD5lAQMIcHJlZml4MQ1wcmV2aW91c0tleTEr");
@@ -137,6 +144,7 @@ public class MetastorageCommandsCompatibilityTest extends BaseCommandsCompatibil
}
@Test
+ @TestCommand(GetRangeCommand.class)
void testGetRangeCommand() {
GetRangeCommand command = decodeCommand("cD1lAQMJa2V5RnJvbTEDB2tleVRvMQ1wcmV2aW91c0tleTEr");
@@ -149,6 +157,7 @@ public class MetastorageCommandsCompatibilityTest extends BaseCommandsCompatibil
}
@Test
+ @TestCommand(InvokeCommand.class)
void testInvokeCommand() {
InvokeCommand command = decodeCommand(
"cAvfAQIDCGV4aXN0czEOAt8BBgMIcmVtb3ZlMQQA3wEMRwAAAAAAAAAAKgAAAAAAAABFR0YC3wEGAwVwdXQxAwMFdmFsMQ=="
@@ -169,6 +178,7 @@ public class MetastorageCommandsCompatibilityTest extends BaseCommandsCompatibil
}
@Test
+ @TestCommand(MultiInvokeCommand.class)
void testMultiInvokeCommand() {
MultiInvokeCommand command = decodeCommand(
"cAzfAQxHAAAAAAAAAAAqAAAAAAAAAEXfAQnfAQvfAQgC3wEGAwVwdXQxAwMFdmFsMd8BBwMCAd8BBd8BBd8BAgMLdG9tYnN0b25lMRDfAQIDDm5vdFRvbWJzd"
@@ -209,6 +219,7 @@ public class MetastorageCommandsCompatibilityTest extends BaseCommandsCompatibil
}
@Test
+ @TestCommand(PutAllCommand.class)
void testPutAllCommand() {
PutAllCommand command = decodeCommand("cDNHAwMFa2V5MQMFa2V5MkYDAwV2YWwxAwV2YWwy");
@@ -219,6 +230,7 @@ public class MetastorageCommandsCompatibilityTest extends BaseCommandsCompatibil
}
@Test
+ @TestCommand(PutCommand.class)
void testPutCommand() {
PutCommand command = decodeCommand("cClHAwVrZXkxRgMFdmFsMQ==");
@@ -229,6 +241,7 @@ public class MetastorageCommandsCompatibilityTest extends BaseCommandsCompatibil
}
@Test
+ @TestCommand(RemoveAllCommand.class)
void testRemoveAllCommand() {
RemoveAllCommand command = decodeCommand("cDRHAwMFa2V5MQMFa2V5MkY=");
@@ -238,6 +251,7 @@ public class MetastorageCommandsCompatibilityTest extends BaseCommandsCompatibil
}
@Test
+ @TestCommand(RemoveByPrefixCommand.class)
void testRemoveByPrefixCommand() {
RemoveByPrefixCommand command = decodeCommand("cDVHAwhwcmVmaXgxRg==");
@@ -247,6 +261,7 @@ public class MetastorageCommandsCompatibilityTest extends BaseCommandsCompatibil
}
@Test
+ @TestCommand(RemoveCommand.class)
void testRemoveCommand() {
RemoveCommand command = decodeCommand("cCpHAwVrZXkxRg==");
@@ -256,6 +271,7 @@ public class MetastorageCommandsCompatibilityTest extends BaseCommandsCompatibil
}
@Test
+ @TestCommand(SyncTimeCommand.class)
void testSyncTimeCommand() {
SyncTimeCommand command = decodeCommand("cEcrR0Y=");
diff --git a/modules/partition-replicator/src/test/java/org/apache/ignite/internal/partition/replicator/network/command/PartitionCommandsCompatibilityTest.java b/modules/partition-replicator/src/test/java/org/apache/ignite/internal/partition/replicator/network/command/PartitionCommandsCompatibilityTest.java
index 460f2c84de8..53ae547f799 100644
--- a/modules/partition-replicator/src/test/java/org/apache/ignite/internal/partition/replicator/network/command/PartitionCommandsCompatibilityTest.java
+++ b/modules/partition-replicator/src/test/java/org/apache/ignite/internal/partition/replicator/network/command/PartitionCommandsCompatibilityTest.java
@@ -79,6 +79,7 @@ public class PartitionCommandsCompatibilityTest extends BaseCommandsCompatibilit
}
@Test
+ @TestCommand(BuildIndexCommand.class)
void testBuildIndexCommand() {
BuildIndexCommand command = decodeCommand("Ci0BRgIAAAAAAAAAACoAAAAAAAAARQ==");
@@ -88,6 +89,7 @@ public class PartitionCommandsCompatibilityTest extends BaseCommandsCompatibilit
}
@Test
+ @TestCommand(BuildIndexCommandV2.class)
void testBuildIndexCommandV2() {
BuildIndexCommandV2 command = decodeCommand("CjIBRgIAAAAAAAAAACoAAAAAAAAARQg=");
@@ -98,6 +100,7 @@ public class PartitionCommandsCompatibilityTest extends BaseCommandsCompatibilit
}
@Test
+ @TestCommand(FinishTxCommandV1.class)
void testFinishTxCommandV1() {
FinishTxCommandV1 command = decodeCommand("CikBSAFHAgkrLSJGAAAAAAAAAAAqAAAAAAAAAEU=");
@@ -111,6 +114,7 @@ public class PartitionCommandsCompatibilityTest extends BaseCommandsCompatibilit
}
@Test
+ @TestCommand(FinishTxCommandV2.class)
void testFinishTxCommandV2() {
FinishTxCommandV2 command = decodeCommand("CjMBSAFHAgYVCSwXDAMtIkYAAAAAAAAAACoAAAAAAAAARQ==");
@@ -124,6 +128,7 @@ public class PartitionCommandsCompatibilityTest extends BaseCommandsCompatibilit
}
@Test
+ @TestCommand(UpdateAllCommand.class)
void testUpdateAllCommand() {
UpdateAllCommand command = decodeCommand(
"CisBRwErAgAAAAAAAAAAKgAAAAAAAABFChkKEwMEAQIDAdMJRgkrLSIAAAAAAAAAACoAAAAAAAAARQAAAAAAAAAAKgAAAAAAAABF"
@@ -140,6 +145,7 @@ public class PartitionCommandsCompatibilityTest extends BaseCommandsCompatibilit
}
@Test
+ @TestCommand(UpdateAllCommandV2.class)
void testUpdateAllCommandV2() {
UpdateAllCommandV2 command = decodeCommand(
"CjEBRwErAgAAAAAAAAAAKgAAAAAAAABFChkKEwMEAQIDAdMJRggJKy0iAAAAAAAAAAAqAAAAAAAAAEUAAAAAAAAAACoAAAAAAAAARQ=="
@@ -157,6 +163,7 @@ public class PartitionCommandsCompatibilityTest extends BaseCommandsCompatibilit
}
@Test
+ @TestCommand(UpdateCommand.class)
void testUpdateCommand() {
UpdateCommand command = decodeCommand(
"CiwBRwErChkKEwMEAQIDAdMJAAAAAAAAAAAqAAAAAAAAAEVGCSstIgAAAAAAAAAAKgAAAAAAAABFAAAAAAAAAAAqAAAAAAAAAEU="
@@ -174,6 +181,7 @@ public class PartitionCommandsCompatibilityTest extends BaseCommandsCompatibilit
}
@Test
+ @TestCommand(UpdateCommandV2.class)
void testUpdateCommandV2() {
UpdateCommandV2 command = decodeCommand(
"CjABRwErChkKEwMEAQIDAdMJAAAAAAAAAAAqAAAAAAAAAEVGCAkrLSIAAAAAAAAAACoAAAAAAAAARQAAAAAAAAAAKgAAAAAAAABF"
@@ -192,6 +200,7 @@ public class PartitionCommandsCompatibilityTest extends BaseCommandsCompatibilit
}
@Test
+ @TestCommand(UpdateMinimumActiveTxBeginTimeCommand.class)
void testUpdateMinimumActiveTxBeginTimeCommand() {
UpdateMinimumActiveTxBeginTimeCommand command = decodeCommand("Ci5HRtMJ");
@@ -201,6 +210,7 @@ public class PartitionCommandsCompatibilityTest extends BaseCommandsCompatibilit
}
@Test
+ @TestCommand(WriteIntentSwitchCommand.class)
void testWriteIntentSwitchCommand() {
WriteIntentSwitchCommand command = decodeCommand("CioBSAFHRgAAAAAAAAAAKgAAAAAAAABF");
@@ -213,6 +223,7 @@ public class PartitionCommandsCompatibilityTest extends BaseCommandsCompatibilit
}
@Test
+ @TestCommand(WriteIntentSwitchCommandV2.class)
void testWriteIntentSwitchCommandV2() {
WriteIntentSwitchCommandV2 command = decodeCommand("Ci8BSAFHRgMJCAAAAAAAAAAAKgAAAAAAAABF");
diff --git a/modules/raft/src/testFixtures/java/org/apache/ignite/internal/raft/BaseCommandsCompatibilityTest.java b/modules/raft/src/testFixtures/java/org/apache/ignite/internal/raft/BaseCommandsCompatibilityTest.java
index 207880ab013..2db6dafcce9 100644
--- a/modules/raft/src/testFixtures/java/org/apache/ignite/internal/raft/BaseCommandsCompatibilityTest.java
+++ b/modules/raft/src/testFixtures/java/org/apache/ignite/internal/raft/BaseCommandsCompatibilityTest.java
@@ -17,6 +17,10 @@
package org.apache.ignite.internal.raft;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
import java.util.Base64;
import java.util.Collection;
import java.util.UUID;
@@ -93,4 +97,12 @@ public abstract class BaseCommandsCompatibilityTest extends BaseIgniteAbstractTe
protected static HybridTimestamp commitTimestamp() {
return HybridTimestamp.hybridTimestamp(71);
}
+
+ /** Annotation to indicate which raft command is being tested. */
+ @Target(ElementType.METHOD)
+ @Retention(RetentionPolicy.RUNTIME)
+ public @interface TestCommand {
+ /** Raft command is being tested. */
+ Class<? extends Command> value();
+ }
}
diff --git a/modules/replicator/src/test/java/org/apache/ignite/internal/replicator/ReplicatorCommandsCompatibilityTest.java b/modules/replicator/src/test/java/org/apache/ignite/internal/replicator/ReplicatorCommandsCompatibilityTest.java
index f2de6013200..f55f5dd0969 100644
--- a/modules/replicator/src/test/java/org/apache/ignite/internal/replicator/ReplicatorCommandsCompatibilityTest.java
+++ b/modules/replicator/src/test/java/org/apache/ignite/internal/replicator/ReplicatorCommandsCompatibilityTest.java
@@ -51,6 +51,7 @@ public class ReplicatorCommandsCompatibilityTest extends BaseCommandsCompatibili
}
@Test
+ @TestCommand(SafeTimeSyncCommand.class)
void testSafeTimeSyncCommand() {
SafeTimeSyncCommand command = decodeCommand("CSlH");
@@ -58,6 +59,7 @@ public class ReplicatorCommandsCompatibilityTest extends BaseCommandsCompatibili
}
@Test
+ @TestCommand(PrimaryReplicaChangeCommand.class)
void testPrimaryReplicaChangeCommand() {
PrimaryReplicaChangeCommand command = decodeCommand("CSorAAAAAAAAAAAqAAAAAAAAAEUGbm9kZTE=");
diff --git a/modules/transactions/src/test/java/org/apache/ignite/internal/tx/message/TxCommandsCompatibilityTest.java b/modules/transactions/src/test/java/org/apache/ignite/internal/tx/message/TxCommandsCompatibilityTest.java
index f9ea3e748de..92e906285b3 100644
--- a/modules/transactions/src/test/java/org/apache/ignite/internal/tx/message/TxCommandsCompatibilityTest.java
+++ b/modules/transactions/src/test/java/org/apache/ignite/internal/tx/message/TxCommandsCompatibilityTest.java
@@ -45,6 +45,7 @@ public class TxCommandsCompatibilityTest extends BaseCommandsCompatibilityTest {
}
@Test
+ @TestCommand(VacuumTxStatesCommand.class)
void testVacuumTxStatesCommand() {
VacuumTxStatesCommand command = decodeCommand("Bg4CAAAAAAAAAAAqAAAAAAAAAEU=");