+ private static Error createError(Xid xid) {
+ ErrorMessageBuilder errorMessageBuilder = new ErrorMessageBuilder();
+ errorMessageBuilder.setCode(42);
+ errorMessageBuilder.setCodeString("42");
+ errorMessageBuilder.setXid(xid.getValue());
+ return errorMessageBuilder.build();
+ }
+
+ @Test
+ public void testProcessReplyError() {
+ LOG.info("Hooking RequestContext");
+ deviceContext.hookRequestCtx(xid, requestContext);
+ Assert.assertEquals(requestContext, deviceContext.getRequests().get(xid.getValue()));
+
+ Assert.assertFalse(requestContext.getFuture().isDone());
+ LOG.info("Sending error reply from device");
+ Error error = createError(xid);
+ deviceContext.processReply(error);
+ Assert.assertTrue(requestContext.getFuture().isDone());
+
+ LOG.info("Checking RequestContext.future");
+ try {
+ Object object = requestContext.getFuture().get(1L, TimeUnit.SECONDS);
+ RpcResult<OfHeader> rpcResult = (RpcResult<OfHeader>) object;
+ Assert.assertFalse(rpcResult.isSuccessful());
+ List<RpcError> errors = (List<RpcError>) rpcResult.getErrors();
+ Assert.assertTrue(errors.get(0).getCause() instanceof DeviceDataException);
+ DeviceDataException cause = (DeviceDataException) errors.get(0).getCause();
+ Assert.assertEquals(error, cause.getError());
+ } catch (InterruptedException | ExecutionException | TimeoutException e) {
+ LOG.error("Test failed when checking RequestContext.future", e);
+ fail("fail");
+ }
+ Assert.assertTrue(deviceContext.getRequests().isEmpty());
+ }
+
+ @Test
+ public void testProcessReplyList() {
+ LOG.info("Hooking RequestContext");
+ deviceContext.hookRequestCtx(xidMulti, requestContextMultiReply);
+ Assert.assertEquals(requestContextMultiReply, deviceContext.getRequests().get(xidMulti.getValue()));
+
+ Assert.assertFalse(requestContextMultiReply.getFuture().isDone());
+ LOG.info("Sending reply from device");
+ deviceContext.processReply(xidMulti, createMultipartReplyList(xidMulti));
+ Assert.assertTrue(requestContextMultiReply.getFuture().isDone());
+
+ LOG.info("Checking RequestContext.future");
+ try {
+ Object object = requestContextMultiReply.getFuture().get(1L, TimeUnit.SECONDS);
+ RpcResult<List<OfHeader>> rpcResult = (RpcResult<List<OfHeader>>) object;
+ List<OfHeader> multipartReplies = rpcResult.getResult();
+ List<OfHeader> expectedMpReplies = createMultipartReplyList(xidMulti);
+ assertEquals(expectedMpReplies, multipartReplies);
+ } catch (InterruptedException | ExecutionException | TimeoutException e) {
+ LOG.error("Test failed when checking RequestContext.future", e);
+ fail("fail");
+ }
+ Assert.assertTrue(deviceContext.getRequests().isEmpty());
+ }
+
+ private static List<OfHeader> createMultipartReplyList(Xid xid) {
+ final MultipartReplyDesc descValue = new MultipartReplyDescBuilder().setHwDesc("hw-test-value").build();
+ final MultipartReplyDescCase replyBody = new MultipartReplyDescCaseBuilder()
+ .setMultipartReplyDesc(descValue).build();
+ List<OfHeader> multipartReplies = new ArrayList<OfHeader>();
+ multipartReplies.add(new MultipartReplyMessageBuilder()
+ .setMultipartReplyBody(replyBody)
+ .setXid(xid.getValue())
+ .setFlags(new MultipartRequestFlags(false))
+ .build());
+ multipartReplies.add(new MultipartReplyMessageBuilder()
+ .setMultipartReplyBody(replyBody)
+ .setXid(xid.getValue())
+ .setFlags(new MultipartRequestFlags(true))
+ .build());
+ return multipartReplies;
+ }
+
+ @Test
+ public void testProcessException() {
+ LOG.info("Hooking RequestContext");
+ deviceContext.hookRequestCtx(xid, requestContext);
+ Assert.assertEquals(requestContext, deviceContext.getRequests().get(xid.getValue()));
+
+ Assert.assertFalse(requestContext.getFuture().isDone());
+
+ LOG.info("Sending reply from device");
+ deviceContext.processException(xid, new DeviceDataException("Some freakin' error", new NullPointerException()));
+ Assert.assertTrue(requestContext.getFuture().isDone());
+
+ LOG.info("Checking RequestContext.future");
+ try {
+ Object object = requestContext.getFuture().get(1L, TimeUnit.SECONDS);
+ RpcResult<OfHeader> rpcResult = (RpcResult<OfHeader>) object;
+ Assert.assertFalse(rpcResult.isSuccessful());
+ List<RpcError> errors = (List<RpcError>) rpcResult.getErrors();
+ Assert.assertTrue(errors.get(0).getCause() instanceof DeviceDataException);
+ DeviceDataException cause = (DeviceDataException) errors.get(0).getCause();
+ Assert.assertTrue(cause.getCause() instanceof NullPointerException);
+ } catch (InterruptedException | ExecutionException | TimeoutException e) {
+ LOG.error("Test failed when checking RequestContext.future", e);
+ fail("fail");
+ }
+ Assert.assertTrue(deviceContext.getRequests().isEmpty());