package org.yamcs;
import static org.junit.Assert.assertEquals;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.junit.BeforeClass;
import org.junit.Test;
import org.yamcs.api.EventProducerFactory;
import org.yamcs.container.ContainerConsumer;
import org.yamcs.container.ContainerRequestManager;
import org.yamcs.management.ManagementService;
import org.yamcs.xtce.SequenceContainer;
import org.yamcs.xtce.XtceDb;
import org.yamcs.xtceproc.XtceDbFactory;
public class ContainerRequestManagerTest {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
YConfiguration.setup("refmdb");
ManagementService.setup(false);
XtceDbFactory.reset();
EventProducerFactory.setMockup(false);
}
@Test
public void testSubscriptions() throws Exception {
RefMdbPacketGenerator packetGenerator = new RefMdbPacketGenerator();
Processor c = ProcessorFactory.create("refmdb", "ContainerRequestManagerTest", "refmdb", new RefMdbTmService(packetGenerator), "refmdb");
ContainerRequestManager rm = c.getContainerRequestManager();
XtceDb xtceDb = c.getXtceDb();
RecordingPacketConsumer consumer1 = new RecordingPacketConsumer();
RecordingPacketConsumer consumer2 = new RecordingPacketConsumer();
rm.subscribeAll(consumer1);
rm.subscribeAll(consumer2);
packetGenerator.generate_PKT1_1();
packetGenerator.generate_PKT1_3();
assertEquals(6, consumer1.received.size());
Iterator<SequenceContainer> it = consumer1.received.iterator();
assertEquals("ccsds-default", it.next().getName());
assertEquals("PKT1", it.next().getName());
assertEquals("PKT1_1", it.next().getName());
assertEquals("ccsds-default", it.next().getName());
assertEquals("PKT1", it.next().getName());
assertEquals("PKT1_3", it.next().getName());
// Same for 2nd consumer
assertEquals(6, consumer2.received.size());
it = consumer2.received.iterator();
assertEquals("ccsds-default", it.next().getName());
assertEquals("PKT1", it.next().getName());
assertEquals("PKT1_1", it.next().getName());
assertEquals("ccsds-default", it.next().getName());
assertEquals("PKT1", it.next().getName());
assertEquals("PKT1_3", it.next().getName());
// Now try unsubscribing 2nd consumer
consumer1.reset();
consumer2.reset();
rm.unsubscribeAll(consumer2);
packetGenerator.generate_PKT1_1();
packetGenerator.generate_PKT1_3();
assertEquals(6, consumer1.received.size());
assertEquals(0, consumer2.received.size());
// Now subscribe 2nd consumer to PKT13 only
rm.subscribe(consumer2, xtceDb.getSequenceContainer("/REFMDB/SUBSYS1/PKT1_3"));
packetGenerator.generate_PKT1_1();
packetGenerator.generate_PKT1_3();
assertEquals(1, consumer2.received.size());
SequenceContainer cont = consumer2.received.iterator().next();
assertEquals("PKT1_3", cont.getName());
// Subscribe consumer2 to all again
consumer2.reset();
rm.subscribeAll(consumer2);
packetGenerator.generate_PKT1_1();
packetGenerator.generate_PKT1_3();
assertEquals(6, consumer2.received.size());
}
/**
* PacketConsumer that stores whatever it consumes for later retrieval
*/
private static class RecordingPacketConsumer implements ContainerConsumer {
List<SequenceContainer> received = new ArrayList<SequenceContainer>();
@Override
public void processContainer(ContainerExtractionResult cer) {
received.add(cer.getContainer());
}
void reset() {
received.clear();
}
}
}