http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/756034f3/modules/clients/src/test/java/org/apache/ignite/client/integration/ClientTcpUnreachableMultiNodeSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/clients/src/test/java/org/apache/ignite/client/integration/ClientTcpUnreachableMultiNodeSelfTest.java
 
b/modules/clients/src/test/java/org/apache/ignite/client/integration/ClientTcpUnreachableMultiNodeSelfTest.java
deleted file mode 100644
index 5450fa7..0000000
--- 
a/modules/clients/src/test/java/org/apache/ignite/client/integration/ClientTcpUnreachableMultiNodeSelfTest.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * 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.client.integration;
-
-import org.apache.ignite.client.*;
-import org.apache.ignite.internal.client.*;
-import org.apache.ignite.internal.client.balancer.*;
-import org.apache.ignite.internal.util.typedef.*;
-
-import java.net.*;
-import java.util.*;
-
-/**
- * Test for TCP binary rest protocol with unreachable address.
- */
-public class ClientTcpUnreachableMultiNodeSelfTest extends 
ClientTcpMultiNodeSelfTest {
-    /** {@inheritDoc} */
-    @Override protected GridClientLoadBalancer getBalancer() {
-        final GridClientLoadBalancer b = super.getBalancer();
-
-        return new TestGridClientLoadBalancer(b);
-    }
-
-    /** {@inheritDoc} */
-    @Override protected GridClientConfiguration clientConfiguration() throws 
GridClientException {
-        GridClientConfiguration cfg = super.clientConfiguration();
-
-        // Setting low connection timeout to allow multiple threads
-        // pass the unavailable address quickly.
-        cfg.setConnectTimeout(100);
-
-        return cfg;
-    }
-
-    /**
-     *
-     */
-    private class TestGridClientLoadBalancer implements 
GridClientLoadBalancer, GridClientTopologyListener {
-        /** */
-        private final GridClientLoadBalancer b;
-
-        /**
-         * @param b Delegating balancer.
-         */
-        TestGridClientLoadBalancer(GridClientLoadBalancer b) {
-            this.b = b;
-        }
-
-        /** {@inheritDoc} */
-        @Override public GridClientNode balancedNode(Collection<? extends 
GridClientNode> nodes)
-            throws GridClientException {
-            final GridClientNode node = b.balancedNode(nodes);
-
-            return new GridClientNode() {
-                @Override public <T> T attribute(String name) {
-                    return node.attribute(name);
-                }
-
-                @Override public Map<String, Object> attributes() {
-                    return node.attributes();
-                }
-
-                @Override public Collection<InetSocketAddress> 
availableAddresses(GridClientProtocol proto,
-                    boolean filterResolved) {
-                    // Fake address first.
-                    return F.asList(new InetSocketAddress("172.22.13.13", 
65432),
-                        F.first(node.availableAddresses(proto, 
filterResolved)));
-                }
-
-                @Override public Map<String, GridClientCacheMode> caches() {
-                    return node.caches();
-                }
-
-                @Override public int replicaCount() {
-                    return node.replicaCount();
-                }
-
-                @Override public List<String> jettyAddresses() {
-                    return node.jettyAddresses();
-                }
-
-                @Override public List<String> jettyHostNames() {
-                    return node.jettyHostNames();
-                }
-
-                @Override public int httpPort() {
-                    return node.httpPort();
-                }
-
-                @Override public List<String> tcpAddresses() {
-                    return node.tcpAddresses();
-                }
-
-                @Override public List<String> tcpHostNames() {
-                    return node.tcpHostNames();
-                }
-
-                @Override public GridClientNodeMetrics metrics() {
-                    return node.metrics();
-                }
-
-                @Override public UUID nodeId() {
-                    return node.nodeId();
-                }
-
-                @Override public Object consistentId() {
-                    return node.consistentId();
-                }
-
-                @Override public int tcpPort() {
-                    return node.tcpPort();
-                }
-
-                @Override public boolean connectable() {
-                    return node.connectable();
-                }
-            };
-        }
-
-        /** {@inheritDoc} */
-        @Override public void onNodeAdded(GridClientNode node) {
-            if (b instanceof GridClientTopologyListener)
-                ((GridClientTopologyListener)b).onNodeAdded(node);
-        }
-
-        /** {@inheritDoc} */
-        @Override public void onNodeRemoved(GridClientNode node) {
-            if (b instanceof GridClientTopologyListener)
-                ((GridClientTopologyListener)b).onNodeRemoved(node);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/756034f3/modules/clients/src/test/java/org/apache/ignite/client/integration/package.html
----------------------------------------------------------------------
diff --git 
a/modules/clients/src/test/java/org/apache/ignite/client/integration/package.html
 
b/modules/clients/src/test/java/org/apache/ignite/client/integration/package.html
deleted file mode 100644
index 056f9fb..0000000
--- 
a/modules/clients/src/test/java/org/apache/ignite/client/integration/package.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!--
-  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.
-  -->
-
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd";>
-<html>
-<body>
-    <img alt="icon" class="javadocimg" src="{@docRoot}/img/cube.gif"/>
-    Contains intergration tests involving API, Client implementation and REST 
processor.
-</body>
-</html>

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/756034f3/modules/clients/src/test/java/org/apache/ignite/client/router/ClientFailedInitSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/clients/src/test/java/org/apache/ignite/client/router/ClientFailedInitSelfTest.java
 
b/modules/clients/src/test/java/org/apache/ignite/client/router/ClientFailedInitSelfTest.java
deleted file mode 100644
index c28b915..0000000
--- 
a/modules/clients/src/test/java/org/apache/ignite/client/router/ClientFailedInitSelfTest.java
+++ /dev/null
@@ -1,277 +0,0 @@
-/*
- * 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.client.router;
-
-import org.apache.ignite.*;
-import org.apache.ignite.client.*;
-import org.apache.ignite.compute.*;
-import org.apache.ignite.configuration.*;
-import org.apache.ignite.internal.client.*;
-import org.apache.ignite.internal.client.impl.connection.*;
-import org.apache.ignite.internal.client.router.*;
-import org.apache.ignite.spi.discovery.tcp.*;
-import org.apache.ignite.spi.discovery.tcp.ipfinder.*;
-import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.*;
-import org.apache.ignite.internal.util.typedef.*;
-import org.apache.ignite.testframework.junits.common.*;
-
-import java.util.*;
-
-import static org.apache.ignite.internal.client.GridClientProtocol.*;
-import static org.apache.ignite.client.integration.ClientAbstractSelfTest.*;
-import static org.apache.ignite.IgniteSystemProperties.*;
-
-/**
- *
- */
-public class ClientFailedInitSelfTest extends GridCommonAbstractTest {
-    /** */
-    private static final int RECONN_CNT = 3;
-
-    /** */
-    private static final long TOP_REFRESH_PERIOD = 5000;
-
-    /** */
-    private static final int ROUTER_BINARY_PORT = BINARY_PORT + 1;
-
-    /** */
-    private static final int ROUTER_JETTY_PORT = 8081;
-
-    /** */
-    private static final TcpDiscoveryIpFinder IP_FINDER = new 
TcpDiscoveryVmIpFinder(true);
-
-    /** {@inheritDoc} */
-    @Override protected void afterTest() throws Exception {
-        GridClientFactory.stopAll();
-        GridRouterFactory.stopAllRouters();
-        stopAllGrids();
-    }
-
-    /** {@inheritDoc} */
-    @Override protected IgniteConfiguration getConfiguration(String gridName) 
throws Exception {
-        IgniteConfiguration cfg = super.getConfiguration(gridName);
-
-        assert cfg.getClientConnectionConfiguration() == null;
-
-        cfg.setLocalHost(HOST);
-
-        ClientConnectionConfiguration clientCfg = new 
ClientConnectionConfiguration();
-
-        clientCfg.setRestTcpPort(BINARY_PORT);
-        clientCfg.setRestJettyPath(REST_JETTY_CFG);
-
-        cfg.setClientConnectionConfiguration(clientCfg);
-
-        TcpDiscoverySpi disco = new TcpDiscoverySpi();
-
-        disco.setIpFinder(IP_FINDER);
-
-        cfg.setDiscoverySpi(disco);
-
-        return cfg;
-    }
-
-    /**
-     *
-     */
-    public void testEmptyAddresses() {
-        try {
-            GridClientFactory.start(new GridClientConfiguration());
-
-            assert false;
-        }
-        catch (GridClientException e) {
-            info("Caught expected exception: " + e);
-        }
-    }
-
-    /**
-     *
-     */
-    public void testRoutersAndServersAddressesProvided() {
-        try {
-            GridClientConfiguration c = new GridClientConfiguration();
-
-            c.setRouters(Collections.singleton("127.0.0.1:10000"));
-            c.setServers(Collections.singleton("127.0.0.1:10000"));
-
-            GridClientFactory.start(c);
-
-            assert false;
-        }
-        catch (GridClientException e) {
-            info("Caught expected exception: " + e);
-        }
-    }
-
-    /**
-     * @throws Exception If failed.
-     */
-    public void testTcpClient() throws Exception {
-        doTestClient(TCP);
-    }
-
-    /**
-     * @throws Exception If failed.
-     */
-    public void testTcpRouter() throws Exception {
-        doTestRouter(TCP);
-    }
-
-    /**
-     * @param p Protocol.
-     * @throws Exception If failed.
-     */
-    @SuppressWarnings("BusyWait")
-    private void doTestClient(GridClientProtocol p) throws Exception {
-        GridClient c = client(p, false);
-
-        for (int i = 0; i < RECONN_CNT; i++) {
-            try {
-                c.compute().nodes();
-            }
-            catch (GridClientDisconnectedException e) {
-                assertTrue(X.hasCause(e,
-                    GridServerUnreachableException.class, 
GridClientConnectionResetException.class));
-            }
-
-            startGrid();
-
-            try {
-                Thread.sleep(TOP_REFRESH_PERIOD * 2);
-
-                c.compute().nodes();
-
-                assertEquals("arg", 
c.compute().execute(TestTask.class.getName(), "arg"));
-            }
-            finally {
-                stopGrid();
-            }
-
-            Thread.sleep(TOP_REFRESH_PERIOD * 2);
-        }
-    }
-
-    /**
-     * @param p Protocol.
-     * @throws Exception If failed.
-     */
-    @SuppressWarnings("BusyWait")
-    private void doTestRouter(GridClientProtocol p) throws Exception {
-        startRouters();
-
-        GridClient c = client(p, true);
-
-        for (int i = 0; i < RECONN_CNT; i++) {
-            try {
-                c.compute().nodes();
-
-                fail("Nodes list should fail while grid is stopped.");
-            }
-            catch (GridClientDisconnectedException e) {
-                assertTrue(X.hasCause(e, GridClientException.class));
-            }
-
-            startGrid();
-
-            try {
-                Thread.sleep(TOP_REFRESH_PERIOD * 2);
-
-                c.compute().nodes();
-
-                assertEquals("arg", 
c.compute().execute(TestTask.class.getName(), "arg"));
-            }
-            finally {
-                stopGrid();
-            }
-
-            Thread.sleep(TOP_REFRESH_PERIOD * 2);
-        }
-    }
-
-    /**
-     * @return Grid.
-     * @throws Exception If failed.
-     */
-    @Override protected Ignite startGrid() throws Exception {
-        System.setProperty(IGNITE_JETTY_PORT, Integer.toString(JETTY_PORT));
-
-        try {
-            return super.startGrid();
-        }
-        finally {
-            System.clearProperty(IGNITE_JETTY_PORT);
-        }
-    }
-
-    /**
-     * Starts router.
-     * @throws IgniteCheckedException If failed.
-     */
-    private void startRouters() throws IgniteCheckedException {
-        GridTcpRouterConfiguration tcpCfg = new GridTcpRouterConfiguration();
-
-        tcpCfg.setHost(HOST);
-        tcpCfg.setPort(ROUTER_BINARY_PORT);
-        tcpCfg.setPortRange(0);
-        tcpCfg.setServers(Collections.singleton(HOST + ":" + BINARY_PORT));
-
-        GridRouterFactory.startTcpRouter(tcpCfg);
-    }
-
-    /**
-     * @param p Protocol.
-     * @param useRouter Use router flag.
-     * @return Client instance.
-     * @throws GridClientException If failed.
-     */
-    private GridClient client(GridClientProtocol p, boolean useRouter) throws 
GridClientException {
-        GridClientConfiguration cfg = new GridClientConfiguration();
-
-        int port = p == TCP ?
-            (useRouter ? ROUTER_BINARY_PORT : BINARY_PORT) :
-            (useRouter ? ROUTER_JETTY_PORT : JETTY_PORT);
-
-        cfg.setProtocol(p);
-        cfg.setServers(Arrays.asList(HOST + ":" + port));
-        cfg.setTopologyRefreshFrequency(TOP_REFRESH_PERIOD);
-
-        return GridClientFactory.start(cfg);
-    }
-
-    /**
-     * Test task.
-     */
-    private static class TestTask extends ComputeTaskSplitAdapter<String, 
String> {
-        /** {@inheritDoc} */
-        @Override protected Collection<? extends ComputeJob> split(int 
gridSize, final String arg) throws IgniteCheckedException {
-            return Collections.singleton(new ComputeJobAdapter() {
-                @Override public String execute() {
-                    return arg;
-                }
-            });
-        }
-
-        /** {@inheritDoc} */
-        @Override public String reduce(List<ComputeJobResult> results) throws 
IgniteCheckedException {
-            assertEquals(1, results.size());
-
-            return results.get(0).getData();
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/756034f3/modules/clients/src/test/java/org/apache/ignite/client/router/RouterFactorySelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/clients/src/test/java/org/apache/ignite/client/router/RouterFactorySelfTest.java
 
b/modules/clients/src/test/java/org/apache/ignite/client/router/RouterFactorySelfTest.java
deleted file mode 100644
index b485117..0000000
--- 
a/modules/clients/src/test/java/org/apache/ignite/client/router/RouterFactorySelfTest.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * 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.client.router;
-
-import org.apache.ignite.configuration.*;
-import org.apache.ignite.internal.client.router.*;
-import org.apache.ignite.spi.discovery.tcp.*;
-import org.apache.ignite.spi.discovery.tcp.ipfinder.*;
-import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.*;
-import org.apache.ignite.testframework.junits.common.*;
-
-import java.util.*;
-
-import static org.apache.ignite.IgniteSystemProperties.*;
-
-/**
- * Test routers factory.
- */
-public class RouterFactorySelfTest extends GridCommonAbstractTest {
-    /** Shared IP finder. */
-    private static final TcpDiscoveryIpFinder IP_FINDER = new 
TcpDiscoveryVmIpFinder(true);
-
-    /** */
-    private static final int GRID_HTTP_PORT = 11087;
-
-    /** {@inheritDoc} */
-    @Override protected IgniteConfiguration getConfiguration(String gridName) 
throws Exception {
-        TcpDiscoverySpi discoSpi = new TcpDiscoverySpi();
-
-        discoSpi.setIpFinder(IP_FINDER);
-
-        IgniteConfiguration cfg = new IgniteConfiguration();
-
-        cfg.setDiscoverySpi(discoSpi);
-        cfg.setGridName(gridName);
-
-        return cfg;
-    }
-
-    /**
-     * Test router's start/stop.
-     *
-     * @throws Exception In case of any exception.
-     */
-    public void testRouterFactory() throws Exception {
-        try {
-            System.setProperty(IGNITE_JETTY_PORT, 
String.valueOf(GRID_HTTP_PORT));
-
-            try {
-                startGrid();
-            }
-            finally {
-                System.clearProperty(IGNITE_JETTY_PORT);
-            }
-
-            final int size = 20;
-            final Collection<GridTcpRouter> tcpRouters = new ArrayList<>(size);
-            final GridTcpRouterConfiguration tcpCfg = new 
GridTcpRouterConfiguration();
-
-            tcpCfg.setPortRange(size);
-
-            for (int i = 0; i < size; i++)
-                tcpRouters.add(GridRouterFactory.startTcpRouter(tcpCfg));
-
-            for (GridTcpRouter tcpRouter : tcpRouters) {
-                assertEquals(tcpCfg, tcpRouter.configuration());
-                assertEquals(tcpRouter, 
GridRouterFactory.tcpRouter(tcpRouter.id()));
-            }
-
-            assertEquals("Validate all started tcp routers.", new 
HashSet<>(tcpRouters),
-                new HashSet<>(GridRouterFactory.allTcpRouters()));
-
-            for (Iterator<GridTcpRouter> it = tcpRouters.iterator(); 
it.hasNext(); ) {
-                GridTcpRouter tcpRouter = it.next();
-
-                assertEquals("Validate all started tcp routers.", new 
HashSet<>(tcpRouters),
-                    new HashSet<>(GridRouterFactory.allTcpRouters()));
-
-                it.remove();
-
-                GridRouterFactory.stopTcpRouter(tcpRouter.id());
-
-                assertEquals("Validate all started tcp routers.", new 
HashSet<>(tcpRouters),
-                    new HashSet<>(GridRouterFactory.allTcpRouters()));
-            }
-
-            assertEquals(Collections.<GridTcpRouter>emptyList(), 
GridRouterFactory.allTcpRouters());
-        }
-        finally {
-            GridRouterFactory.stopAllRouters();
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/756034f3/modules/clients/src/test/java/org/apache/ignite/client/router/TcpRouterAbstractSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/clients/src/test/java/org/apache/ignite/client/router/TcpRouterAbstractSelfTest.java
 
b/modules/clients/src/test/java/org/apache/ignite/client/router/TcpRouterAbstractSelfTest.java
deleted file mode 100644
index d5eedd3..0000000
--- 
a/modules/clients/src/test/java/org/apache/ignite/client/router/TcpRouterAbstractSelfTest.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * 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.client.router;
-
-import org.apache.ignite.*;
-import org.apache.ignite.client.*;
-import org.apache.ignite.internal.client.*;
-import org.apache.ignite.internal.client.router.*;
-import org.apache.ignite.internal.client.router.impl.*;
-import org.apache.ignite.logger.log4j.*;
-import org.apache.ignite.client.integration.*;
-import org.apache.ignite.internal.util.typedef.*;
-
-import java.util.*;
-
-/**
- * Abstract base class for http routing tests.
- */
-public abstract class TcpRouterAbstractSelfTest extends ClientAbstractSelfTest 
{
-    /** Port number to use by router. */
-    private static final int ROUTER_PORT = BINARY_PORT + 1;
-
-    /** TCP router instance. */
-    private static GridTcpRouterImpl router;
-
-    /** Send count. */
-    private static long sndCnt;
-
-    /** Receive count. */
-    private static long rcvCnt;
-
-    /** {@inheritDoc} */
-    @Override protected GridClientProtocol protocol() {
-        return GridClientProtocol.TCP;
-    }
-
-    /** {@inheritDoc} */
-    @Override protected String serverAddress() {
-        return null;
-    }
-
-    /** {@inheritDoc} */
-    @Override protected void beforeTest() throws Exception {
-        sndCnt = router.getSendCount();
-        rcvCnt = router.getReceivedCount();
-
-        super.beforeTest();
-    }
-
-    /** {@inheritDoc} */
-    @Override protected void afterTest() throws Exception {
-        super.afterTest();
-
-        assert router.getSendCount() > sndCnt :
-            "Failed to ensure network activity [currCnt=" + 
router.getSendCount() + ", oldCnt=" + sndCnt + ']';
-        assert router.getReceivedCount() > rcvCnt:
-            "Failed to ensure network activity [currCnt=" + 
router.getReceivedCount() + ", oldCnt=" + rcvCnt + ']';
-    }
-
-    /** {@inheritDoc} */
-    @Override protected void beforeTestsStarted() throws Exception {
-        super.beforeTestsStarted();
-
-        router = new GridTcpRouterImpl(routerConfiguration());
-
-        router.start();
-    }
-
-    /** {@inheritDoc} */
-    @Override protected void afterTestsStopped() throws Exception {
-        router.stop();
-
-        super.afterTestsStopped();
-    }
-
-    /** {@inheritDoc} */
-    @Override protected GridClientConfiguration clientConfiguration() throws 
GridClientException {
-        GridClientConfiguration cfg = super.clientConfiguration();
-
-        cfg.setServers(Collections.<String>emptySet());
-        cfg.setRouters(Collections.singleton(HOST + ":" + ROUTER_PORT));
-
-        return cfg;
-    }
-
-    /**
-     * @return Router configuration.
-     * @throws IgniteCheckedException If failed.
-     */
-    public GridTcpRouterConfiguration routerConfiguration() throws 
IgniteCheckedException {
-        GridTcpRouterConfiguration cfg = new GridTcpRouterConfiguration();
-
-        cfg.setHost(HOST);
-        cfg.setPort(ROUTER_PORT);
-        cfg.setPortRange(0);
-        cfg.setServers(Collections.singleton(HOST+":"+BINARY_PORT));
-        cfg.setLogger(new IgniteLog4jLogger(ROUTER_LOG_CFG));
-
-        return cfg;
-    }
-
-    /**
-     * @throws Exception If failed.
-     */
-    @Override public void testConnectable() throws Exception {
-        GridClient client = client();
-
-        List<GridClientNode> nodes = client.compute().refreshTopology(false, 
false);
-
-        assertFalse(F.first(nodes).connectable());
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/756034f3/modules/clients/src/test/java/org/apache/ignite/client/router/TcpRouterMultiNodeSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/clients/src/test/java/org/apache/ignite/client/router/TcpRouterMultiNodeSelfTest.java
 
b/modules/clients/src/test/java/org/apache/ignite/client/router/TcpRouterMultiNodeSelfTest.java
deleted file mode 100644
index cb7f8d4..0000000
--- 
a/modules/clients/src/test/java/org/apache/ignite/client/router/TcpRouterMultiNodeSelfTest.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * 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.client.router;
-
-import org.apache.ignite.*;
-import org.apache.ignite.client.*;
-import org.apache.ignite.internal.client.*;
-import org.apache.ignite.internal.client.router.*;
-import org.apache.ignite.internal.client.router.impl.*;
-import org.apache.ignite.logger.log4j.*;
-import org.apache.ignite.client.integration.*;
-
-import java.util.*;
-
-import static org.apache.ignite.client.integration.ClientAbstractSelfTest.*;
-
-/**
- *
- */
-public class TcpRouterMultiNodeSelfTest extends 
ClientAbstractMultiNodeSelfTest {
-    /** Number of routers to start in this test. */
-    private static final int ROUTERS_CNT = 5;
-
-    /** Where to start routers' port numeration. */
-    private static final int ROUTER_TCP_PORT_BASE = REST_TCP_PORT_BASE + 
NODES_CNT;
-
-    /** Collection of routers. */
-    private static Collection<GridTcpRouterImpl> routers = new 
ArrayList<>(ROUTERS_CNT);
-
-    /** {@inheritDoc} */
-    @Override protected void beforeTestsStarted() throws Exception {
-        super.beforeTestsStarted();
-
-        for (int i = 0; i < ROUTERS_CNT; i++)
-            routers.add(new GridTcpRouterImpl(routerConfiguration(i++)));
-
-        for (GridTcpRouterImpl r : routers)
-            r.start();
-    }
-
-    /** {@inheritDoc} */
-    @Override protected void afterTestsStopped() throws Exception {
-        info("Stopping routers...");
-
-        for (GridTcpRouterImpl r : routers)
-            r.stop();
-
-        info("Routers stopped.");
-
-        routers.clear();
-
-        super.afterTestsStopped();
-    }
-
-    /** {@inheritDoc} */
-    @Override protected GridClientProtocol protocol() {
-        return GridClientProtocol.TCP;
-    }
-
-    /** {@inheritDoc} */
-    @Override protected String serverAddress() {
-        return null;
-    }
-
-    /**
-     * @param i Number of router. Used to avoid configuration conflicts.
-     * @return Router configuration.
-     * @throws IgniteCheckedException If failed.
-     */
-    private GridTcpRouterConfiguration routerConfiguration(int i) throws 
IgniteCheckedException {
-        GridTcpRouterConfiguration cfg = new GridTcpRouterConfiguration();
-
-        cfg.setHost(HOST);
-        cfg.setPort(ROUTER_TCP_PORT_BASE + i);
-        cfg.setPortRange(0);
-        cfg.setServers(Collections.singleton(HOST + ":" + REST_TCP_PORT_BASE));
-        cfg.setLogger(new IgniteLog4jLogger(ROUTER_LOG_CFG));
-
-        return cfg;
-    }
-
-    /** {@inheritDoc} */
-    @Override protected GridClientConfiguration clientConfiguration() throws 
GridClientException {
-        GridClientConfiguration cfg = super.clientConfiguration();
-
-        cfg.setServers(Collections.<String>emptySet());
-
-        Collection<String> rtrs = new ArrayList<>(ROUTERS_CNT);
-
-        for (int i = 0; i < ROUTERS_CNT; i++)
-            rtrs.add(HOST + ':' + (ROUTER_TCP_PORT_BASE + i));
-
-        cfg.setRouters(rtrs);
-
-        return cfg;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/756034f3/modules/clients/src/test/java/org/apache/ignite/client/router/TcpRouterSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/clients/src/test/java/org/apache/ignite/client/router/TcpRouterSelfTest.java
 
b/modules/clients/src/test/java/org/apache/ignite/client/router/TcpRouterSelfTest.java
deleted file mode 100644
index a7fa1f8..0000000
--- 
a/modules/clients/src/test/java/org/apache/ignite/client/router/TcpRouterSelfTest.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * 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.client.router;
-
-import org.apache.ignite.internal.client.ssl.*;
-
-/**
- * Tests the simplest use case for router: singe router proxies connections to 
a single node.
- */
-public class TcpRouterSelfTest extends TcpRouterAbstractSelfTest {
-    /** {@inheritDoc} */
-    @Override protected boolean useSsl() {
-        return false;
-    }
-
-    /** {@inheritDoc} */
-    @Override protected GridSslContextFactory sslContextFactory() {
-        return null;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/756034f3/modules/clients/src/test/java/org/apache/ignite/client/router/TcpSslRouterSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/clients/src/test/java/org/apache/ignite/client/router/TcpSslRouterSelfTest.java
 
b/modules/clients/src/test/java/org/apache/ignite/client/router/TcpSslRouterSelfTest.java
deleted file mode 100644
index a90f010..0000000
--- 
a/modules/clients/src/test/java/org/apache/ignite/client/router/TcpSslRouterSelfTest.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * 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.client.router;
-
-import org.apache.ignite.*;
-import org.apache.ignite.internal.client.router.*;
-import org.apache.ignite.internal.client.ssl.*;
-import org.apache.ignite.testframework.*;
-
-/**
- *
- */
-public class TcpSslRouterSelfTest extends TcpRouterAbstractSelfTest {
-    /** {@inheritDoc} */
-    @Override protected boolean useSsl() {
-        return true;
-    }
-
-    /** {@inheritDoc} */
-    @Override protected GridSslContextFactory sslContextFactory() {
-        return GridTestUtils.sslContextFactory();
-    }
-
-    /**
-     * @return Router configuration.
-     */
-    @Override public GridTcpRouterConfiguration routerConfiguration() throws 
IgniteCheckedException {
-        GridTcpRouterConfiguration cfg = super.routerConfiguration();
-
-        cfg.setSslContextFactory(sslContextFactory());
-
-        return cfg;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/756034f3/modules/clients/src/test/java/org/apache/ignite/client/router/package.html
----------------------------------------------------------------------
diff --git 
a/modules/clients/src/test/java/org/apache/ignite/client/router/package.html 
b/modules/clients/src/test/java/org/apache/ignite/client/router/package.html
deleted file mode 100644
index 13bcb4b..0000000
--- a/modules/clients/src/test/java/org/apache/ignite/client/router/package.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!--
-  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.
-  -->
-
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd";>
-<html>
-<body>
-    <img alt="icon" class="javadocimg" src="{@docRoot}/img/cube.gif"/>
-    Contains intergration tests involving API, Client, router and REST 
processor.
-</body>
-</html>

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/756034f3/modules/clients/src/test/java/org/apache/ignite/client/router/testsuites/IgniteRouterTestSuite.java
----------------------------------------------------------------------
diff --git 
a/modules/clients/src/test/java/org/apache/ignite/client/router/testsuites/IgniteRouterTestSuite.java
 
b/modules/clients/src/test/java/org/apache/ignite/client/router/testsuites/IgniteRouterTestSuite.java
deleted file mode 100644
index 41660b1..0000000
--- 
a/modules/clients/src/test/java/org/apache/ignite/client/router/testsuites/IgniteRouterTestSuite.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * 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.client.router.testsuites;
-
-import junit.framework.*;
-import org.apache.ignite.client.router.*;
-
-/**
- * Test suite for router tests.
- */
-public class IgniteRouterTestSuite extends TestSuite {
-    /**
-     * @return Suite that contains all router tests.
-     */
-    public static TestSuite suite() {
-        TestSuite suite = new TestSuite("Ignite Router Test Suite");
-
-        suite.addTest(new TestSuite(RouterFactorySelfTest.class));
-        suite.addTest(new TestSuite(TcpRouterSelfTest.class));
-        suite.addTest(new TestSuite(TcpSslRouterSelfTest.class));
-        suite.addTest(new TestSuite(TcpRouterMultiNodeSelfTest.class));
-//        suite.addTest(new TestSuite(ClientFailedInitSelfTest.class));
-
-        return suite;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/756034f3/modules/clients/src/test/java/org/apache/ignite/client/suite/IgniteClientTestSuite.java
----------------------------------------------------------------------
diff --git 
a/modules/clients/src/test/java/org/apache/ignite/client/suite/IgniteClientTestSuite.java
 
b/modules/clients/src/test/java/org/apache/ignite/client/suite/IgniteClientTestSuite.java
deleted file mode 100644
index 2be4a20..0000000
--- 
a/modules/clients/src/test/java/org/apache/ignite/client/suite/IgniteClientTestSuite.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * 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.client.suite;
-
-import junit.framework.*;
-import org.apache.ignite.client.*;
-import org.apache.ignite.client.impl.*;
-import org.apache.ignite.client.integration.*;
-import org.apache.ignite.client.router.*;
-import org.apache.ignite.client.util.*;
-import org.apache.ignite.internal.processors.rest.*;
-import org.apache.ignite.internal.processors.rest.protocols.tcp.*;
-
-/**
- * Test suite includes all test that concern REST processors.
- */
-public class IgniteClientTestSuite extends TestSuite {
-    /**
-     * @return Suite that contains all tests for REST.
-     */
-    public static TestSuite suite() {
-        TestSuite suite = new TestSuite("Ignite Clients Test Suite");
-
-        suite.addTest(new TestSuite(RouterFactorySelfTest.class));
-
-        // Parser standalone test.
-        suite.addTest(new TestSuite(TcpRestParserSelfTest.class));
-
-        // Test memcache protocol with custom test client.
-        suite.addTest(new TestSuite(RestMemcacheProtocolSelfTest.class));
-
-        // Test custom binary protocol with test client.
-        suite.addTest(new TestSuite(RestBinaryProtocolSelfTest.class));
-
-        // Test jetty rest processor
-        suite.addTest(new TestSuite(JettyRestProcessorSignedSelfTest.class));
-        suite.addTest(new TestSuite(JettyRestProcessorUnsignedSelfTest.class));
-
-        // Test TCP rest processor with original memcache client.
-        suite.addTest(new TestSuite(ClientMemcachedProtocolSelfTest.class));
-
-        suite.addTest(new TestSuite(RestProcessorStartSelfTest.class));
-
-        // Test cache flag conversion.
-        suite.addTest(new TestSuite(ClientCacheFlagsCodecTest.class));
-
-        // Test multi-start.
-        suite.addTest(new TestSuite(RestProcessorMultiStartSelfTest.class));
-
-        // Test clients.
-        suite.addTest(new TestSuite(ClientDataImplSelfTest.class));
-        suite.addTest(new TestSuite(ClientComputeImplSelfTest.class));
-        suite.addTest(new TestSuite(ClientTcpSelfTest.class));
-        suite.addTest(new TestSuite(ClientTcpDirectSelfTest.class));
-        suite.addTest(new TestSuite(ClientTcpSslSelfTest.class));
-        suite.addTest(new TestSuite(ClientTcpSslDirectSelfTest.class));
-
-        // Test client with many nodes.
-        suite.addTest(new TestSuite(ClientTcpMultiNodeSelfTest.class));
-        suite.addTest(new TestSuite(ClientTcpDirectMultiNodeSelfTest.class));
-        suite.addTest(new TestSuite(ClientTcpSslMultiNodeSelfTest.class));
-        suite.addTest(new 
TestSuite(ClientTcpSslDirectMultiNodeSelfTest.class));
-        suite.addTest(new 
TestSuite(ClientTcpUnreachableMultiNodeSelfTest.class));
-        suite.addTest(new TestSuite(ClientPreferDirectSelfTest.class));
-
-        // Test client with many nodes and in multithreaded scenarios
-        suite.addTest(new TestSuite(ClientTcpMultiThreadedSelfTest.class));
-        suite.addTest(new TestSuite(ClientTcpSslMultiThreadedSelfTest.class));
-
-        // Test client authentication.
-        suite.addTest(new TestSuite(ClientTcpSslAuthenticationSelfTest.class));
-
-        suite.addTest(new TestSuite(ClientTcpConnectivitySelfTest.class));
-        suite.addTest(new TestSuite(ClientReconnectionSelfTest.class));
-
-        // Rest task command handler test.
-        suite.addTest(new TestSuite(TaskCommandHandlerSelfTest.class));
-
-        // Default cache only test.
-        suite.addTest(new TestSuite(ClientDefaultCacheSelfTest.class));
-
-        suite.addTestSuite(ClientFutureAdapterSelfTest.class);
-        suite.addTestSuite(ClientPartitionAffinitySelfTest.class);
-        suite.addTestSuite(ClientPropertiesConfigurationSelfTest.class);
-        suite.addTestSuite(ClientConsistentHashSelfTest.class);
-        suite.addTestSuite(ClientJavaHasherSelfTest.class);
-
-        suite.addTestSuite(ClientByteUtilsTest.class);
-
-        suite.addTest(new TestSuite(ClientTopologyCacheSelfTest.class));
-
-        // Router tests.
-        suite.addTest(new TestSuite(TcpRouterSelfTest.class));
-        suite.addTest(new TestSuite(TcpSslRouterSelfTest.class));
-        suite.addTest(new TestSuite(TcpRouterMultiNodeSelfTest.class));
-
-        suite.addTest(new TestSuite(ClientFailedInitSelfTest.class));
-
-        suite.addTest(new 
TestSuite(ClientTcpTaskExecutionAfterTopologyRestartSelfTest.class));
-
-        return suite;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/756034f3/modules/clients/src/test/java/org/apache/ignite/client/util/ClientByteUtilsTest.java
----------------------------------------------------------------------
diff --git 
a/modules/clients/src/test/java/org/apache/ignite/client/util/ClientByteUtilsTest.java
 
b/modules/clients/src/test/java/org/apache/ignite/client/util/ClientByteUtilsTest.java
deleted file mode 100644
index 4774cec..0000000
--- 
a/modules/clients/src/test/java/org/apache/ignite/client/util/ClientByteUtilsTest.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * 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.client.util;
-
-import org.apache.ignite.internal.util.*;
-import org.apache.ignite.testframework.junits.common.*;
-import org.junit.*;
-
-import java.util.*;
-
-import static org.apache.ignite.internal.util.GridClientByteUtils.*;
-
-/**
- * Test case for client's byte convertion utility.
- */
-public class ClientByteUtilsTest extends GridCommonAbstractTest {
-    /**
-     * Test UUID conversions from string to binary and back.
-     *
-     * @throws Exception On any exception.
-     */
-    public void testUuidConvertions() throws Exception {
-        Map<String, byte[]> map = new LinkedHashMap<>();
-
-        map.put("2ec84557-f7c4-4a2e-aea8-251eb13acff3", new byte[] {
-            46, -56, 69, 87, -9, -60, 74, 46, -82, -88, 37, 30, -79, 58, -49, 
-13
-        });
-        map.put("4e17b7b5-79e7-4db5-ac45-a644ead95b9e", new byte[] {
-            78, 23, -73, -75, 121, -25, 77, -75, -84, 69, -90, 68, -22, -39, 
91, -98
-        });
-        map.put("412daadb-e9e6-443b-8b87-8d7895fc2e53", new byte[] {
-            65, 45, -86, -37, -23, -26, 68, 59, -117, -121, -115, 120, -107, 
-4, 46, 83
-        });
-        map.put("e71aabf4-4aad-4280-b4e9-3c310be0cb88", new byte[] {
-            -25, 26, -85, -12, 74, -83, 66, -128, -76, -23, 60, 49, 11, -32, 
-53, -120
-        });
-        map.put("d4454cda-a81f-490f-9424-9bdfcc9cf610", new byte[] {
-            -44, 69, 76, -38, -88, 31, 73, 15, -108, 36, -101, -33, -52, -100, 
-10, 16
-        });
-        map.put("3a584450-5e85-4b69-9f9d-043d89fef23b", new byte[] {
-            58, 88, 68, 80, 94, -123, 75, 105, -97, -99, 4, 61, -119, -2, -14, 
59
-        });
-        map.put("6c8baaec-f173-4a60-b566-240a87d7f81d", new byte[] {
-            108, -117, -86, -20, -15, 115, 74, 96, -75, 102, 36, 10, -121, 
-41, -8, 29
-        });
-        map.put("d99c7102-79f7-4fb4-a665-d331cf285c20", new byte[] {
-            -39, -100, 113, 2, 121, -9, 79, -76, -90, 101, -45, 49, -49, 40, 
92, 32
-        });
-        map.put("007d56c7-5c8b-4279-a700-7f3f95946dde", new byte[] {
-            0, 125, 86, -57, 92, -117, 66, 121, -89, 0, 127, 63, -107, -108, 
109, -34
-        });
-        map.put("15627963-d8f9-4423-bedc-f6f89f7d3433", new byte[] {
-            21, 98, 121, 99, -40, -7, 68, 35, -66, -36, -10, -8, -97, 125, 52, 
51
-        });
-
-        for (Map.Entry<String, byte[]> e : map.entrySet()) {
-            UUID uuid = UUID.fromString(e.getKey());
-            UUID uuidFromBytes = GridClientByteUtils.bytesToUuid(e.getValue(), 
0);
-
-            assertEquals(uuid, uuidFromBytes);
-            assertEquals(e.getKey(), uuid.toString());
-            assertEquals(e.getKey(), uuidFromBytes.toString());
-
-            byte[] bytes = new byte[16];
-
-            GridClientByteUtils.uuidToBytes(uuid, bytes, 0);
-
-            assertTrue(e.getKey(), Arrays.equals(e.getValue(), bytes));
-        }
-    }
-
-    public void testShortToBytes() throws Exception {
-        Map<String, Short> map = new HashMap<>();
-
-        map.put("00-00", (short)0);
-        map.put("00-0F", (short)0x0F);
-        map.put("FF-F1", (short)-0x0F);
-        map.put("27-10", (short)10000);
-        map.put("D8-F0", (short)-10000);
-        map.put("80-00", Short.MIN_VALUE);
-        map.put("7F-FF", Short.MAX_VALUE);
-
-        for (Map.Entry<String, Short> entry : map.entrySet()) {
-            byte[] b = asByteArray(entry.getKey());
-
-            Assert.assertArrayEquals(b, shortToBytes(entry.getValue()));
-            Assert.assertEquals((short)entry.getValue(), bytesToShort(b, 0));
-
-            byte[] tmp = new byte[2];
-
-            shortToBytes(entry.getValue(), tmp, 0);
-            Assert.assertArrayEquals(b, tmp);
-        }
-    }
-
-    public void testIntToBytes() throws Exception {
-        Map<String, Integer> map = new HashMap<>();
-
-        map.put("00-00-00-00", 0);
-        map.put("00-FF-FF-FF", 0xFFFFFF);
-        map.put("FF-00-00-01", -0xFFFFFF);
-        map.put("3B-9A-CA-00", 1000000000);
-        map.put("C4-65-36-00", -1000000000);
-        map.put("80-00-00-00", Integer.MIN_VALUE);
-        map.put("7F-FF-FF-FF", Integer.MAX_VALUE);
-
-        for (Map.Entry<String, Integer> entry : map.entrySet()) {
-            byte[] b = asByteArray(entry.getKey());
-
-            Assert.assertArrayEquals(b, intToBytes(entry.getValue()));
-            Assert.assertEquals((int)entry.getValue(), bytesToInt(b, 0));
-
-            byte[] tmp = new byte[4];
-
-            intToBytes(entry.getValue(), tmp, 0);
-            Assert.assertArrayEquals(b, tmp);
-        }
-    }
-
-    public void testLongToBytes() throws Exception {
-        Map<String, Long> map = new LinkedHashMap<>();
-
-        map.put("00-00-00-00-00-00-00-00", 0L);
-        map.put("00-00-00-00-00-FF-FF-FF", 0xFFFFFFL);
-        map.put("FF-FF-FF-FF-FF-00-00-01", -0xFFFFFFL);
-        map.put("00-00-00-00-3B-9A-CA-00", 1000000000L);
-        map.put("FF-FF-FF-FF-C4-65-36-00", -1000000000L);
-        map.put("00-00-AA-AA-AA-AA-AA-AA", 0xAAAAAAAAAAAAL);
-        map.put("FF-FF-55-55-55-55-55-56", -0xAAAAAAAAAAAAL);
-        map.put("0D-E0-B6-B3-A7-64-00-00", 1000000000000000000L);
-        map.put("F2-1F-49-4C-58-9C-00-00", -1000000000000000000L);
-        map.put("80-00-00-00-00-00-00-00", Long.MIN_VALUE);
-        map.put("7F-FF-FF-FF-FF-FF-FF-FF", Long.MAX_VALUE);
-
-        for (Map.Entry<String, Long> entry : map.entrySet()) {
-            byte[] b = asByteArray(entry.getKey());
-
-            Assert.assertArrayEquals(b, longToBytes(entry.getValue()));
-            Assert.assertEquals((long)entry.getValue(), bytesToLong(b, 0));
-
-            byte[] tmp = new byte[8];
-
-            longToBytes(entry.getValue(), tmp, 0);
-            Assert.assertArrayEquals(b, tmp);
-        }
-    }
-
-    private byte[] asByteArray(String text) {
-        String[] split = text.split("-");
-        byte[] b = new byte[split.length];
-
-        for (int i = 0; i < split.length; i++)
-            b[i] = (byte)Integer.parseInt(split[i], 16);
-
-        return b;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/756034f3/modules/clients/src/test/java/org/apache/ignite/client/util/ClientConsistentHashSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/clients/src/test/java/org/apache/ignite/client/util/ClientConsistentHashSelfTest.java
 
b/modules/clients/src/test/java/org/apache/ignite/client/util/ClientConsistentHashSelfTest.java
deleted file mode 100644
index 0abce33..0000000
--- 
a/modules/clients/src/test/java/org/apache/ignite/client/util/ClientConsistentHashSelfTest.java
+++ /dev/null
@@ -1,282 +0,0 @@
-/*
- * 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.client.util;
-
-import org.apache.ignite.internal.client.util.*;
-import org.apache.ignite.testframework.junits.common.*;
-
-import java.util.*;
-
-/**
- * Test for consistent hash management class.
- */
-public class ClientConsistentHashSelfTest extends GridCommonAbstractTest {
-    /** Replicas count. */
-    private static final int REPLICAS = 512;
-
-    /**
-     * Test hash codes collisions.
-     *
-     * @throws Exception In case of any exception.
-     */
-    public void testCollisions() throws Exception {
-        Map<Integer, Set<UUID>> map = new HashMap<>();
-
-        // Different nodes, but collide hash codes.
-        Collection<UUID> nodes = new LinkedHashSet<>();
-
-        // Generate several nodes with collide hash codes.
-        while (nodes.size() < 10) {
-            UUID uuid = UUID.randomUUID();
-            int hashCode = uuid.hashCode();
-
-            Set<UUID> set = map.get(hashCode);
-
-            if (set == null)
-                map.put(hashCode, set = new LinkedHashSet<>());
-
-            set.add(uuid);
-
-            if (set.size() > 1)
-                nodes.addAll(set);
-        }
-
-        map.clear(); // Clean up.
-
-        GridClientConsistentHash<UUID> hash = new GridClientConsistentHash<>();
-
-        hash.addNodes(nodes, REPLICAS);
-
-        boolean fail = false;
-
-        for (UUID exp : nodes) {
-            UUID act = hash.node(0, Arrays.asList(exp));
-
-            if (exp.equals(act))
-                info("Validation succeed [exp=" + exp + ", act=" + act + ']');
-            else{
-                info("Validation failed  [exp=" + exp + ", act=" + act + ']');
-
-                fail = true;
-            }
-        }
-
-        if (fail)
-            fail("Failed to resolve consistent hash node, when node's hash 
codes collide: " + nodes);
-    }
-
-    /**
-     * Test restrictions from internal {@link TreeSet} usage.
-     *
-     * @throws Exception In case of any exception.
-     */
-    public void testTreeSetRestrictions() throws Exception {
-        // Constructs hash without explicit node's comparator.
-        GridClientConsistentHash<Object> hash = new 
GridClientConsistentHash<>();
-
-        try {
-            // Add several objects with the same hash without neither natural 
ordering nor comparator.
-            hash.addNode(new Object() { public int hashCode() { return 0; } }, 
1);
-            hash.addNode(new Object() { public int hashCode() { return 0; } }, 
1);
-
-            fail("Expects failed due to internal TreeSet requires comparator 
or natural ordering.");
-        }
-        catch (ClassCastException e) {
-            info("Expected fail due to internal TreeSet requires comparator or 
natural ordering: " + e.getMessage());
-        }
-
-        // Constructs hash with explicit node's comparator.
-        hash = new GridClientConsistentHash<>(new Comparator<Object>() {
-            @Override public int compare(Object o1, Object o2) {
-                // Such comparator is invalid for production code, but 
acceptable for current test purposes.
-                return System.identityHashCode(o1) - 
System.identityHashCode(o2);
-            }
-        }, null);
-
-        // Add several objects with the same hash into consistent hash with 
explicit comparator.
-        hash.addNode(new Object() { public int hashCode() { return 0; } }, 1);
-        hash.addNode(new Object() { public int hashCode() { return 0; } }, 1);
-
-        info("Expected pass due to internal TreeSet has explicit comparator.");
-    }
-
-    /**
-     * Validate generated hashes.<p>
-     * Note! This test should be ported into all supported platforms.
-     */
-    public void testHashGeneraton() {
-        // Validate strings.
-        checkHash("", -1484017934);
-        checkHash("1", -80388575);
-        checkHash("a", -873690096);
-        checkHash("Hadoop\u3092\u6bba\u3059", -695300527);
-        checkHash("key1", -2067461682);
-
-        // Validate primitives.
-        checkHash(true, 1669973725);
-        checkHash(false, -1900934144);
-
-        checkHash(3, 386050343);
-        checkHash(1000000000, -547312286);
-        checkHash(0x7fffffff, 473949739);
-        checkHash(0xffffffff, -1399925094);
-        checkHash(0x7fffffffffffffffL, 201097861);
-        checkHash(0xffffffffffffffffL, -1484017934);
-        checkHash(1.4e-45f, 1262722378);
-        checkHash(3.4028235e+38f, 1313755354);
-        checkHash(4.9e-324, 1262722378);
-        checkHash(1.7976931348623157e+308, -783615357);
-
-        // Validate objects.
-        checkHash(UUID.fromString("4d180911-21c9-48f2-a1e6-7bc1daf588a0"), 
-440525148);
-
-        checkUUID("224ea4cd-f449-4dcb-869a-5317c63bd619", 806670090);
-        checkUUID("fdc9ec54-ff53-4fdb-8239-5a3ac1fb31bd", -354375826);
-        checkUUID("0f9c9b94-02ae-45a6-9d5c-a066dbdf2636", -1312538272);
-        checkUUID("d8f1f916-4357-4cfe-a7df-49d4721690bf", -482944041);
-        checkUUID("d67eb652-4e76-47fb-ad4e-cd902d9b868a", -449444069);
-        checkUUID("c77ffeae-78a1-4ee6-a0fd-8d197a794412", -168980875);
-        checkUUID("35de9f21-3c9b-4f4a-a7d5-3e2c6cb01564", -383915637);
-    }
-
-    /**
-     * Test mapping to nodes.
-     */
-    @SuppressWarnings("UnaryPlus")
-    public void testMappingToNodes() {
-        String n1 = "node #1";
-        String n2 = "node #2";
-        String n3 = "node #3";
-        String n4 = "node #4";
-
-        List<String> nodes = Arrays.asList(n1, n2, n3, n4);
-
-        GridClientConsistentHash<String> hash = new 
GridClientConsistentHash<>();
-
-        for (String node : nodes)
-            hash.addNode(node, 5);
-
-        Map<Object, String> data = new LinkedHashMap<>();
-
-        data.put("", n1);
-        data.put("asdf", n3);
-        data.put("224ea4cd-f449-4dcb-869a-5317c63bd619", n2);
-        data.put("fdc9ec54-ff53-4fdb-8239-5a3ac1fb31bd", n4);
-        data.put("0f9c9b94-02ae-45a6-9d5c-a066dbdf2636", n1);
-        data.put("d8f1f916-4357-4cfe-a7df-49d4721690bf", n3);
-        data.put("c77ffeae-78a1-4ee6-a0fd-8d197a794412", n4);
-        data.put("35de9f21-3c9b-4f4a-a7d5-3e2c6cb01564", n4);
-        data.put("d67eb652-4e76-47fb-ad4e-cd902d9b868a", n4);
-
-        data.put(0, n1);
-        data.put(1, n4);
-        data.put(12, n3);
-        data.put(123, n3);
-        data.put(1234, n3);
-        data.put(12345, n4);
-        data.put(123456, n3);
-        data.put(1234567, n4);
-        data.put(12345678, n4);
-        data.put(123456789, n4);
-        data.put(1234567890, n3);
-        data.put(1234567890L, n3);
-        data.put(12345678901L, n4);
-        data.put(123456789012L, n2);
-        data.put(1234567890123L, n4);
-        data.put(12345678901234L, n1);
-        data.put(123456789012345L, n1);
-        data.put(1234567890123456L, n3);
-        data.put(-23456789012345L, n2);
-        data.put(-2345678901234L, n1);
-        data.put(-234567890123L, n4);
-        data.put(-23456789012L, n3);
-        data.put(-2345678901L, n3);
-        data.put(-234567890L, n1);
-        data.put(-234567890, n4);
-        data.put(-23456789, n4);
-        data.put(-2345678, n4);
-        data.put(-234567, n4);
-        data.put(-23456, n4);
-        data.put(-2345, n1);
-        data.put(-234, n4);
-        data.put(-23, n3);
-        data.put(-2, n4);
-
-        data.put(0x80000000, n2);
-        data.put(0x7fffffff, n4);
-        data.put(0x8000000000000000L, n2);
-        data.put(0x7fffffffffffffffL, n2);
-
-        data.put(+1.1, n1);
-        data.put(-10.01, n3);
-        data.put(+100.001, n3);
-        data.put(-1000.0001, n4);
-        data.put(+1.7976931348623157E+308, n4);
-        data.put(-1.7976931348623157E+308, n4);
-        data.put(+4.9E-324, n4);
-        data.put(-4.9E-324, n3);
-
-        for (Map.Entry<Object, String> entry : data.entrySet())
-            assertEquals("Validate key '" + entry.getKey() + "'.", 
entry.getValue(), hash.node(entry.getKey()));
-
-        for (Map.Entry<Object, String> entry : data.entrySet())
-            assertEquals("Validate key '" + entry.getKey() + "'.", 
entry.getValue(), hash.node(entry.getKey(), nodes));
-
-        //
-        // Change order nodes were added.
-        //
-
-        nodes = new ArrayList<>(nodes);
-
-        Collections.reverse(nodes);
-
-        // Reset consistent hash with new nodes order.
-        hash = new GridClientConsistentHash<>();
-
-        for (String node : nodes)
-            hash.addNode(node, 5);
-
-        for (Map.Entry<Object, String> entry : data.entrySet())
-            assertEquals("Validate key '" + entry.getKey() + "'.", 
entry.getValue(), hash.node(entry.getKey()));
-
-        for (Map.Entry<Object, String> entry : data.entrySet())
-            assertEquals("Validate key '" + entry.getKey() + "'.", 
entry.getValue(), hash.node(entry.getKey(), nodes));
-    }
-
-    /**
-     * Check unique id and generated hash code.
-     *
-     * @param uuid String presentation of unique id.
-     * @param code Expected hash code.
-     */
-    private void checkUUID(String uuid, int code) {
-        checkHash(UUID.fromString(uuid), code);
-    }
-
-    /**
-     * Check hash generation for the specified object.
-     *
-     * @param o Object to verify hash generation for.
-     * @param code Expected hash code.
-     */
-    private void checkHash(Object o, int code) {
-        int i = GridClientConsistentHash.hash(o);
-
-        assertEquals("Check affinity for object: " + o, code, i);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/756034f3/modules/clients/src/test/java/org/apache/ignite/client/util/ClientJavaHasherSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/clients/src/test/java/org/apache/ignite/client/util/ClientJavaHasherSelfTest.java
 
b/modules/clients/src/test/java/org/apache/ignite/client/util/ClientJavaHasherSelfTest.java
deleted file mode 100644
index 79be2e4..0000000
--- 
a/modules/clients/src/test/java/org/apache/ignite/client/util/ClientJavaHasherSelfTest.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * 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.client.util;
-
-import org.apache.ignite.testframework.junits.common.*;
-
-import java.util.*;
-
-/**
- * Test for Java hash codes calculations - SHOULD BE PORTED to other languages.
- */
-public class ClientJavaHasherSelfTest extends GridCommonAbstractTest {
-    /**
-     * Validate known Java hash codes.
-     */
-    public void testPredefined() {
-        Map<Object, Integer> map = new LinkedHashMap<>();
-
-        // Primitives.
-        for (long i = 1, max = 1L << 48; i < max; i *= -3) {
-            map.put((byte)i, (int)(byte)i);
-            map.put((char)i, (int)(char)i);
-            map.put((int)i, (int)i);
-            map.put(i, (int)(i ^ (i >>> 32)));
-        }
-
-        // Double.
-        map.put(0.0, 0);
-        map.put(1.0, 1072693248);
-        map.put(-1.0, -1074790400);
-        map.put(3.1415e200, 1130072580);
-        map.put(3.1415e-200, -819810675);
-
-        // Strings
-        map.put("", 0);
-        map.put("asdf", 3003444);
-        map.put("Hadoop\u3092\u6bba\u3059", 2113729932);
-        map.put("224ea4cd-f449-4dcb-869a-5317c63bd619", 258755163);
-        map.put("fdc9ec54-ff53-4fdb-8239-5a3ac1fb31bd", -863611257);
-        map.put("0f9c9b94-02ae-45a6-9d5c-a066dbdf2636", -1499939567);
-        map.put("d8f1f916-4357-4cfe-a7df-49d4721690bf", 2041432124);
-
-        // UUID.
-        map.put(UUID.fromString("224ea4cd-f449-4dcb-869a-5317c63bd619"), 
-1767478264);
-        map.put(UUID.fromString("fdc9ec54-ff53-4fdb-8239-5a3ac1fb31bd"), 
1096337416);
-        map.put(UUID.fromString("0f9c9b94-02ae-45a6-9d5c-a066dbdf2636"), 
1269913698);
-        map.put(UUID.fromString("d8f1f916-4357-4cfe-a7df-49d4721690bf"), 
1315925123);
-
-        boolean ok = true;
-
-        for (Map.Entry<Object, Integer> entry : map.entrySet()) {
-            int act = entry.getKey().hashCode();
-            int exp = entry.getValue();
-
-            if (exp == act)
-                continue;
-
-            ok = false;
-
-            info("Validation of hash code for '" + entry.getKey() + "' failed" 
+
-                " [expected=" + exp + ", actual=" + act + ".");
-        }
-
-        if (ok)
-            return;
-
-        fail("Java hash codes validation fails.");
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/756034f3/modules/clients/src/test/java/org/apache/ignite/internal/client/ClientAbstractMultiThreadedSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/clients/src/test/java/org/apache/ignite/internal/client/ClientAbstractMultiThreadedSelfTest.java
 
b/modules/clients/src/test/java/org/apache/ignite/internal/client/ClientAbstractMultiThreadedSelfTest.java
new file mode 100644
index 0000000..e2f7ad1
--- /dev/null
+++ 
b/modules/clients/src/test/java/org/apache/ignite/internal/client/ClientAbstractMultiThreadedSelfTest.java
@@ -0,0 +1,619 @@
+/*
+ * 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.client;
+
+import org.apache.ignite.*;
+import org.apache.ignite.cache.*;
+import org.apache.ignite.cache.affinity.*;
+import org.apache.ignite.client.*;
+import org.apache.ignite.cluster.*;
+import org.apache.ignite.compute.*;
+import org.apache.ignite.configuration.*;
+import org.apache.ignite.internal.*;
+import org.apache.ignite.internal.client.*;
+import org.apache.ignite.internal.client.balancer.*;
+import org.apache.ignite.internal.client.impl.*;
+import org.apache.ignite.internal.client.ssl.*;
+import org.apache.ignite.lang.*;
+import org.apache.ignite.resources.*;
+import org.apache.ignite.internal.processors.affinity.*;
+import org.apache.ignite.spi.discovery.tcp.*;
+import org.apache.ignite.spi.discovery.tcp.ipfinder.*;
+import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.*;
+import org.apache.ignite.internal.util.typedef.*;
+import org.apache.ignite.internal.util.typedef.internal.*;
+import org.apache.ignite.testframework.junits.common.*;
+import org.jetbrains.annotations.*;
+import org.junit.*;
+
+import java.util.*;
+import java.util.concurrent.*;
+import java.util.concurrent.atomic.*;
+
+import static org.apache.ignite.cache.CacheAtomicityMode.*;
+import static org.apache.ignite.cache.CacheDistributionMode.*;
+import static org.apache.ignite.cache.CacheMode.*;
+import static org.apache.ignite.cache.CacheWriteSynchronizationMode.*;
+import static org.apache.ignite.testframework.GridTestUtils.*;
+
+/**
+ *
+ */
+public abstract class ClientAbstractMultiThreadedSelfTest extends 
GridCommonAbstractTest {
+    /** IP finder. */
+    private static final TcpDiscoveryIpFinder IP_FINDER = new 
TcpDiscoveryVmIpFinder(true);
+
+    /** Partitioned cache name. */
+    protected static final String PARTITIONED_CACHE_NAME = "partitioned";
+
+    /** Partitioned cache with async commit and backup name. */
+    protected static final String PARTITIONED_ASYNC_BACKUP_CACHE_NAME = 
"partitioned-async-backup";
+
+    /** Replicated cache name. */
+    private static final String REPLICATED_CACHE_NAME = "replicated";
+
+    /** Replicated cache  with async commit name. */
+    private static final String REPLICATED_ASYNC_CACHE_NAME = 
"replicated-async";
+
+    /** Nodes count. */
+    protected static final int NODES_CNT = 5;
+
+    /** Thread count to run tests. */
+    private static final int THREAD_CNT = 20;
+
+    /** Count of tasks to run. */
+    private static final int TASK_EXECUTION_CNT = 50000;
+
+    /** Count of cache puts in tests. */
+    private static final int CACHE_PUT_CNT = 10000;
+
+    /** Topology update frequency. */
+    private static final int TOP_REFRESH_FREQ = 1000;
+
+    /** Info messages will be printed each 5000 iterations. */
+    private static final int STATISTICS_PRINT_STEP = 5000;
+
+    /** Host. */
+    public static final String HOST = "127.0.0.1";
+
+    /** Base for tcp rest ports. */
+    public static final int REST_TCP_PORT_BASE = 12345;
+
+    static {
+        System.setProperty("CLIENTS_MODULE_PATH", 
U.resolveGridGainPath("modules/clients").getAbsolutePath());
+    }
+
+    /** Client instance for each test. */
+    private GridClient client;
+
+    /**
+     * @return Client protocol that should be used.
+     */
+    protected abstract GridClientProtocol protocol();
+
+    /**
+     * @return Server address to create first connection.
+     */
+    protected abstract String serverAddress();
+
+    /**
+     * @return Whether SSL should be used.
+     */
+    protected abstract boolean useSsl();
+
+    /**
+     * @return SSL context factory to use if SSL is enabled.
+     */
+    protected abstract GridSslContextFactory sslContextFactory();
+
+    /**
+     * @return Count of iterations for sync commit test.
+     */
+    protected int syncCommitIterCount() {
+        return 1000;
+    }
+
+    /**
+     * @return Topology refresh frequency interval.
+     */
+    protected int topologyRefreshFrequency() {
+        return TOP_REFRESH_FREQ;
+    }
+
+    /**
+     * @return Max connection idle time.
+     */
+    protected int maxConnectionIdleTime() {
+        return 5000;
+    }
+
+    /**
+     * @return Number of tasks that should be executed during test.
+     */
+    protected int taskExecutionCount() {
+        return TASK_EXECUTION_CNT;
+    }
+
+    /**
+     * @return Number of puts to the cache.
+     */
+    protected int cachePutCount() {
+        return CACHE_PUT_CNT;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected IgniteConfiguration getConfiguration(String gridName) 
throws Exception {
+        IgniteConfiguration c = super.getConfiguration(gridName);
+
+        c.setLocalHost(HOST);
+
+        assert c.getClientConnectionConfiguration() == null;
+
+        ClientConnectionConfiguration clientCfg = new 
ClientConnectionConfiguration();
+
+        clientCfg.setRestTcpPort(REST_TCP_PORT_BASE);
+
+        if (useSsl()) {
+            clientCfg.setRestTcpSslEnabled(true);
+
+            clientCfg.setRestTcpSslContextFactory(sslContextFactory());
+        }
+
+        c.setClientConnectionConfiguration(clientCfg);
+
+        TcpDiscoverySpi disco = new TcpDiscoverySpi();
+
+        disco.setIpFinder(IP_FINDER);
+
+        c.setDiscoverySpi(disco);
+
+        c.setCacheConfiguration(cacheConfiguration(null), 
cacheConfiguration(PARTITIONED_CACHE_NAME),
+            cacheConfiguration(REPLICATED_CACHE_NAME), 
cacheConfiguration(PARTITIONED_ASYNC_BACKUP_CACHE_NAME),
+            cacheConfiguration(REPLICATED_ASYNC_CACHE_NAME));
+
+        return c;
+    }
+
+    /**
+     * @param cacheName Cache name.
+     * @return Cache configuration.
+     * @throws Exception In case of error.
+     */
+    private CacheConfiguration cacheConfiguration(@Nullable String cacheName) 
throws Exception {
+        CacheConfiguration cfg = defaultCacheConfiguration();
+
+        cfg.setDistributionMode(NEAR_PARTITIONED);
+        cfg.setAtomicityMode(TRANSACTIONAL);
+
+        if (cacheName == null)
+            cfg.setCacheMode(LOCAL);
+        else if (PARTITIONED_CACHE_NAME.equals(cacheName)) {
+            cfg.setCacheMode(PARTITIONED);
+
+            cfg.setBackups(0);
+        }
+        else if (PARTITIONED_ASYNC_BACKUP_CACHE_NAME.equals(cacheName)) {
+            cfg.setCacheMode(PARTITIONED);
+
+            cfg.setBackups(1);
+        }
+        else
+            cfg.setCacheMode(REPLICATED);
+
+        cfg.setName(cacheName);
+
+        if (cacheName != null && !cacheName.contains("async"))
+            cfg.setWriteSynchronizationMode(FULL_SYNC);
+
+        return cfg;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void beforeTestsStarted() throws Exception {
+        startGridsMultiThreaded(NODES_CNT);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void afterTestsStopped() throws Exception {
+        stopAllGrids();
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void beforeTest() throws Exception {
+        client = GridClientFactory.start(clientConfiguration());
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void afterTest() throws Exception {
+        GridClientFactory.stop(client.id(), false);
+
+        client = null;
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testSyncCommitFlagReplicated() throws Exception {
+        doTestSyncCommitFlag(client.data(REPLICATED_ASYNC_CACHE_NAME));
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testSyncCommitFlagPartitioned() throws Exception {
+        doTestSyncCommitFlag(client.data(PARTITIONED_ASYNC_BACKUP_CACHE_NAME));
+    }
+
+    /**
+     * Extracts array from given iterator.
+     *
+     * @param nodes Iterator of nodes.
+     * @return Nodes array.
+     */
+    private GridClientNode[] toArray(Iterator<? extends GridClientNode> nodes) 
{
+        ArrayList<GridClientNode> res = new ArrayList<>();
+
+        while (nodes.hasNext())
+            res.add(nodes.next());
+
+        return res.toArray(new GridClientNode[res.size()]);
+    }
+
+    /**
+     * Runs test on SYNC_COMMIT flag.
+     *
+     * @param data Client data to run test on.
+     * @throws Exception If failed.
+     */
+    private void doTestSyncCommitFlag(final GridClientData data) throws 
Exception {
+        final String key = "k0";
+
+        Collection<UUID> affNodesIds = F.viewReadOnly(
+            
grid(0).cache(data.cacheName()).affinity().mapKeyToPrimaryAndBackups(key),
+            F.node2id());
+
+        final GridClientData dataFirst = 
data.pinNodes(F.first(client.compute().nodes()));
+
+        List<GridClientNode> affNodes = new ArrayList<>();
+
+        for (GridClientNode node : client.compute().nodes()) {
+            if (affNodesIds.contains(node.nodeId()))
+                affNodes.add(node);
+        }
+
+        Assert.assertFalse(affNodes.isEmpty());
+
+        Iterator<? extends GridClientNode> it = affNodes.iterator();
+
+        final GridClientData dataOthers = data.pinNodes(it.next(), 
toArray(it));
+
+        for (int i = 0; i < syncCommitIterCount(); i++) {
+            final CountDownLatch l = new CountDownLatch(1);
+
+            final String val = "v" + i;
+
+            IgniteInternalFuture<?> f = multithreadedAsync(new 
Callable<Object>() {
+                @Override public Object call() throws Exception {
+                    l.await();
+
+                    assertEquals(val, dataOthers.get(key));
+
+                    return null;
+                }
+            }, THREAD_CNT);
+
+            dataFirst.flagsOn(GridClientCacheFlag.SYNC_COMMIT).put(key, val);
+
+            l.countDown();
+
+            f.get();
+        }
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testMultithreadedTaskRun() throws Exception {
+        final AtomicLong cnt = new AtomicLong();
+
+        final AtomicReference<GridClientException> err = new 
AtomicReference<>();
+
+        final ConcurrentLinkedQueue<String> execQueue = new 
ConcurrentLinkedQueue<>();
+
+        IgniteInternalFuture<?> fut = multithreadedAsync(new Runnable() {
+            @Override
+            public void run() {
+                long processed;
+
+                while ((processed = cnt.getAndIncrement()) < 
taskExecutionCount()) {
+                    try {
+                        if (processed > 0 && processed % STATISTICS_PRINT_STEP 
== 0)
+                            info(">>>>>>> " + processed + " tasks finished.");
+
+                        String res = 
client.compute().execute(TestTask.class.getName(), null);
+
+                        execQueue.add(res);
+                    }
+                    catch (GridClientException e) {
+                        err.compareAndSet(null, e);
+                    }
+                }
+            }
+        }, THREAD_CNT, "client-task-request");
+
+        fut.get();
+
+        if (err.get() != null)
+            throw new Exception(err.get());
+
+        assertEquals(taskExecutionCount(), execQueue.size());
+
+        // With round-robin balancer each node must receive equal count of 
task requests.
+        Collection<String> executionIds = new HashSet<>(execQueue);
+
+        assertTrue(executionIds.size() == NODES_CNT);
+
+        Map<String, AtomicInteger> statisticsMap = new HashMap<>();
+
+        for (String id : executionIds)
+            statisticsMap.put(id, new AtomicInteger());
+
+        for (String id : execQueue)
+            statisticsMap.get(id).incrementAndGet();
+
+        info(">>>>>>> Execution statistics per node:");
+
+        for (Map.Entry<String, AtomicInteger> e : statisticsMap.entrySet())
+            info(">>>>>>> " + e.getKey() + " run " + e.getValue().get() + " 
tasks");
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void test6Affinity() throws Exception {
+        GridClientData cache = client.data(PARTITIONED_CACHE_NAME);
+        UUID nodeId = cache.affinity("6");
+
+        info("Affinity node: " + nodeId);
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testMultithreadedCachePut() throws Exception {
+        final AtomicLong keyCnt = new AtomicLong();
+
+        final AtomicReference<Exception> err = new AtomicReference<>();
+
+        final ConcurrentMap<String, T2<UUID, String>> puts = new 
ConcurrentHashMap<>();
+
+        final Map<UUID, Ignite> gridMap = new HashMap<>();
+
+        for (int i = 0; i < NODES_CNT; i++) {
+            Ignite g = grid(i);
+
+            gridMap.put(g.cluster().localNode().id(), g);
+        }
+
+        final Ignite ignite = F.first(gridMap.values());
+
+        assertEquals(NODES_CNT, client.compute().refreshTopology(false, 
false).size());
+
+        IgniteInternalFuture<?> fut = multithreadedAsync(new Runnable() {
+            @SuppressWarnings("OverlyStrongTypeCast")
+            @Override public void run() {
+                try {
+                    GridClientData cache = client.data(PARTITIONED_CACHE_NAME);
+
+                    assertEquals(NODES_CNT, 
((GridClientDataImpl)cache).projectionNodes().size());
+
+                    long rawKey;
+
+                    while ((rawKey = keyCnt.getAndIncrement()) < 
cachePutCount()) {
+                        String key = String.valueOf(rawKey);
+
+                        UUID nodeId = cache.affinity(key);
+                        UUID srvNodeId = 
ignite.cluster().mapKeyToNode(PARTITIONED_CACHE_NAME, key).id();
+
+                        if (!nodeId.equals(srvNodeId)) {
+                            //GridClientDataAffinity clAff =
+                            //    
((GridClientConfiguration)getFieldValue(client, "cfg")).
+                            //        
getDataConfiguration(PARTITIONED_CACHE_NAME).getAffinity();
+
+                            //printAffinityState(gridMap.values());
+                            //info("Client affinity: " + clAff);
+
+                            info("Got wrong client mapping [key=" + key + ", 
exp=" + srvNodeId +
+                                ", actual=" + nodeId + "]");
+                        }
+
+                        String val = "val" + rawKey;
+
+                        if (cache.put(key, val)) {
+                            T2<UUID, String> old = puts.putIfAbsent(key, new 
T2<>(nodeId, val));
+
+                            assert old == null : "Map contained entry [key=" + 
rawKey + ", entry=" + old + ']';
+                        }
+                    }
+                }
+                catch (Exception e) {
+                    err.compareAndSet(null, e);
+                }
+            }
+        }, THREAD_CNT, "client-cache-put");
+
+        fut.get();
+
+        if (err.get() != null)
+            throw new Exception(err.get());
+
+        assertEquals(cachePutCount(), puts.size());
+
+        // Now check that all puts went to primary nodes.
+        for (long i = 0; i < cachePutCount(); i++) {
+            String key = String.valueOf(i);
+
+            ClusterNode node = 
ignite.cluster().mapKeyToNode(PARTITIONED_CACHE_NAME, key);
+
+            if 
(!puts.get(key).get2().equals(gridMap.get(node.id()).cache(PARTITIONED_CACHE_NAME).peek(key)))
 {
+                // printAffinityState(gridMap.values());
+
+                failNotEquals("Node don't have value for key [nodeId=" + 
node.id() + ", key=" + key + "]",
+                    puts.get(key).get2(), 
gridMap.get(node.id()).cache(PARTITIONED_CACHE_NAME).peek(key));
+            }
+
+            // Assert that client has properly determined affinity node.
+            if (!node.id().equals(puts.get(key).get1())) {
+                //GridClientDataAffinity clAff =
+                //    ((GridClientConfiguration)getFieldValue(client, "cfg")).
+                //        
getDataConfiguration(PARTITIONED_CACHE_NAME).getAffinity();
+
+                //printAffinityState(gridMap.values());
+                //info("Client affinity: " + clAff);
+
+                UUID curAffNode = 
client.data(PARTITIONED_CACHE_NAME).affinity(key);
+
+                failNotEquals(
+                    "Got different mappings [key=" + key + ", currId=" + 
curAffNode + "]",
+                    node.id(), puts.get(key).get1());
+            }
+
+            // Check that no other nodes see this key.
+            for (UUID id : F.view(gridMap.keySet(), F.notEqualTo(node.id())))
+                assertNull("Got value in near cache.", 
gridMap.get(id).cache(PARTITIONED_CACHE_NAME).peek(key));
+        }
+
+        for (Ignite g : gridMap.values())
+            g.cache(PARTITIONED_CACHE_NAME).clearAll();
+    }
+
+    /**
+     * @param grids Collection for Grids to print affinity info.
+     */
+    private void printAffinityState(Iterable<Ignite> grids) {
+        for (Ignite g : grids) {
+            GridAffinityAssignmentCache affCache = getFieldValue(
+                
((IgniteKernal)g).internalCache(PARTITIONED_CACHE_NAME).context().affinity(),
+                "aff");
+
+            CacheAffinityFunction aff = getFieldValue(affCache, "aff");
+
+            info("Affinity [nodeId=" + g.cluster().localNode().id() + ", 
affinity=" + aff + "]");
+        }
+    }
+
+    /** {@inheritDoc} */
+    @Override protected long getTestTimeout() {
+        return 5 * 60 * 1000;
+    }
+
+    /**
+     * Creates client that will try to connect to only first node in grid.
+     *
+     * @return Client.
+     */
+    private GridClientConfiguration clientConfiguration() {
+        GridClientConfiguration cfg = new GridClientConfiguration();
+
+        cfg.setTopologyRefreshFrequency(topologyRefreshFrequency());
+        cfg.setMaxConnectionIdleTime(maxConnectionIdleTime());
+
+        cfg.setProtocol(protocol());
+        cfg.setServers(Arrays.asList(serverAddress()));
+        cfg.setBalancer(new GridClientRoundRobinBalancer());
+
+        if (useSsl())
+            cfg.setSslContextFactory(sslContextFactory());
+
+        GridClientDataConfiguration loc = new GridClientDataConfiguration();
+
+        GridClientDataConfiguration partitioned = new 
GridClientDataConfiguration();
+        partitioned.setName(PARTITIONED_CACHE_NAME);
+        partitioned.setAffinity(new GridClientPartitionAffinity());
+
+        GridClientDataConfiguration partitionedAsyncBackup = new 
GridClientDataConfiguration();
+        partitionedAsyncBackup.setName(PARTITIONED_ASYNC_BACKUP_CACHE_NAME);
+        partitionedAsyncBackup.setAffinity(new GridClientPartitionAffinity());
+
+        GridClientDataConfiguration replicated = new 
GridClientDataConfiguration();
+        replicated.setName(REPLICATED_CACHE_NAME);
+
+        GridClientDataConfiguration replicatedAsync = new 
GridClientDataConfiguration();
+        replicatedAsync.setName(REPLICATED_ASYNC_CACHE_NAME);
+
+        cfg.setDataConfigurations(Arrays.asList(loc, partitioned, replicated, 
replicatedAsync, partitionedAsyncBackup));
+
+        return cfg;
+    }
+
+    /**
+     * Test task. Returns a tuple in which first component is id of node that 
has split the task,
+     * and second component is count of nodes that executed jobs.
+     */
+    private static class TestTask extends ComputeTaskSplitAdapter<Object, 
String> {
+        /** Injected grid. */
+        @IgniteInstanceResource
+        private Ignite ignite;
+
+        /** Count of tasks this job was split to. */
+        private int gridSize;
+
+        /** {@inheritDoc} */
+        @Override protected Collection<? extends ComputeJob> split(int 
gridSize, Object arg)
+            throws IgniteCheckedException {
+            Collection<ComputeJobAdapter> jobs = new ArrayList<>(gridSize);
+
+            this.gridSize = gridSize;
+
+            final String locNodeId = 
ignite.cluster().localNode().id().toString();
+
+            for (int i = 0; i < gridSize; i++) {
+                jobs.add(new ComputeJobAdapter() {
+                    @Override public Object execute() {
+                        return new IgniteBiTuple<>(locNodeId, 1);
+                    }
+                });
+            }
+
+            return jobs;
+        }
+
+        /** {@inheritDoc} */
+        @Override public String reduce(List<ComputeJobResult> results) throws 
IgniteCheckedException {
+            int sum = 0;
+
+            String locNodeId = null;
+
+            for (ComputeJobResult res : results) {
+                IgniteBiTuple<String, Integer> part = res.getData();
+
+                if (locNodeId == null)
+                    locNodeId = part.get1();
+
+                Integer i = part.get2();
+
+                if (i != null)
+                    sum += i;
+            }
+
+            assert gridSize == sum;
+
+            return locNodeId;
+        }
+    }
+}

Reply via email to