package org.yamcs.simulation; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.io.File; import java.util.ArrayList; import java.util.Collection; import java.util.List; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import org.junit.BeforeClass; import org.junit.Test; import org.yamcs.parameter.ParameterValue; import org.yamcs.protobuf.Pvalue; import org.yamcs.protobuf.Pvalue.MonitoringResult; import org.yamcs.protobuf.Pvalue.RangeCondition; import org.yamcs.simulation.generated.ObjectFactory; import org.yamcs.simulation.generated.PpSimulation; import org.yamcs.tctm.ParameterSink; import org.yamcs.utils.TimeEncoding; public class SimulationPpProviderTest { private static final String DATA_SCENARIO1 = "src/test/resources/simulation_data.xml"; private static final String DATA_SCENARIO2 = "src/test/resources/simulation_data2.xml"; private static final String DATA_SCENARIO_DATE = "src/test/resources/simulation_data_date.xml"; @BeforeClass public static void beforeClass() { TimeEncoding.setUp(); } @Test public void LoadSimulationData_loadOk() { // Arrange String fileName = DATA_SCENARIO1; SimulationPpProvider target = new SimulationPpProvider(); // Act PpSimulation ppSimulation = target.loadSimulationData(fileName); // Assert assertTrue(ppSimulation != null); } @Test public void CreateXml() throws JAXBException { try { // ARRANGE File file = new File("src/test/resources/genTest.xml"); JAXBContext jaxbContext = JAXBContext .newInstance(PpSimulation.class); Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); // ACT ObjectFactory of = new ObjectFactory(); PpSimulation ppSimulation = of.createPpSimulation(); PpSimulation.ParameterSequence paramSequence1 = new PpSimulation.ParameterSequence(); PpSimulation.ParameterSequence.Parameter parameter1 = new PpSimulation.ParameterSequence.Parameter(); parameter1.setSpaceSystem("APM"); parameter1.setAquisitionStep(1); parameter1.setGenerationStep(2); parameter1.setParaName("SOLAR_toto"); paramSequence1.getParameter().add(parameter1); ppSimulation.getParameterSequence().add(paramSequence1); jaxbMarshaller.marshal(ppSimulation, file); jaxbMarshaller.marshal(ppSimulation, System.out); } catch (Exception e) { // ASSERT assertFalse(e.toString(), true); } } @Test public void ProcessSimulationData_Scenario1() { // Arrange SimulationPpProvider target = new SimulationPpProvider() { public boolean IsRunning() { return true; } }; target.setSimulationData(DATA_SCENARIO1); FakePpListener ppListener = new FakePpListener(); target.setParameterSink(ppListener); target.enable(); // Act target.processSimulationData(); // Assert assertEquals(21, ppListener.receivedValue.size()); // check values assertTrue(ppListener.receivedValue.get(0).getEngValue() .getFloatValue() == (float) 1.1); assertTrue(ppListener.receivedValue.get(1).getEngValue() .getFloatValue() == (float) 1.2); assertTrue(ppListener.receivedValue.get(2).getEngValue() .getFloatValue() == (float) 2.1); assertTrue(ppListener.receivedValue.get(3).getEngValue() .getFloatValue() == (float) 3.5); assertTrue(ppListener.receivedValue.get(4).getEngValue() .getFloatValue() == (float) 1.1); assertTrue(ppListener.receivedValue.get(5).getEngValue() .getFloatValue() == (float) 1.2); assertTrue(ppListener.receivedValue.get(6).getEngValue() .getFloatValue() == (float) 2.1); assertTrue(ppListener.receivedValue.get(7).getEngValue() .getFloatValue() == (float) 3.5); // check generation time assertTrue(ppListener.receivedValue.get(0).getGenerationTime() == ppListener.receivedValue .get(1).getGenerationTime()); assertTrue(ppListener.receivedValue.get(4).getGenerationTime() == ppListener.receivedValue .get(5).getGenerationTime()); assertTrue(ppListener.receivedValue.get(2).getGenerationTime() - ppListener.receivedValue.get(1).getGenerationTime() == 2); assertTrue(ppListener.receivedValue.get(2).getGenerationTime() - ppListener.receivedValue.get(1).getGenerationTime() == 2); assertTrue(ppListener.receivedValue.get(18).getGenerationTime() - ppListener.receivedValue.get(1).getGenerationTime() == 30); assertTrue(ppListener.receivedValue.get(20).getGenerationTime() - ppListener.receivedValue.get(1).getGenerationTime() == 42); // check monitoring result assertEquals(MonitoringResult.WARNING, ppListener.receivedValue.get(20).getMonitoringResult()); assertEquals(RangeCondition.HIGH, ppListener.receivedValue.get(20).getRangeCondition()); } @Test public void ProcessSimulationData_Scenario2() { // Arrange SimulationPpProvider target = new SimulationPpProvider() { public boolean IsRunning() { return true; } }; target.setSimulationData(DATA_SCENARIO2); FakePpListener ppListener = new FakePpListener(); target.setParameterSink(ppListener); target.enable(); // Act target.processSimulationData(); // Assert assertTrue(ppListener.receivedValue.size() == 52); } @Test public void ProcessSimulationData_Date() { // Arrange SimulationPpProvider target = new SimulationPpProvider() { public boolean IsRunning() { return true; } }; target.setSimulationData(DATA_SCENARIO_DATE); FakePpListener ppListener = new FakePpListener(); target.setParameterSink(ppListener); target.enable(); // Act long dateStart = TimeEncoding.getWallclockTime(); target.processSimulationData(); long dateEnd = TimeEncoding.getWallclockTime(); // Assert assertTrue(ppListener.receivedValue.size() == 2); assertTrue(ppListener.receivedValue.get(1).getGenerationTime() == ppListener.receivedValue.get(1).getAcquisitionTime() - 1500); long elapsedTimeGen0 = ppListener.receivedValue.get(0).getGenerationTime() - dateStart; long elapsedTimeAcqu0 = ppListener.receivedValue.get(0).getAcquisitionTime() - dateStart; assertTrue(0 <= elapsedTimeGen0 && elapsedTimeGen0 < 200); assertTrue(1300 < elapsedTimeAcqu0 && elapsedTimeAcqu0 < 1600); long elapsedTimeGen1 = ppListener.receivedValue.get(1).getGenerationTime() - dateStart; long elapsedTimeAcqu1 = ppListener.receivedValue.get(1).getAcquisitionTime() - dateStart; assertTrue(1900 < elapsedTimeGen1 && elapsedTimeGen1 < 2100); assertTrue(3400 < elapsedTimeAcqu1 && elapsedTimeAcqu1 < 3600); assertTrue((dateEnd - dateStart) >= elapsedTimeAcqu1); } class FakePpListener implements ParameterSink { public List<ParameterValue> receivedValue; public FakePpListener() { receivedValue = new ArrayList<ParameterValue>(); } @Override public void updateParameters(long gentime, String group, int seqNum, Collection<ParameterValue> params) { receivedValue.addAll(params); } @Override public void updateParams(long gentime, String group, int seqNum, Collection<Pvalue.ParameterValue> params) { } @Override public String toString() { String result = ""; long firstGenerationTime = 0; for (ParameterValue pv : receivedValue) { if (firstGenerationTime == 0) firstGenerationTime = pv.getGenerationTime(); result += "(" + pv.getEngValue().getFloatValue() + ", " + (pv.getGenerationTime() - firstGenerationTime) + ") "; } return result; } } }