package com.alibaba.doris.dataserver.net.protocol.text; import junit.framework.TestCase; import org.jboss.netty.buffer.ChannelBuffer; import org.jboss.netty.buffer.ChannelBuffers; import com.alibaba.doris.common.data.util.ByteUtils; import com.alibaba.doris.common.router.virtual.VirtualRouterImpl; import com.alibaba.doris.dataserver.action.ActionFactory; import com.alibaba.doris.dataserver.action.CatchCommandErrorAction; import com.alibaba.doris.dataserver.action.CheckAction; import com.alibaba.doris.dataserver.action.DeleteAction; import com.alibaba.doris.dataserver.action.ExitServerAction; import com.alibaba.doris.dataserver.action.GetAction; import com.alibaba.doris.dataserver.action.SetAction; import com.alibaba.doris.dataserver.action.ShutdownAction; import com.alibaba.doris.dataserver.action.data.ActionData; import com.alibaba.doris.dataserver.action.data.BaseActionType; import com.alibaba.doris.dataserver.action.data.CommonActionData; public class TextProtocolDecoderTest extends TestCase { public TextProtocolDecoderTest() { ActionFactory.registAction(BaseActionType.SET, new SetAction()); ActionFactory.registAction(BaseActionType.CAS, new SetAction()); ActionFactory.registAction(BaseActionType.GET, new GetAction()); ActionFactory.registAction(BaseActionType.DELETE, new DeleteAction()); ActionFactory.registAction(BaseActionType.CAD, new DeleteAction()); ActionFactory.registAction(BaseActionType.ERROR, new CatchCommandErrorAction()); ActionFactory.registAction(BaseActionType.EXIT, new ExitServerAction()); ActionFactory.registAction(BaseActionType.SHUTDOWN, new ShutdownAction()); ActionFactory.registAction(BaseActionType.CHECK, new CheckAction()); } public static void main(String[] args) { VirtualRouterImpl.setDebug(true); ActionFactory.registAction(BaseActionType.GET, new GetAction()); TextProtocolDecoder decoder = new TextProtocolDecoder(); ChannelBuffer buffer = ChannelBuffers.copiedBuffer(commandHead); int error = 0; int len = 1000000; long start = System.currentTimeMillis(); for (int i = 0; i < len; i++) { buffer.markReaderIndex(); if (decoder.readHeader(buffer) == null) { error++; } buffer.resetReaderIndex(); } long end = System.currentTimeMillis(); System.out.println("Len:" + len + " error:" + error + " time(ms):" + (end - start)); } public void testSetDecodeNormal() { VirtualRouterImpl.setDebug(true); ChannelBuffer buffer = ChannelBuffers.wrappedBuffer(SET_COMMAND); TextProtocolDecoder decoder = new TextProtocolDecoder(); ActionData md = decoder.readHeader(buffer); assertNotNull(md); assertEquals(BaseActionType.SET.getName(), md.getActionType().getName()); CommonActionData sMd = (CommonActionData) md; sMd.setBodyByteArray(decoder.readBody(buffer, sMd)); assertNotNull(sMd.getBodyByteArray()); assertEquals(0, sMd.getFlag()); assertEquals("product:product_id", ByteUtils.byteToString(sMd.getKeyBytes())); assertEquals(12345, sMd.getTimestamp()); assertEquals(10, sMd.getBodyByteArray().length); assertFalse(sMd.isNoreply()); } public void testSetDecodeWithNoreplyAndExtraSpace() { ChannelBuffer buffer = ChannelBuffers.wrappedBuffer(SET_COMMAND_NOREPLY_AND_SPACE); TextProtocolDecoder decoder = new TextProtocolDecoder(); ActionData md = decoder.readHeader(buffer); assertNotNull(md); assertEquals(BaseActionType.SET.getName(), md.getActionType().getName()); CommonActionData sMd = (CommonActionData) md; sMd.setBodyByteArray(decoder.readBody(buffer, sMd)); assertNotNull(sMd.getBodyByteArray()); assertEquals(0, sMd.getFlag()); assertEquals("product:product_id", ByteUtils.byteToString(sMd.getKeyBytes())); assertEquals(12345, sMd.getTimestamp()); assertEquals(10, sMd.getBodyByteArray().length); assertFalse("noreply should be false.", sMd.isNoreply()); } // set product:product_id 0 1234 10\r\n // 1234567890\r\n private static final byte[] SET_COMMAND = { 's', 'e', 't', ' ', 'p', 'r', 'o', 'd', 'u', 'c', 't', ':', 'p', 'r', 'o', 'd', 'u', 'c', 't', '_', 'i', 'd', ' ', '0', ' ', '1', '2', '3', '4', '5', ' ', '1', '0', '\r', '\n', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '\r', '\n' }; // set product:product_id 0 1234 10 noreply \r\n // 1234567890\r\n private static final byte[] SET_COMMAND_NOREPLY_AND_SPACE = { ' ', ' ', ' ', 's', 'e', 't', ' ', 'p', 'r', 'o', 'd', 'u', 'c', 't', ':', 'p', 'r', 'o', 'd', 'u', 'c', 't', '_', 'i', 'd', ' ', '0', ' ', '1', '2', '3', '4', '5', ' ', '1', '0', ' ', '1', ' ', '2', ' ', ' ', '\r', '\n',/* split */'1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '\r', '\n' }; private static final byte[] commandHead = new byte[] { 'g', 'e', 't', ' ', '1', ':', 'k', 'e', 'y', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', ' ', '0', ' ', '0', ' ', '0', ' ', '1', ' ', '1', '\r', '\n' }; }