package org.yamcs.xtceproc;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import org.junit.Test;
import org.yamcs.ErrorInCommand;
import org.yamcs.utils.StringConverter;
import org.yamcs.xtce.ArgumentAssignment;
import org.yamcs.xtce.MetaCommand;
import org.yamcs.xtce.XtceDb;
/**
* Created by msc on 27/05/15.
*/
public class XtceCommandEncodingTest {
@Test
public void floatCommand() throws ErrorInCommand {
// encode command
XtceDb xtcedb=XtceDbFactory.createInstanceByConfig("refmdb");
MetaCommand mc = xtcedb.getMetaCommand("/REFMDB/SUBSYS1/FLOAT_ARG_TC");
List<ArgumentAssignment> arguments = new LinkedList<ArgumentAssignment>() ;
ArgumentAssignment argumentAssignment1 = new ArgumentAssignment("float_arg", "-30");
arguments.add(argumentAssignment1);
ArgumentAssignment argumentAssignment2 = new ArgumentAssignment("double_arg", "1");
arguments.add(argumentAssignment2);
byte[] b = MetaCommandProcessor.buildCommand(mc, arguments).getCmdPacket();
assertTrue(b[0] != 0);
}
@Test
public void floatCommandDefault()
{
// encode command
XtceDb xtcedb=XtceDbFactory.createInstanceByConfig("refmdb");
MetaCommand mc = xtcedb.getMetaCommand("/REFMDB/SUBSYS1/FLOAT_ARG_TC");
boolean errorInCommand = false;
try {
// should complain that parameter has not been assigned
List<ArgumentAssignment> arguments = new LinkedList<ArgumentAssignment>();
byte[] b = MetaCommandProcessor.buildCommand(mc, arguments).getCmdPacket();
}
catch (ErrorInCommand e)
{
errorInCommand = true;
}
assertTrue(errorInCommand);
}
@Test
public void stringCommand() throws ErrorInCommand {
XtceDb xtcedb = XtceDbFactory.createInstanceByConfig("refmdb");
MetaCommand mc = xtcedb.getMetaCommand("/REFMDB/SUBSYS1/STRING_ARG_TC");
List<ArgumentAssignment> arguments = new LinkedList<ArgumentAssignment>() ;
ArgumentAssignment argumentAssignment1 = new ArgumentAssignment("string_arg", "aaaa");
arguments.add(argumentAssignment1);
ArgumentAssignment argumentAssignment2 = new ArgumentAssignment("terminatedString_arg", "bbbb");
arguments.add(argumentAssignment2);
ArgumentAssignment argumentAssignment3 = new ArgumentAssignment("prependedSizeString_arg", "cccc");
arguments.add(argumentAssignment3);
ArgumentAssignment argumentAssignment4 = new ArgumentAssignment("fixedString_arg", "dddd");
arguments.add(argumentAssignment4);
byte[] b = MetaCommandProcessor.buildCommand(mc, arguments).getCmdPacket();
byte[] expectedResult = {
97, 97, 97, 97, 0, // aaaa
97, 98, 99, 100, 101, 102, 0, // abcdef
98, 98, 98, 98, 0x2C, // aaaa
0, 4, 99, 99, 99, 99, // bbbb
100, 100, 100, 100, 0, 0 // dddd
};
assertEquals(StringConverter.arrayToHexString(expectedResult), StringConverter.arrayToHexString(b));
}
@Test
public void cgsLikeStringCommand() throws ErrorInCommand {
XtceDb xtcedb = XtceDbFactory.createInstanceByConfig("refmdb");
MetaCommand mc = xtcedb.getMetaCommand("/REFMDB/SUBSYS1/CGS_LIKE_STRING_ARG_TC");
List<ArgumentAssignment> arguments = new LinkedList<ArgumentAssignment>() ;
ArgumentAssignment argumentAssignment1 = new ArgumentAssignment("string_arg1", "aaaa");
arguments.add(argumentAssignment1);
ArgumentAssignment argumentAssignment2 = new ArgumentAssignment("string_arg2", "bbbb");
arguments.add(argumentAssignment2);
byte[] b = MetaCommandProcessor.buildCommand(mc, arguments).getCmdPacket();
byte[] expectedResult = {
0, 4, 97, 97, 97, 97, 0, 0, // aaaa
98, 98, 98, 98, 0x2C, 0 // bbbb
};
assertEquals(StringConverter.arrayToHexString(expectedResult), StringConverter.arrayToHexString(b));
}
@Test
public void binaryCommand() throws ErrorInCommand {
XtceDb xtcedb = XtceDbFactory.createInstanceByConfig("refmdb");
MetaCommand mc = xtcedb.getMetaCommand("/REFMDB/SUBSYS1/BINARY_ARG_TC");
List<ArgumentAssignment> arguments = new LinkedList<ArgumentAssignment>() ;
ArgumentAssignment argumentAssignment1 = new ArgumentAssignment("binary_arg1", "0102");
arguments.add(argumentAssignment1);
ArgumentAssignment argumentAssignment2 = new ArgumentAssignment("binary_arg2", "0A1B");
arguments.add(argumentAssignment2);
byte[] b = MetaCommandProcessor.buildCommand(mc, arguments).getCmdPacket();
byte[] expectedResult = {
0x01, 0x02, 0, 0, 0,
0x0A, 0x1B, 0, 0, 0, 0
};
assertEquals(StringConverter.arrayToHexString(expectedResult), StringConverter.arrayToHexString(b));
}
@Test
public void littleEndianUint() throws ErrorInCommand {
XtceDb xtcedb = XtceDbFactory.createInstanceByConfig("refmdb");
MetaCommand mc = xtcedb.getMetaCommand("/REFMDB/SUBSYS1/LE_ARG_TC");
List<ArgumentAssignment> arguments = new LinkedList<ArgumentAssignment>() ;
ArgumentAssignment argumentAssignment1 = new ArgumentAssignment("p2", "0x12");
arguments.add(argumentAssignment1);
byte[] b = MetaCommandProcessor.buildCommand(mc, arguments).getCmdPacket();
ByteBuffer bb = ByteBuffer.wrap(b);
bb.order(ByteOrder.LITTLE_ENDIAN);
System.out.println("command buffer: "+StringConverter.arrayToHexString(b));
assertEquals(0x0A0B, bb.getShort());
assertEquals(0x12, bb.getShort());
}
@Test
public void booleanCommandTrue() throws ErrorInCommand {
XtceDb xtcedb = XtceDbFactory.createInstanceByConfig("refmdb");
MetaCommand mc = xtcedb.getMetaCommand("/REFMDB/SUBSYS1/BOOLEAN_ARG_TC");
List<ArgumentAssignment> arguments = new LinkedList<ArgumentAssignment>() ;
ArgumentAssignment argumentAssignment1 = new ArgumentAssignment("bool_arg1", "true");
arguments.add(argumentAssignment1);
byte[] b = MetaCommandProcessor.buildCommand(mc, arguments).getCmdPacket();
assertEquals(0b11000000, b[0]&0xFF);
}
@Test
public void booleanCommandFalseTrue() throws ErrorInCommand {
XtceDb xtcedb = XtceDbFactory.createInstanceByConfig("refmdb");
MetaCommand mc = xtcedb.getMetaCommand("/REFMDB/SUBSYS1/BOOLEAN_ARG_TC");
List<ArgumentAssignment> arguments = new LinkedList<ArgumentAssignment>() ;
ArgumentAssignment argumentAssignment1 = new ArgumentAssignment("bool_arg1", "false");
arguments.add(argumentAssignment1);
byte[] b = MetaCommandProcessor.buildCommand(mc, arguments).getCmdPacket();
// - assigned false
// - default argument assignemnt true
assertEquals(0b01000000, b[0]&0xFF);
}
@Test
public void int64CommandArgumentRange() throws ErrorInCommand {
XtceDb xtcedb = XtceDbFactory.createInstanceByConfig("refmdb");
MetaCommand mc = xtcedb.getMetaCommand("/REFMDB/SUBSYS1/INT64_ARG_TC");
try {
List<ArgumentAssignment> arguments = getArgAssignment("p1", "0X0102030405060707", "p2", "0xF102030405060708", "p3", "-18374120213919168760");
MetaCommandProcessor.buildCommand(mc, arguments).getCmdPacket();
fail("Should throw an exception");
} catch (Exception e) {
assertTrue(e.getMessage().contains("Cannot assign value to p1"));
}
try {
List<ArgumentAssignment> arguments = getArgAssignment("p1", "0X0102030405060708", "p2", "0xF10203040506070A", "p3", "-18374120213919168760");
MetaCommandProcessor.buildCommand(mc, arguments).getCmdPacket();
fail("Should throw an exception");
} catch (Exception e) {
assertTrue(e.getMessage().contains("Cannot assign value to p2"));
}
try {
List<ArgumentAssignment> arguments = getArgAssignment("p1", "0X0102030405060708", "p2", "0xF102030405060708", "p3", "-0X0102030405060707");
MetaCommandProcessor.buildCommand(mc, arguments).getCmdPacket();
fail("Should throw an exception");
} catch (Exception e) {
assertTrue(e.getMessage().contains("Cannot assign value to p3"));
}
}
@Test
public void int64CommandArgumentEncoding() throws ErrorInCommand {
XtceDb xtcedb = XtceDbFactory.createInstanceByConfig("refmdb");
MetaCommand mc = xtcedb.getMetaCommand("/REFMDB/SUBSYS1/INT64_ARG_TC");
List<ArgumentAssignment> arguments = getArgAssignment("p1", "0X0102030405060708", "p2", "0xF102030405060708", "p3", "-0X0102030405060708");
byte[] b = MetaCommandProcessor.buildCommand(mc, arguments).getCmdPacket();
assertEquals("0102030405060708F102030405060708FEFDFCFBFAF9F8F8", StringConverter.arrayToHexString(b));
}
@Test
public void testStringEncodedTc() throws Exception {
MetaCommand mc = XtceDbFactory.createInstanceByConfig("refmdb").getMetaCommand("/REFMDB/SUBSYS1/STRING_ENCODED_ARG_TC");
assertNotNull(mc);
List<ArgumentAssignment> aaList = Arrays.asList(
new ArgumentAssignment("uint_arg", "1"),
new ArgumentAssignment("int_arg", "-2"), // with calibration applied
new ArgumentAssignment("float_arg", "-3.01"),
new ArgumentAssignment("string_arg", "string with \n special chars \""),
new ArgumentAssignment("binary_arg", "010A"),
new ArgumentAssignment("enumerated_arg", "value1"),
new ArgumentAssignment("boolean_arg", "false"));
ErrorInCommand e = null;
byte[] b = MetaCommandProcessor.buildCommand(mc, aaList).getCmdPacket();
String result = new String(b);
String expected = "1,-3,-3.01,string with \n special chars \",010A,1,false,";
assertEquals(expected, result);
}
private List<ArgumentAssignment> getArgAssignment(String ...v) {
if((v.length&0x1)!=0) throw new IllegalArgumentException("Please pass an even number of arguments: arg1,value1,arg2,value2...");
List<ArgumentAssignment> arguments = new LinkedList<ArgumentAssignment>() ;
for(int i=0;i<v.length;i+=2) {
ArgumentAssignment arg = new ArgumentAssignment(v[i], v[i+1]);
arguments.add(arg);
}
return arguments;
}
}