package org.yamcs.parameter;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
import org.junit.BeforeClass;
import org.junit.Test;
import org.yamcs.parameter.ParameterValue;
import org.yamcs.YConfiguration;
import org.yamcs.protobuf.ValueHelper;
import org.yamcs.protobuf.Yamcs.NamedObjectId;
import org.yamcs.protobuf.Yamcs.Value;
import org.yamcs.utils.TimeEncoding;
import org.yamcs.xtce.Parameter;
import org.yamcs.xtce.XtceDb;
import org.yamcs.xtceproc.XtceDbFactory;
public class SoftwareParameterManagerTest {
@BeforeClass
static public void setupTime() {
TimeEncoding.setUp();
YConfiguration.setup();
XtceDbFactory.reset();
}
@Test
public void test() throws Exception {
SoftwareParameterManager spm = new SoftwareParameterManager("test");
XtceDb xtceDb = XtceDbFactory.createInstanceByConfig("refmdb");
MyParamConsumer consumer = new MyParamConsumer();
spm.init(xtceDb);
spm.setParameterListener(consumer);
assertFalse(spm.canProvide(NamedObjectId.newBuilder().setName("/REFMDB/SUBSYS1/FloatPara11_2").build()));
Parameter p1 = spm.getParameter(NamedObjectId.newBuilder().setName("/REFMDB/SUBSYS1/LocalPara1").build());
Parameter p2 = spm.getParameter(NamedObjectId.newBuilder().setName("/REFMDB/SUBSYS1/LocalPara2").build());
assertNotNull(p1);
assertNotNull(p2);
spm.startProviding(p1);
NamedObjectId p1id = NamedObjectId.newBuilder().setName(p1.getQualifiedName()).build();
NamedObjectId p2id = NamedObjectId.newBuilder().setName(p2.getQualifiedName()).build();
Value p1v = ValueHelper.newValue(3);
Value p2v = ValueHelper.newValue(2.72);
org.yamcs.protobuf.Pvalue.ParameterValue pv1 = org.yamcs.protobuf.Pvalue.ParameterValue.newBuilder().setId(p1id).setEngValue(p1v).build();
org.yamcs.protobuf.Pvalue.ParameterValue pv2 = org.yamcs.protobuf.Pvalue.ParameterValue.newBuilder().setId(p2id).setEngValue(p2v).build();
List<org.yamcs.protobuf.Pvalue.ParameterValue> pvList = new ArrayList<org.yamcs.protobuf.Pvalue.ParameterValue>();
pvList.add(pv1);
pvList.add(pv2);
spm.updateParameters(pvList);
Collection<ParameterValue> pvs = consumer.received.poll(5, TimeUnit.SECONDS);
assertNotNull(pvs);
assertEquals(1, pvs.size());
ParameterValue pv = pvs.iterator().next();
assertEquals(p1, pv.getParameter());
spm.startProvidingAll();
spm.updateParameters(pvList);
pvs = consumer.received.poll(5, TimeUnit.SECONDS);
assertEquals(2, pvs.size());
spm.stopProviding(p1);
spm.updateParameters(pvList);
pvs = consumer.received.poll(5, TimeUnit.SECONDS);
assertEquals(1, pvs.size());
pv = pvs.iterator().next();
assertEquals(p2, pv.getParameter());
spm.stopProviding(p2);
spm.updateParameters(pvList);
pvs = consumer.received.poll(2, TimeUnit.SECONDS);
assertNull(pvs);
}
class MyParamConsumer implements ParameterRequestManager {
BlockingQueue<Collection<ParameterValue>> received = new LinkedBlockingQueue<Collection<ParameterValue>>();
@Override
public void update(Collection<ParameterValue> params) {
try {
received.put(params);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}