package org.yamcs.parameterarchive; import static org.junit.Assert.*; import java.nio.ByteBuffer; import org.junit.Test; import org.yamcs.parameter.ParameterValue; import org.yamcs.protobuf.Mdb.AlarmRange; import org.yamcs.protobuf.Pvalue.MonitoringResult; import org.yamcs.protobuf.Pvalue.ParameterStatus; import org.yamcs.utils.DecodingException; import org.yamcs.utils.ValueUtility; import org.yamcs.xtce.FloatRange; import org.yamcs.xtce.Parameter; public class ObjectSegmentTest { Parameter p1 = new Parameter("abc"); @Test public void test() throws DecodingException { ParameterStatusSegment pss = new ParameterStatusSegment(true); ParameterValue pv = TestUtils.getParameterValue(p1, 0, 120); pv.setMonitoringResult(MonitoringResult.CRITICAL); pv.setCriticalRange(new FloatRange(0, 100)); pss.addParameterValue(pv); pss.consolidate(); assertEquals(1, pss.rleValues.size()); ParameterStatus s = pss.get(0); assertEquals(pv.getCriticalRange().getMaxInclusive(), s.getAlarmRange(0).getMaxInclusive(), 1e-10); assertEquals(pv.getCriticalRange().getMinInclusive(), s.getAlarmRange(0).getMinInclusive(), 1e-10); //ascending range ParameterStatus[] statusList = (ParameterStatus[]) pss.getRange(0, 1, true); assertEquals(1, statusList.length); assertEquals(s, statusList[0]); //descending range statusList = (ParameterStatus[]) pss.getRange(-1, 0, false); assertEquals(1, statusList.length); assertEquals(s, statusList[0]); pv.setAcquisitionTime(100); pss.addParameterValue(pv); assertEquals(1, pss.rleValues.size()); ParameterStatus s1 = pss.get(1); assertEquals(s, s1); //ascending range statusList = (ParameterStatus[]) pss.getRange(0, 2, true); assertEquals(2, statusList.length); assertEquals(s, statusList[0]); assertEquals(s, statusList[1]); //descending range statusList = (ParameterStatus[]) pss.getRange(-1, 1, false); assertEquals(2, statusList.length); assertEquals(s, statusList[1]); assertEquals(s, statusList[0]); pv.setEngineeringValue(ValueUtility.getUint32Value(70)); pv.setMonitoringResult(MonitoringResult.WARNING); pv.setWarningRange(new FloatRange(0, 80)); pv.setAcquisitionTime(200); pss.addParameterValue(pv); pss.consolidate(); assertEquals(2, pss.rleValues.size()); ParameterStatus s2 = pss.get(2); assertEquals(pv.getWarningRange().getMaxInclusive(), s2.getAlarmRange(0).getMaxInclusive(), 1e-10); assertEquals(pv.getWarningRange().getMinInclusive(), s2.getAlarmRange(0).getMinInclusive(), 1e-10); assertEquals(pv.getCriticalRange().getMaxInclusive(), s2.getAlarmRange(1).getMaxInclusive(), 1e-10); assertEquals(pv.getCriticalRange().getMinInclusive(), s2.getAlarmRange(1).getMinInclusive(), 1e-10); //ascending ranges statusList = (ParameterStatus[]) pss.getRange(0, 3, true); assertEquals(3, statusList.length); assertEquals(s, statusList[0]); assertEquals(s, statusList[1]); assertEquals(s2, statusList[2]); statusList = (ParameterStatus[]) pss.getRange(0, 1, true); assertEquals(1, statusList.length); assertEquals(s, statusList[0]); statusList = (ParameterStatus[]) pss.getRange(0, 2, true); assertEquals(2, statusList.length); assertEquals(s, statusList[0]); assertEquals(s, statusList[1]); statusList = (ParameterStatus[]) pss.getRange(1, 2, true); assertEquals(1, statusList.length); assertEquals(s, statusList[0]); statusList = (ParameterStatus[]) pss.getRange(2, 3, true); assertEquals(1, statusList.length); assertEquals(s2, statusList[0]); statusList = (ParameterStatus[]) pss.getRange(1, 3, true); assertEquals(2, statusList.length); assertEquals(s, statusList[0]); assertEquals(s2, statusList[1]); //descending ranges statusList = (ParameterStatus[]) pss.getRange(-1, 2, false); assertEquals(3, statusList.length); assertEquals(s2, statusList[0]); assertEquals(s, statusList[1]); assertEquals(s, statusList[2]); statusList = (ParameterStatus[]) pss.getRange(-1, 0, false); assertEquals(1, statusList.length); assertEquals(s, statusList[0]); statusList = (ParameterStatus[]) pss.getRange(-1, 1, false); assertEquals(2, statusList.length); assertEquals(s, statusList[0]); assertEquals(s, statusList[1]); statusList = (ParameterStatus[]) pss.getRange(0, 1, false); assertEquals(1, statusList.length); assertEquals(s, statusList[0]); statusList = (ParameterStatus[]) pss.getRange(1, 2, false); assertEquals(1, statusList.length); assertEquals(s2, statusList[0]); statusList = (ParameterStatus[]) pss.getRange(0, 2, false); assertEquals(2, statusList.length); assertEquals(s2, statusList[0]); assertEquals(s, statusList[1]); // encoding/decoding RAW int size = pss.getMaxSerializedSize(); ByteBuffer bb = ByteBuffer.allocate(size); pss.writeRaw(bb); assertEquals(105, bb.position()); bb.rewind(); ParameterStatusSegment pss1 = ParameterStatusSegment.parseFrom(bb); assertEquals(3, pss1.objectList.size()); statusList = (ParameterStatus[]) pss1.getRange(0, 3, true); assertEquals(3, statusList.length); assertEquals(s, statusList[0]); assertEquals(s, statusList[1]); assertEquals(s2, statusList[2]); //encoding/decoding ENUM RLE bb = ByteBuffer.allocate(pss.enumRleSize); pss.writeEnumRle(bb); assertEquals(83, bb.position()); bb.rewind(); pss1 = ParameterStatusSegment.parseFrom(bb); assertTrue(pss1.runLengthEncoded); assertEquals(2, pss1.rleObjectList.size()); statusList = (ParameterStatus[]) pss1.getRange(0, 3, true); assertEquals(3, statusList.length); assertEquals(s, statusList[0]); assertEquals(s, statusList[1]); assertEquals(s2, statusList[2]); //encoding/decoding ENUM FPROF bb = ByteBuffer.allocate(size); pss.writeEnumFprof(bb); assertEquals(82, bb.position()); bb.rewind(); pss1 = ParameterStatusSegment.parseFrom(bb); assertFalse(pss1.runLengthEncoded); assertEquals(3, pss1.objectList.size()); statusList = (ParameterStatus[]) pss1.getRange(0, 3, true); assertEquals(3, statusList.length); assertEquals(s, statusList[0]); assertEquals(s, statusList[1]); assertEquals(s2, statusList[2]); } @Test public void testEnumFprof() throws DecodingException { ParameterStatus ps1 = ParameterStatus.newBuilder().addAlarmRange(AlarmRange.newBuilder().setMinInclusive(1).build()).build(); ParameterStatus ps2 = ParameterStatus.newBuilder().addAlarmRange(AlarmRange.newBuilder().setMinInclusive(2).build()).build(); ParameterStatusSegment pss = new ParameterStatusSegment(true); for(int i=0; i<1000;i++) { pss.add(ps1); pss.add(ps2); } pss.consolidate(); assertTrue(pss.enumRleSize>pss.enumRawSize); ByteBuffer bb = ByteBuffer.allocate(pss.getMaxSerializedSize()); pss.writeTo(bb); assertEquals(396, bb.position()); assertEquals(ObjectSegment.SUBFORMAT_ID_ENUM_FPROF, bb.get(0)); bb.rewind(); pss = ParameterStatusSegment.parseFrom(bb); for(int i=0; i<2000;i+=2) { assertTrue(ps1.equals(pss.get(i))); assertTrue(ps2.equals(pss.get(i+1))); } } @Test public void testRangesAscending() throws DecodingException { ParameterStatus ps1 = ParameterStatus.newBuilder().addAlarmRange(AlarmRange.newBuilder().setMinInclusive(1).build()).build(); ParameterStatus ps2 = ParameterStatus.newBuilder().addAlarmRange(AlarmRange.newBuilder().setMinInclusive(2).build()).build(); ParameterStatus ps3 = ParameterStatus.newBuilder().addAlarmRange(AlarmRange.newBuilder().setMinInclusive(3).build()).build(); ParameterStatusSegment pss = new ParameterStatusSegment(true); pss.add(ps1); pss.add(ps1); pss.add(ps2); pss.add(ps2); pss.add(ps2); pss.add(ps3); pss.add(ps3); pss.add(ps3); pss.add(ps3); pss.consolidate(); assertEquals(9, pss.size); ByteBuffer bb = ByteBuffer.allocate(pss.getMaxSerializedSize()); pss.writeTo(bb); bb.rewind(); pss = ParameterStatusSegment.parseFrom(bb); assertTrue(pss.runLengthEncoded); assertEquals(3, pss.rleObjectList.size()); ParameterStatus[] r = pss.getRange(0, 1, true); checkEquals(r, ps1); r = pss.getRange(0, 3, true); checkEquals(r, ps1, ps1, ps2); r = pss.getRange(1, 2, true); checkEquals(r, ps1); r = pss.getRange(2, 3, true); checkEquals(r, ps2); r = pss.getRange(1, 5, true); checkEquals(r, ps1, ps2, ps2, ps2); r = pss.getRange(2, 5, true); checkEquals(r, ps2, ps2, ps2); r = pss.getRange(5, 9, true); checkEquals(r, ps3, ps3, ps3, ps3); r = pss.getRange(8, 9, true); checkEquals(r, ps3); r = pss.getRange(0, 9, true); checkEquals(r, ps1, ps1, ps2, ps2, ps2, ps3, ps3, ps3, ps3); } @Test public void testRangesDescending() throws DecodingException { ParameterStatus ps1 = ParameterStatus.newBuilder().addAlarmRange(AlarmRange.newBuilder().setMinInclusive(1).build()).build(); ParameterStatus ps2 = ParameterStatus.newBuilder().addAlarmRange(AlarmRange.newBuilder().setMinInclusive(2).build()).build(); ParameterStatus ps3 = ParameterStatus.newBuilder().addAlarmRange(AlarmRange.newBuilder().setMinInclusive(3).build()).build(); ParameterStatusSegment pss = new ParameterStatusSegment(true); pss.add(ps1); pss.add(ps1); pss.add(ps2); pss.add(ps2); pss.add(ps2); pss.add(ps3); pss.add(ps3); pss.add(ps3); pss.add(ps3); assertEquals(9, pss.size); pss.consolidate(); ByteBuffer bb = ByteBuffer.allocate(pss.getMaxSerializedSize()); pss.writeTo(bb); bb.rewind(); pss = ParameterStatusSegment.parseFrom(bb); ParameterStatus[] r = pss.getRange(-1, 8, false); checkEquals(r, ps3, ps3, ps3, ps3, ps2, ps2, ps2, ps1, ps1); r = pss.getRange(-1, 0, false); checkEquals(r, ps1); r = pss.getRange(-1, 2, false); checkEquals(r, ps2, ps1, ps1); r = pss.getRange(0, 1, false); checkEquals(r, ps1); r = pss.getRange(1, 2, false); checkEquals(r, ps2); r = pss.getRange(0, 4, false); checkEquals(r, ps2, ps2, ps2, ps1); r = pss.getRange(1, 4, false); checkEquals(r, ps2, ps2, ps2); r = pss.getRange(4, 8, false); checkEquals(r, ps3, ps3, ps3, ps3); r = pss.getRange(7, 8, false); checkEquals(r, ps3); r = pss.getRange(6, 7, false); checkEquals(r, ps3); r = pss.getRange(3, 5, false); checkEquals(r, ps3, ps2); } private void checkEquals(ParameterStatus[] actual, ParameterStatus ... expected) { assertEquals(expected.length, actual.length); for(int i =0; i<expected.length; i++) { assertEquals(expected[i], actual[i]); } } }