package com.alibaba.doris.dataserver.net.netty;
import junit.framework.TestCase;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.ChannelBuffers;
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.BaseActionType;
import com.alibaba.doris.dataserver.action.data.ErrorActionData;
import com.alibaba.doris.dataserver.action.data.SupportBodyActionData;
/**
* @author ajun Email:jack.yuj@alibaba-inc.com
*/
public class DataServerDecoderTest extends TestCase {
public DataServerDecoderTest() {
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 void testSetCommandDecode() {
VirtualRouterImpl.setDebug(true);
ChannelBuffer buffer = ChannelBuffers.wrappedBuffer(SET_COMMAND);
DataServerDecoder decoder = new DataServerDecoder();
SupportBodyActionData md = null;
try {
Object value = decoder.decode(null, null, buffer);
md = (SupportBodyActionData) value;
} catch (Exception e) {
fail(e.getMessage());
}
assertNotNull(md);
assertEquals(10, md.getBodyByteArray().length);
}
public void testInvalidSetCommandDecode() {
VirtualRouterImpl.setDebug(true);
ChannelBuffer buffer = ChannelBuffers.wrappedBuffer(INVALID_SET_COMMAND);
DataServerDecoder decoder = new DataServerDecoder();
ErrorActionData md = null;
try {
Object value = decoder.decode(null, null, buffer);
md = (ErrorActionData) value;
} catch (Exception e) {
fail(e.getMessage());
}
assertNotNull(md);
assertEquals(BaseActionType.ERROR, md.getActionType());
assertEquals(ErrorActionData.UNKNOWN_COMMAND, md.getCode());
}
public void testOneSetInvalidOneSetOKDecode() {
VirtualRouterImpl.setDebug(true);
try {
ChannelBuffer buffer = ChannelBuffers.wrappedBuffer(ONE_SET_INVALID_AND_ONE_SET_OK);
DataServerDecoder decoder = new DataServerDecoder();
ErrorActionData md = (ErrorActionData) decoder.decode(null, null, buffer);
assertNotNull("断言返回一个错误的命令。", md);
assertEquals(BaseActionType.ERROR, md.getActionType());
assertEquals(ErrorActionData.CLIENT_ERROR, md.getCode());
// 测试系统能否正确跳过错误的命令流,并读取到后续正确的命令数据。
SupportBodyActionData cmd = (SupportBodyActionData) decoder.decode(null, null, buffer);
assertNotNull("断言系统会自动过滤掉错误的命令数据流,并找到下一个正确的命令序列。", cmd);
assertEquals(BaseActionType.SET, cmd.getActionType());
assertEquals(10, cmd.getBodyByteArray().length);
} catch (Exception e) {
fail(e.getMessage());
}
}
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' };
private static final byte[] INVALID_SET_COMMAND = { ' ', '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' };
private static final byte[] ONE_SET_INVALID_AND_ONE_SET_OK = { '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', ' ', 'n', 'r', 'p', 'l', 'y', '\r', '\n', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '\r',
'\n',/* conmmand two: */'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' };
}