package org.yamcs; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import java.util.concurrent.TimeUnit; import org.junit.Test; import org.yamcs.api.ws.WebSocketRequest; import org.yamcs.cmdhistory.CommandHistoryPublisher; import org.yamcs.commanding.PreparedCommand; import org.yamcs.protobuf.Commanding.CommandHistoryAttribute; import org.yamcs.protobuf.Commanding.CommandHistoryEntry; import org.yamcs.protobuf.Commanding.CommandId; import org.yamcs.protobuf.Rest.IssueCommandRequest; import org.yamcs.protobuf.Rest.IssueCommandResponse; import org.yamcs.protobuf.SchemaRest; import org.yamcs.tctm.TcDataLink; import com.google.common.util.concurrent.AbstractService; import io.netty.handler.codec.http.HttpMethod; public class ComVerifIntegrationTest extends AbstractIntegrationTest { @Test public void testCommandVerificationContainter() throws Exception { WebSocketRequest wsr = new WebSocketRequest("cmdhistory", "subscribe"); wsClient.sendRequest(wsr); IssueCommandRequest cmdreq = getCommand(7); String resp = restClient.doRequest("/processors/IntegrationTest/realtime/commands/REFMDB/SUBSYS1/CONT_VERIF_TC", HttpMethod.POST, toJson(cmdreq, SchemaRest.IssueCommandRequest.WRITE)).get(); IssueCommandResponse response = (fromJson(resp, SchemaRest.IssueCommandResponse.MERGE)).build(); assertEquals("REFMDB/SUBSYS1/CONT_VERIF_TC()", response.getSource()); CommandHistoryEntry cmdhist = wsListener.cmdHistoryDataList.poll(3, TimeUnit.SECONDS); assertNotNull(cmdhist); CommandId cmdid = cmdhist.getCommandId(); assertEquals("/REFMDB/SUBSYS1/CONT_VERIF_TC", cmdid.getCommandName()); assertEquals(7, cmdid.getSequenceNumber()); assertEquals("IntegrationTest", cmdid.getOrigin()); packetGenerator.generateContVerifCmdAck((short)1001, (byte)0, 0); cmdhist = wsListener.cmdHistoryDataList.poll(3, TimeUnit.SECONDS); assertNotNull(cmdhist); assertEquals(1, cmdhist.getAttrCount()); CommandHistoryAttribute cha = cmdhist.getAttr(0); assertEquals(CommandHistoryPublisher.TransmissionContraints_KEY, cha.getName()); assertEquals("NA", cha.getValue().getStringValue()); cmdhist = wsListener.cmdHistoryDataList.poll(3, TimeUnit.SECONDS); assertNotNull(cmdhist); assertEquals(1, cmdhist.getAttrCount()); cha = cmdhist.getAttr(0); assertEquals("Verifier_Execution", cha.getName()); assertEquals("OK", cha.getValue().getStringValue()); packetGenerator.generateContVerifCmdAck((short)1001, (byte)5, 0); cmdhist = wsListener.cmdHistoryDataList.poll(3, TimeUnit.SECONDS); assertNotNull(cmdhist); assertEquals(1, cmdhist.getAttrCount()); cha = cmdhist.getAttr(0); assertEquals("Verifier_Complete", cha.getName()); assertEquals("OK", cha.getValue().getStringValue()); cmdhist = wsListener.cmdHistoryDataList.poll(3, TimeUnit.SECONDS); assertNotNull(cmdhist); assertEquals(1, cmdhist.getAttrCount()); cha = cmdhist.getAttr(0); assertEquals(CommandHistoryPublisher.CommandComplete_KEY, cha.getName()); assertEquals("OK", cha.getValue().getStringValue()); } @Test public void testCommandVerificationAlgorithm() throws Exception { WebSocketRequest wsr = new WebSocketRequest("cmdhistory", "subscribe"); wsClient.sendRequest(wsr); IssueCommandRequest cmdreq = getCommand(4, "p1", "10", "p2", "20"); String resp = restClient.doRequest("/processors/IntegrationTest/realtime/commands/REFMDB/SUBSYS1/ALG_VERIF_TC", HttpMethod.POST, toJson(cmdreq, SchemaRest.IssueCommandRequest.WRITE)).get(); IssueCommandResponse response = (fromJson(resp, SchemaRest.IssueCommandResponse.MERGE)).build(); assertEquals("REFMDB/SUBSYS1/ALG_VERIF_TC(p1: 10, p2: 20)", response.getSource()); CommandHistoryEntry cmdhist = wsListener.cmdHistoryDataList.poll(3, TimeUnit.SECONDS); assertNotNull(cmdhist); CommandId cmdid = cmdhist.getCommandId(); assertEquals("/REFMDB/SUBSYS1/ALG_VERIF_TC", cmdid.getCommandName()); assertEquals(4, cmdid.getSequenceNumber()); assertEquals("IntegrationTest", cmdid.getOrigin()); packetGenerator.generateAlgVerifCmdAck((short)25, MyTcDataLink.seqNum, (byte)0, 0); cmdhist = wsListener.cmdHistoryDataList.poll(3, TimeUnit.SECONDS); assertNotNull(cmdhist); assertEquals(1, cmdhist.getAttrCount()); CommandHistoryAttribute cha = cmdhist.getAttr(0); assertEquals(CommandHistoryPublisher.TransmissionContraints_KEY, cha.getName()); assertEquals("NA", cha.getValue().getStringValue()); cmdhist = wsListener.cmdHistoryDataList.poll(3, TimeUnit.SECONDS); assertNotNull(cmdhist); assertEquals(1, cmdhist.getAttrCount()); cha = cmdhist.getAttr(0); assertEquals("packetSeqNum", cha.getName()); assertEquals(5000, cha.getValue().getSint32Value()); packetGenerator.generateAlgVerifCmdAck((short)25, MyTcDataLink.seqNum, (byte)1, 5); cmdhist = wsListener.cmdHistoryDataList.poll(3, TimeUnit.SECONDS); assertNotNull(cmdhist); assertEquals(1, cmdhist.getAttrCount()); cha = cmdhist.getAttr(0); assertEquals("Verifier_Execution", cha.getName()); assertEquals("OK", cha.getValue().getStringValue()); cmdhist = wsListener.cmdHistoryDataList.poll(3, TimeUnit.SECONDS); assertNotNull(cmdhist); assertEquals(1, cmdhist.getAttrCount()); cha = cmdhist.getAttr(0); assertEquals("Verifier_Complete", cha.getName()); cmdhist = wsListener.cmdHistoryDataList.poll(3, TimeUnit.SECONDS); assertNotNull(cmdhist); assertEquals(1, cmdhist.getAttrCount()); cha = cmdhist.getAttr(0); assertEquals(CommandHistoryPublisher.CommandFailed_KEY, cha.getName()); assertEquals("NOK", cha.getValue().getStringValue()); } public static class MyTcDataLink extends AbstractService implements TcDataLink { static short seqNum = 5000; CommandHistoryPublisher commandHistoryPublisher; public MyTcDataLink(String yamcsInstance, String name) { } @Override public String getLinkStatus() { return "OK"; } @Override public String getDetailedStatus() { return "OK"; } @Override public void enable() { } @Override public void disable() { } @Override public boolean isDisabled() { return false; } @Override public long getDataCount() { return 0; } @Override public void sendTc(PreparedCommand preparedCommand) { if(preparedCommand.getCmdName().contains("ALG_VERIF_TC")) { commandHistoryPublisher.publish(preparedCommand.getCommandId(), "packetSeqNum", seqNum); } } @Override public void setCommandHistoryPublisher(CommandHistoryPublisher commandHistoryPublisher) { this.commandHistoryPublisher = commandHistoryPublisher; } @Override protected void doStart() { notifyStarted(); } @Override protected void doStop() { notifyStopped(); } } }