/* * The Alluxio Open Foundation licenses this work under the Apache License, version 2.0 * (the "License"). You may not use this work except in compliance with the License, which is * available at www.apache.org/licenses/LICENSE-2.0 * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, * either express or implied, as more fully set forth in the License. * * See the NOTICE file distributed with this work for information regarding copyright ownership. */ package alluxio.worker.netty; import alluxio.EmbeddedNoExceptionChannel; import alluxio.network.protocol.RPCProtoMessage; import alluxio.network.protocol.databuffer.DataBuffer; import alluxio.network.protocol.databuffer.DataNettyBufferV2; import alluxio.proto.dataserver.Protocol; import alluxio.proto.status.Status.PStatus; import alluxio.util.io.BufferUtils; import alluxio.util.proto.ProtoMessage; import alluxio.worker.block.BlockWorker; import alluxio.worker.block.io.BlockWriter; import alluxio.worker.block.io.LocalFileBlockWriter; import io.netty.buffer.ByteBuf; import io.netty.buffer.PooledByteBufAllocator; import io.netty.channel.embedded.EmbeddedChannel; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; import java.util.Random; /** * Unit tests for {@link DataServerBlockWriteHandler}. */ public final class DataServerBlockWriteHandlerTest extends DataServerWriteHandlerTest { private final Random mRandom = new Random(); private BlockWorker mBlockWorker; private BlockWriter mBlockWriter; @Before public void before() throws Exception { mBlockWorker = Mockito.mock(BlockWorker.class); Mockito.doNothing().when(mBlockWorker) .createBlockRemote(Mockito.anyLong(), Mockito.anyLong(), Mockito.anyString(), Mockito.anyLong()); Mockito.doNothing().when(mBlockWorker) .requestSpace(Mockito.anyLong(), Mockito.anyLong(), Mockito.anyLong()); mFile = mTestFolder.newFile().getPath(); mBlockWriter = new LocalFileBlockWriter(mFile); Mockito.when(mBlockWorker.getTempBlockWriterRemote(Mockito.anyLong(), Mockito.anyLong())) .thenReturn(mBlockWriter); mChecksum = 0; mChannel = new EmbeddedChannel( new DataServerBlockWriteHandler(NettyExecutors.BLOCK_WRITER_EXECUTOR, mBlockWorker)); mChannelNoException = new EmbeddedNoExceptionChannel( new DataServerBlockWriteHandler(NettyExecutors.BLOCK_WRITER_EXECUTOR, mBlockWorker)); } /** * Tests write failure. */ @Test public void writeFailure() throws Exception { mChannelNoException.writeInbound(buildWriteRequest(0, PACKET_SIZE)); mBlockWriter.close(); mChannelNoException.writeInbound(buildWriteRequest(PACKET_SIZE, PACKET_SIZE)); Object writeResponse = waitForResponse(mChannelNoException); Assert.assertTrue(writeResponse instanceof RPCProtoMessage); checkWriteResponse(writeResponse, PStatus.FAILED_PRECONDITION); } @Override protected RPCProtoMessage buildWriteRequest(long offset, int len) { Protocol.WriteRequest writeRequest = Protocol.WriteRequest.newBuilder().setId(1L).setOffset(offset).setSessionId(1L) .setType(Protocol.RequestType.ALLUXIO_BLOCK).build(); DataBuffer buffer = null; if (len > 0) { ByteBuf buf = PooledByteBufAllocator.DEFAULT.buffer(len); for (int i = 0; i < len; i++) { byte value = (byte) (mRandom.nextInt() % Byte.MAX_VALUE); buf.writeByte(value); mChecksum += BufferUtils.byteToInt(value); } buffer = new DataNettyBufferV2(buf); } if (len == EOF) { writeRequest = writeRequest.toBuilder().setEof(true).build(); } if (len == CANCEL) { writeRequest = writeRequest.toBuilder().setCancel(true).build(); } return new RPCProtoMessage(new ProtoMessage(writeRequest), buffer); } }