This is an automated email from the ASF dual-hosted git repository.

ptupitsyn pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git


The following commit(s) were added to refs/heads/main by this push:
     new 56fd82711f2 IGNITE-28320 Move client integration tests to 
ignite-client module (#7832)
56fd82711f2 is described below

commit 56fd82711f2bb38ae9ba76df2cc44f8987062b7d
Author: Maksim Myskov <[email protected]>
AuthorDate: Mon Mar 23 15:15:01 2026 +0300

    IGNITE-28320 Move client integration tests to ignite-client module (#7832)
    
    Test duration:
    
    Before
    
    Integration Runner - ~26 mins
    All Other tests - 10 mins
    
    After
    
    Integration Runner - ~16 mins
    All other tests - 17 mins
---
 modules/client/build.gradle                        |  28 +++
 .../internal}/client/ItAbstractThinClientTest.java |   2 +-
 .../internal/client/ItClientDirectMappingTest.java |   0
 .../client/ItClientGetTableSchemaTest.java         |   0
 .../client/ItClientObservableTimeTest.java         |   0
 .../client/ItCustomKeyColumnOrderClientTest.java   |   2 +-
 .../client/ItCustomKeyColumnOrderEmbeddedTest.java |   2 +-
 .../client/ItNullsEmbeddedClientTest.java          |   2 +-
 .../internal}/client/ItNullsThinClientTest.java    |   2 +-
 .../client/ItThinClientAuthenticationTest.java     |   2 +-
 .../client/ItThinClientChannelValidatorTest.java   |   2 +-
 .../client/ItThinClientComputeMarshallingTest.java |   2 +-
 .../internal}/client/ItThinClientComputeTest.java  | 218 ++++-----------------
 ...tThinClientComputeTypeCheckMarshallingTest.java |   2 +-
 .../client/ItThinClientConnectionTest.java         |   4 +-
 .../client/ItThinClientDdlQueriesTrackerTest.java  |   2 +-
 .../ItThinClientMarshallingEmbeddedTest.java       |   2 +-
 .../client/ItThinClientMarshallingTest.java        |   8 +-
 .../client/ItThinClientMultistatementSqlTest.java  |   2 +-
 .../client/ItThinClientObservationTsTest.java      |   3 +-
 .../client/ItThinClientPartitionAwarenessTest.java |   4 +-
 .../ItThinClientPojoComputeMarshallingTest.java    |   2 +-
 .../ItThinClientSchemaSynchronizationTest.java     |   6 +-
 .../internal}/client/ItThinClientSqlTest.java      |   2 +-
 .../client/ItThinClientTablesGetListTest.java      |   2 +-
 .../internal}/client/ItThinClientTablesTest.java   |   2 +-
 .../client/ItThinClientTransactionCleanupTest.java |   4 +-
 .../client/ItThinClientTransactionsTest.java       |   7 +-
 ...ClientTransactionsWithBrokenReplicatorTest.java |   4 +-
 .../ItThinClientTransactionsWithReplicasTest.java  |   4 +-
 .../ItThinClientTupleComputeMarshallingTest.java   |   2 +-
 .../ItThinClientUninitializedClusterTest.java      |   2 +-
 .../client/ItThinConnectionFailoverTest.java       |   2 +-
 .../internal}/client/proxy/IgniteClientProxy.java  |   2 +-
 .../proxy/IgniteClientProxyBackendHandler.java     |   2 +-
 .../proxy/IgniteClientProxyFrontendHandler.java    |   2 +-
 .../client/proxy/IgniteClientProxyInitializer.java |   2 +-
 .../streamer/ItAbstractDataStreamerTest.java       |   7 +-
 .../streamer/ItClientDataStreamerLoadTest.java     |   0
 .../streamer/ItClientDataStreamerTest.java         |   0
 .../streamer/ItServerDataStreamerTest.java         |   0
 .../cpp/tests/client-test/compute_test.cpp         |   2 +-
 .../cpp/tests/client-test/ignite_runner_suite.h    |  19 +-
 .../Compute/PlatformJobBenchmarks.cs               |   2 +-
 .../Apache.Ignite.Tests.Common/Compute/JavaJobs.cs |  22 +--
 .../Apache.Ignite.Tests/Compute/ComputeTests.cs    |   4 +-
 .../apache/ignite/internal/runner/app/Jobs.java    | 155 +++++++++++++++
 47 files changed, 293 insertions(+), 254 deletions(-)

diff --git a/modules/client/build.gradle b/modules/client/build.gradle
index 1aefe0f95b2..0b9d425be0f 100644
--- a/modules/client/build.gradle
+++ b/modules/client/build.gradle
@@ -18,6 +18,7 @@
 apply from: "$rootDir/buildscripts/java-core.gradle"
 apply from: "$rootDir/buildscripts/publishing.gradle"
 apply from: "$rootDir/buildscripts/java-junit5.gradle"
