package org.yamcs;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
import org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.yamcs.alarms.AlarmReporter;
import org.yamcs.api.EventProducerFactory;
import org.yamcs.management.ManagementService;
import org.yamcs.parameter.ParameterConsumer;
import org.yamcs.parameter.ParameterRequestManagerImpl;
import org.yamcs.parameter.ParameterValue;
import org.yamcs.protobuf.Pvalue.MonitoringResult;
import org.yamcs.protobuf.Pvalue.RangeCondition;
import org.yamcs.protobuf.Yamcs.Event;
import org.yamcs.protobuf.Yamcs.NamedObjectId;
import org.yamcs.tctm.SimpleTcTmService;
import org.yamcs.xtce.Parameter;
import org.yamcs.xtce.XtceDb;
import org.yamcs.xtceproc.XtceDbFactory;
public class AlarmTest {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
YConfiguration.setup("refmdb");
ManagementService.setup(false);
XtceDbFactory.reset();
}
private XtceDb db;
private Processor c;
private RefMdbPacketGenerator tmGenerator;
private ParameterRequestManagerImpl prm;
private Queue<Event> q;
private AlarmReporter alarmReporter;
@Before
public void beforeEachTest() throws ConfigurationException, ProcessorException {
String yamcsInstance="refmdb";
EventProducerFactory.setMockup(true);
q=EventProducerFactory.getMockupQueue();
db=XtceDbFactory.getInstance(yamcsInstance);
assertNotNull(db.getParameter("/REFMDB/SUBSYS1/FloatPara1_1_2"));
tmGenerator=new RefMdbPacketGenerator();
SimpleTcTmService tctms = new SimpleTcTmService(tmGenerator, null, null);
try {
c=ProcessorFactory.create(yamcsInstance, "AlarmTest", "refmdb", tctms, "test");
} catch (Exception e) {
e.printStackTrace();
}
prm=c.getParameterRequestManager();
alarmReporter = new AlarmReporter(yamcsInstance, "AlarmTest");
}
@After
public void afterEachTest() { // Prevents us from wrapping our code in try-finally
c.quit();
}
@Test
public void testIntegerLimits() throws InvalidIdentification {
Parameter p = db.getParameter("/REFMDB/SUBSYS1/IntegerPara1_10_1");
final ArrayList<ParameterValue> params=new ArrayList<ParameterValue>();
prm.addRequest(p,
new ParameterConsumer() {
@Override
public void updateItems(int subscriptionId, List<ParameterValue> items) {
params.addAll(items);
}
});
c.start();
alarmReporter.startAsync();
tmGenerator.generate_PKT1_10(30, 7, 0);
// Check whether spreadsheet loads all levels ok
assertEquals(-11, params.get(0).getWatchRange().getMinInclusive(), 1e-17);
assertEquals(30, params.get(0).getWatchRange().getMaxInclusive(), 1e-17);
assertEquals(-22, params.get(0).getWarningRange().getMinInclusive(), 1e-17);
assertEquals(40, params.get(0).getWarningRange().getMaxInclusive(), 1e-17);
assertEquals(-33, params.get(0).getDistressRange().getMinInclusive(), 1e-17);
assertEquals(50, params.get(0).getDistressRange().getMaxInclusive(), 1e-17);
assertEquals(Double.NEGATIVE_INFINITY, params.get(0).getCriticalRange().getMinInclusive(), 1e-17);
assertEquals(60, params.get(0).getCriticalRange().getMaxInclusive(), 1e-17);
assertEquals(Double.NEGATIVE_INFINITY, params.get(0).getSevereRange().getMinInclusive(), 1e-17);
assertEquals(70, params.get(0).getSevereRange().getMaxInclusive(), 1e-17);
assertEquals(MonitoringResult.IN_LIMITS, params.get(0).getMonitoringResult());
assertEquals(0, q.size());
tmGenerator.generate_PKT1_10(42, 7, 0);
assertEquals(MonitoringResult.WARNING, params.get(1).getMonitoringResult());
assertEquals(RangeCondition.HIGH, params.get(1).getRangeCondition());
assertEquals(1, q.size()); // Message for changed MonitoringResult
tmGenerator.generate_PKT1_10(52, 7, 0);
assertEquals(MonitoringResult.DISTRESS, params.get(2).getMonitoringResult());
assertEquals(RangeCondition.HIGH, params.get(2).getRangeCondition());
assertEquals(2, q.size()); // Message for changed MonitoringResult
tmGenerator.generate_PKT1_10(62, 7, 0);
assertEquals(MonitoringResult.CRITICAL, params.get(3).getMonitoringResult());
assertEquals(RangeCondition.HIGH, params.get(3).getRangeCondition());
assertEquals(3, q.size()); // Message for changed MonitoringResult
tmGenerator.generate_PKT1_10(72, 7, 0);
assertEquals(MonitoringResult.SEVERE, params.get(4).getMonitoringResult());
assertEquals(RangeCondition.HIGH, params.get(4).getRangeCondition());
assertEquals(4, q.size()); // Message for changed MonitoringResult
tmGenerator.generate_PKT1_10(74, 7, 0);
assertEquals(MonitoringResult.SEVERE, params.get(5).getMonitoringResult());
assertEquals(RangeCondition.HIGH, params.get(5).getRangeCondition());
assertEquals(4 /* ! */, q.size()); // No message, since nothing changed
tmGenerator.generate_PKT1_10(15, 7, 0);
assertEquals(MonitoringResult.IN_LIMITS, params.get(6).getMonitoringResult());
assertEquals(5, q.size()); // Message for back to normal
// Now, change context
tmGenerator.generate_PKT1_10(71, 0 /* ! */, 0);
assertEquals(MonitoringResult.CRITICAL, params.get(7).getMonitoringResult());
assertEquals(RangeCondition.HIGH, params.get(7).getRangeCondition());
assertEquals(6, q.size()); // Message for changed MonitoringResult
// Test minViolations of 3 under context 6
tmGenerator.generate_PKT1_10(40, 6, 0);
assertEquals(MonitoringResult.WARNING, params.get(8).getMonitoringResult());
assertEquals(RangeCondition.HIGH, params.get(8).getRangeCondition());
assertEquals(6, q.size()); // No message, violations=1
tmGenerator.generate_PKT1_10(40, 6, 0);
assertEquals(MonitoringResult.WARNING, params.get(9).getMonitoringResult());
assertEquals(RangeCondition.HIGH, params.get(9).getRangeCondition());
assertEquals(6, q.size()); // No message, violations=2
tmGenerator.generate_PKT1_10(40, 6, 0);
assertEquals(MonitoringResult.WARNING, params.get(10).getMonitoringResult());
assertEquals(RangeCondition.HIGH, params.get(10).getRangeCondition());
assertEquals(7, q.size()); // Message because violations=3
}
@Test
public void testFloatLimits() throws InvalidIdentification {
final ArrayList<ParameterValue> params=new ArrayList<ParameterValue>();
Parameter p = prm.getParameter(NamedObjectId.newBuilder().setName("/REFMDB/SUBSYS1/FloatPara1_10_3").build());
prm.addRequest(p,
new ParameterConsumer() {
@Override
public void updateItems(int subscriptionId, List<ParameterValue> items) {
params.addAll(items);
}
});
c.start();
alarmReporter.startAsync();
tmGenerator.generate_PKT1_10(0, 1, 30);
// Check whether spreadsheet loads all levels ok
assertEquals(-11, params.get(0).getWatchRange().getMinInclusive(), 1e-17);
assertEquals(30, params.get(0).getWatchRange().getMaxInclusive(), 1e-17);
assertEquals(-22, params.get(0).getWarningRange().getMinInclusive(), 1e-17);
assertEquals(40, params.get(0).getWarningRange().getMaxInclusive(), 1e-17);
assertEquals(-33, params.get(0).getDistressRange().getMinInclusive(), 1e-17);
assertEquals(50, params.get(0).getDistressRange().getMaxInclusive(), 1e-17);
assertEquals(Double.NEGATIVE_INFINITY, params.get(0).getCriticalRange().getMinInclusive(), 1e-17);
assertEquals(60, params.get(0).getCriticalRange().getMaxInclusive(), 1e-17);
assertEquals(Double.NEGATIVE_INFINITY, params.get(0).getSevereRange().getMinInclusive(), 1e-17);
assertEquals(70, params.get(0).getSevereRange().getMaxInclusive(), 1e-17);
assertEquals(MonitoringResult.IN_LIMITS, params.get(0).getMonitoringResult());
assertEquals(0, q.size());
tmGenerator.generate_PKT1_10(0, 1, 42);
assertEquals(MonitoringResult.WARNING, params.get(1).getMonitoringResult());
assertEquals(RangeCondition.HIGH, params.get(1).getRangeCondition());
assertEquals(1, q.size()); // Message for changed MonitoringResult
tmGenerator.generate_PKT1_10(0, 1, 52);
assertEquals(MonitoringResult.DISTRESS, params.get(2).getMonitoringResult());
assertEquals(RangeCondition.HIGH, params.get(2).getRangeCondition());
assertEquals(2, q.size()); // Message for changed MonitoringResult
tmGenerator.generate_PKT1_10(0, 1, 62);
assertEquals(MonitoringResult.CRITICAL, params.get(3).getMonitoringResult());
assertEquals(RangeCondition.HIGH, params.get(3).getRangeCondition());
assertEquals(3, q.size()); // Message for changed MonitoringResult
tmGenerator.generate_PKT1_10(0, 1, 72);
assertEquals(MonitoringResult.SEVERE, params.get(4).getMonitoringResult());
assertEquals(RangeCondition.HIGH, params.get(4).getRangeCondition());
assertEquals(4, q.size()); // Message for changed MonitoringResult
tmGenerator.generate_PKT1_10(0, 1, 74);
assertEquals(MonitoringResult.SEVERE, params.get(5).getMonitoringResult());
assertEquals(RangeCondition.HIGH, params.get(5).getRangeCondition());
assertEquals(4 /* ! */, q.size()); // No message, since nothing changed
tmGenerator.generate_PKT1_10(0, 1, 15);
assertEquals(MonitoringResult.IN_LIMITS, params.get(6).getMonitoringResult());
assertEquals(5, q.size()); // Message for back to normal
// Now, change context
tmGenerator.generate_PKT1_10(0, 0 /* ! */, 71);
assertEquals(MonitoringResult.CRITICAL, params.get(7).getMonitoringResult());
assertEquals(RangeCondition.HIGH, params.get(7).getRangeCondition());
assertEquals(6, q.size()); // Message for changed MonitoringResult
}
@Test
public void testEnumerationAlarms() throws InvalidIdentification {
final ArrayList<ParameterValue> params=new ArrayList<ParameterValue>();
Parameter p = prm.getParameter(NamedObjectId.newBuilder().setName("/REFMDB/SUBSYS1/EnumerationPara1_10_2").build());
prm.addRequest(p,
new ParameterConsumer() {
@Override
public void updateItems(int subscriptionId, List<ParameterValue> items) {
params.addAll(items);
}
});
c.start();
alarmReporter.startAsync();
tmGenerator.generate_PKT1_10(0, 1, 0);
assertEquals(MonitoringResult.IN_LIMITS, params.get(0).getMonitoringResult());
assertEquals(0, q.size());
tmGenerator.generate_PKT1_10(0, 2, 0);
assertEquals(MonitoringResult.WATCH, params.get(1).getMonitoringResult());
assertEquals(1, q.size()); // Message for changed MonitoringResult
tmGenerator.generate_PKT1_10(0, 3, 0);
assertEquals(MonitoringResult.WARNING, params.get(2).getMonitoringResult());
assertEquals(2, q.size()); // Message for changed MonitoringResult
tmGenerator.generate_PKT1_10(0, 4, 0);
assertEquals(MonitoringResult.WARNING, params.get(3).getMonitoringResult());
assertEquals(2 /* ! */, q.size()); // No message, since nothing changed
tmGenerator.generate_PKT1_10(0, 5, 0);
assertEquals(MonitoringResult.CRITICAL, params.get(4).getMonitoringResult());
assertEquals(3, q.size()); // Message for changed MonitoringResult
tmGenerator.generate_PKT1_10(0, 0, 0);
assertEquals(MonitoringResult.IN_LIMITS, params.get(5).getMonitoringResult());
assertEquals(4, q.size()); // Message for back to normal
}
@Test
public void testAlarmReportingWithoutSubscription() {
c.start();
alarmReporter.startAsync();
tmGenerator.generate_PKT1_10(30, 1, 0);
assertEquals(0, q.size());
tmGenerator.generate_PKT1_10(42, 1, 0);
assertEquals(1, q.size()); // Message for changed MonitoringResult
}
@Test
public void testOnValueChangeReport() {
c.start();
alarmReporter.startAsync();
tmGenerator.generate_PKT1_10(20, 1, 0);
assertEquals(0, q.size());
tmGenerator.generate_PKT1_10(20, 1, 0);
assertEquals(0, q.size()); // No change
tmGenerator.generate_PKT1_10(21, 1, 0);
assertEquals(1, q.size()); // Change
tmGenerator.generate_PKT1_10(21, 1, 0);
assertEquals(1, q.size()); // No Change
tmGenerator.generate_PKT1_10(20, 1, 0);
assertEquals(2, q.size()); // Change
}
}