Use Future.cause() to discern failures -- meaning we have a non-null
cause in the error path.
Change-Id: Ifb88cfcf666d1aea99c09189992d80224c0862e1
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
requests.add(req);
currentSession.sendMessage(req.request).addListener(future -> {
requests.add(req);
currentSession.sendMessage(req.request).addListener(future -> {
- if (!future.isSuccess()) {
+ final var cause = future.cause();
+ if (cause != null) {
// We expect that a session down will occur at this point
// We expect that a session down will occur at this point
- final var cause = future.cause();
if (LOG.isDebugEnabled()) {
LOG.debug("{}: Failed to send request {}", id, XmlUtil.toString(req.request.getDocument()), cause);
}
if (LOG.isDebugEnabled()) {
LOG.debug("{}: Failed to send request {}", id, XmlUtil.toString(req.request.getDocument()), cause);
}
- final RpcResult<NetconfMessage> result;
- if (cause == null) {
- // assume session is down
- result = createSessionDownRpcResult();
- } else {
- result = createErrorRpcResult(ErrorType.TRANSPORT, cause.getLocalizedMessage());
- }
- req.future.set(result);
+ req.future.set(createErrorRpcResult(ErrorType.TRANSPORT, cause.getLocalizedMessage()));
} else {
LOG.trace("Finished sending request {}", req.request);
}
} else {
LOG.trace("Finished sending request {}", req.request);
}
import com.google.common.base.CharMatcher;
import com.google.common.base.Strings;
import com.google.common.base.CharMatcher;
import com.google.common.base.Strings;
+import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import com.google.common.util.concurrent.ListenableFuture;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import java.util.ArrayList;
import java.util.Set;
import java.util.UUID;
import java.util.ArrayList;
import java.util.Set;
import java.util.UUID;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
import javax.xml.parsers.ParserConfigurationException;
import org.junit.Before;
import org.junit.Test;
import javax.xml.parsers.ParserConfigurationException;
import org.junit.Before;
import org.junit.Test;
import org.opendaylight.yangtools.yang.common.RpcError;
import org.opendaylight.yangtools.yang.common.RpcResult;
import org.opendaylight.yangtools.yang.common.Uint32;
import org.opendaylight.yangtools.yang.common.RpcError;
import org.opendaylight.yangtools.yang.common.RpcResult;
import org.opendaylight.yangtools.yang.common.Uint32;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
@RunWith(MockitoJUnitRunner.StrictStubs.class)
public class NetconfDeviceCommunicatorTest {
import org.w3c.dom.Document;
import org.w3c.dom.Element;
@RunWith(MockitoJUnitRunner.StrictStubs.class)
public class NetconfDeviceCommunicatorTest {
- private static final Logger LOG = LoggerFactory.getLogger(NetconfDeviceCommunicatorTest.class);
private static final SessionIdType SESSION_ID = new SessionIdType(Uint32.ONE);
@Mock
private static final SessionIdType SESSION_ID = new SessionIdType(Uint32.ONE);
@Mock
verify(mockDevice, never()).onRemoteSessionDown();
}
verify(mockDevice, never()).onRemoteSessionDown();
}
- @SuppressWarnings({"rawtypes", "unchecked"})
+ @SuppressWarnings("unchecked")
@Test
public void testSendRequest() throws Exception {
setupSession();
@Test
public void testSendRequest() throws Exception {
setupSession();
NetconfMessage message = new NetconfMessage(UntrustedXML.newDocumentBuilder().newDocument());
QName rpc = QName.create("", "mockRpc");
NetconfMessage message = new NetconfMessage(UntrustedXML.newDocumentBuilder().newDocument());
QName rpc = QName.create("", "mockRpc");
- ArgumentCaptor<GenericFutureListener> futureListener =
- ArgumentCaptor.forClass(GenericFutureListener.class);
+ final var futureListener = ArgumentCaptor.forClass(GenericFutureListener.class);
ChannelFuture mockChannelFuture = mock(ChannelFuture.class);
doReturn(mockChannelFuture).when(mockChannelFuture).addListener(futureListener.capture());
ChannelFuture mockChannelFuture = mock(ChannelFuture.class);
doReturn(mockChannelFuture).when(mockChannelFuture).addListener(futureListener.capture());
verify(mockChannelFuture).addListener(futureListener.capture());
Future<Void> operationFuture = mock(Future.class);
verify(mockChannelFuture).addListener(futureListener.capture());
Future<Void> operationFuture = mock(Future.class);
- doReturn(true).when(operationFuture).isSuccess();
+ doReturn(null).when(operationFuture).cause();
futureListener.getValue().operationComplete(operationFuture);
futureListener.getValue().operationComplete(operationFuture);
- try {
- resultFuture.get(1, TimeUnit.MILLISECONDS); // verify it's not cancelled or has an error set
- } catch (TimeoutException e) {
- LOG.info("Operation failed due timeout.");
- } // expected
+ // verify it is not cancelled nor has an error set
+ assertFalse(resultFuture.isDone());
assertNotNull("ListenableFuture is null", resultFuture);
// Should have an immediate result
assertNotNull("ListenableFuture is null", resultFuture);
// Should have an immediate result
- RpcResult<NetconfMessage> rpcResult = resultFuture.get(3, TimeUnit.MILLISECONDS);
+ RpcResult<NetconfMessage> rpcResult = Futures.getDone(resultFuture);
verifyErrorRpcResult(rpcResult, ErrorType.TRANSPORT, ErrorTag.OPERATION_FAILED);
}
verifyErrorRpcResult(rpcResult, ErrorType.TRANSPORT, ErrorTag.OPERATION_FAILED);
}
return new NetconfMessage(doc);
}
return new NetconfMessage(doc);
}
- @SuppressWarnings({ "rawtypes", "unchecked" })
+ @SuppressWarnings("unchecked")
@Test
public void testSendRequestWithWithSendFailure() throws Exception {
setupSession();
@Test
public void testSendRequestWithWithSendFailure() throws Exception {
setupSession();
NetconfMessage message = new NetconfMessage(UntrustedXML.newDocumentBuilder().newDocument());
QName rpc = QName.create("", "mockRpc");
NetconfMessage message = new NetconfMessage(UntrustedXML.newDocumentBuilder().newDocument());
QName rpc = QName.create("", "mockRpc");
- ArgumentCaptor<GenericFutureListener> futureListener =
- ArgumentCaptor.forClass(GenericFutureListener.class);
+ final var futureListener = ArgumentCaptor.forClass(GenericFutureListener.class);
ChannelFuture mockChannelFuture = mock(ChannelFuture.class);
doReturn(mockChannelFuture).when(mockChannelFuture).addListener(futureListener.capture());
ChannelFuture mockChannelFuture = mock(ChannelFuture.class);
doReturn(mockChannelFuture).when(mockChannelFuture).addListener(futureListener.capture());
verify(mockChannelFuture).addListener(futureListener.capture());
Future<Void> operationFuture = mock(Future.class);
verify(mockChannelFuture).addListener(futureListener.capture());
Future<Void> operationFuture = mock(Future.class);
- doReturn(false).when(operationFuture).isSuccess();
doReturn(new Exception("mock error")).when(operationFuture).cause();
futureListener.getValue().operationComplete(operationFuture);
// Should have an immediate result
doReturn(new Exception("mock error")).when(operationFuture).cause();
futureListener.getValue().operationComplete(operationFuture);
// Should have an immediate result
- RpcResult<NetconfMessage> rpcResult = resultFuture.get(3, TimeUnit.MILLISECONDS);
+ RpcResult<NetconfMessage> rpcResult = Futures.getDone(resultFuture);
RpcError rpcError = verifyErrorRpcResult(rpcResult, ErrorType.TRANSPORT, ErrorTag.OPERATION_FAILED);
assertEquals("RpcError message contains \"mock error\"", true,
RpcError rpcError = verifyErrorRpcResult(rpcResult, ErrorType.TRANSPORT, ErrorTag.OPERATION_FAILED);
assertEquals("RpcError message contains \"mock error\"", true,