blob: 87d763c0b0e5627c683df1b4d29a49272690b6ac [file] [log] [blame]
/*
* 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.managers.communication;
import java.nio.ByteBuffer;
import java.util.Collection;
import java.util.UUID;
import java.util.concurrent.Callable;
import org.apache.commons.collections.CollectionUtils;
import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.cluster.ClusterNode;
import org.apache.ignite.internal.GridKernalContext;
import org.apache.ignite.internal.GridTopic;
import org.apache.ignite.internal.managers.discovery.GridDiscoveryManager;
import org.apache.ignite.internal.util.typedef.F;
import org.apache.ignite.marshaller.jdk.JdkMarshaller;
import org.apache.ignite.plugin.extensions.communication.Message;
import org.apache.ignite.plugin.extensions.communication.MessageReader;
import org.apache.ignite.plugin.extensions.communication.MessageWriter;
import org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi;
import org.apache.ignite.testframework.GridTestNode;
import org.apache.ignite.testframework.GridTestUtils;
import org.apache.ignite.testframework.junits.GridTestKernalContext;
import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
import org.junit.Ignore;
import org.junit.Test;
import org.mockito.ArgumentMatcher;
import org.mockito.Mockito;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.argThat;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
/**
* Test for {@link GridIoManager}.
*/
public class GridIoManagerSelfTest extends GridCommonAbstractTest {
/** Grid test context. */
private GridTestKernalContext ctx;
/** Test local node. */
private GridTestNode locNode = new GridTestNode(UUID.randomUUID());
/** Test remote node. */
private GridTestNode rmtNode = new GridTestNode(UUID.randomUUID());
/**
* @throws IgniteCheckedException In case of error.
*/
public GridIoManagerSelfTest() throws IgniteCheckedException {
ctx = new GridTestKernalContext(log);
}
/** {@inheritDoc} */
@Override protected void beforeTest() throws Exception {
ctx.config().setCommunicationSpi(new TcpCommunicationSpi());
ctx.config().setMarshaller(new JdkMarshaller());
// Turn off peer class loading to simplify mocking.
ctx.config().setPeerClassLoadingEnabled(false);
// Register local and remote nodes in discovery manager.
GridDiscoveryManager mockedDiscoveryMgr = Mockito.mock(GridDiscoveryManager.class);
when(mockedDiscoveryMgr.localNode()).thenReturn(locNode);
when(mockedDiscoveryMgr.remoteNodes()).thenReturn(F.<ClusterNode>asList(rmtNode));
ctx.add(mockedDiscoveryMgr);
}
/**
* @throws Exception If failed.
*/
@Test
@Ignore("https://issues.apache.org/jira/browse/IGNITE-12661")
public void testSendIfOneOfNodesIsLocalAndTopicIsEnum() throws Exception {
GridTestUtils.assertThrows(log, new Callable<Object>() {
@Override public Object call() throws Exception {
new GridIoManager(ctx).sendToGridTopic(F.asList(locNode, rmtNode), GridTopic.TOPIC_CACHE, new TestMessage(),
GridIoPolicy.P2P_POOL);
return null;
}
}, AssertionError.class, "Internal Ignite code should never call the method with local node in a node list.");
}
/**
* @throws Exception If failed.
*/
@Test
@Ignore("https://issues.apache.org/jira/browse/IGNITE-12661")
public void testSendUserMessageThinVersionIfOneOfNodesIsLocal() throws Exception {
Object msg = new Object();
GridIoManager ioMgr = spy(new TestGridIoManager(ctx));
try {
ioMgr.sendUserMessage(F.asList(locNode, rmtNode), msg, null, false, 0, false);
}
catch (IgniteCheckedException ignored) {
// No-op. We are using mocks so real sending is impossible.
}
verify(ioMgr).sendToGridTopic(eq(locNode), eq(GridTopic.TOPIC_COMM_USER), any(GridIoUserMessage.class),
eq(GridIoPolicy.PUBLIC_POOL));
Collection<? extends ClusterNode> rmtNodes = F.view(F.asList(rmtNode), F.remoteNodes(locNode.id()));
verify(ioMgr).sendToGridTopic(argThat(new IsEqualCollection(rmtNodes)), eq(GridTopic.TOPIC_COMM_USER),
any(GridIoUserMessage.class), eq(GridIoPolicy.PUBLIC_POOL));
}
/**
* @throws Exception If failed.
*/
@Test
@Ignore("https://issues.apache.org/jira/browse/IGNITE-12661")
public void testSendUserMessageUnorderedThickVersionIfOneOfNodesIsLocal() throws Exception {
Object msg = new Object();
GridIoManager ioMgr = spy(new TestGridIoManager(ctx));
try {
ioMgr.sendUserMessage(F.asList(locNode, rmtNode), msg, GridTopic.TOPIC_IGFS, false, 123L, false);
}
catch (IgniteCheckedException ignored) {
// No-op. We are using mocks so real sending is impossible.
}
verify(ioMgr).sendToGridTopic(eq(locNode), eq(GridTopic.TOPIC_COMM_USER), any(GridIoUserMessage.class),
eq(GridIoPolicy.PUBLIC_POOL));
Collection<? extends ClusterNode> rmtNodes = F.view(F.asList(rmtNode), F.remoteNodes(locNode.id()));
verify(ioMgr).sendToGridTopic(argThat(new IsEqualCollection(rmtNodes)), eq(GridTopic.TOPIC_COMM_USER),
any(GridIoUserMessage.class), eq(GridIoPolicy.PUBLIC_POOL));
}
/**
* @throws Exception If failed.
*/
@Test
@Ignore("https://issues.apache.org/jira/browse/IGNITE-12661")
public void testSendUserMessageOrderedThickVersionIfOneOfNodesIsLocal() throws Exception {
Object msg = new Object();
GridIoManager ioMgr = spy(new TestGridIoManager(ctx));
try {
ioMgr.sendUserMessage(F.asList(locNode, rmtNode), msg, GridTopic.TOPIC_IGFS, true, 123L, false);
}
catch (Exception ignored) {
// No-op. We are using mocks so real sending is impossible.
}
verify(ioMgr).sendOrderedMessageToGridTopic(
argThat(new IsEqualCollection(F.asList(locNode, rmtNode))),
eq(GridTopic.TOPIC_COMM_USER),
any(GridIoUserMessage.class),
eq(GridIoPolicy.PUBLIC_POOL),
eq(123L),
false);
}
/**
* Test-purposed extension of {@code GridIoManager} with no-op {@code send(...)} methods.
*/
private static class TestGridIoManager extends GridIoManager {
/**
* @param ctx Grid kernal context.
*/
TestGridIoManager(GridKernalContext ctx) {
super(ctx);
}
/** {@inheritDoc} */
@Override public void sendToGridTopic(ClusterNode node, GridTopic topic, Message msg, byte plc)
throws IgniteCheckedException {
// No-op.
}
}
/**
* Mockito argument matcher to compare collections produced by {@code F.view()} methods.
*/
private static class IsEqualCollection implements ArgumentMatcher<Collection<? extends ClusterNode>> {
/** Expected collection. */
private final Collection<? extends ClusterNode> expCol;
/**
* Default constructor.
*
* @param expCol Expected collection.
*/
IsEqualCollection(Collection<? extends ClusterNode> expCol) {
this.expCol = expCol;
}
/**
* Matches a given collection to the specified in constructor expected one
* with Apache {@code CollectionUtils.isEqualCollection()}.
*
* @param colToCheck Collection to be matched against the expected one.
* @return True if collections matches.
*/
@Override public boolean matches(Collection<? extends ClusterNode> colToCheck) {
return CollectionUtils.isEqualCollection(expCol, colToCheck);
}
}
/** */
private static class TestMessage implements Message {
/** {@inheritDoc} */
@Override public void onAckReceived() {
// No-op.
}
/** {@inheritDoc} */
@Override public boolean writeTo(ByteBuffer buf, MessageWriter writer) {
return true;
}
/** {@inheritDoc} */
@Override public boolean readFrom(ByteBuffer buf, MessageReader reader) {
return true;
}
/** {@inheritDoc} */
@Override public short directType() {
return 0;
}
/** {@inheritDoc} */
@Override public byte fieldsCount() {
return 0;
}
}
}