+apply from: "$rootDir/buildscripts/java-integration-test.gradle"
 
 dependencies {
     api project(':ignite-api')
@@ -72,6 +73,33 @@ dependencies {
     testImplementation libs.archunit.junit5
     testImplementation libs.jmh.core
     testImplementation libs.awaitility
+
+    integrationTestImplementation project(':ignite-catalog')
+    integrationTestImplementation project(':ignite-client-common')
+    integrationTestImplementation project(':ignite-client-handler')
+    integrationTestImplementation project(':ignite-configuration')
+    integrationTestImplementation project(':ignite-configuration-api')
+    integrationTestImplementation project(':ignite-configuration-root')
+    integrationTestImplementation project(':ignite-core')
+    integrationTestImplementation project(':ignite-eventlog')
+    integrationTestImplementation project(':ignite-network-api')
+    integrationTestImplementation project(':ignite-raft-api')
+    integrationTestImplementation project(':ignite-raft')
+    integrationTestImplementation project(':ignite-replicator')
+    integrationTestImplementation project(':ignite-runner')
+    integrationTestImplementation project(':ignite-security')
+    integrationTestImplementation project(':ignite-security-api')
+    integrationTestImplementation project(':ignite-sql-engine')
+    integrationTestImplementation project(':ignite-sql-engine-api')
+    integrationTestImplementation project(':ignite-system-view-api')
+    integrationTestImplementation project(':ignite-transactions')
+    integrationTestImplementation testFixtures(project(':ignite-core'))
+    integrationTestImplementation testFixtures(project(':ignite-runner'))
+    integrationTestImplementation testFixtures(project(':ignite-sql-engine'))
+    integrationTestImplementation libs.awaitility
+    integrationTestImplementation libs.netty.handler
+    integrationTestImplementation libs.netty.transport
+    integrationTestImplementation libs.typesafe.config
 }
 
 def archTestDir = "$buildDir/archtest"
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItAbstractThinClientTest.java
 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItAbstractThinClientTest.java
similarity index 99%
rename from 
modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItAbstractThinClientTest.java
rename to 
modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItAbstractThinClientTest.java
index cd2af11cb95..2e644b2fd18 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItAbstractThinClientTest.java
+++ 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItAbstractThinClientTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.runner.app.client;
+package org.apache.ignite.internal.client;
 
 import static java.util.stream.Collectors.toList;
 import static org.apache.ignite.internal.TestWrappers.unwrapIgniteImpl;
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/client/ItClientDirectMappingTest.java
 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItClientDirectMappingTest.java
similarity index 100%
rename from 
modules/runner/src/integrationTest/java/org/apache/ignite/internal/client/ItClientDirectMappingTest.java
rename to 
modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItClientDirectMappingTest.java
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/client/ItClientGetTableSchemaTest.java
 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItClientGetTableSchemaTest.java
similarity index 100%
rename from 
modules/runner/src/integrationTest/java/org/apache/ignite/internal/client/ItClientGetTableSchemaTest.java
rename to 
modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItClientGetTableSchemaTest.java
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/client/ItClientObservableTimeTest.java
 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItClientObservableTimeTest.java
similarity index 100%
rename from 
modules/runner/src/integrationTest/java/org/apache/ignite/internal/client/ItClientObservableTimeTest.java
rename to 
modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItClientObservableTimeTest.java
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItCustomKeyColumnOrderClientTest.java
 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItCustomKeyColumnOrderClientTest.java
similarity index 99%
rename from 
modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItCustomKeyColumnOrderClientTest.java
rename to 
modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItCustomKeyColumnOrderClientTest.java
index 45fc1c1a8f9..166569bed2e 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItCustomKeyColumnOrderClientTest.java
+++ 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItCustomKeyColumnOrderClientTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.runner.app.client;
+package org.apache.ignite.internal.client;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItCustomKeyColumnOrderEmbeddedTest.java
 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItCustomKeyColumnOrderEmbeddedTest.java
similarity index 95%
rename from 
modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItCustomKeyColumnOrderEmbeddedTest.java
rename to 
modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItCustomKeyColumnOrderEmbeddedTest.java
index 3f7bc291396..5b7e0840424 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItCustomKeyColumnOrderEmbeddedTest.java
+++ 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItCustomKeyColumnOrderEmbeddedTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.runner.app.client;
+package org.apache.ignite.internal.client;
 
 import org.apache.ignite.Ignite;
 
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItNullsEmbeddedClientTest.java
 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItNullsEmbeddedClientTest.java
similarity index 95%
rename from 
modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItNullsEmbeddedClientTest.java
rename to 
modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItNullsEmbeddedClientTest.java
index 567b4a41011..550af3f2035 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItNullsEmbeddedClientTest.java
+++ 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItNullsEmbeddedClientTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.runner.app.client;
+package org.apache.ignite.internal.client;
 
 import org.apache.ignite.Ignite;
 
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItNullsThinClientTest.java
 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItNullsThinClientTest.java
similarity index 98%
rename from 
modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItNullsThinClientTest.java
rename to 
modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItNullsThinClientTest.java
index b175a1baf8f..3479c0e261b 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItNullsThinClientTest.java
+++ 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItNullsThinClientTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.runner.app.client;
+package org.apache.ignite.internal.client;
 
 import static 
org.apache.ignite.internal.testframework.IgniteTestUtils.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertEquals;
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientAuthenticationTest.java
 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientAuthenticationTest.java
similarity index 99%
rename from 
modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientAuthenticationTest.java
rename to 
modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientAuthenticationTest.java
index 4a79cf91d5a..4e8cc7b754e 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientAuthenticationTest.java
+++ 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientAuthenticationTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.runner.app.client;
+package org.apache.ignite.internal.client;
 
 import static org.apache.ignite.internal.TestWrappers.unwrapIgniteImpl;
 import static 
org.apache.ignite.internal.configuration.hocon.HoconConverter.hoconSource;
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientChannelValidatorTest.java
 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientChannelValidatorTest.java
similarity index 99%
rename from 
modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientChannelValidatorTest.java
rename to 
modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientChannelValidatorTest.java
index 47bcaf85fa8..42325e38daa 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientChannelValidatorTest.java
+++ 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientChannelValidatorTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.runner.app.client;
+package org.apache.ignite.internal.client;
 
 import static java.util.stream.Collectors.toList;
 import static 
org.apache.ignite.client.IgniteClientConfiguration.DFLT_BACKGROUND_RECONNECT_INTERVAL;
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientComputeMarshallingTest.java
 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientComputeMarshallingTest.java
similarity index 99%
rename from 
modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientComputeMarshallingTest.java
rename to 
modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientComputeMarshallingTest.java
index 17945775242..d222cc230dc 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientComputeMarshallingTest.java
+++ 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientComputeMarshallingTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.runner.app.client;
+package org.apache.ignite.internal.client;
 
 import static org.apache.ignite.catalog.definitions.ColumnDefinition.column;
 import static org.hamcrest.CoreMatchers.equalTo;
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientComputeTest.java
 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientComputeTest.java
similarity index 83%
rename from 
modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientComputeTest.java
rename to 
modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientComputeTest.java
index 55d95d92b87..823e46366c3 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientComputeTest.java
+++ 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientComputeTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.runner.app.client;
+package org.apache.ignite.internal.client;
 
 import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.concurrent.CompletableFuture.failedFuture;
@@ -61,7 +61,6 @@ import java.time.Instant;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
@@ -95,6 +94,7 @@ import org.apache.ignite.compute.task.TaskExecution;
 import org.apache.ignite.compute.task.TaskExecutionContext;
 import org.apache.ignite.deployment.DeploymentUnit;
 import org.apache.ignite.internal.compute.JobTaskStatusMapper;
+import org.apache.ignite.internal.runner.app.Jobs;
 import org.apache.ignite.internal.testframework.IgniteTestUtils;
 import org.apache.ignite.lang.CancelHandle;
 import org.apache.ignite.lang.Cursor;
@@ -115,8 +115,6 @@ import org.junit.jupiter.params.provider.ValueSource;
  */
 @SuppressWarnings("resource")
 public class ItThinClientComputeTest extends ItAbstractThinClientTest {
-    /** Test trace id. */
-    private static final UUID TRACE_ID = UUID.randomUUID();
 
     @Test
     void testClusterNodes() {
@@ -136,10 +134,10 @@ public class ItThinClientComputeTest extends 
ItAbstractThinClientTest {
     @Test
     void testExecuteOnSpecificNode() {
         String res1 = client().compute().execute(
-                JobTarget.node(node(0)), 
JobDescriptor.builder(NodeNameJob.class).build(), null
+                JobTarget.node(node(0)), 
JobDescriptor.builder(Jobs.NodeNameJob.class).build(), null
         );
         String res2 = client().compute().execute(
-                JobTarget.node(node(1)), 
JobDescriptor.builder(NodeNameJob.class).build(), null
+                JobTarget.node(node(1)), 
JobDescriptor.builder(Jobs.NodeNameJob.class).build(), null
         );
 
         assertEquals("itcct_n_3344", res1);
@@ -236,10 +234,10 @@ public class ItThinClientComputeTest extends 
ItAbstractThinClientTest {
     @Test
     void testExecuteOnSpecificNodeAsync() {
         JobExecution<String> execution1 = submit(
-                JobTarget.node(node(0)), 
JobDescriptor.builder(NodeNameJob.class).build(), null
+                JobTarget.node(node(0)), 
JobDescriptor.builder(Jobs.NodeNameJob.class).build(), null
         );
         JobExecution<String> execution2 = submit(
-                JobTarget.node(node(1)), 
JobDescriptor.builder(NodeNameJob.class).build(), null
+                JobTarget.node(node(1)), 
JobDescriptor.builder(Jobs.NodeNameJob.class).build(), null
         );
 
         assertThat(execution1.resultAsync(), willBe("itcct_n_3344"));
@@ -254,7 +252,7 @@ public class ItThinClientComputeTest extends 
ItAbstractThinClientTest {
         CancelHandle cancelHandle = CancelHandle.create();
         JobExecution<String> execution = submit(
                 JobTarget.node(node(0)),
-                JobDescriptor.builder(NodeNameJob.class).build(),
+                JobDescriptor.builder(Jobs.NodeNameJob.class).build(),
                 cancelHandle.token(),
                 null
         );
@@ -270,7 +268,7 @@ public class ItThinClientComputeTest extends 
ItAbstractThinClientTest {
     void testChangingPriorityCompletedJob() {
         JobExecution<String> execution = submit(
                 JobTarget.node(node(0)),
-                JobDescriptor.builder(NodeNameJob.class).build(), null
+                JobDescriptor.builder(Jobs.NodeNameJob.class).build(), null
         );
 
         assertThat(execution.resultAsync(), willBe("itcct_n_3344"));
@@ -285,7 +283,7 @@ public class ItThinClientComputeTest extends 
ItAbstractThinClientTest {
     void testCancelOnSpecificNodeAsync(boolean asyncJob) {
         int sleepMs = 1_000_000;
         JobDescriptor<Integer, Void> sleepJob = JobDescriptor
-                .builder(asyncJob ? AsyncSleepJob.class : SleepJob.class)
+                .builder(asyncJob ? AsyncSleepJob.class : Jobs.SleepJob.class)
                 .build();
 
         CancelHandle cancelHandle = CancelHandle.create();
@@ -304,7 +302,7 @@ public class ItThinClientComputeTest extends 
ItAbstractThinClientTest {
     @Test
     void changeJobPriority() {
         int sleepMs = 1_000_000;
-        JobDescriptor<Integer, Void> sleepJob = 
JobDescriptor.builder(SleepJob.class).build();
+        JobDescriptor<Integer, Void> sleepJob = 
JobDescriptor.builder(Jobs.SleepJob.class).build();
         JobTarget target = JobTarget.node(node(0));
 
         // Start 1 task in executor with 1 thread
@@ -344,7 +342,8 @@ public class ItThinClientComputeTest extends 
ItAbstractThinClientTest {
 
     @Test
     void testExecuteOnRandomNode() {
-        String res = 
client().compute().execute(JobTarget.anyNode(sortedNodes()), 
JobDescriptor.builder(NodeNameJob.class).build(), null);
+        String res = client().compute()
+                .execute(JobTarget.anyNode(sortedNodes()), 
JobDescriptor.builder(Jobs.NodeNameJob.class).build(), null);
 
         assertTrue(Set.of("itcct_n_3344", "itcct_n_3345").contains(res));
     }
@@ -352,7 +351,7 @@ public class ItThinClientComputeTest extends 
ItAbstractThinClientTest {
     @Test
     void testExecuteOnRandomNodeAsync() {
         JobExecution<String> execution = submit(
-                JobTarget.anyNode(sortedNodes()), 
JobDescriptor.builder(NodeNameJob.class).build(), null);
+                JobTarget.anyNode(sortedNodes()), 
JobDescriptor.builder(Jobs.NodeNameJob.class).build(), null);
 
         assertThat(
                 execution.resultAsync(),
@@ -365,7 +364,7 @@ public class ItThinClientComputeTest extends 
ItAbstractThinClientTest {
     void testBroadcastOneNode() {
         BroadcastExecution<String> broadcastExecution = submit(
                 Set.of(node(1)),
-                JobDescriptor.builder(NodeNameJob.class).build(),
+                JobDescriptor.builder(Jobs.NodeNameJob.class).build(),
                 null
         );
 
@@ -378,7 +377,7 @@ public class ItThinClientComputeTest extends 
ItAbstractThinClientTest {
     void testBroadcastAllNodes() {
         BroadcastExecution<String> broadcastExecution = submit(
                 new HashSet<>(sortedNodes()),
-                JobDescriptor.builder(NodeNameJob.class).build(),
+                JobDescriptor.builder(Jobs.NodeNameJob.class).build(),
                 null
         );
 
@@ -395,7 +394,7 @@ public class ItThinClientComputeTest extends 
ItAbstractThinClientTest {
 
         BroadcastExecution<Void> broadcastExecution = submit(
                 new HashSet<>(sortedNodes()),
-                JobDescriptor.builder(SleepJob.class).build(),
+                JobDescriptor.builder(Jobs.SleepJob.class).build(),
                 cancelHandle.token(),
                 sleepMs
         );
@@ -420,7 +419,7 @@ public class ItThinClientComputeTest extends 
ItAbstractThinClientTest {
     @Test
     void testExecuteWithArgs() {
         JobExecution<String> execution = submit(
-                JobTarget.anyNode(client().cluster().nodes()), 
JobDescriptor.builder(ConcatJob.class).build(),
+                JobTarget.anyNode(client().cluster().nodes()), 
JobDescriptor.builder(Jobs.ConcatJob.class).build(),
                 "1:2:3.3"
         );
 
@@ -431,13 +430,13 @@ public class ItThinClientComputeTest extends 
ItAbstractThinClientTest {
     @Test
     void 
testIgniteExceptionInJobPropagatesToClientWithMessageAndCodeAndTraceIdAsync() {
         IgniteException cause = getExceptionInJobExecutionAsync(
-                submit(JobTarget.node(node(0)), 
JobDescriptor.builder(IgniteExceptionJob.class).build(), null)
+                submit(JobTarget.node(node(0)), 
JobDescriptor.builder(Jobs.IgniteExceptionJob.class).build(), null)
         );
 
         assertThat(cause.getMessage(), containsString("Custom job error"));
-        assertEquals(TRACE_ID, cause.traceId());
+        assertEquals(Jobs.TRACE_ID, cause.traceId());
         assertEquals(COLUMN_NOT_FOUND_ERR, cause.code());
-        assertInstanceOf(CustomException.class, cause);
+        assertInstanceOf(Jobs.CustomException.class, cause);
         assertNotNull(cause.getCause());
         String hint = cause.getCause().getMessage();
 
@@ -447,13 +446,14 @@ public class ItThinClientComputeTest extends 
ItAbstractThinClientTest {
     @Test
     void 
testIgniteExceptionInJobPropagatesToClientWithMessageAndCodeAndTraceIdSync() {
         IgniteException cause = getExceptionInJobExecutionSync(
-                () -> client().compute().execute(JobTarget.node(node(0)), 
JobDescriptor.builder(IgniteExceptionJob.class).build(), null)
+                () -> client().compute()
+                        .execute(JobTarget.node(node(0)), 
JobDescriptor.builder(Jobs.IgniteExceptionJob.class).build(), null)
         );
 
         assertThat(cause.getMessage(), containsString("Custom job error"));
-        assertEquals(TRACE_ID, cause.traceId());
+        assertEquals(Jobs.TRACE_ID, cause.traceId());
         assertEquals(COLUMN_NOT_FOUND_ERR, cause.code());
-        assertInstanceOf(CustomException.class, cause);
+        assertInstanceOf(Jobs.CustomException.class, cause);
         assertNotNull(cause.getCause());
         String hint = cause.getCause().getMessage();
 
@@ -672,7 +672,7 @@ public class ItThinClientComputeTest extends 
ItAbstractThinClientTest {
 
         assertThat(cause.getCause().getMessage(), containsString(
                 "Caused by: java.lang.ArithmeticException: math err" + 
System.lineSeparator()
-                        + "\tat 
org.apache.ignite.internal.runner.app.client.ItThinClientComputeTest$"
+                        + "\tat 
org.apache.ignite.internal.client.ItThinClientComputeTest$"
                         + 
"ExceptionJob.executeAsync(ItThinClientComputeTest.java:")
         );
     }
@@ -683,7 +683,7 @@ public class ItThinClientComputeTest extends 
ItAbstractThinClientTest {
         var keyTuple = Tuple.create().set(COLUMN_KEY, key);
 
         JobExecution<String> tupleExecution = submit(
-                JobTarget.colocated(TABLE_NAME, keyTuple), 
JobDescriptor.builder(NodeNameJob.class).build(), null
+                JobTarget.colocated(TABLE_NAME, keyTuple), 
JobDescriptor.builder(Jobs.NodeNameJob.class).build(), null
         );
 
         String expectedNode = "itcct_n_" + port;
@@ -699,7 +699,7 @@ public class ItThinClientComputeTest extends 
ItAbstractThinClientTest {
 
         Mapper<TestPojo> keyMapper = Mapper.of(TestPojo.class);
         JobExecution<String> pojoExecution = submit(
-                JobTarget.colocated(TABLE_NAME, keyPojo, keyMapper), 
JobDescriptor.builder(NodeNameJob.class).build(), null);
+                JobTarget.colocated(TABLE_NAME, keyPojo, keyMapper), 
JobDescriptor.builder(Jobs.NodeNameJob.class).build(), null);
 
         String expectedNode = "itcct_n_" + port;
         assertThat(pojoExecution.resultAsync(), willBe(expectedNode));
@@ -716,7 +716,7 @@ public class ItThinClientComputeTest extends 
ItAbstractThinClientTest {
         CancelHandle cancelHandle = CancelHandle.create();
         JobExecution<Void> tupleExecution = submit(
                 JobTarget.colocated(TABLE_NAME, keyTuple),
-                JobDescriptor.builder(SleepJob.class).build(),
+                JobDescriptor.builder(Jobs.SleepJob.class).build(),
                 cancelHandle.token(),
                 sleepMs
         );
@@ -738,7 +738,7 @@ public class ItThinClientComputeTest extends 
ItAbstractThinClientTest {
         CancelHandle cancelHandle = CancelHandle.create();
         JobExecution<Void> pojoExecution = submit(
                 JobTarget.colocated(TABLE_NAME, keyPojo, keyMapper),
-                JobDescriptor.builder(SleepJob.class).build(),
+                JobDescriptor.builder(Jobs.SleepJob.class).build(),
                 cancelHandle.token(),
                 sleepMs
         );
@@ -756,7 +756,7 @@ public class ItThinClientComputeTest extends 
ItAbstractThinClientTest {
                 CompletionException.class,
                 () -> client().compute().executeAsync(
                         JobTarget.node(node(0)),
-                        JobDescriptor.builder(NodeNameJob.class)
+                        JobDescriptor.builder(Jobs.NodeNameJob.class)
                                 .units(List.of(new DeploymentUnit("u", 
"latest")))
                                 .build(),
                         null
@@ -776,7 +776,7 @@ public class ItThinClientComputeTest extends 
ItAbstractThinClientTest {
                 CompletionException.class,
                 () -> client().compute().executeAsync(
                         JobTarget.colocated(TABLE_NAME, 
Tuple.create().set(COLUMN_KEY, 1)),
-                        JobDescriptor.builder(NodeNameJob.class)
+                        JobDescriptor.builder(Jobs.NodeNameJob.class)
                                 .units(new DeploymentUnit("u", "latest"))
                                 .build(),
                         null
@@ -796,7 +796,7 @@ public class ItThinClientComputeTest extends 
ItAbstractThinClientTest {
         try (IgniteClient client = builder.build()) {
             int delayMs = 3000;
             CompletableFuture<Void> jobFut = client.compute().executeAsync(
-                    JobTarget.node(node(0)), 
JobDescriptor.builder(SleepJob.class).build(), delayMs);
+                    JobTarget.node(node(0)), 
JobDescriptor.builder(Jobs.SleepJob.class).build(), delayMs);
 
             // Wait a bit and close the connection.
             Thread.sleep(10);
@@ -831,7 +831,7 @@ public class ItThinClientComputeTest extends 
ItAbstractThinClientTest {
         Mapper<TestPojo> mapper = Mapper.of(TestPojo.class);
         TestPojo pojoKey = new TestPojo(1);
         Tuple tupleKey = Tuple.create().set("key", pojoKey.key);
-        JobDescriptor<Object, String> job = 
JobDescriptor.builder(NodeNameJob.class).build();
+        JobDescriptor<Object, String> job = 
JobDescriptor.builder(Jobs.NodeNameJob.class).build();
 
         var tupleRes = 
client().compute().execute(JobTarget.colocated(tableName, tupleKey), job, null);
         var pojoRes = 
client().compute().execute(JobTarget.colocated(tableName, pojoKey, mapper), 
job, null);
@@ -844,7 +844,7 @@ public class ItThinClientComputeTest extends 
ItAbstractThinClientTest {
     void testBigDecimalPropagation(String number, int scale) {
         BigDecimal res = client().compute().execute(
                 JobTarget.node(node(0)),
-                JobDescriptor.builder(DecimalJob.class).build(),
+                JobDescriptor.builder(Jobs.DecimalJob.class).build(),
                 number + "," + scale);
 
         var expected = new BigDecimal(number).setScale(scale, 
RoundingMode.HALF_UP);
@@ -853,7 +853,7 @@ public class ItThinClientComputeTest extends 
ItAbstractThinClientTest {
 
     @Test
     void testExecuteMapReduce() throws Exception {
-        TaskDescriptor<String, String> taskDescriptor = 
TaskDescriptor.builder(MapReduceNodeNameTask.class).build();
+        TaskDescriptor<String, String> taskDescriptor = 
TaskDescriptor.builder(Jobs.MapReduceNodeNameTask.class).build();
         TaskExecution<String> execution = 
client().compute().submitMapReduce(taskDescriptor, null);
 
         List<Matcher<? super String>> nodeNames = sortedNodes().stream()
@@ -879,7 +879,7 @@ public class ItThinClientComputeTest extends 
ItAbstractThinClientTest {
     }
 
     @ParameterizedTest
-    @ValueSource(classes = {MapReduceExceptionOnSplitTask.class, 
MapReduceExceptionOnReduceTask.class})
+    @ValueSource(classes = {Jobs.MapReduceExceptionOnSplitTask.class, 
Jobs.MapReduceExceptionOnReduceTask.class})
     <I, M, T> void testExecuteMapReduceExceptionPropagation(Class<? extends 
MapReduceTask<I, M, T, String>> taskClass) {
         // Task execution doesn't use preferred node name and will use 
round-robin leading to random node selection
         try (IgniteClient client = 
IgniteClient.builder().addresses(getNodeAddress()).build()) {
@@ -887,9 +887,9 @@ public class ItThinClientComputeTest extends 
ItAbstractThinClientTest {
             IgniteException cause = 
getExceptionInTaskExecutionAsync(client.compute().submitMapReduce(taskDescriptor,
 null));
 
             assertThat(cause.getMessage(), containsString("Custom job error"));
-            assertEquals(TRACE_ID, cause.traceId());
+            assertEquals(Jobs.TRACE_ID, cause.traceId());
             assertEquals(COLUMN_NOT_FOUND_ERR, cause.code());
-            assertInstanceOf(CustomException.class, cause);
+            assertInstanceOf(Jobs.CustomException.class, cause);
             assertNotNull(cause.getCause());
             String hint = cause.getCause().getMessage();
 
@@ -928,7 +928,7 @@ public class ItThinClientComputeTest extends 
ItAbstractThinClientTest {
     }
 
     private void testEchoArg(Object arg) {
-        Object res = client().compute().execute(JobTarget.node(node(0)), 
JobDescriptor.builder(EchoJob.class).build(), arg);
+        Object res = client().compute().execute(JobTarget.node(node(0)), 
JobDescriptor.builder(Jobs.EchoJob.class).build(), arg);
 
         if (arg instanceof byte[]) {
             assertArrayEquals((byte[]) arg, (byte[]) res);
@@ -936,38 +936,10 @@ public class ItThinClientComputeTest extends 
ItAbstractThinClientTest {
             assertEquals(arg, res);
         }
 
-        String str = client().compute().execute(JobTarget.node(node(0)), 
JobDescriptor.builder(ToStringJob.class).build(), arg);
+        String str = client().compute().execute(JobTarget.node(node(0)), 
JobDescriptor.builder(Jobs.ToStringJob.class).build(), arg);
         assertEquals(arg.toString(), str);
     }
 
-    private static class NodeNameJob implements ComputeJob<Object, String> {
-        @Override
-        public CompletableFuture<String> executeAsync(JobExecutionContext 
context, Object arg) {
-            return completedFuture(context.ignite().name() + (arg == null ? "" 
: arg.toString()));
-        }
-    }
-
-    private static class ConcatJob implements ComputeJob<String, String> {
-        @Override
-        public CompletableFuture<String> executeAsync(JobExecutionContext 
context, String args) {
-            if (args == null) {
-                return nullCompletedFuture();
-            }
-
-            return completedFuture(
-                    Arrays.stream(args.split(":"))
-                            .map(o -> o == null ? "null" : o)
-                            .collect(Collectors.joining("_")));
-        }
-    }
-
-    private static class IgniteExceptionJob implements ComputeJob<Object, 
String> {
-        @Override
-        public CompletableFuture<String> executeAsync(JobExecutionContext 
context, Object args) {
-            throw new CustomException(TRACE_ID, COLUMN_NOT_FOUND_ERR, "Custom 
job error", null);
-        }
-    }
-
     private static class ExceptionJob implements ComputeJob<Boolean, String> {
         @Override
         public CompletableFuture<String> executeAsync(JobExecutionContext 
context, Boolean arg) {
@@ -981,37 +953,6 @@ public class ItThinClientComputeTest extends 
ItAbstractThinClientTest {
         }
     }
 
-    private static class EchoJob implements ComputeJob<Object, Object> {
-        @Override
-        public CompletableFuture<Object> executeAsync(JobExecutionContext 
context, Object arg) {
-            return completedFuture(arg);
-        }
-    }
-
-    private static class ToStringJob implements ComputeJob<Object, String> {
-        @Override
-        public CompletableFuture<String> executeAsync(JobExecutionContext 
context, Object arg) {
-            if (arg instanceof byte[]) {
-                return completedFuture(Arrays.toString((byte[]) arg));
-            }
-
-            return completedFuture(arg.toString());
-        }
-    }
-
-    private static class SleepJob implements ComputeJob<Integer, Void> {
-        @Override
-        public @Nullable CompletableFuture<Void> 
executeAsync(JobExecutionContext context, Integer sleepMs) {
-            try {
-                Thread.sleep(sleepMs);
-            } catch (InterruptedException e) {
-                throw new RuntimeException(e);
-            }
-
-            return null;
-        }
-    }
-
     private static class AsyncSleepJob implements ComputeJob<Integer, Void> {
         @Override
         public @Nullable CompletableFuture<Void> 
executeAsync(JobExecutionContext context, Integer sleepMs) {
@@ -1032,42 +973,12 @@ public class ItThinClientComputeTest extends 
ItAbstractThinClientTest {
         }
     }
 
-    private static class DecimalJob implements ComputeJob<String, BigDecimal> {
-        @Override
-        public CompletableFuture<BigDecimal> executeAsync(JobExecutionContext 
context, String arg) {
-            @SuppressWarnings("DataFlowIssue")
-            var args = arg.split(",", 2);
-
-            return completedFuture(new 
BigDecimal(args[0]).setScale(Integer.parseInt(args[1]), RoundingMode.HALF_UP));
-        }
-    }
-
-    private static class MapReduceNodeNameTask implements 
MapReduceTask<String, Object, String, String> {
-        @Override
-        public CompletableFuture<List<MapReduceJob<Object, String>>> 
splitAsync(TaskExecutionContext context, String args) {
-            return completedFuture(context.ignite().cluster().nodes().stream()
-                    .map(node -> MapReduceJob.<Object, String>builder()
-                            
.jobDescriptor(JobDescriptor.builder(NodeNameJob.class).build())
-                            .nodes(Set.of(node))
-                            .args(args)
-                            .build())
-                    .collect(Collectors.toList()));
-        }
-
-        @Override
-        public CompletableFuture<String> reduceAsync(TaskExecutionContext 
context, Map<UUID, String> results) {
-            return completedFuture(results.values().stream()
-                    .map(String.class::cast)
-                    .collect(Collectors.joining(",")));
-        }
-    }
-
     private static class MapReduceArgsTask implements MapReduceTask<String, 
String, String, String> {
         @Override
         public CompletableFuture<List<MapReduceJob<String, String>>> 
splitAsync(TaskExecutionContext context, String args) {
             return completedFuture(context.ignite().cluster().nodes().stream()
                     .map(node -> MapReduceJob.<String, String>builder()
-                            
.jobDescriptor(JobDescriptor.builder(ConcatJob.class).build())
+                            
.jobDescriptor(JobDescriptor.builder(Jobs.ConcatJob.class).build())
                             .nodes(Set.of(node))
                             .args(args)
                             .build())
@@ -1082,37 +993,6 @@ public class ItThinClientComputeTest extends 
ItAbstractThinClientTest {
         }
     }
 
-    private static class MapReduceExceptionOnSplitTask implements 
MapReduceTask<Object, Object, Object, String> {
-        @Override
-        public CompletableFuture<List<MapReduceJob<Object, Object>>> 
splitAsync(TaskExecutionContext context, Object args) {
-            throw new CustomException(TRACE_ID, COLUMN_NOT_FOUND_ERR, "Custom 
job error", null);
-        }
-
-        @Override
-        public CompletableFuture<String> reduceAsync(TaskExecutionContext 
context, Map<UUID, Object> results) {
-            return completedFuture("expected split exception");
-        }
-    }
-
-    private static class MapReduceExceptionOnReduceTask implements 
MapReduceTask<Object, Object, String, String> {
-
-        @Override
-        public CompletableFuture<List<MapReduceJob<Object, String>>> 
splitAsync(TaskExecutionContext context, Object args) {
-            return completedFuture(context.ignite().cluster().nodes().stream()
-                    .map(node -> MapReduceJob.<Object, String>builder()
-                            
.jobDescriptor(JobDescriptor.builder(NodeNameJob.class).build())
-                            .nodes(Set.of(node))
-                            .args(args)
-                            .build())
-                    .collect(Collectors.toList()));
-        }
-
-        @Override
-        public CompletableFuture<String> reduceAsync(TaskExecutionContext 
context, Map<UUID, String> results) {
-            throw new CustomException(TRACE_ID, COLUMN_NOT_FOUND_ERR, "Custom 
job error", null);
-        }
-    }
-
     private static class InfiniteJob implements ComputeJob<Object, Void> {
         @Override
         public CompletableFuture<Void> executeAsync(JobExecutionContext 
context, Object ignored) {
@@ -1125,15 +1005,6 @@ public class ItThinClientComputeTest extends 
ItAbstractThinClientTest {
         }
     }
 
-    /**
-     * Custom public exception class.
-     */
-    public static class CustomException extends IgniteException {
-        public CustomException(UUID traceId, int code, String message, 
Throwable cause) {
-            super(traceId, code, message, cause);
-        }
-    }
-
     private static class InfiniteMapReduceTask implements MapReduceTask<Void, 
Void, Void, Void> {
         @Override
         public CompletableFuture<List<MapReduceJob<Void, Void>>> 
splitAsync(TaskExecutionContext taskContext, Void input) {
@@ -1174,11 +1045,4 @@ public class ItThinClientComputeTest extends 
ItAbstractThinClientTest {
         }
     }
 
-    /** Simple job which always returns null value. */
-    public static class ReturnNullJob implements ComputeJob<Void, String> {
-        @Override
-        public @Nullable CompletableFuture<String> 
executeAsync(JobExecutionContext context, @Nullable Void arg) {
-            return null;
-        }
-    }
 }
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientComputeTypeCheckMarshallingTest.java
 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientComputeTypeCheckMarshallingTest.java
similarity index 99%
rename from 
modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientComputeTypeCheckMarshallingTest.java
rename to 
modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientComputeTypeCheckMarshallingTest.java
index d7c815c8572..3463cc2e1d7 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientComputeTypeCheckMarshallingTest.java
+++ 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientComputeTypeCheckMarshallingTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.runner.app.client;
+package org.apache.ignite.internal.client;
 
 import static java.util.concurrent.CompletableFuture.completedFuture;
 import static org.apache.ignite.compute.JobStatus.COMPLETED;
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientConnectionTest.java
 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientConnectionTest.java
similarity index 97%
rename from 
modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientConnectionTest.java
rename to 
modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientConnectionTest.java
index 17d13be9bd2..99ffd6216fd 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientConnectionTest.java
+++ 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientConnectionTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.runner.app.client;
+package org.apache.ignite.internal.client;
 
 import static 
org.apache.ignite.internal.eventlog.api.IgniteEventType.CLIENT_CONNECTION_CLOSED;
 import static 
org.apache.ignite.internal.eventlog.api.IgniteEventType.CLIENT_CONNECTION_ESTABLISHED;
@@ -35,8 +35,6 @@ import java.util.List;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 import org.apache.ignite.client.IgniteClient;
-import org.apache.ignite.internal.client.ClientChannel;
-import org.apache.ignite.internal.client.TcpIgniteClient;
 import org.apache.ignite.internal.testframework.WorkDirectoryExtension;
 import org.apache.ignite.internal.testframework.log4j2.EventLogInspector;
 import org.apache.ignite.lang.IgniteException;
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientDdlQueriesTrackerTest.java
 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientDdlQueriesTrackerTest.java
similarity index 99%
rename from 
modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientDdlQueriesTrackerTest.java
rename to 
modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientDdlQueriesTrackerTest.java
index 165d683b1f2..70c2613dcdb 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientDdlQueriesTrackerTest.java
+++ 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientDdlQueriesTrackerTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.runner.app.client;
+package org.apache.ignite.internal.client;
 
 import static org.apache.ignite.internal.TestWrappers.unwrapIgniteImpl;
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.await;
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientMarshallingEmbeddedTest.java
 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientMarshallingEmbeddedTest.java
similarity index 95%
rename from 
modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientMarshallingEmbeddedTest.java
rename to 
modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientMarshallingEmbeddedTest.java
index 0364680f9af..5191c6fbbc3 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientMarshallingEmbeddedTest.java
+++ 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientMarshallingEmbeddedTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.runner.app.client;
+package org.apache.ignite.internal.client;
 
 import org.apache.ignite.Ignite;
 
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientMarshallingTest.java
 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientMarshallingTest.java
similarity index 98%
rename from 
modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientMarshallingTest.java
rename to 
modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientMarshallingTest.java
index ffa74c5f19c..68019ba3daa 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientMarshallingTest.java
+++ 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientMarshallingTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.runner.app.client;
+package org.apache.ignite.internal.client;
 
 import static 
org.apache.ignite.internal.testframework.IgniteTestUtils.assertThrowsWithCode;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -58,7 +58,7 @@ public class ItThinClientMarshallingTest extends 
ItAbstractThinClientTest {
         assertThrowsMarshallerException(
                 () -> pojoView.upsert(null, pojo),
                 "Fields [unmapped, unmapped2] of type "
-                        + 
"org.apache.ignite.internal.runner.app.client.ItThinClientMarshallingTest$TestPojo2
 are not mapped to columns"
+                        + 
"org.apache.ignite.internal.client.ItThinClientMarshallingTest$TestPojo2 are 
not mapped to columns"
         );
     }
 
@@ -71,7 +71,7 @@ public class ItThinClientMarshallingTest extends 
ItAbstractThinClientTest {
 
         assertThrowsMarshallerException(
                 () -> kvPojoView.put(null, pojo, pojo),
-                "Fields [val] of type 
org.apache.ignite.internal.runner.app.client.ItAbstractThinClientTest$TestPojo "
+                "Fields [val] of type 
org.apache.ignite.internal.client.ItAbstractThinClientTest$TestPojo "
                         + "are not mapped to columns");
     }
 
@@ -84,7 +84,7 @@ public class ItThinClientMarshallingTest extends 
ItAbstractThinClientTest {
 
         assertThrowsMarshallerException(
                 () -> kvPojoView.put(null, 1, pojo),
-                "Fields [key] of type 
org.apache.ignite.internal.runner.app.client.ItAbstractThinClientTest$TestPojo "
+                "Fields [key] of type 
org.apache.ignite.internal.client.ItAbstractThinClientTest$TestPojo "
                         + "are not mapped to columns"
         );
     }
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientMultistatementSqlTest.java
 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientMultistatementSqlTest.java
similarity index 99%
rename from 
modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientMultistatementSqlTest.java
rename to 
modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientMultistatementSqlTest.java
index 8e381b20d80..21c0f76be40 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientMultistatementSqlTest.java
+++ 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientMultistatementSqlTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.runner.app.client;
+package org.apache.ignite.internal.client;
 
 import static org.apache.ignite.internal.TestWrappers.unwrapIgniteImpl;
 import static 
org.apache.ignite.internal.sql.engine.util.SqlTestUtils.assertThrowsSqlException;
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientObservationTsTest.java
 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientObservationTsTest.java
similarity index 97%
rename from 
modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientObservationTsTest.java
rename to 
modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientObservationTsTest.java
index ea3459bdee7..279a1edc1ae 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientObservationTsTest.java
+++ 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientObservationTsTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.runner.app.client;
+package org.apache.ignite.internal.client;
 
 import static org.awaitility.Awaitility.await;
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -23,7 +23,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 import java.time.Duration;
 import org.apache.ignite.client.IgniteClient;
 import org.apache.ignite.client.IgniteClient.Builder;
-import org.apache.ignite.internal.client.TcpIgniteClient;
 import org.apache.ignite.internal.hlc.HybridTimestampTracker;
 import org.apache.ignite.table.Table;
 import org.apache.ignite.table.Tuple;
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientPartitionAwarenessTest.java
 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientPartitionAwarenessTest.java
similarity index 97%
rename from 
modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientPartitionAwarenessTest.java
rename to 
modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientPartitionAwarenessTest.java
index e2e3d7b5418..b406de7cbc9 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientPartitionAwarenessTest.java
+++ 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientPartitionAwarenessTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.runner.app.client;
+package org.apache.ignite.internal.client;
 
 import static java.util.concurrent.CompletableFuture.completedFuture;
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -30,7 +30,7 @@ import org.apache.ignite.compute.ComputeJob;
 import org.apache.ignite.compute.JobDescriptor;
 import org.apache.ignite.compute.JobExecutionContext;
 import org.apache.ignite.compute.JobTarget;
-import org.apache.ignite.internal.runner.app.client.proxy.IgniteClientProxy;
+import org.apache.ignite.internal.client.proxy.IgniteClientProxy;
 import org.apache.ignite.table.RecordView;
 import org.apache.ignite.table.Tuple;
 import org.apache.ignite.tx.Transaction;
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientPojoComputeMarshallingTest.java
 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientPojoComputeMarshallingTest.java
similarity index 99%
rename from 
modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientPojoComputeMarshallingTest.java
rename to 
modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientPojoComputeMarshallingTest.java
index 3b389e0025e..370af5fc3ca 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientPojoComputeMarshallingTest.java
+++ 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientPojoComputeMarshallingTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.runner.app.client;
+package org.apache.ignite.internal.client;
 
 import static org.apache.ignite.internal.TestWrappers.unwrapIgniteImpl;
 import static 
org.apache.ignite.internal.testframework.IgniteTestUtils.assertThrows;
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientSchemaSynchronizationTest.java
 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientSchemaSynchronizationTest.java
similarity index 97%
rename from 
modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientSchemaSynchronizationTest.java
rename to 
modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientSchemaSynchronizationTest.java
index c403d646144..fb792c0ba0f 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientSchemaSynchronizationTest.java
+++ 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientSchemaSynchronizationTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.runner.app.client;
+package org.apache.ignite.internal.client;
 
 import static 
org.apache.ignite.internal.testframework.IgniteTestUtils.assertThrowsWithCause;
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -203,7 +203,7 @@ public class ItThinClientSchemaSynchronizationTest extends 
ItAbstractThinClientT
                 : () -> recordView.insert(null, rec);
 
         IgniteTestUtils.assertThrows(IgniteException.class, action::run,
-                "Fields [name] of type 
org.apache.ignite.internal.runner.app.client.ItThinClientSchemaSynchronizationTest$Pojo
 "
+                "Fields [name] of type 
org.apache.ignite.internal.client.ItThinClientSchemaSynchronizationTest$Pojo "
                         + "are not mapped to columns");
 
         // Modify table, insert again - client will use old schema, throw 
ClientSchemaMismatchException,
@@ -235,7 +235,7 @@ public class ItThinClientSchemaSynchronizationTest extends 
ItAbstractThinClientT
                 : () -> kvView.put(null, key, val);
 
         IgniteTestUtils.assertThrows(IgniteException.class, action::run, 
"Fields [name] of type "
-                        + 
"org.apache.ignite.internal.runner.app.client.ItThinClientSchemaSynchronizationTest$ValPojo
 "
+                        + 
"org.apache.ignite.internal.client.ItThinClientSchemaSynchronizationTest$ValPojo
 "
                         + "are not mapped to columns");
 
         // Modify table, insert again - client will use old schema, throw 
ClientSchemaMismatchException,
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientSqlTest.java
 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientSqlTest.java
similarity index 99%
rename from 
modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientSqlTest.java
rename to 
modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientSqlTest.java
index ec7973ea7cc..9115b6bc7a6 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientSqlTest.java
+++ 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientSqlTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.runner.app.client;
+package org.apache.ignite.internal.client;
 
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.await;
 import static 
org.apache.ignite.internal.tx.impl.ResourceVacuumManager.RESOURCE_VACUUM_INTERVAL_MILLISECONDS_PROPERTY;
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientTablesGetListTest.java
 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientTablesGetListTest.java
similarity index 99%
rename from 
modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientTablesGetListTest.java
rename to 
modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientTablesGetListTest.java
index d351d90d7cf..8b7aaa7c7ba 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientTablesGetListTest.java
+++ 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientTablesGetListTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.runner.app.client;
+package org.apache.ignite.internal.client;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientTablesTest.java
 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientTablesTest.java
similarity index 98%
rename from 
modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientTablesTest.java
rename to 
modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientTablesTest.java
index 1a8d484e8c7..2209371f489 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientTablesTest.java
+++ 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientTablesTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.runner.app.client;
+package org.apache.ignite.internal.client;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNull;
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientTransactionCleanupTest.java
 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientTransactionCleanupTest.java
similarity index 96%
rename from 
modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientTransactionCleanupTest.java
rename to 
modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientTransactionCleanupTest.java
index bbae8717cdb..5d5514f3278 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientTransactionCleanupTest.java
+++ 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientTransactionCleanupTest.java
@@ -15,10 +15,10 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.runner.app.client;
+package org.apache.ignite.internal.client;
 
 import static org.apache.ignite.internal.TestWrappers.unwrapIgniteImpl;
-import static 
org.apache.ignite.internal.runner.app.client.ItThinClientTransactionsTest.generateKeysForNode;
+import static 
org.apache.ignite.internal.client.ItThinClientTransactionsTest.generateKeysForNode;
 import static org.awaitility.Awaitility.await;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.greaterThanOrEqualTo;
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientTransactionsTest.java
 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientTransactionsTest.java
similarity index 99%
rename from 
modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientTransactionsTest.java
rename to 
modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientTransactionsTest.java
index 44209e6c62a..aedee88476b 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientTransactionsTest.java
+++ 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientTransactionsTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.runner.app.client;
+package org.apache.ignite.internal.client;
 
 import static java.lang.String.format;
 import static java.util.Collections.emptyList;
@@ -59,9 +59,6 @@ import java.util.stream.Stream;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.client.IgniteClient;
 import org.apache.ignite.internal.app.IgniteImpl;
-import org.apache.ignite.internal.client.ClientChannel;
-import org.apache.ignite.internal.client.ClientTransactionInflights;
-import org.apache.ignite.internal.client.TcpIgniteClient;
 import org.apache.ignite.internal.client.sql.ClientSql;
 import org.apache.ignite.internal.client.sql.PartitionMappingProvider;
 import org.apache.ignite.internal.client.table.ClientTable;
@@ -321,7 +318,7 @@ public class ItThinClientTransactionsTest extends 
ItAbstractThinClientTest {
         var ex = assertThrows(IgniteException.class, () -> kvView().put(tx, 1, 
"1"));
 
         String expected = "Unsupported transaction implementation: "
-                + "'class 
org.apache.ignite.internal.runner.app.client.ItThinClientTransactionsTest";
+                + "'class 
org.apache.ignite.internal.client.ItThinClientTransactionsTest";
 
         assertThat(ex.getMessage(), containsString(expected));
     }
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientTransactionsWithBrokenReplicatorTest.java
 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientTransactionsWithBrokenReplicatorTest.java
similarity index 98%
rename from 
modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientTransactionsWithBrokenReplicatorTest.java
rename to 
modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientTransactionsWithBrokenReplicatorTest.java
index 974b3d0c11d..4ba9185aba2 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientTransactionsWithBrokenReplicatorTest.java
+++ 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientTransactionsWithBrokenReplicatorTest.java
@@ -15,11 +15,11 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.runner.app.client;
+package org.apache.ignite.internal.client;
 
 import static 
org.apache.ignite.internal.ReplicationGroupsUtils.zonePartitionIds;
 import static org.apache.ignite.internal.TestWrappers.unwrapIgniteImpl;
-import static 
org.apache.ignite.internal.runner.app.client.ItThinClientTransactionsTest.generateKeysForPartition;
+import static 
org.apache.ignite.internal.client.ItThinClientTransactionsTest.generateKeysForPartition;
 import static 
org.apache.ignite.internal.testframework.IgniteTestUtils.getFieldValue;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientTransactionsWithReplicasTest.java
 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientTransactionsWithReplicasTest.java
similarity index 96%
rename from 
modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientTransactionsWithReplicasTest.java
rename to 
modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientTransactionsWithReplicasTest.java
index 9758348447c..61fb8f7eb21 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientTransactionsWithReplicasTest.java
+++ 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientTransactionsWithReplicasTest.java
@@ -15,9 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.runner.app.client;
+package org.apache.ignite.internal.client;
 
-import static 
org.apache.ignite.internal.runner.app.client.ItThinClientTransactionsTest.generateKeysForNode;
+import static 
org.apache.ignite.internal.client.ItThinClientTransactionsTest.generateKeysForNode;
 import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientTupleComputeMarshallingTest.java
 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientTupleComputeMarshallingTest.java
similarity index 99%
rename from 
modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientTupleComputeMarshallingTest.java
rename to 
modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientTupleComputeMarshallingTest.java
index d625415eb63..06c69995be6 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientTupleComputeMarshallingTest.java
+++ 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientTupleComputeMarshallingTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.runner.app.client;
+package org.apache.ignite.internal.client;
 
 import static java.util.concurrent.CompletableFuture.completedFuture;
 import static org.apache.ignite.internal.TestWrappers.unwrapIgniteImpl;
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientUninitializedClusterTest.java
 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientUninitializedClusterTest.java
similarity index 98%
rename from 
modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientUninitializedClusterTest.java
rename to 
modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientUninitializedClusterTest.java
index 2cf623583a5..c3d5b25608a 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientUninitializedClusterTest.java
+++ 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinClientUninitializedClusterTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.runner.app.client;
+package org.apache.ignite.internal.client;
 
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinConnectionFailoverTest.java
 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinConnectionFailoverTest.java
similarity index 98%
rename from 
modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinConnectionFailoverTest.java
rename to 
modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinConnectionFailoverTest.java
index bd8ab69ffab..83808131c0b 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinConnectionFailoverTest.java
+++ 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/ItThinConnectionFailoverTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.runner.app.client;
+package org.apache.ignite.internal.client;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/proxy/IgniteClientProxy.java
 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/proxy/IgniteClientProxy.java
similarity index 97%
rename from 
modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/proxy/IgniteClientProxy.java
rename to 
modules/client/src/integrationTest/java/org/apache/ignite/internal/client/proxy/IgniteClientProxy.java
index 09d84a0e863..2bb458688e2 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/proxy/IgniteClientProxy.java
+++ 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/proxy/IgniteClientProxy.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.runner.app.client.proxy;
+package org.apache.ignite.internal.client.proxy;
 
 import io.netty.bootstrap.ServerBootstrap;
 import io.netty.channel.ChannelFuture;
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/proxy/IgniteClientProxyBackendHandler.java
 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/proxy/IgniteClientProxyBackendHandler.java
similarity index 97%
rename from 
modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/proxy/IgniteClientProxyBackendHandler.java
rename to 
modules/client/src/integrationTest/java/org/apache/ignite/internal/client/proxy/IgniteClientProxyBackendHandler.java
index 7d88acc942e..aa78a792447 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/proxy/IgniteClientProxyBackendHandler.java
+++ 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/proxy/IgniteClientProxyBackendHandler.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.runner.app.client.proxy;
+package org.apache.ignite.internal.client.proxy;
 
 import io.netty.channel.Channel;
 import io.netty.channel.ChannelFutureListener;
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/proxy/IgniteClientProxyFrontendHandler.java
 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/proxy/IgniteClientProxyFrontendHandler.java
similarity index 98%
rename from 
modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/proxy/IgniteClientProxyFrontendHandler.java
rename to 
modules/client/src/integrationTest/java/org/apache/ignite/internal/client/proxy/IgniteClientProxyFrontendHandler.java
index a3e81b2ff8c..735abd388a9 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/proxy/IgniteClientProxyFrontendHandler.java
+++ 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/proxy/IgniteClientProxyFrontendHandler.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.runner.app.client.proxy;
+package org.apache.ignite.internal.client.proxy;
 
 import io.netty.bootstrap.Bootstrap;
 import io.netty.buffer.Unpooled;
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/proxy/IgniteClientProxyInitializer.java
 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/proxy/IgniteClientProxyInitializer.java
similarity index 97%
rename from 
modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/proxy/IgniteClientProxyInitializer.java
rename to 
modules/client/src/integrationTest/java/org/apache/ignite/internal/client/proxy/IgniteClientProxyInitializer.java
index 54e9b8a2a3f..c6fa82d73ff 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/proxy/IgniteClientProxyInitializer.java
+++ 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/client/proxy/IgniteClientProxyInitializer.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.runner.app.client.proxy;
+package org.apache.ignite.internal.client.proxy;
 
 import io.netty.channel.ChannelHandlerContext;
 import io.netty.channel.ChannelInboundHandlerAdapter;
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/streamer/ItAbstractDataStreamerTest.java
 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/streamer/ItAbstractDataStreamerTest.java
similarity index 99%
rename from 
modules/runner/src/integrationTest/java/org/apache/ignite/internal/streamer/ItAbstractDataStreamerTest.java
rename to 
modules/client/src/integrationTest/java/org/apache/ignite/internal/streamer/ItAbstractDataStreamerTest.java
index 97b7938b71a..079395185be 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/streamer/ItAbstractDataStreamerTest.java
+++ 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/streamer/ItAbstractDataStreamerTest.java
@@ -61,7 +61,6 @@ import org.apache.ignite.lang.MarshallerException;
 import org.apache.ignite.marshalling.ByteArrayMarshaller;
 import org.apache.ignite.marshalling.Marshaller;
 import org.apache.ignite.network.ClusterNode;
-import org.apache.ignite.raft.jraft.test.TestUtils;
 import org.apache.ignite.sql.IgniteSql;
 import org.apache.ignite.sql.ResultSet;
 import org.apache.ignite.sql.SqlRow;
@@ -739,7 +738,7 @@ public abstract class ItAbstractDataStreamerTest extends 
ClusterPerClassIntegrat
     }
 
     @Test
-    public void testFailedItems() {
+    public void testFailedItems() throws InterruptedException {
         RecordView<Tuple> view = defaultTable().recordView();
 
         CompletableFuture<Void> streamerFut;
@@ -756,14 +755,14 @@ public abstract class ItAbstractDataStreamerTest extends 
ClusterPerClassIntegrat
 
             streamerFut = view.streamData(publisher, options);
 
-            assertTrue(TestUtils.waitForCondition(() -> publisher.requested() 
> 0, 5000));
+            assertTrue(waitForCondition(() -> publisher.requested() > 0, 
5000));
 
             // Submit valid items.
             for (int i = 0; i < 100; i++) {
                 publisher.submit(DataStreamerItem.of(tuple(i, "foo-" + i)));
             }
 
-            assertTrue(TestUtils.waitForCondition(() -> view.contains(null, 
tupleKey(99)), 5000));
+            assertTrue(waitForCondition(() -> view.contains(null, 
tupleKey(99)), 5000));
 
             // Submit invalid items.
             for (int i = 200; i < 300; i++) {
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/streamer/ItClientDataStreamerLoadTest.java
 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/streamer/ItClientDataStreamerLoadTest.java
similarity index 100%
rename from 
modules/runner/src/integrationTest/java/org/apache/ignite/internal/streamer/ItClientDataStreamerLoadTest.java
rename to 
modules/client/src/integrationTest/java/org/apache/ignite/internal/streamer/ItClientDataStreamerLoadTest.java
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/streamer/ItClientDataStreamerTest.java
 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/streamer/ItClientDataStreamerTest.java
similarity index 100%
rename from 
modules/runner/src/integrationTest/java/org/apache/ignite/internal/streamer/ItClientDataStreamerTest.java
rename to 
modules/client/src/integrationTest/java/org/apache/ignite/internal/streamer/ItClientDataStreamerTest.java
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/streamer/ItServerDataStreamerTest.java
 
b/modules/client/src/integrationTest/java/org/apache/ignite/internal/streamer/ItServerDataStreamerTest.java
similarity index 100%
rename from 
modules/runner/src/integrationTest/java/org/apache/ignite/internal/streamer/ItServerDataStreamerTest.java
rename to 
modules/client/src/integrationTest/java/org/apache/ignite/internal/streamer/ItServerDataStreamerTest.java
diff --git a/modules/platforms/cpp/tests/client-test/compute_test.cpp 
b/modules/platforms/cpp/tests/client-test/compute_test.cpp
index d54f57c5553..2025eee0230 100644
--- a/modules/platforms/cpp/tests/client-test/compute_test.cpp
+++ b/modules/platforms/cpp/tests/client-test/compute_test.cpp
@@ -201,7 +201,7 @@ TEST_F(compute_test, job_error_propagates_to_client) {
                 // TODO https://issues.apache.org/jira/browse/IGNITE-19603
                 // EXPECT_THAT(e.what_str(),
                 //     testing::HasSubstr(
-                //         
"org.apache.ignite.internal.runner.app.client.ItThinClientComputeTest$CustomException"));
+                //         
"org.apache.ignite.internal.runner.app.Jobs$CustomException"));
                 // EXPECT_THAT(e.what_str(), testing::HasSubstr("IGN-TBL-3"));
                 throw;
             }
diff --git a/modules/platforms/cpp/tests/client-test/ignite_runner_suite.h 
b/modules/platforms/cpp/tests/client-test/ignite_runner_suite.h
index 932aeca99cf..edc97733394 100644
--- a/modules/platforms/cpp/tests/client-test/ignite_runner_suite.h
+++ b/modules/platforms/cpp/tests/client-test/ignite_runner_suite.h
@@ -48,16 +48,15 @@ public:
 
     inline static const std::string ENABLE_AUTHN_JOB = 
PLATFORM_TEST_NODE_RUNNER + "$EnableAuthenticationJob";
 
-    inline static const std::string IT_THIN_CLIENT_COMPUTE_TEST =
-        "org.apache.ignite.internal.runner.app.client.ItThinClientComputeTest";
-
-    inline static const std::string NODE_NAME_JOB = 
IT_THIN_CLIENT_COMPUTE_TEST + "$NodeNameJob";
-    inline static const std::string SLEEP_JOB = IT_THIN_CLIENT_COMPUTE_TEST + 
"$SleepJob";
-    inline static const std::string TO_STRING_JOB = 
IT_THIN_CLIENT_COMPUTE_TEST + "$ToStringJob";
-    inline static const std::string CONCAT_JOB = IT_THIN_CLIENT_COMPUTE_TEST + 
"$ConcatJob";
-    inline static const std::string ERROR_JOB = IT_THIN_CLIENT_COMPUTE_TEST + 
"$IgniteExceptionJob";
-    inline static const std::string ECHO_JOB = IT_THIN_CLIENT_COMPUTE_TEST + 
"$EchoJob";
-    inline static const std::string RETURN_NULL_JOB = 
IT_THIN_CLIENT_COMPUTE_TEST + "$ReturnNullJob";
+    inline static const std::string JOBS = 
"org.apache.ignite.internal.runner.app.Jobs";
+
+    inline static const std::string NODE_NAME_JOB = JOBS + "$NodeNameJob";
+    inline static const std::string SLEEP_JOB = JOBS + "$SleepJob";
+    inline static const std::string TO_STRING_JOB = JOBS + "$ToStringJob";
+    inline static const std::string CONCAT_JOB = JOBS + "$ConcatJob";
+    inline static const std::string ERROR_JOB = JOBS + "$IgniteExceptionJob";
+    inline static const std::string ECHO_JOB = JOBS + "$EchoJob";
+    inline static const std::string RETURN_NULL_JOB = JOBS + "$ReturnNullJob";
 
     static constexpr const char *KEY_COLUMN = "KEY";
     static constexpr const char *VAL_COLUMN = "VAL";
diff --git 
a/modules/platforms/dotnet/Apache.Ignite.Benchmarks/Compute/PlatformJobBenchmarks.cs
 
b/modules/platforms/dotnet/Apache.Ignite.Benchmarks/Compute/PlatformJobBenchmarks.cs
index 3112bc15019..79b5cd51eaf 100644
--- 
a/modules/platforms/dotnet/Apache.Ignite.Benchmarks/Compute/PlatformJobBenchmarks.cs
+++ 
b/modules/platforms/dotnet/Apache.Ignite.Benchmarks/Compute/PlatformJobBenchmarks.cs
@@ -68,7 +68,7 @@ public class PlatformJobBenchmarks : ServerBenchmarkBase
             Options: new() { ExecutorType = JobExecutorType.DotNetSidecar });
 
         _echoJobJava = new(
-            
"org.apache.ignite.internal.runner.app.client.ItThinClientComputeTest$EchoJob", 
[_unit]);
+            "org.apache.ignite.internal.runner.app.Jobs$EchoJob", [_unit]);
 
         var nodes = await Client.GetClusterNodesAsync();
         var firstNode = nodes.Single(x => 
x.Name.EndsWith("PlatformTestNodeRunner", StringComparison.Ordinal));
diff --git 
a/modules/platforms/dotnet/Apache.Ignite.Tests.Common/Compute/JavaJobs.cs 
b/modules/platforms/dotnet/Apache.Ignite.Tests.Common/Compute/JavaJobs.cs
index 0f790a9bdca..8ea53d2e3c3 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Tests.Common/Compute/JavaJobs.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Tests.Common/Compute/JavaJobs.cs
@@ -23,21 +23,21 @@ public static class JavaJobs
 {
     public const string PlatformTestNodeRunner = 
"org.apache.ignite.internal.runner.app.PlatformTestNodeRunner";
 
-    public const string ItThinClientComputeTest = 
"org.apache.ignite.internal.runner.app.client.ItThinClientComputeTest";
+    public const string Jobs = "org.apache.ignite.internal.runner.app.Jobs";
 
-    public static readonly JobDescriptor<object?, string> NodeNameJob = 
new(ItThinClientComputeTest + "$NodeNameJob");
+    public static readonly JobDescriptor<object?, string> NodeNameJob = 
new(Jobs + "$NodeNameJob");
 
-    public static readonly JobDescriptor<string?, string> ConcatJob = 
new(ItThinClientComputeTest + "$ConcatJob");
+    public static readonly JobDescriptor<string?, string> ConcatJob = new(Jobs 
+ "$ConcatJob");
 
-    public static readonly JobDescriptor<string, string> ErrorJob = 
new(ItThinClientComputeTest + "$IgniteExceptionJob");
+    public static readonly JobDescriptor<string, string> ErrorJob = new(Jobs + 
"$IgniteExceptionJob");
 
-    public static readonly JobDescriptor<object?, object> EchoJob = 
new(ItThinClientComputeTest + "$EchoJob");
+    public static readonly JobDescriptor<object?, object> EchoJob = new(Jobs + 
"$EchoJob");
 
-    public static readonly JobDescriptor<object, string> ToStringJob = 
new(ItThinClientComputeTest + "$ToStringJob");
+    public static readonly JobDescriptor<object, string> ToStringJob = 
new(Jobs + "$ToStringJob");
 
-    public static readonly JobDescriptor<int, string> SleepJob = 
new(ItThinClientComputeTest + "$SleepJob");
+    public static readonly JobDescriptor<int, string> SleepJob = new(Jobs + 
"$SleepJob");
 
-    public static readonly JobDescriptor<string, BigDecimal> DecimalJob = 
new(ItThinClientComputeTest + "$DecimalJob");
+    public static readonly JobDescriptor<string, BigDecimal> DecimalJob = 
new(Jobs + "$DecimalJob");
 
     public static readonly JobDescriptor<string, string> CreateTableJob = 
new(PlatformTestNodeRunner + "$CreateTableJob");
 
@@ -49,15 +49,15 @@ public static class JavaJobs
 
     public static readonly JobDescriptor<long, int> PartitionJob = 
new(PlatformTestNodeRunner + "$PartitionJob");
 
-    public static readonly TaskDescriptor<string, string> NodeNameTask = 
new(ItThinClientComputeTest + "$MapReduceNodeNameTask");
+    public static readonly TaskDescriptor<string, string> NodeNameTask = 
new(Jobs + "$MapReduceNodeNameTask");
 
     public static readonly TaskDescriptor<int, object?> SleepTask = 
new(PlatformTestNodeRunner + "$SleepTask");
 
     public static readonly TaskDescriptor<object?, object?> SplitExceptionTask 
=
-        new(ItThinClientComputeTest + "$MapReduceExceptionOnSplitTask");
+        new(Jobs + "$MapReduceExceptionOnSplitTask");
 
     public static readonly TaskDescriptor<object?, object?> 
ReduceExceptionTask =
-        new(ItThinClientComputeTest + "$MapReduceExceptionOnReduceTask");
+        new(Jobs + "$MapReduceExceptionOnReduceTask");
 
     public static readonly JobDescriptor<int, string> ExceptionCodeAsStringJob 
= new(PlatformTestNodeRunner + "$ExceptionCodeAsStringJob");
 }
diff --git 
a/modules/platforms/dotnet/Apache.Ignite.Tests/Compute/ComputeTests.cs 
b/modules/platforms/dotnet/Apache.Ignite.Tests/Compute/ComputeTests.cs
index 10ee0717e53..90db3da5ebd 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Tests/Compute/ComputeTests.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Tests/Compute/ComputeTests.cs
@@ -157,7 +157,7 @@ namespace Apache.Ignite.Tests.Compute
             StringAssert.Contains("Custom job error", ex!.Message);
 
             StringAssert.StartsWith(
-                
"org.apache.ignite.internal.runner.app.client.ItThinClientComputeTest$CustomException",
+                "org.apache.ignite.internal.runner.app.Jobs$CustomException",
                 ex.InnerException!.Message);
 
             Assert.AreEqual(ErrorGroups.Table.ColumnNotFound, ex.Code);
@@ -951,7 +951,7 @@ namespace Apache.Ignite.Tests.Compute
 
             // Result - exception.
             Assert.AreEqual("Custom job error", ex.Message);
-            StringAssert.Contains("ItThinClientComputeTest$CustomException", 
ex.InnerException!.Message);
+            StringAssert.Contains("Jobs$CustomException", 
ex.InnerException!.Message);
             Assert.AreEqual(ErrorGroups.Table.ColumnNotFound, ex.Code);
 
             // Failed task state.
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/Jobs.java
 
b/modules/runner/src/testFixtures/java/org/apache/ignite/internal/runner/app/Jobs.java
similarity index 73%
rename from 
modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/Jobs.java
rename to 
modules/runner/src/testFixtures/java/org/apache/ignite/internal/runner/app/Jobs.java
index d546e0ea22e..c7a33174435 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/Jobs.java
+++ 
b/modules/runner/src/testFixtures/java/org/apache/ignite/internal/runner/app/Jobs.java
@@ -20,21 +20,29 @@ package org.apache.ignite.internal.runner.app;
 import static java.util.Comparator.comparing;
 import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.stream.Collectors.toList;
+import static 
org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
+import static org.apache.ignite.lang.ErrorGroups.Table.COLUMN_NOT_FOUND_ERR;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import java.io.IOException;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.UUID;
 import java.util.concurrent.CompletableFuture;
+import java.util.stream.Collectors;
 import org.apache.ignite.compute.ComputeJob;
 import org.apache.ignite.compute.JobDescriptor;
 import org.apache.ignite.compute.JobExecutionContext;
 import org.apache.ignite.compute.task.MapReduceJob;
 import org.apache.ignite.compute.task.MapReduceTask;
 import org.apache.ignite.compute.task.TaskExecutionContext;
+import org.apache.ignite.lang.IgniteException;
 import org.apache.ignite.marshalling.ByteArrayMarshaller;
 import org.apache.ignite.marshalling.Marshaller;
 import org.apache.ignite.network.ClusterNode;
@@ -475,4 +483,151 @@ public class Jobs {
             this.secondString = secondString;
         }
     }
+
+    /** Trace ID used in exception jobs for testing purposes. */
+    public static final UUID TRACE_ID = UUID.randomUUID();
+
+    /** Returns node name concatenated with optional argument. */
+    public static class NodeNameJob implements ComputeJob<Object, String> {
+        @Override
+        public CompletableFuture<String> executeAsync(JobExecutionContext 
context, Object arg) {
+            return completedFuture(context.ignite().name() + (arg == null ? "" 
: arg.toString()));
+        }
+    }
+
+    /** Concatenates colon-separated args using underscore. */
+    public static class ConcatJob implements ComputeJob<String, String> {
+        @Override
+        public CompletableFuture<String> executeAsync(JobExecutionContext 
context, String args) {
+            if (args == null) {
+                return nullCompletedFuture();
+            }
+
+            return completedFuture(
+                    Arrays.stream(args.split(":"))
+                            .map(o -> o == null ? "null" : o)
+                            .collect(Collectors.joining("_")));
+        }
+    }
+
+    /** Custom exception class for testing. */
+    public static class CustomException extends IgniteException {
+        public CustomException(UUID traceId, int code, String message, 
Throwable cause) {
+            super(traceId, code, message, cause);
+        }
+    }
+
+    /** Throws a custom Ignite exception. */
+    public static class IgniteExceptionJob implements ComputeJob<Object, 
String> {
+        @Override
+        public CompletableFuture<String> executeAsync(JobExecutionContext 
context, Object args) {
+            throw new CustomException(TRACE_ID, COLUMN_NOT_FOUND_ERR, "Custom 
job error", null);
+        }
+    }
+
+    /** Echoes the argument back. */
+    public static class EchoJob implements ComputeJob<Object, Object> {
+        @Override
+        public CompletableFuture<Object> executeAsync(JobExecutionContext 
context, Object arg) {
+            return completedFuture(arg);
+        }
+    }
+
+    /** Returns the string representation of the argument. */
+    public static class ToStringJob implements ComputeJob<Object, String> {
+        @Override
+        public CompletableFuture<String> executeAsync(JobExecutionContext 
context, Object arg) {
+            if (arg instanceof byte[]) {
+                return completedFuture(Arrays.toString((byte[]) arg));
+            }
+
+            return completedFuture(arg.toString());
+        }
+    }
+
+    /** Sleeps for the specified number of milliseconds. */
+    public static class SleepJob implements ComputeJob<Integer, Void> {
+        @Override
+        public @Nullable CompletableFuture<Void> 
executeAsync(JobExecutionContext context, Integer sleepMs) {
+            try {
+                Thread.sleep(sleepMs);
+            } catch (InterruptedException e) {
+                throw new RuntimeException(e);
+            }
+
+            return null;
+        }
+    }
+
+    /** Parses and scales a decimal number. */
+    public static class DecimalJob implements ComputeJob<String, BigDecimal> {
+        @Override
+        public CompletableFuture<BigDecimal> executeAsync(JobExecutionContext 
context, String arg) {
+            @SuppressWarnings("DataFlowIssue")
+            var args = arg.split(",", 2);
+
+            return completedFuture(new 
BigDecimal(args[0]).setScale(Integer.parseInt(args[1]), RoundingMode.HALF_UP));
+        }
+    }
+
+    /** Always returns null. */
+    public static class ReturnNullJob implements ComputeJob<Void, String> {
+        @Override
+        public @Nullable CompletableFuture<String> 
executeAsync(JobExecutionContext context, @Nullable Void arg) {
+            return null;
+        }
+    }
+
+    /** MapReduce task that collects node names. */
+    public static class MapReduceNodeNameTask implements MapReduceTask<String, 
Object, String, String> {
+        @Override
+        public CompletableFuture<List<MapReduceJob<Object, String>>> 
splitAsync(TaskExecutionContext context, String args) {
+            return completedFuture(context.ignite().cluster().nodes().stream()
+                    .map(node -> MapReduceJob.<Object, String>builder()
+                            
.jobDescriptor(JobDescriptor.builder(NodeNameJob.class).build())
+                            .nodes(Set.of(node))
+                            .args(args)
+                            .build())
+                    .collect(Collectors.toList()));
+        }
+
+        @Override
+        public CompletableFuture<String> reduceAsync(TaskExecutionContext 
context, Map<UUID, String> results) {
+            return completedFuture(results.values().stream()
+                    .map(String.class::cast)
+                    .collect(Collectors.joining(",")));
+        }
+    }
+
+    /** MapReduce task that throws a custom exception during split. */
+    public static class MapReduceExceptionOnSplitTask implements 
MapReduceTask<Object, Object, Object, String> {
+        @Override
+        public CompletableFuture<List<MapReduceJob<Object, Object>>> 
splitAsync(TaskExecutionContext context, Object args) {
+            throw new CustomException(TRACE_ID, COLUMN_NOT_FOUND_ERR, "Custom 
job error", null);
+        }
+
+        @Override
+        public CompletableFuture<String> reduceAsync(TaskExecutionContext 
context, Map<UUID, Object> results) {
+            return completedFuture("expected split exception");
+        }
+    }
+
+    /** MapReduce task that throws a custom exception during reduce. */
+    public static class MapReduceExceptionOnReduceTask implements 
MapReduceTask<Object, Object, String, String> {
+        @Override
+        public CompletableFuture<List<MapReduceJob<Object, String>>> 
splitAsync(TaskExecutionContext context, Object args) {
+            return completedFuture(context.ignite().cluster().nodes().stream()
+                    .map(node -> MapReduceJob.<Object, String>builder()
+                            
.jobDescriptor(JobDescriptor.builder(NodeNameJob.class).build())
+                            .nodes(Set.of(node))
+                            .args(args)
+                            .build())
+                    .collect(Collectors.toList()));
+        }
+
+        @Override
+        public CompletableFuture<String> reduceAsync(TaskExecutionContext 
context, Map<UUID, String> results) {
+            throw new CustomException(TRACE_ID, COLUMN_NOT_FOUND_ERR, "Custom 
job error", null);
+        }
+    }
 }


Reply via email to