@Test public void testSetOperationExceptionAndComplete() throws Exception { int numChunks = routerConfig.routerMaxInMemPutChunks + 1; BlobProperties blobProperties = new BlobProperties(-1, "serviceId", "memberId", "contentType", false, Utils.Infinite_Time, Utils.getRandomShort(TestUtils.RANDOM), Utils.getRandomShort(TestUtils.RANDOM), false, null); byte[] userMetadata = new byte[10]; byte[] content = new byte[chunkSize * numChunks]; random.nextBytes(content); ReadableStreamChannel channel = new ByteBufferReadableStreamChannel(ByteBuffer.wrap(content)); FutureResult<String> future = new FutureResult<>(); MockNetworkClient mockNetworkClient = new MockNetworkClient(); PutOperation op = PutOperation.forUpload(routerConfig, routerMetrics, mockClusterMap, new LoggingNotificationSystem(), new InMemAccountService(true, false), userMetadata, channel, PutBlobOptions.DEFAULT, future, null, new RouterCallback(mockNetworkClient, new ArrayList<>()), null, null, null, null, time, blobProperties, MockClusterMap.DEFAULT_PARTITION_CLASS); RouterErrorCode[] routerErrorCodes = new RouterErrorCode[5]; routerErrorCodes[0] = RouterErrorCode.OperationTimedOut; routerErrorCodes[1] = RouterErrorCode.UnexpectedInternalError; routerErrorCodes[2] = RouterErrorCode.AmbryUnavailable; routerErrorCodes[3] = RouterErrorCode.InsufficientCapacity; routerErrorCodes[4] = RouterErrorCode.InvalidBlobId; for (int i = 0; i < routerErrorCodes.length; ++i) { op.setOperationExceptionAndComplete(new RouterException("RouterError", routerErrorCodes[i])); Assert.assertEquals(((RouterException) op.getOperationException()).getErrorCode(), routerErrorCodes[i]); } for (int i = routerErrorCodes.length - 1; i >= 0; --i) { op.setOperationExceptionAndComplete(new RouterException("RouterError", routerErrorCodes[i])); Assert.assertEquals(((RouterException) op.getOperationException()).getErrorCode(), routerErrorCodes[routerErrorCodes.length - 1]); } Exception nonRouterException = new Exception(); op.setOperationExceptionAndComplete(nonRouterException); Assert.assertEquals(nonRouterException, op.getOperationException()); op.setOperationExceptionAndComplete(new RouterException("RouterError", RouterErrorCode.InsufficientCapacity)); Assert.assertEquals(((RouterException) op.getOperationException()).getErrorCode(), RouterErrorCode.InsufficientCapacity); }
void setOperationExceptionAndComplete(Exception exception) { if (exception instanceof RouterException) { RouterUtils.replaceOperationException(operationException, (RouterException) exception, this::getPrecedenceLevel); } else { operationException.set(exception); } setOperationCompleted(); }
PutOperation { void setOperationExceptionAndComplete(Exception exception) { if (exception instanceof RouterException) { RouterUtils.replaceOperationException(operationException, (RouterException) exception, this::getPrecedenceLevel); } else { operationException.set(exception); } setOperationCompleted(); } }
PutOperation { void setOperationExceptionAndComplete(Exception exception) { if (exception instanceof RouterException) { RouterUtils.replaceOperationException(operationException, (RouterException) exception, this::getPrecedenceLevel); } else { operationException.set(exception); } setOperationCompleted(); } private  PutOperation(RouterConfig routerConfig, NonBlockingRouterMetrics routerMetrics, ClusterMap clusterMap,
      NotificationSystem notificationSystem, AccountService accountService, byte[] userMetadata,
      ReadableStreamChannel channel, List<ChunkInfo> chunksToStitch, PutBlobOptions options,
      FutureResult<String> futureResult, Callback<String> callback, RouterCallback routerCallback,
      ByteBufferAsyncWritableChannel.ChannelEventListener writableChannelEventListener, KeyManagementService kms,
      CryptoService cryptoService, CryptoJobHandler cryptoJobHandler, Time time, BlobProperties blobProperties,
      String partitionClass); }
PutOperation { void setOperationExceptionAndComplete(Exception exception) { if (exception instanceof RouterException) { RouterUtils.replaceOperationException(operationException, (RouterException) exception, this::getPrecedenceLevel); } else { operationException.set(exception); } setOperationCompleted(); } private  PutOperation(RouterConfig routerConfig, NonBlockingRouterMetrics routerMetrics, ClusterMap clusterMap,
      NotificationSystem notificationSystem, AccountService accountService, byte[] userMetadata,
      ReadableStreamChannel channel, List<ChunkInfo> chunksToStitch, PutBlobOptions options,
      FutureResult<String> futureResult, Callback<String> callback, RouterCallback routerCallback,
      ByteBufferAsyncWritableChannel.ChannelEventListener writableChannelEventListener, KeyManagementService kms,
      CryptoService cryptoService, CryptoJobHandler cryptoJobHandler, Time time, BlobProperties blobProperties,
      String partitionClass);  }
PutOperation { void setOperationExceptionAndComplete(Exception exception) { if (exception instanceof RouterException) { RouterUtils.replaceOperationException(operationException, (RouterException) exception, this::getPrecedenceLevel); } else { operationException.set(exception); } setOperationCompleted(); } private  PutOperation(RouterConfig routerConfig, NonBlockingRouterMetrics routerMetrics, ClusterMap clusterMap,
      NotificationSystem notificationSystem, AccountService accountService, byte[] userMetadata,
      ReadableStreamChannel channel, List<ChunkInfo> chunksToStitch, PutBlobOptions options,
      FutureResult<String> futureResult, Callback<String> callback, RouterCallback routerCallback,
      ByteBufferAsyncWritableChannel.ChannelEventListener writableChannelEventListener, KeyManagementService kms,
      CryptoService cryptoService, CryptoJobHandler cryptoJobHandler, Time time, BlobProperties blobProperties,
      String partitionClass);   }