package org.yamcs.commanding; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.junit.BeforeClass; import org.junit.Test; import org.yamcs.ConfigurationException; import org.yamcs.ErrorInCommand; import org.yamcs.YConfiguration; import org.yamcs.utils.CcsdsPacket; import org.yamcs.utils.StringConverter; import org.yamcs.utils.TimeEncoding; import org.yamcs.xtce.ArgumentAssignment; import org.yamcs.xtce.MetaCommand; import org.yamcs.xtce.XtceDb; import org.yamcs.xtceproc.MetaCommandProcessor; import org.yamcs.xtceproc.XtceDbFactory; public class CommandingManagerTest { static XtceDb xtceDb; @BeforeClass public static void beforeClass() throws ConfigurationException { TimeEncoding.setUp(); YConfiguration.setup(); xtceDb = XtceDbFactory.createInstanceByConfig("refmdb"); } @Test public void testOneIntArg() throws Exception { MetaCommand mc = xtceDb.getMetaCommand("/REFMDB/SUBSYS1/ONE_INT_ARG_TC"); assertNotNull(mc); byte[] b= MetaCommandProcessor.buildCommand(mc, new ArrayList<ArgumentAssignment>()).getCmdPacket(); assertEquals("ABCDEFAB", StringConverter.arrayToHexString(b)); } @Test public void testFixedValue() throws Exception { MetaCommand mc = xtceDb.getMetaCommand("/REFMDB/SUBSYS1/FIXED_VALUE_TC"); assertNotNull(mc); byte[] b= MetaCommandProcessor.buildCommand(mc, new ArrayList<ArgumentAssignment>()).getCmdPacket(); assertEquals("ABCD901408081808", StringConverter.arrayToHexString(b)); } @Test public void testIntegerArg() throws Exception { MetaCommand mc = xtceDb.getMetaCommand("/REFMDB/SUBSYS1/INT_ARG_TC"); assertNotNull(mc); byte[] b= MetaCommandProcessor.buildCommand(mc, new ArrayList<ArgumentAssignment>()).getCmdPacket(); assertEquals("ABCD901408081808", StringConverter.arrayToHexString(b)); } @Test public void testFloatArg() throws Exception { MetaCommand mc = xtceDb.getMetaCommand("/REFMDB/SUBSYS1/FLOAT_ARG_TC"); assertNotNull(mc); List<ArgumentAssignment> aaList = Arrays.asList(new ArgumentAssignment("float_arg", "-10.23"), new ArgumentAssignment("double_arg", "25.4")); byte[] b= MetaCommandProcessor.buildCommand(mc, aaList).getCmdPacket(); assertEquals(16, b.length); ByteBuffer bb = ByteBuffer.wrap(b); assertEquals(-10.23, bb.getFloat(), 1e-5); assertEquals(25.4d, bb.getDouble(), 1e-20); } @Test public void testLittleEndianFloatArg() throws Exception { MetaCommand mc = xtceDb.getMetaCommand("/REFMDB/SUBSYS1/LE_FLOAT_INT_ARG_TC"); assertNotNull(mc); List<ArgumentAssignment> aaList = Arrays.asList(new ArgumentAssignment("float_arg", "1.0"), new ArgumentAssignment("uint_arg1", "2"), new ArgumentAssignment("uint_arg2", "3") ); byte[] b= MetaCommandProcessor.buildCommand(mc, aaList).getCmdPacket(); assertEquals(12, b.length); ByteBuffer bb = ByteBuffer.wrap(b); bb.order(ByteOrder.LITTLE_ENDIAN); assertEquals(1.0, bb.getFloat(), 1e-5); assertEquals(2, bb.getInt()); assertEquals(3, bb.getInt()); } @Test public void testCcsdsTc() throws Exception { MetaCommand mc = xtceDb.getMetaCommand("/REFMDB/SUBSYS1/CCSDS_TC"); assertNotNull(mc); List<ArgumentAssignment> aaList = Arrays.asList(new ArgumentAssignment("uint8_arg", "1"), new ArgumentAssignment("uint16_arg", "2"), new ArgumentAssignment("int32_arg", "-3"), new ArgumentAssignment("uint64_arg", "4")); byte[] b= MetaCommandProcessor.buildCommand(mc, aaList).getCmdPacket(); assertEquals(31, b.length); CcsdsPacket p = new CcsdsPacket(b); assertEquals(100, p.getAPID()); assertEquals(0xABCDEFAB, p.getPacketID()); assertEquals(1, p.getTimeId()); assertEquals(true, p.getChecksumIndicator()); ByteBuffer bb = ByteBuffer.wrap(b); assertEquals(1, bb.get(16)); assertEquals(2, bb.getShort(17)); assertEquals(-3, bb.getInt(19)); assertEquals(4, bb.getLong(23)); } @Test public void testValidIntegerRange() throws Exception { MetaCommand mc = xtceDb.getMetaCommand("/REFMDB/SUBSYS1/CCSDS_TC"); assertNotNull(mc); List<ArgumentAssignment> aaList = Arrays.asList(new ArgumentAssignment("uint8_arg", "5"), new ArgumentAssignment("uint16_arg", "2"), new ArgumentAssignment("int32_arg", "-3"), new ArgumentAssignment("uint64_arg", "4")); ErrorInCommand e = null; try { MetaCommandProcessor.buildCommand(mc, aaList); } catch (ErrorInCommand e1) { e=e1; } assertNotNull(e); assertTrue(e.getMessage().contains("not in the range")); } @Test public void testCalibration() throws Exception { MetaCommand mc = xtceDb.getMetaCommand("/REFMDB/SUBSYS1/CALIB_TC"); assertNotNull(mc); List<ArgumentAssignment> aaList = Arrays.asList(new ArgumentAssignment("p1", "1"), new ArgumentAssignment("p2", "1"), new ArgumentAssignment("p3", "-3.2"), new ArgumentAssignment("p4", "value2")); byte[] b= MetaCommandProcessor.buildCommand(mc, aaList).getCmdPacket(); assertEquals(9, b.length); ByteBuffer bb = ByteBuffer.wrap(b); assertEquals(3, bb.getShort(0)); assertEquals(2, bb.getShort(2)); assertEquals(-5.4, bb.getFloat(4), 1e-5); int p4 = (bb.get(8)&0xFF)>>6; assertEquals(2, p4); } @Test public void testInvalidEnum() throws Exception { MetaCommand mc = xtceDb.getMetaCommand("/REFMDB/SUBSYS1/CALIB_TC"); assertNotNull(mc); List<ArgumentAssignment> aaList = Arrays.asList(new ArgumentAssignment("p1", "1"), new ArgumentAssignment("p2", "1"), new ArgumentAssignment("p3", "-3.2"), new ArgumentAssignment("p4", "invalidenum")); ErrorInCommand e = null; try { MetaCommandProcessor.buildCommand(mc, aaList); } catch (ErrorInCommand e1) { e=e1; } assertNotNull(e); assertTrue(e.getMessage().contains("Cannot assign value to p4")); } @Test(expected = ErrorInCommand.class) public void testExceptionOnReassigningInheritanceArgument() throws Exception { MetaCommand mc = xtceDb.getMetaCommand("/REFMDB/SUBSYS1/CCSDS_TC"); List<ArgumentAssignment> assignments = Arrays.asList(new ArgumentAssignment("uint8_arg", "2"), new ArgumentAssignment("uint16_arg", "2"), new ArgumentAssignment("int32_arg", "2"), new ArgumentAssignment("uint64_arg", "2"), new ArgumentAssignment("ccsds-apid", "123")); // Already assigned by parent MetaCommandProcessor.buildCommand(mc, assignments); } }