You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sh...@apache.org on 2016/11/01 02:37:25 UTC

[06/50] [abbrv] ignite git commit: IGNITE-3019 Implement config variations test for IgniteCompute

IGNITE-3019 Implement config variations test for IgniteCompute


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/24b24bf8
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/24b24bf8
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/24b24bf8

Branch: refs/heads/ignite-2788
Commit: 24b24bf8a8fedac55d41f69ebf75e08975ff1bea
Parents: b674865
Author: sboikov <sb...@gridgain.com>
Authored: Fri Apr 22 16:44:39 2016 +0300
Committer: shtykh_roman <rs...@yahoo.com>
Committed: Fri May 13 16:11:14 2016 +0900

----------------------------------------------------------------------
 ...gniteComputeConfigVariationsFullApiTest.java | 2009 ++++++++++++++++++
 .../configvariations/ConfigVariations.java      |    2 +-
 .../IgniteConfigVariationsAbstractTest.java     |   43 +-
 ...teBasicConfigVariationsFullApiTestSuite.java |   72 +
 4 files changed, 2124 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/24b24bf8/modules/core/src/test/java/org/apache/ignite/internal/processors/compute/IgniteComputeConfigVariationsFullApiTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/compute/IgniteComputeConfigVariationsFullApiTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/compute/IgniteComputeConfigVariationsFullApiTest.java
new file mode 100644
index 0000000..81cdb15
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/compute/IgniteComputeConfigVariationsFullApiTest.java
@@ -0,0 +1,2009 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.compute;
+
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import javax.cache.configuration.Factory;
+import org.apache.ignite.Ignite;
+import org.apache.ignite.IgniteCompute;
+import org.apache.ignite.IgniteException;
+import org.apache.ignite.binary.BinaryObjectException;
+import org.apache.ignite.binary.BinaryReader;
+import org.apache.ignite.binary.BinaryWriter;
+import org.apache.ignite.binary.Binarylizable;
+import org.apache.ignite.compute.ComputeJob;
+import org.apache.ignite.compute.ComputeJobAdapter;
+import org.apache.ignite.compute.ComputeJobResult;
+import org.apache.ignite.compute.ComputeTaskFuture;
+import org.apache.ignite.compute.ComputeTaskSplitAdapter;
+import org.apache.ignite.internal.util.typedef.T2;
+import org.apache.ignite.lang.IgniteCallable;
+import org.apache.ignite.lang.IgniteClosure;
+import org.apache.ignite.lang.IgniteReducer;
+import org.apache.ignite.lang.IgniteRunnable;
+import org.apache.ignite.testframework.junits.IgniteConfigVariationsAbstractTest;
+import org.jetbrains.annotations.Nullable;
+import org.junit.Assert;
+
+/**
+ * Full API compute test.
+ */
+@SuppressWarnings("unchecked")
+public class IgniteComputeConfigVariationsFullApiTest extends IgniteConfigVariationsAbstractTest {
+    /** Max job count. */
+    private static final int MAX_JOB_COUNT = 10;
+
+    /** Test cache name. */
+    private static final String CACHE_NAME = "test";
+
+    /** */
+    private static final String STR_VAL = "string value";
+
+    /** */
+    private static final Object[] ARRAY_VAL = {"str0", "str1", "str2"};
+
+    /** Job factories. */
+    private static final JobFactory[] jobFactories = new JobFactory[] {
+        new JobFactory(EchoJob.class),
+        new JobFactory(EchoJobExternalizable.class),
+        new JobFactory(EchoJobBinarylizable.class)
+    };
+
+    /** Closure factories. */
+    private static final Factory[] closureFactories = new Factory[] {
+        new JobFactory(EchoClosure.class),
+        new JobFactory(EchoClosureExternalizable.class),
+        new JobFactory(EchoClosureBinarylizable.class)
+    };
+
+    /** Callable factories. */
+    private static final Factory[] callableFactories = new Factory[] {
+        new JobFactory(EchoCallable.class),
+        new JobFactory(EchoCallableExternalizable.class),
+        new JobFactory(EchoCallableBinarylizable.class)
+    };
+
+    /** Runnable factories. */
+    private static final Factory[] runnableFactories = new Factory[] {
+        new JobFactory(ComputeTestRunnable.class),
+        new JobFactory(ComputeTestRunnableExternalizable.class),
+        new JobFactory(ComputeTestRunnableBinarylizable.class)
+    };
+
+    /**
+     * @param expCnt Expected count.
+     * @param results Results.
+     * @param dataCls Data class.
+     */
+    private static void checkResultsClassCount(final int expCnt, final Collection<Object> results,
+        final Class dataCls) {
+        int cnt = 0;
+
+        for (Object o : results) {
+            if ((o != null) && dataCls.equals(o.getClass()))
+                ++cnt;
+        }
+
+        assertEquals("Count of the result objects' type mismatch (null values are filtered)", expCnt, cnt);
+    }
+
+    /**
+     * @return Expected valid result.
+     */
+    private Collection<Object> createGoldenResults() {
+        Collection<Object> results = new ArrayList<>(MAX_JOB_COUNT);
+
+        for (int i = 0; i < MAX_JOB_COUNT; ++i)
+            results.add(value(i - 1));
+
+        return results;
+    }
+
+    /**
+     * @param msg Message.
+     * @param exp Expected.
+     * @param act Action.
+     */
+    private <E> void assertCollectionsEquals(String msg, Collection<E> exp, Collection<E> act) {
+        assertEquals(msg + "; Size are different", exp.size(), act.size());
+
+        for (Object o : exp) {
+            if (!act.contains(o)) {
+                error("Expected: " + exp.toString());
+                error("Actual: " + act.toString());
+
+                assertTrue(msg + String.format("; actual collection doesn't contain the object [%s]", o), false);
+            }
+        }
+    }
+
+    /**
+     * The test's wrapper provides variations of the argument data model and user factories. The test is launched {@code
+     * factories.length * DataMode.values().length} times with each datamodel and each factory.
+     *
+     * @param test Test.
+     * @param factories various factories
+     * @throws Exception If failed.
+     */
+    protected void runTest(final Factory[] factories, final ComputeTest test) throws Exception {
+        runInAllDataModes(new TestRunnable() {
+            @Override public void run() throws Exception {
+                for (int i = 0; i < factories.length; i++) {
+                    Factory factory = factories[i];
+
+                    info("Running test with jobs model: " + factory.create().getClass().getSimpleName());
+
+                    if (i != 0)
+                        beforeTest();
+
+                    try {
+                        test.test(factory, grid(testedNodeIdx));
+                    }
+                    finally {
+                        if (i + 1 != factories.length)
+                            afterTest();
+                    }
+                }
+            }
+        });
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testExecuteTaskClass() throws Exception {
+        runTest(jobFactories, new ComputeTest() {
+            @Override public void test(Factory factory, Ignite ignite) throws Exception {
+                // Begin with negative to check 'null' value in the test.
+                final int[] i = {-1};
+
+                List<Object> results = ignite.compute().execute(
+                    TestTask.class,
+                    new T2<>((Factory<ComputeJobAdapter>)factory,
+                        (Factory<Object>)new Factory<Object>() {
+                            @Override public Object create() {
+                                return value(i[0]++);
+                            }
+                        }));
+
+                checkResultsClassCount(MAX_JOB_COUNT - 1, results, value(0).getClass());
+                assertCollectionsEquals("Results value mismatch", createGoldenResults(), results);
+            }
+        });
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testExecuteTask() throws Exception {
+        runTest(jobFactories, new ComputeTest() {
+            @Override public void test(Factory factory, Ignite ignite) throws Exception {
+                // Begin with negative to check 'null' value in the test.
+                final int[] i = {-1};
+
+                List<Object> results = ignite.compute().execute(new TestTask(),
+                    new T2<>((Factory<ComputeJobAdapter>)factory,
+                        (Factory<Object>)new Factory<Object>() {
+                            @Override public Object create() {
+                                return value(i[0]++);
+                            }
+                        }));
+
+                checkResultsClassCount(MAX_JOB_COUNT - 1, results, value(0).getClass());
+                assertCollectionsEquals("Results value mismatch", createGoldenResults(), results);
+            }
+        });
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testBroadcastClosure() throws Exception {
+        runTest(closureFactories, new ComputeTest() {
+            @Override public void test(Factory factory, Ignite ignite) throws Exception {
+                final Collection<Object> resultsAllNull = ignite.compute()
+                    .broadcast((IgniteClosure<Object, Object>)factory.create(), null);
+
+                assertEquals("Result's size mismatch: job must be run on all server nodes",
+                    gridCount() - clientsCount(), resultsAllNull.size());
+
+                for (Object o : resultsAllNull)
+                    assertNull("All results must be null", o);
+
+                Collection<Object> resultsNotNull = ignite.compute()
+                    .broadcast((IgniteClosure<Object, Object>)factory.create(), value(0));
+
+                checkResultsClassCount(gridCount() - clientsCount(), resultsNotNull, value(0).getClass());
+            }
+        });
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testBroadcastCallable() throws Exception {
+        runTest(callableFactories, new ComputeTest() {
+            @Override public void test(Factory factory, Ignite ignite) throws Exception {
+                EchoCallable job = (EchoCallable)factory.create();
+                job.setArg(null);
+
+                final Collection<Object> resultsAllNull = ignite.compute()
+                    .broadcast(job);
+
+                assertEquals("Result's size mismatch: job must be run on all server nodes",
+                    gridCount() - clientsCount(), resultsAllNull.size());
+
+                for (Object o : resultsAllNull)
+                    assertNull("All results must be null", o);
+
+                job.setArg(value(0));
+                Collection<Object> resultsNotNull = ignite.compute()
+                    .broadcast(job);
+
+                checkResultsClassCount(gridCount() - clientsCount(), resultsNotNull, value(0).getClass());
+                for (Object o : resultsNotNull)
+                    assertEquals("Invalid broadcast results", value(0), o);
+            }
+        });
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testBroadcastRunnable() throws Exception {
+        runTest(runnableFactories, new ComputeTest() {
+            @Override public void test(Factory factory, Ignite ignite) throws Exception {
+                IgniteRunnable job = (IgniteRunnable)factory.create();
+
+                ignite.compute().broadcast(job);
+                // All checks are inside the run() method of the job.
+            }
+        });
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testRun() throws Exception {
+        runTest(runnableFactories, new ComputeTest() {
+            @Override public void test(Factory factory, Ignite ignite) throws Exception {
+                IgniteRunnable job = (IgniteRunnable)factory.create();
+
+                ignite.compute().run(job);
+                // All checks are inside the run() method of the job.
+
+                Collection<IgniteRunnable> jobs = new ArrayList<>(MAX_JOB_COUNT);
+
+                for (int i = 0; i < MAX_JOB_COUNT; ++i)
+                    jobs.add((IgniteRunnable)factory.create());
+
+                ignite.compute().run(jobs);
+                // All checks are inside the run() method of the job.
+            }
+        });
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testApplyAsync() throws Exception {
+        runTest(closureFactories, new ComputeTest() {
+            @Override public void test(Factory factory, Ignite ignite) throws Exception {
+                final IgniteCompute comp = ignite.compute().withAsync();
+
+                Collection<ComputeTaskFuture<Object>> futures = new ArrayList<>(MAX_JOB_COUNT);
+
+                for (int i = 0; i < MAX_JOB_COUNT; ++i) {
+                    // value(i - 1): use negative argument of the value method to generate nullong value.
+                    comp.apply((IgniteClosure<Object, Object>)factory.create(), value(i - 1));
+
+                    futures.add(comp.future());
+                }
+
+                // Wait for results.
+                Collection<Object> results = new ArrayList<>(MAX_JOB_COUNT);
+
+                for (ComputeTaskFuture<Object> future : futures)
+                    results.add(future.get());
+
+                checkResultsClassCount(MAX_JOB_COUNT - 1, results, value(0).getClass());
+                assertCollectionsEquals("Results value mismatch", createGoldenResults(), results);
+            }
+        });
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testApplySync() throws Exception {
+        runTest(closureFactories, new ComputeTest() {
+            @Override public void test(Factory factory, Ignite ignite) throws Exception {
+                Collection<Object> results = new ArrayList<>(MAX_JOB_COUNT);
+
+                for (int i = 0; i < MAX_JOB_COUNT; ++i) {
+                    // value(i - 1): use negative argument of the value method to generate nullong value.
+                    results.add(ignite.compute().apply((IgniteClosure<Object, Object>)factory.create(), value(i - 1)));
+                }
+
+                checkResultsClassCount(MAX_JOB_COUNT - 1, results, value(0).getClass());
+                assertCollectionsEquals("Results value mismatch", createGoldenResults(), results);
+            }
+        });
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testApplyForCollection() throws Exception {
+        runTest(closureFactories, new ComputeTest() {
+            @Override public void test(Factory factory, Ignite ignite) throws Exception {
+                Collection<TestObject> params = new ArrayList<>(MAX_JOB_COUNT);
+
+                for (int i = 0; i < MAX_JOB_COUNT; ++i) {
+                    // value(i - 1): use negative argument of the value method to generate nullong value.
+                    // Use type casting to avoid ambiguous for apply(Callable, Object) vs apply(Callable, Collection<Object>).
+                    params.add((TestObject)value(i - 1));
+                }
+
+                Collection<Object> results = ignite.compute()
+                    .apply((IgniteClosure<TestObject, Object>)factory.create(), params);
+
+                checkResultsClassCount(MAX_JOB_COUNT - 1, results, value(0).getClass());
+                assertCollectionsEquals("Results value mismatch", createGoldenResults(), results);
+            }
+        });
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testApplyForCollectionWithReducer() throws Exception {
+        runTest(closureFactories, new ComputeTest() {
+            @Override public void test(Factory factory, Ignite ignite) throws Exception {
+                Collection<Object> params = new ArrayList<>(MAX_JOB_COUNT);
+
+                for (int i = 0; i < MAX_JOB_COUNT; ++i) {
+                    // value(i - 1): use negative argument of the value method to generate nullong value.
+                    params.add(value(i - 1));
+                }
+
+                boolean res = ignite.compute()
+                    .apply((IgniteClosure<Object, Object>)factory.create(), params, new IgniteReducer<Object, Boolean>() {
+
+                        private Collection<Object> results = new ArrayList<>(MAX_JOB_COUNT);
+
+                        @Override public boolean collect(@Nullable Object o) {
+                            results.add(o);
+                            return true;
+                        }
+
+                        @Override public Boolean reduce() {
+                            checkResultsClassCount(MAX_JOB_COUNT - 1, results, value(0).getClass());
+                            assertCollectionsEquals("Results value mismatch", createGoldenResults(), results);
+                            return true;
+                        }
+                    });
+                assertTrue(res);
+            }
+        });
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testCallAsync() throws Exception {
+        runTest(callableFactories, new ComputeTest() {
+            @Override public void test(Factory factory, Ignite ignite) throws Exception {
+                final IgniteCompute comp = ignite.compute().withAsync();
+
+                Collection<ComputeTaskFuture<Object>> futures = new ArrayList<>(MAX_JOB_COUNT);
+
+                for (int i = 0; i < MAX_JOB_COUNT; ++i) {
+                    EchoCallable job = (EchoCallable)factory.create();
+                    job.setArg(value(i - 1));
+
+                    comp.call(job);
+                    futures.add(comp.future());
+                }
+
+                // Wait for results.
+                Collection<Object> results = new ArrayList<>(MAX_JOB_COUNT);
+                for (ComputeTaskFuture<Object> future : futures)
+                    results.add(future.get());
+
+                checkResultsClassCount(MAX_JOB_COUNT - 1, results, value(0).getClass());
+                assertCollectionsEquals("Results value mismatch", createGoldenResults(), results);
+            }
+        });
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testCallSync() throws Exception {
+        runTest(callableFactories, new ComputeTest() {
+            @Override public void test(Factory factory, Ignite ignite) throws Exception {
+                Collection<Object> results = new ArrayList<>(MAX_JOB_COUNT);
+
+                for (int i = 0; i < MAX_JOB_COUNT; ++i) {
+                    EchoCallable job = (EchoCallable)factory.create();
+                    job.setArg(value(i - 1));
+                    results.add(ignite.compute().call(job));
+                }
+
+                checkResultsClassCount(MAX_JOB_COUNT - 1, results, value(0).getClass());
+                assertCollectionsEquals("Results value mismatch", createGoldenResults(), results);
+            }
+        });
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testCallCollection() throws Exception {
+        runTest(callableFactories, new ComputeTest() {
+            @Override public void test(Factory factory, Ignite ignite) throws Exception {
+                Collection<EchoCallable> jobs = new ArrayList<>(MAX_JOB_COUNT);
+
+                for (int i = 0; i < MAX_JOB_COUNT; ++i) {
+                    EchoCallable job = (EchoCallable)factory.create();
+                    job.setArg(value(i - 1));
+                    jobs.add(job);
+                }
+
+                Collection<Object> results = ignite.compute().call(jobs);
+
+                checkResultsClassCount(MAX_JOB_COUNT - 1, results, value(0).getClass());
+                assertCollectionsEquals("Results value mismatch", createGoldenResults(), results);
+            }
+        });
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testCallCollectionWithReducer() throws Exception {
+        runTest(callableFactories, new ComputeTest() {
+            @Override public void test(Factory factory, Ignite ignite) throws Exception {
+                Collection<EchoCallable> jobs = new ArrayList<>(MAX_JOB_COUNT);
+
+                for (int i = 0; i < MAX_JOB_COUNT; ++i) {
+                    EchoCallable job = (EchoCallable)factory.create();
+                    job.setArg(value(i - 1));
+                    jobs.add(job);
+                }
+
+                boolean res = ignite.compute().call(jobs, new IgniteReducer<Object, Boolean>() {
+                    private Collection<Object> results = new ArrayList<>(MAX_JOB_COUNT);
+
+                    @Override public boolean collect(@Nullable Object o) {
+                        results.add(o);
+                        return true;
+                    }
+
+                    @Override public Boolean reduce() {
+                        checkResultsClassCount(MAX_JOB_COUNT - 1, results, value(0).getClass());
+                        assertCollectionsEquals("Results value mismatch", createGoldenResults(), results);
+                        return true;
+                    }
+                });
+
+                assertTrue(res);
+            }
+        });
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testDummyAffinityCall() throws Exception {
+        runTest(callableFactories, new ComputeTest() {
+            @Override public void test(Factory factory, Ignite ignite) throws Exception {
+                ignite.getOrCreateCache(CACHE_NAME);
+
+                final IgniteCompute comp = ignite.compute();
+
+                Collection<Object> results = new ArrayList<>(MAX_JOB_COUNT);
+
+                for (int i = 0; i < MAX_JOB_COUNT; ++i) {
+                    EchoCallable job = (EchoCallable)factory.create();
+
+                    job.setArg(value(i - 1));
+
+                    results.add(comp.affinityCall("test", key(0), job));
+                }
+
+                checkResultsClassCount(MAX_JOB_COUNT - 1, results, value(0).getClass());
+                assertCollectionsEquals("Results value mismatch", createGoldenResults(), results);
+            }
+        });
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testDummyAffinityRun() throws Exception {
+        runTest(runnableFactories, new ComputeTest() {
+            @Override public void test(Factory factory, Ignite ignite) throws Exception {
+                ignite.getOrCreateCache(CACHE_NAME);
+
+                final IgniteCompute comp = ignite.compute();
+
+                for (int i = 0; i < MAX_JOB_COUNT; ++i) {
+                    IgniteRunnable job = (IgniteRunnable)factory.create();
+
+                    comp.affinityRun("test", key(0), job);
+                }
+            }
+        });
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testDeployExecuteByName() throws Exception {
+        runTest(jobFactories, new ComputeTest() {
+            @Override public void test(Factory factory, Ignite ignite) throws Exception {
+                final int[] i = {-1};
+
+                final IgniteCompute comp = ignite.compute();
+
+                comp.localDeployTask(TestTask.class, TestTask.class.getClassLoader());
+
+                List<Object> results = ignite.compute().execute(
+                    TestTask.class.getName(),
+                    new T2<>((Factory<ComputeJobAdapter>)factory,
+                        (Factory<Object>)new Factory<Object>() {
+                            @Override public Object create() {
+                                return value(i[0]++);
+                            }
+                        }));
+
+                checkResultsClassCount(MAX_JOB_COUNT - 1, results, value(0).getClass());
+                assertCollectionsEquals("Results value mismatch", createGoldenResults(), results);
+
+                comp.undeployTask(TestTask.class.getName());
+            }
+        });
+    }
+
+    /**
+     * Override the base method to return {@code null} value in case the valId is negative.
+     */
+    @Nullable @Override public Object value(int valId) {
+        if (valId < 0)
+            return null;
+
+        return super.value(valId);
+    }
+
+    /**
+     *
+     */
+    enum TestJobEnum {
+        /** */
+        VALUE_0,
+        /** */
+        VALUE_1,
+        /** */
+        VALUE_2
+    }
+
+    /**
+     *
+     */
+    public interface ComputeTest {
+        /**
+         * @param factory Factory.
+         * @param ignite Ignite instance to use.
+         * @throws Exception If failed.
+         */
+        public void test(Factory factory, Ignite ignite) throws Exception;
+    }
+
+    /**
+     * Creates set of jobs.
+     */
+    static class TestTask
+        extends ComputeTaskSplitAdapter<T2<Factory<ComputeJobAdapter>, Factory<Object>>, List<Object>> {
+        /** {@inheritDoc} */
+        @Override protected Collection<? extends ComputeJob> split(int gridSize,
+            T2<Factory<ComputeJobAdapter>, Factory<Object>> factoriesJobAndArg) throws IgniteException {
+            Collection<ComputeJob> jobs = new HashSet<>();
+
+            for (int i = 0; i < MAX_JOB_COUNT; ++i) {
+                ComputeJobAdapter job = factoriesJobAndArg.get1().create();
+
+                job.setArguments(factoriesJobAndArg.get2().create());
+                jobs.add(job);
+            }
+
+            return jobs;
+        }
+
+        /** {@inheritDoc} */
+        @Nullable @Override public List<Object> reduce(List<ComputeJobResult> results) throws IgniteException {
+            List<Object> ret = new ArrayList<>(results.size());
+
+            for (ComputeJobResult result : results)
+                ret.add(result.getData());
+
+            return ret;
+        }
+    }
+
+    /**
+     * Echo job, serializable object. All fields are used only for serialization check.
+     */
+    @SuppressWarnings({"PublicInnerClass"})
+    public static class EchoJob extends ComputeJobAdapter {
+        /** */
+        private boolean isVal;
+
+        /** */
+        private byte bVal;
+
+        /** */
+        private char cVal;
+
+        /** */
+        private short sVal;
+
+        /** */
+        private int intVal;
+
+        /** */
+        private long lVal;
+
+        /** */
+        private float fltVal;
+
+        /** */
+        private double dblVal;
+
+        /** */
+        private String strVal;
+
+        /** */
+        private Object[] arrVal;
+
+        /** */
+        private TestJobEnum eVal;
+
+        /**
+         * Default constructor (required by ReflectionFactory).
+         */
+        public EchoJob() {
+            // No-op.
+        }
+
+        /**
+         * @param isVal boolean value.
+         * @param bVal byte value.
+         * @param cVal char value.
+         * @param sVal short value.
+         * @param intVal int value.
+         * @param lVal long value.
+         * @param fltVal float value.
+         * @param dblVal double value.
+         * @param strVal String value.
+         * @param arrVal Array value.
+         * @param val Enum value.
+         */
+        public EchoJob(boolean isVal, byte bVal, char cVal, short sVal, int intVal, long lVal, float fltVal,
+            double dblVal,
+            String strVal, Object[] arrVal, TestJobEnum val) {
+            this.isVal = isVal;
+            this.bVal = bVal;
+            this.cVal = cVal;
+            this.sVal = sVal;
+            this.intVal = intVal;
+            this.lVal = lVal;
+            this.fltVal = fltVal;
+            this.dblVal = dblVal;
+            this.strVal = strVal;
+            this.arrVal = arrVal;
+            eVal = val;
+        }
+
+        /** {@inheritDoc} */
+        @Nullable @Override public Object execute() {
+            checkState();
+
+            return argument(0);
+        }
+
+        /**
+         * Check the object state after serialization / deserialization
+         */
+        protected void checkState() {
+            JobUtils.checkJobState(isVal, bVal, cVal, sVal, intVal, lVal, fltVal, dblVal, strVal, arrVal, eVal);
+        }
+    }
+
+    /**
+     * Echo job, externalizable. All fields are used only for serialization check.
+     */
+    @SuppressWarnings({"PublicInnerClass"})
+    public static class EchoJobExternalizable extends EchoJob implements Externalizable {
+        /** */
+        private boolean isVal;
+
+        /** */
+        private byte bVal;
+
+        /** */
+        private char cVal;
+
+        /** */
+        private short sVal;
+
+        /** */
+        private int intVal;
+
+        /** */
+        private long lVal;
+
+        /** */
+        private float fltVal;
+
+        /** */
+        private double dblVal;
+
+        /** */
+        private String strVal;
+
+        /** */
+        private Object[] arrVal;
+
+        /** */
+        private TestJobEnum eVal;
+
+        /**
+         * Default constructor (required by {@link Externalizable}).
+         */
+        public EchoJobExternalizable() {
+            // No-op.
+        }
+
+        /**
+         * @param isVal boolean value.
+         * @param bVal byte value.
+         * @param cVal char value.
+         * @param sVal short value.
+         * @param intVal int value.
+         * @param lVal long value.
+         * @param fltVal float value.
+         * @param dblVal double value.
+         * @param strVal String value.
+         * @param arrVal Array value.
+         * @param val Enum value.
+         */
+        public EchoJobExternalizable(boolean isVal, byte bVal, char cVal, short sVal, int intVal, long lVal,
+            float fltVal,
+            double dblVal, String strVal, Object[] arrVal, TestJobEnum val) {
+            this.isVal = isVal;
+            this.bVal = bVal;
+            this.cVal = cVal;
+            this.sVal = sVal;
+            this.intVal = intVal;
+            this.lVal = lVal;
+            this.fltVal = fltVal;
+            this.dblVal = dblVal;
+            this.strVal = strVal;
+            this.arrVal = arrVal;
+            eVal = val;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override public void writeExternal(ObjectOutput out) throws IOException {
+            out.writeObject(argument(0));
+
+            JobUtils.writeJobState(out, isVal, bVal, cVal, sVal, intVal, lVal, fltVal, dblVal, strVal, arrVal, eVal);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+            setArguments(in.readObject());
+
+            isVal = in.readBoolean();
+            bVal = in.readByte();
+            cVal = in.readChar();
+            sVal = in.readShort();
+            intVal = in.readInt();
+            lVal = in.readLong();
+            fltVal = in.readFloat();
+            dblVal = in.readDouble();
+            strVal = (String)in.readObject();
+            arrVal = (Object[])in.readObject();
+            eVal = (TestJobEnum)in.readObject();
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override protected void checkState() {
+            JobUtils.checkJobState(isVal, bVal, cVal, sVal, intVal, lVal, fltVal, dblVal, strVal, arrVal, eVal);
+        }
+    }
+
+    /**
+     * Echo job, externalizable. All fields are used only for serialization check.
+     */
+    @SuppressWarnings({"PublicInnerClass"})
+    public static class EchoJobBinarylizable extends EchoJob implements Binarylizable {
+        /** */
+        private boolean isVal;
+
+        /** */
+        private byte bVal;
+
+        /** */
+        private char cVal;
+
+        /** */
+        private short sVal;
+
+        /** */
+        private int intVal;
+
+        /** */
+        private long lVal;
+
+        /** */
+        private float fltVal;
+
+        /** */
+        private double dblVal;
+
+        /** */
+        private String strVal;
+
+        /** */
+        private Object[] arrVal;
+
+        /** */
+        private TestJobEnum eVal;
+
+        /**
+         * Default constructor (required by ReflectionFactory).
+         */
+        public EchoJobBinarylizable() {
+            // No-op.
+        }
+
+        /**
+         * @param isVal boolean value.
+         * @param bVal byte value.
+         * @param cVal char value.
+         * @param sVal short value.
+         * @param intVal int value.
+         * @param lVal long value.
+         * @param fltVal float value.
+         * @param dblVal double value.
+         * @param strVal String value.
+         * @param arrVal Array value.
+         * @param val Enum value.
+         */
+        public EchoJobBinarylizable(boolean isVal, byte bVal, char cVal, short sVal, int intVal, long lVal,
+            float fltVal,
+            double dblVal, String strVal, Object[] arrVal, TestJobEnum val) {
+            this.isVal = isVal;
+            this.bVal = bVal;
+            this.cVal = cVal;
+            this.sVal = sVal;
+            this.intVal = intVal;
+            this.lVal = lVal;
+            this.fltVal = fltVal;
+            this.dblVal = dblVal;
+            this.strVal = strVal;
+            this.arrVal = arrVal;
+            eVal = val;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override public void writeBinary(BinaryWriter writer) throws BinaryObjectException {
+            writer.writeObject("arg", argument(0));
+
+            JobUtils.writeJobState(writer, isVal, bVal, cVal, sVal, intVal, lVal, fltVal, dblVal, strVal, arrVal, eVal);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override public void readBinary(BinaryReader reader) throws BinaryObjectException {
+            Object arg = reader.readObject("arg");
+
+            setArguments(arg);
+
+            isVal = reader.readBoolean("isVal");
+            bVal = reader.readByte("bVal");
+            cVal = reader.readChar("cVal");
+            sVal = reader.readShort("sVal");
+            intVal = reader.readInt("intVal");
+            lVal = reader.readLong("lVal");
+            fltVal = reader.readFloat("fltVal");
+            dblVal = reader.readDouble("dblVal");
+            strVal = reader.readString("strVal");
+            arrVal = reader.readObjectArray("arrVal");
+            eVal = reader.readEnum("eVal");
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override protected void checkState() {
+            JobUtils.checkJobState(isVal, bVal, cVal, sVal, intVal, lVal, fltVal, dblVal, strVal, arrVal, eVal);
+        }
+    }
+
+    /**
+     * Echo job, serializable object. All fields are used only for serialization check.
+     */
+    @SuppressWarnings({"PublicInnerClass"})
+    public static class EchoClosure implements IgniteClosure<Object, Object> {
+        /** */
+        private boolean isVal;
+
+        /** */
+        private byte bVal;
+
+        /** */
+        private char cVal;
+
+        /** */
+        private short sVal;
+
+        /** */
+        private int intVal;
+
+        /** */
+        private long lVal;
+
+        /** */
+        private float fltVal;
+
+        /** */
+        private double dblVal;
+
+        /** */
+        private String strVal;
+
+        /** */
+        private Object[] arrVal;
+
+        /** */
+        private TestJobEnum eVal;
+
+        /**
+         * Default constructor.
+         */
+        public EchoClosure() {
+            // No-op.
+        }
+
+        /**
+         * @param isVal boolean value.
+         * @param bVal byte value.
+         * @param cVal char value.
+         * @param sVal short value.
+         * @param intVal int value.
+         * @param lVal long value.
+         * @param fltVal float value.
+         * @param dblVal double value.
+         * @param strVal String value.
+         * @param arrVal Array value.
+         * @param val Enum value.
+         */
+        public EchoClosure(boolean isVal, byte bVal, char cVal, short sVal, int intVal, long lVal, float fltVal,
+            double dblVal,
+            String strVal, Object[] arrVal, TestJobEnum val) {
+            this.isVal = isVal;
+            this.bVal = bVal;
+            this.cVal = cVal;
+            this.sVal = sVal;
+            this.intVal = intVal;
+            this.lVal = lVal;
+            this.fltVal = fltVal;
+            this.dblVal = dblVal;
+            this.strVal = strVal;
+            this.arrVal = arrVal;
+            eVal = val;
+        }
+
+        /** {@inheritDoc} */
+        @Override public Object apply(Object arg) {
+            checkState();
+
+            return arg;
+        }
+
+        /**
+         * Check the object state after serialization / deserialization
+         */
+        protected void checkState() {
+            JobUtils.checkJobState(isVal, bVal, cVal, sVal, intVal, lVal, fltVal, dblVal, strVal, arrVal, eVal);
+        }
+    }
+
+    /**
+     * Echo closure, externalizable. All fields are used only for serialization check.
+     */
+    @SuppressWarnings({"PublicInnerClass"})
+    public static class EchoClosureExternalizable extends EchoClosure implements Externalizable {
+        /** */
+        private boolean isVal;
+
+        /** */
+        private byte bVal;
+
+        /** */
+        private char cVal;
+
+        /** */
+        private short sVal;
+
+        /** */
+        private int intVal;
+
+        /** */
+        private long lVal;
+
+        /** */
+        private float fltVal;
+
+        /** */
+        private double dblVal;
+
+        /** */
+        private String strVal;
+
+        /** */
+        private Object[] arrVal;
+
+        /** */
+        private TestJobEnum eVal;
+
+        /**
+         * Default constructor (required by Externalizable).
+         */
+        public EchoClosureExternalizable() {
+            // No-op
+        }
+
+        /**
+         * @param isVal boolean value.
+         * @param bVal byte value.
+         * @param cVal char value.
+         * @param sVal short value.
+         * @param intVal int value.
+         * @param lVal long value.
+         * @param fltVal float value.
+         * @param dblVal double value.
+         * @param strVal String value.
+         * @param arrVal Array value.
+         * @param val Enum value.
+         */
+        public EchoClosureExternalizable(boolean isVal, byte bVal, char cVal, short sVal, int intVal, long lVal,
+            float fltVal,
+            double dblVal, String strVal, Object[] arrVal, TestJobEnum val) {
+            this.isVal = isVal;
+            this.bVal = bVal;
+            this.cVal = cVal;
+            this.sVal = sVal;
+            this.intVal = intVal;
+            this.lVal = lVal;
+            this.fltVal = fltVal;
+            this.dblVal = dblVal;
+            this.strVal = strVal;
+            this.arrVal = arrVal;
+            eVal = val;
+        }
+
+        /** {@inheritDoc} */
+        @Override public void writeExternal(ObjectOutput out) throws IOException {
+            JobUtils.writeJobState(out, isVal, bVal, cVal, sVal, intVal, lVal, fltVal, dblVal, strVal, arrVal, eVal);
+        }
+
+        /** {@inheritDoc} */
+        @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+            isVal = in.readBoolean();
+            bVal = in.readByte();
+            cVal = in.readChar();
+            sVal = in.readShort();
+            intVal = in.readInt();
+            lVal = in.readLong();
+            fltVal = in.readFloat();
+            dblVal = in.readDouble();
+            strVal = (String)in.readObject();
+            arrVal = (Object[])in.readObject();
+            eVal = (TestJobEnum)in.readObject();
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override protected void checkState() {
+            JobUtils.checkJobState(isVal, bVal, cVal, sVal, intVal, lVal, fltVal, dblVal, strVal, arrVal, eVal);
+        }
+    }
+
+    /**
+     * Echo closure, externalizable. All fields are used only for serialization check.
+     */
+    @SuppressWarnings({"PublicInnerClass"})
+    public static class EchoClosureBinarylizable extends EchoClosure implements Binarylizable {
+        /** */
+        private boolean isVal;
+
+        /** */
+        private byte bVal;
+
+        /** */
+        private char cVal;
+
+        /** */
+        private short sVal;
+
+        /** */
+        private int intVal;
+
+        /** */
+        private long lVal;
+
+        /** */
+        private float fltVal;
+
+        /** */
+        private double dblVal;
+
+        /** */
+        private String strVal;
+
+        /** */
+        private Object[] arrVal;
+
+        /** */
+        private TestJobEnum eVal;
+
+        /**
+         * @param isVal boolean value.
+         * @param bVal byte value.
+         * @param cVal char value.
+         * @param sVal short value.
+         * @param intVal int value.
+         * @param lVal long value.
+         * @param fltVal float value.
+         * @param dblVal double value.
+         * @param strVal String value.
+         * @param arrVal Array value.
+         * @param val Enum value.
+         */
+        public EchoClosureBinarylizable(boolean isVal, byte bVal, char cVal, short sVal, int intVal, long lVal,
+            float fltVal,
+            double dblVal, String strVal, Object[] arrVal, TestJobEnum val) {
+            this.isVal = isVal;
+            this.bVal = bVal;
+            this.cVal = cVal;
+            this.sVal = sVal;
+            this.intVal = intVal;
+            this.lVal = lVal;
+            this.fltVal = fltVal;
+            this.dblVal = dblVal;
+            this.strVal = strVal;
+            this.arrVal = arrVal;
+            eVal = val;
+        }
+
+        /** {@inheritDoc} */
+        @Override public void writeBinary(BinaryWriter writer) throws BinaryObjectException {
+            JobUtils.writeJobState(writer, isVal, bVal, cVal, sVal, intVal, lVal, fltVal, dblVal, strVal, arrVal, eVal);
+        }
+
+        /** {@inheritDoc} */
+        @Override public void readBinary(BinaryReader reader) throws BinaryObjectException {
+            isVal = reader.readBoolean("isVal");
+            bVal = reader.readByte("bVal");
+            cVal = reader.readChar("cVal");
+            sVal = reader.readShort("sVal");
+            intVal = reader.readInt("intVal");
+            lVal = reader.readLong("lVal");
+            fltVal = reader.readFloat("fltVal");
+            dblVal = reader.readDouble("dblVal");
+            strVal = reader.readString("strVal");
+            arrVal = reader.readObjectArray("arrVal");
+            eVal = reader.readEnum("eVal");
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override protected void checkState() {
+            JobUtils.checkJobState(isVal, bVal, cVal, sVal, intVal, lVal, fltVal, dblVal, strVal, arrVal, eVal);
+        }
+    }
+
+    /**
+     * Test callable, serializable object. All fields are used only for serialization check.
+     */
+    @SuppressWarnings({"PublicInnerClass"})
+    public static class EchoCallable implements IgniteCallable<Object> {
+        /** */
+        protected Object arg;
+
+        /** */
+        private boolean isVal;
+
+        /** */
+        private byte bVal;
+
+        /** */
+        private char cVal;
+
+        /** */
+        private short sVal;
+
+        /** */
+        private int intVal;
+
+        /** */
+        private long lVal;
+
+        /** */
+        private float fltVal;
+
+        /** */
+        private double dblVal;
+
+        /** */
+        private String strVal;
+
+        /** */
+        private Object[] arrVal;
+
+        /** */
+        private TestJobEnum eVal;
+
+        /**
+         * Default constructor.
+         */
+        public EchoCallable() {
+            // No-op.
+        }
+
+        /**
+         * @param isVal boolean value.
+         * @param bVal byte value.
+         * @param cVal char value.
+         * @param sVal short value.
+         * @param intVal int value.
+         * @param lVal long value.
+         * @param fltVal float value.
+         * @param dblVal double value.
+         * @param strVal String value.
+         * @param arrVal Array value.
+         * @param val Enum value.
+         */
+        public EchoCallable(boolean isVal, byte bVal, char cVal, short sVal, int intVal, long lVal, float fltVal,
+            double dblVal,
+            String strVal, Object[] arrVal, TestJobEnum val) {
+            this.isVal = isVal;
+            this.bVal = bVal;
+            this.cVal = cVal;
+            this.sVal = sVal;
+            this.intVal = intVal;
+            this.lVal = lVal;
+            this.fltVal = fltVal;
+            this.dblVal = dblVal;
+            this.strVal = strVal;
+            this.arrVal = arrVal;
+            eVal = val;
+        }
+
+        /**
+         * @param arg Argument.
+         */
+        void setArg(@Nullable Object arg) {
+            this.arg = arg;
+        }
+
+        /** {@inheritDoc} */
+        @Nullable @Override public Object call() throws Exception {
+            checkState();
+
+            return arg;
+        }
+
+        /**
+         * Check the object state after serialization / deserialization
+         */
+        protected void checkState() {
+            JobUtils.checkJobState(isVal, bVal, cVal, sVal, intVal, lVal, fltVal, dblVal, strVal, arrVal, eVal);
+        }
+    }
+
+    /**
+     * Echo callable, externalizable object. All fields are used only for serialization check.
+     */
+    @SuppressWarnings({"PublicInnerClass"})
+    public static class EchoCallableExternalizable extends EchoCallable implements Externalizable {
+        /** */
+        private boolean isVal;
+
+        /** */
+        private byte bVal;
+
+        /** */
+        private char cVal;
+
+        /** */
+        private short sVal;
+
+        /** */
+        private int intVal;
+
+        /** */
+        private long lVal;
+
+        /** */
+        private float fltVal;
+
+        /** */
+        private double dblVal;
+
+        /** */
+        private String strVal;
+
+        /** */
+        private Object[] arrVal;
+
+        /** */
+        private TestJobEnum eVal;
+
+        /**
+         * Default constructor.
+         */
+        public EchoCallableExternalizable() {
+            // No-op.
+        }
+
+        /**
+         * @param isVal boolean value.
+         * @param bVal byte value.
+         * @param cVal char value.
+         * @param sVal short value.
+         * @param intVal int value.
+         * @param lVal long value.
+         * @param fltVal float value.
+         * @param dblVal double value.
+         * @param strVal String value.
+         * @param arrVal Array value.
+         * @param val Enum value.
+         */
+        public EchoCallableExternalizable(boolean isVal, byte bVal, char cVal, short sVal, int intVal, long lVal,
+            float fltVal,
+            double dblVal, String strVal, Object[] arrVal, TestJobEnum val) {
+            this.isVal = isVal;
+            this.bVal = bVal;
+            this.cVal = cVal;
+            this.sVal = sVal;
+            this.intVal = intVal;
+            this.lVal = lVal;
+            this.fltVal = fltVal;
+            this.dblVal = dblVal;
+            this.strVal = strVal;
+            this.arrVal = arrVal;
+            eVal = val;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override public void writeExternal(ObjectOutput out) throws IOException {
+            out.writeObject(arg);
+
+            JobUtils.writeJobState(out, isVal, bVal, cVal, sVal, intVal, lVal, fltVal, dblVal, strVal, arrVal, eVal);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+            arg = in.readObject();
+
+            isVal = in.readBoolean();
+            bVal = in.readByte();
+            cVal = in.readChar();
+            sVal = in.readShort();
+            intVal = in.readInt();
+            lVal = in.readLong();
+            fltVal = in.readFloat();
+            dblVal = in.readDouble();
+            strVal = (String)in.readObject();
+            arrVal = (Object[])in.readObject();
+            eVal = (TestJobEnum)in.readObject();
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override protected void checkState() {
+            JobUtils.checkJobState(isVal, bVal, cVal, sVal, intVal, lVal, fltVal, dblVal, strVal, arrVal, eVal);
+        }
+    }
+
+    /**
+     * Echo callable, binarylizable object. All fields are used only for serialization check.
+     */
+    @SuppressWarnings({"PublicInnerClass"})
+    public static class EchoCallableBinarylizable extends EchoCallable implements Binarylizable {
+        /** */
+        private boolean isVal;
+
+        /** */
+        private byte bVal;
+
+        /** */
+        private char cVal;
+
+        /** */
+        private short sVal;
+
+        /** */
+        private int intVal;
+
+        /** */
+        private long lVal;
+
+        /** */
+        private float fltVal;
+
+        /** */
+        private double dblVal;
+
+        /** */
+        private String strVal;
+
+        /** */
+        private Object[] arrVal;
+
+        /** */
+        private TestJobEnum eVal;
+
+        /**
+         * Default constructor.
+         */
+        public EchoCallableBinarylizable() {
+            // No-op.
+        }
+
+        /**
+         * @param isVal boolean value.
+         * @param bVal byte value.
+         * @param cVal char value.
+         * @param sVal short value.
+         * @param intVal int value.
+         * @param lVal long value.
+         * @param fltVal float value.
+         * @param dblVal double value.
+         * @param strVal String value.
+         * @param arrVal Array value.
+         * @param val Enum value.
+         */
+        public EchoCallableBinarylizable(boolean isVal, byte bVal, char cVal, short sVal, int intVal, long lVal,
+            float fltVal,
+            double dblVal, String strVal, Object[] arrVal, TestJobEnum val) {
+            this.isVal = isVal;
+            this.bVal = bVal;
+            this.cVal = cVal;
+            this.sVal = sVal;
+            this.intVal = intVal;
+            this.lVal = lVal;
+            this.fltVal = fltVal;
+            this.dblVal = dblVal;
+            this.strVal = strVal;
+            this.arrVal = arrVal;
+            eVal = val;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override public void writeBinary(BinaryWriter writer) throws BinaryObjectException {
+            writer.writeObject("arg", arg);
+
+            JobUtils.writeJobState(writer, isVal, bVal, cVal, sVal, intVal, lVal, fltVal, dblVal, strVal, arrVal, eVal);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override public void readBinary(BinaryReader reader) throws BinaryObjectException {
+            arg = reader.readObject("arg");
+
+            isVal = reader.readBoolean("isVal");
+            bVal = reader.readByte("bVal");
+            cVal = reader.readChar("cVal");
+            sVal = reader.readShort("sVal");
+            intVal = reader.readInt("intVal");
+            lVal = reader.readLong("lVal");
+            fltVal = reader.readFloat("fltVal");
+            dblVal = reader.readDouble("dblVal");
+            strVal = reader.readString("strVal");
+            arrVal = reader.readObjectArray("arrVal");
+            eVal = reader.readEnum("eVal");
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override protected void checkState() {
+            JobUtils.checkJobState(isVal, bVal, cVal, sVal, intVal, lVal, fltVal, dblVal, strVal, arrVal, eVal);
+        }
+    }
+
+    /**
+     * Test runnable, serializable object. All fields are used only for serialization check.
+     */
+    @SuppressWarnings({"PublicInnerClass"})
+    public static class ComputeTestRunnable implements IgniteRunnable {
+        /** */
+        private boolean isVal;
+
+        /** */
+        private byte bVal;
+
+        /** */
+        private char cVal;
+
+        /** */
+        private short sVal;
+
+        /** */
+        private int intVal;
+
+        /** */
+        private long lVal;
+
+        /** */
+        private float fltVal;
+
+        /** */
+        private double dblVal;
+
+        /** */
+        private String strVal;
+
+        /** */
+        private Object[] arrVal;
+
+        /** */
+        private TestJobEnum eVal;
+
+        /**
+         * Default constructor.
+         */
+        public ComputeTestRunnable() {
+            // No-op.
+        }
+
+        /**
+         * @param isVal boolean value.
+         * @param bVal byte value.
+         * @param cVal char value.
+         * @param sVal short value.
+         * @param intVal int value.
+         * @param lVal long value.
+         * @param fltVal float value.
+         * @param dblVal double value.
+         * @param strVal String value.
+         * @param arrVal Array value.
+         * @param val Enum value.
+         */
+        public ComputeTestRunnable(boolean isVal, byte bVal, char cVal, short sVal, int intVal, long lVal, float fltVal,
+            double dblVal, String strVal, Object[] arrVal, TestJobEnum val) {
+            this.isVal = isVal;
+            this.bVal = bVal;
+            this.cVal = cVal;
+            this.sVal = sVal;
+            this.intVal = intVal;
+            this.lVal = lVal;
+            this.fltVal = fltVal;
+            this.dblVal = dblVal;
+            this.strVal = strVal;
+            this.arrVal = arrVal;
+            eVal = val;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override public void run() {
+            checkState();
+        }
+
+        /**
+         * Check the object state after serialization / deserialization
+         */
+        protected void checkState() {
+            JobUtils.checkJobState(isVal, bVal, cVal, sVal, intVal, lVal, fltVal, dblVal, strVal, arrVal, eVal);
+        }
+    }
+
+    /**
+     * Test runnable, externalizable object. All fields are used only for serialization check.
+     */
+    public static class ComputeTestRunnableExternalizable extends ComputeTestRunnable implements Externalizable {
+        /** */
+        private boolean isVal;
+
+        /** */
+        private byte bVal;
+
+        /** */
+        private char cVal;
+
+        /** */
+        private short sVal;
+
+        /** */
+        private int intVal;
+
+        /** */
+        private long lVal;
+
+        /** */
+        private float fltVal;
+
+        /** */
+        private double dblVal;
+
+        /** */
+        private String strVal;
+
+        /** */
+        private Object[] arrVal;
+
+        /** */
+        private TestJobEnum eVal;
+
+        /**
+         * Default constructor (required by Externalizable).
+         */
+        public ComputeTestRunnableExternalizable() {
+            // No-op
+        }
+
+        /**
+         * @param isVal boolean value.
+         * @param bVal byte value.
+         * @param cVal char value.
+         * @param sVal short value.
+         * @param intVal int value.
+         * @param lVal long value.
+         * @param fltVal float value.
+         * @param dblVal double value.
+         * @param strVal String value.
+         * @param arrVal Array value.
+         * @param val Enum value.
+         */
+        public ComputeTestRunnableExternalizable(boolean isVal, byte bVal, char cVal, short sVal, int intVal, long lVal,
+            float fltVal, double dblVal, String strVal, Object[] arrVal,
+            TestJobEnum val) {
+            this.intVal = intVal;
+            this.isVal = isVal;
+            this.bVal = bVal;
+            this.cVal = cVal;
+            this.sVal = sVal;
+            this.lVal = lVal;
+            this.fltVal = fltVal;
+            this.dblVal = dblVal;
+            this.strVal = strVal;
+            this.arrVal = arrVal;
+            eVal = val;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override public void writeExternal(ObjectOutput out) throws IOException {
+            JobUtils.writeJobState(out, isVal, bVal, cVal, sVal, intVal, lVal, fltVal, dblVal, strVal, arrVal, eVal);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+            isVal = in.readBoolean();
+            bVal = in.readByte();
+            cVal = in.readChar();
+            sVal = in.readShort();
+            intVal = in.readInt();
+            lVal = in.readLong();
+            fltVal = in.readFloat();
+            dblVal = in.readDouble();
+            strVal = (String)in.readObject();
+            arrVal = (Object[])in.readObject();
+            eVal = (TestJobEnum)in.readObject();
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override protected void checkState() {
+            JobUtils.checkJobState(isVal, bVal, cVal, sVal, intVal, lVal, fltVal, dblVal, strVal, arrVal, eVal);
+        }
+    }
+
+    /**
+     * Test runnable, binarylizable object. All fields are used only for serialization check.
+     */
+    public static class ComputeTestRunnableBinarylizable extends ComputeTestRunnable implements Binarylizable {
+        /** */
+        private boolean isVal;
+
+        /** */
+        private byte bVal;
+
+        /** */
+        private char cVal;
+
+        /** */
+        private short sVal;
+
+        /** */
+        private int intVal;
+
+        /** */
+        private long lVal;
+
+        /** */
+        private float fltVal;
+
+        /** */
+        private double dblVal;
+
+        /** */
+        private String strVal;
+
+        /** */
+        private Object[] arrVal;
+
+        /** */
+        private TestJobEnum eVal;
+
+        /**
+         * Default constructor.
+         */
+        public ComputeTestRunnableBinarylizable() {
+            // No-op.
+        }
+
+        /**
+         * @param isVal boolean value.
+         * @param bVal byte value.
+         * @param cVal char value.
+         * @param sVal short value.
+         * @param intVal int value.
+         * @param lVal long value.
+         * @param fltVal float value.
+         * @param dblVal double value.
+         * @param strVal String value.
+         * @param arrVal Array value.
+         * @param val Enum value.
+         */
+        public ComputeTestRunnableBinarylizable(boolean isVal, byte bVal, char cVal, short sVal, int intVal, long lVal,
+            float fltVal, double dblVal, String strVal, Object[] arrVal,
+            TestJobEnum val) {
+            this.isVal = isVal;
+            this.bVal = bVal;
+            this.cVal = cVal;
+            this.sVal = sVal;
+            this.intVal = intVal;
+            this.lVal = lVal;
+            this.fltVal = fltVal;
+            this.dblVal = dblVal;
+            this.strVal = strVal;
+            this.arrVal = arrVal;
+            eVal = val;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override public void writeBinary(BinaryWriter writer) throws BinaryObjectException {
+            JobUtils.writeJobState(writer, isVal, bVal, cVal, sVal, intVal, lVal, fltVal, dblVal, strVal, arrVal, eVal);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override public void readBinary(BinaryReader reader) throws BinaryObjectException {
+            isVal = reader.readBoolean("isVal");
+            bVal = reader.readByte("bVal");
+            cVal = reader.readChar("cVal");
+            sVal = reader.readShort("sVal");
+            intVal = reader.readInt("intVal");
+            lVal = reader.readLong("lVal");
+            fltVal = reader.readFloat("fltVal");
+            dblVal = reader.readDouble("dblVal");
+            strVal = reader.readString("strVal");
+            arrVal = reader.readObjectArray("arrVal");
+            eVal = reader.readEnum("eVal");
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override protected void checkState() {
+            JobUtils.checkJobState(isVal, bVal, cVal, sVal, intVal, lVal, fltVal, dblVal, strVal, arrVal, eVal);
+        }
+    }
+
+    /**
+     * Creates test jobs with tested parameters
+     */
+    private static class JobFactory<T> implements Factory<T> {
+        /** */
+        private static final long serialVersionUID = 0;
+
+        /** */
+        private Class<?> cls;
+
+        /**
+         * @param cls Class.
+         */
+        JobFactory(Class<?> cls) {
+            this.cls = cls;
+        }
+
+        /** {@inheritDoc} */
+        @Override public T create() {
+            try {
+                Constructor<?> constructor = cls.getConstructor(Boolean.TYPE, Byte.TYPE, Character.TYPE,
+                    Short.TYPE, Integer.TYPE, Long.TYPE, Float.TYPE, Double.TYPE, String.class, Object[].class, TestJobEnum.class);
+
+                return (T)constructor.newInstance(true,
+                    Byte.MAX_VALUE,
+                    Character.MAX_VALUE,
+                    Short.MAX_VALUE,
+                    Integer.MAX_VALUE,
+                    Long.MAX_VALUE,
+                    Float.MAX_VALUE,
+                    Double.MAX_VALUE,
+                    STR_VAL, ARRAY_VAL,
+                    TestJobEnum.VALUE_2);
+            }
+            catch (NoSuchMethodException | InstantiationException | InvocationTargetException |
+                IllegalAccessException e) {
+                throw new IgniteException("Failed to create object using default constructor: " + cls, e);
+            }
+        }
+    }
+
+    /**
+     * Collection of utility methods to simplify EchoJob*, EchoCLosure*, EchoCallable* and ComputeTestRunnable* classes
+     */
+    private static class JobUtils {
+        /**
+         * @param isVal boolean value.
+         * @param bVal byte value.
+         * @param cVal char value.
+         * @param sVal short value.
+         * @param intVal int value.
+         * @param lVal long value.
+         * @param fltVal float value.
+         * @param dblVal double value.
+         * @param strVal String value.
+         * @param arrVal Array value.
+         * @param eVal Enum value.
+         */
+        private static void checkJobState(boolean isVal, byte bVal, char cVal, short sVal, int intVal, long lVal,
+            float fltVal,
+            double dblVal, String strVal, Object[] arrVal, TestJobEnum eVal) {
+            assertEquals(true, isVal);
+            assertEquals(Byte.MAX_VALUE, bVal);
+            assertEquals(Character.MAX_VALUE, cVal);
+            assertEquals(Short.MAX_VALUE, sVal);
+            assertEquals(Integer.MAX_VALUE, intVal);
+            assertEquals(Long.MAX_VALUE, lVal);
+            assertEquals(Float.MAX_VALUE, fltVal);
+            assertEquals(Double.MAX_VALUE, dblVal);
+            assertEquals(STR_VAL, strVal);
+            Assert.assertArrayEquals(ARRAY_VAL, arrVal);
+            assertEquals(TestJobEnum.VALUE_2, eVal);
+        }
+
+        /**
+         * @param writer Writer.
+         * @param isVal boolean value.
+         * @param bVal byte value.
+         * @param cVal char value.
+         * @param sVal short value.
+         * @param intVal int value.
+         * @param lVal long value.
+         * @param fltVal float value.
+         * @param dblVal double value.
+         * @param strVal String value.
+         * @param arrVal Array value.
+         * @param eVal Enum value.
+         * @throws BinaryObjectException If failed.
+         */
+        private static void writeJobState(BinaryWriter writer, boolean isVal, byte bVal, char cVal, short sVal,
+            int intVal, long lVal, float fltVal, double dblVal, String strVal,
+            Object[] arrVal, TestJobEnum eVal) throws BinaryObjectException {
+            writer.writeBoolean("isVal", isVal);
+            writer.writeByte("bVal", bVal);
+            writer.writeChar("cVal", cVal);
+            writer.writeShort("sVal", sVal);
+            writer.writeInt("intVal", intVal);
+            writer.writeLong("lVal", lVal);
+            writer.writeFloat("fltVal", fltVal);
+            writer.writeDouble("dblVal", dblVal);
+            writer.writeString("strVal", strVal);
+            writer.writeObjectArray("arrVal", arrVal);
+            writer.writeEnum("eVal", eVal);
+        }
+
+        /**
+         * @param out Out.
+         * @param isVal boolean value.
+         * @param bVal byte value.
+         * @param cVal char value.
+         * @param sVal short value.
+         * @param intVal int value.
+         * @param lVal long value.
+         * @param fltVal float value.
+         * @param dblVal double value.
+         * @param strVal String value.
+         * @param arrVal Array value.
+         * @param eVal Enum value.
+         * @throws IOException If failed.
+         */
+        private static void writeJobState(ObjectOutput out, boolean isVal, byte bVal, char cVal, short sVal,
+            int intVal, long lVal, float fltVal, double dblVal, String strVal, Object[] arrVal,
+            TestJobEnum eVal) throws IOException {
+            out.writeBoolean(isVal);
+            out.writeByte(bVal);
+            out.writeChar(cVal);
+            out.writeShort(sVal);
+            out.writeInt(intVal);
+            out.writeLong(lVal);
+            out.writeFloat(fltVal);
+            out.writeDouble(dblVal);
+            out.writeObject(strVal);
+            out.writeObject(arrVal);
+            out.writeObject(eVal);
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/24b24bf8/modules/core/src/test/java/org/apache/ignite/testframework/configvariations/ConfigVariations.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/testframework/configvariations/ConfigVariations.java b/modules/core/src/test/java/org/apache/ignite/testframework/configvariations/ConfigVariations.java
index e5856f0..0be6d50 100644
--- a/modules/core/src/test/java/org/apache/ignite/testframework/configvariations/ConfigVariations.java
+++ b/modules/core/src/test/java/org/apache/ignite/testframework/configvariations/ConfigVariations.java
@@ -215,7 +215,7 @@ public class ConfigVariations {
     /**
      * @return Marshaller.
      */
-    private static Factory<OptimizedMarshaller> optimizedMarshallerFactory() {
+    public static Factory<OptimizedMarshaller> optimizedMarshallerFactory() {
         return new Factory<OptimizedMarshaller>() {
             @Override public OptimizedMarshaller create() {
                 OptimizedMarshaller marsh = new OptimizedMarshaller(true);

http://git-wip-us.apache.org/repos/asf/ignite/blob/24b24bf8/modules/core/src/test/java/org/apache/ignite/testframework/junits/IgniteConfigVariationsAbstractTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/testframework/junits/IgniteConfigVariationsAbstractTest.java b/modules/core/src/test/java/org/apache/ignite/testframework/junits/IgniteConfigVariationsAbstractTest.java
index b22f289..258eba8 100644
--- a/modules/core/src/test/java/org/apache/ignite/testframework/junits/IgniteConfigVariationsAbstractTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/testframework/junits/IgniteConfigVariationsAbstractTest.java
@@ -21,13 +21,16 @@ import java.io.Externalizable;
 import java.io.File;
 import java.io.IOException;
 import java.io.ObjectInput;
+import java.io.ObjectInputStream;
 import java.io.ObjectOutput;
+import java.io.ObjectOutputStream;
 import java.io.Serializable;
 import org.apache.commons.io.FileUtils;
 import org.apache.ignite.Ignition;
 import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.internal.IgniteEx;
 import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.marshaller.jdk.JdkMarshaller;
 import org.apache.ignite.testframework.configvariations.VariationsTestsConfig;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 
@@ -197,6 +200,12 @@ public abstract class IgniteConfigVariationsAbstractTest extends GridCommonAbstr
         for (int i = 0; i < DataMode.values().length; i++) {
             dataMode = DataMode.values()[i];
 
+            if ((getConfiguration().getMarshaller() instanceof JdkMarshaller)
+                && (dataMode == DataMode.PLANE_OBJECT)) {
+                info("Skip test for JdkMarshaller & PLANE_OBJECT data mode");
+                continue;
+            }
+
             info("Running test in data mode: " + dataMode);
 
             if (i != 0)
@@ -289,6 +298,13 @@ public abstract class IgniteConfigVariationsAbstractTest extends GridCommonAbstr
         protected TestEnum enumVal;
 
         /**
+         * Default constructor must be accessible for deserialize subclasses by JDK serialization API.
+         */
+        TestObject() {
+            // No-op.
+        }
+
+        /**
          * @param val Value.
          */
         TestObject(int val) {
@@ -345,6 +361,31 @@ public abstract class IgniteConfigVariationsAbstractTest extends GridCommonAbstr
         public SerializableObject(int val) {
             super(val);
         }
+
+        /**
+         * Custom serialization of superclass because {@link TestObject} is non-serializable.
+         *
+         * @param out output stream.
+         * @throws IOException if de-serialization failed.
+         */
+        private void writeObject(ObjectOutputStream out) throws IOException {
+            out.writeInt(val);
+            out.writeObject(strVal);
+            out.writeObject(enumVal);
+        }
+
+        /**
+         * Custom deserialization of superclass because {@link TestObject} is non-serializable.
+         *
+         * @param in input stream
+         * @throws IOException if de-serialization failed.
+         * @throws ClassNotFoundException if de-serialization failed.
+         */
+        private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
+            val = in.readInt();
+            strVal = (String)in.readObject();
+            enumVal = (TestEnum)in.readObject();
+        }
     }
 
     /**
@@ -354,7 +395,7 @@ public abstract class IgniteConfigVariationsAbstractTest extends GridCommonAbstr
         /**
          * Default constructor.
          */
-        ExternalizableObject() {
+        public ExternalizableObject() {
             super(-1);
         }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/24b24bf8/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteComputeBasicConfigVariationsFullApiTestSuite.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteComputeBasicConfigVariationsFullApiTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteComputeBasicConfigVariationsFullApiTestSuite.java
new file mode 100644
index 0000000..1be932a
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteComputeBasicConfigVariationsFullApiTestSuite.java
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.testsuites;
+
+import junit.framework.TestSuite;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.internal.binary.BinaryMarshaller;
+import org.apache.ignite.internal.processors.compute.IgniteComputeConfigVariationsFullApiTest;
+import org.apache.ignite.marshaller.jdk.JdkMarshaller;
+import org.apache.ignite.testframework.configvariations.ConfigParameter;
+import org.apache.ignite.testframework.configvariations.ConfigVariations;
+import org.apache.ignite.testframework.configvariations.ConfigVariationsTestSuiteBuilder;
+import org.apache.ignite.testframework.configvariations.Parameters;
+
+/**
+ * Full API compute test.
+ */
+public class IgniteComputeBasicConfigVariationsFullApiTestSuite extends TestSuite {
+    /** */
+    @SuppressWarnings("unchecked")
+    private static final ConfigParameter<IgniteConfiguration>[][] BASIC_COMPUTE_SET = new ConfigParameter[][] {
+        Parameters.objectParameters("setMarshaller",
+            Parameters.factory(JdkMarshaller.class),
+            Parameters.factory(BinaryMarshaller.class),
+            ConfigVariations.optimizedMarshallerFactory()
+        ),
+        Parameters.booleanParameters("setPeerClassLoadingEnabled"),
+        Parameters.booleanParameters("setMarshalLocalJobs"),
+    };
+
+    /**
+     * @return Compute API test suite.
+     * @throws Exception If failed.
+     */
+    public static TestSuite suite() throws Exception {
+        TestSuite suite = new TestSuite("Compute New Full API Test Suite");
+
+        suite.addTest(new ConfigVariationsTestSuiteBuilder(
+            "Single server",
+            IgniteComputeConfigVariationsFullApiTest.class)
+            .igniteParams(BASIC_COMPUTE_SET)
+            .gridsCount(1)
+            .build());
+
+        // Tests run on server (node#0) & client(node#1).
+        suite.addTest(new ConfigVariationsTestSuiteBuilder(
+            "3 servers, 1 client",
+            IgniteComputeConfigVariationsFullApiTest.class)
+            .igniteParams(BASIC_COMPUTE_SET)
+            .gridsCount(4)
+            .testedNodesCount(2)
+            .withClients()
+            .build());
+
+        return suite;
+    }
+}