package org.yamcs; import static org.junit.Assert.assertEquals; import java.util.concurrent.Future; import java.util.logging.Level; import java.util.logging.Logger; import org.junit.Ignore; import org.junit.Test; import org.yamcs.parameterarchive.ParameterArchive; import org.yamcs.parameterarchive.ParameterGroupIdDb; import org.yamcs.parameterarchive.ParameterIdDb; import org.yamcs.protobuf.Pvalue.AcquisitionStatus; import org.yamcs.protobuf.Pvalue.ParameterData; import org.yamcs.protobuf.Pvalue.TimeSeries; import org.yamcs.protobuf.Pvalue.TimeSeries.Sample; import org.yamcs.protobuf.SchemaPvalue; import org.yamcs.protobuf.Yamcs.Value; import org.yamcs.utils.TimeEncoding; import io.netty.handler.codec.http.HttpMethod; public class ParameterArchiveIntegrationTest extends AbstractIntegrationTest { private void generateData(String utcStart, int numPackets) { long t0 = TimeEncoding.parse(utcStart); for (int i=0;i <numPackets; i++) { packetGenerator.setGenerationTime(t0+1000*i); packetGenerator.generate_PKT1_1(); packetGenerator.generate_PKT1_3(); } } @Test @Ignore public void testReplayFillup1() throws Exception { Logger.getLogger("org.yamcs").setLevel(Level.INFO); Logger.getLogger("org.yamcs.parameterarchive").setLevel(Level.ALL); generateData("2015-01-02T10:00:00", 30*24*3600); ParameterArchive parameterArchive = YamcsServer.getService(yamcsInstance, ParameterArchive.class); Future<?> f = parameterArchive.reprocess(TimeEncoding.parse("2015-01-02T10:00:00"), TimeEncoding.parse("2016-02-03T11:00:00")); f.get(); ParameterIdDb pdb = parameterArchive.getParameterIdDb(); ParameterGroupIdDb pgdb = parameterArchive.getParameterGroupIdDb(); pdb.print(System.out); pgdb.print(System.out); } @Test public void testRestRetrieval() throws Exception { // Logger.getLogger("org.yamcs").setLevel(Level.INFO); Logger.getLogger("org.yamcs.parameterarchive").setLevel(Level.ALL); generateData("2015-01-02T10:00:00", 2*3600); String resp; Value engValue; ParameterData pdata; org.yamcs.protobuf.Pvalue.ParameterValue pv; TimeSeries vals; Sample s0; //first two requests before the consolidation, should return data from cache resp = restClient.doRequest("/archive/IntegrationTest/parameters/REFMDB/SUBSYS1/FloatPara1_1_2?start=2015-01-02T10:00:00&stop=2015-01-02T11:00:00", HttpMethod.GET, "").get(); pdata = fromJson(resp, SchemaPvalue.ParameterData.MERGE).build(); assertEquals(100, pdata.getParameterCount()); engValue = pdata.getParameter(0).getEngValue(); assertEquals(0.167291805148, engValue.getFloatValue(), 1e-5); resp = restClient.doRequest("/archive/IntegrationTest/parameters/REFMDB/SUBSYS1/FloatPara1_1_2/samples?start=2015-01-02T11:40:00&stop=2015-01-02T12:00:00", HttpMethod.GET, "").get(); vals = (fromJson(resp, SchemaPvalue.TimeSeries.MERGE)).build(); assertEquals(500, vals.getSampleCount()); s0 = vals.getSample(0); assertEquals(0.167291805148, s0.getMin(), 1e-5); assertEquals(0.167291805148, s0.getMax(), 1e-5); assertEquals(0.167291805148, s0.getAvg(), 1e-5); ParameterArchive parameterArchive = YamcsServer.getService(yamcsInstance, ParameterArchive.class); Future<?> f = parameterArchive.reprocess(TimeEncoding.parse("2015-01-02T10:00:00"), TimeEncoding.parse("2016-01-02T11:00:00")); f.get(); //parameterArchive.printKeys(System.out); resp = restClient.doRequest("/archive/IntegrationTest/parameters/REFMDB/SUBSYS1/FloatPara1_1_2/samples?start=2015-01-02T10:00:00&stop=2015-01-02T11:00:00", HttpMethod.GET, "").get(); vals = (fromJson(resp, SchemaPvalue.TimeSeries.MERGE)).build(); assertEquals(500, vals.getSampleCount()); s0 = vals.getSample(0); assertEquals(0.167291805148, s0.getMin(), 1e-5); assertEquals(0.167291805148, s0.getMax(), 1e-5); assertEquals(0.167291805148, s0.getAvg(), 1e-5); resp = restClient.doRequest("/archive/IntegrationTest/parameters/REFMDB/SUBSYS1/FloatPara1_1_2?start=2015-01-02T10:00:00&stop=2015-01-02T11:00:00", HttpMethod.GET, "").get(); pdata = fromJson(resp, SchemaPvalue.ParameterData.MERGE).build(); assertEquals(100, pdata.getParameterCount()); engValue = pdata.getParameter(0).getEngValue(); assertEquals(0.167291805148, engValue.getFloatValue(), 1e-5); resp = restClient.doRequest("/archive/IntegrationTest/parameters/REFMDB/SUBSYS1/FloatPara1_1_2?start=2015-01-02T10:00:00&stop=2015-01-02T11:00:00&limit=10", HttpMethod.GET, "").get(); pdata = fromJson(resp, SchemaPvalue.ParameterData.MERGE).build(); assertEquals(10, pdata.getParameterCount()); resp = restClient.doRequest("/archive/IntegrationTest/parameters/REFMDB/SUBSYS1/FloatPara1_1_2?start=2015-01-02T10:00:00&stop=2015-01-02T11:00:00&norepeat", HttpMethod.GET, "").get(); pdata = fromJson(resp, SchemaPvalue.ParameterData.MERGE).build(); assertEquals(1, pdata.getParameterCount()); pv = pdata.getParameter(0); assertEquals("2015-01-02T11:00:00.000", TimeEncoding.toString(pv.getGenerationTime())); assertEquals(0.167291805148, pv.getEngValue().getFloatValue(), 1e-5); AcquisitionStatus acqs = pdata.getParameter(0).getAcquisitionStatus(); assertEquals(AcquisitionStatus.ACQUIRED, acqs); //add some realtime data generateData("2015-01-02T12:00:00", 10); resp = restClient.doRequest("/archive/IntegrationTest/parameters/REFMDB/SUBSYS1/FloatPara1_1_2?start=2015-01-02T11:59:00&limit=20", HttpMethod.GET, "").get(); pdata = fromJson(resp, SchemaPvalue.ParameterData.MERGE).build(); assertEquals(20, pdata.getParameterCount()); long t = TimeEncoding.parse("2015-01-02T12:00:09.000"); for(int i=0; i<pdata.getParameterCount(); i++) { pv = pdata.getParameter(i); assertEquals(TimeEncoding.toString(t), TimeEncoding.toString(pv.getGenerationTime())); t-=1000; } resp = restClient.doRequest("/archive/IntegrationTest/parameters/REFMDB/SUBSYS1/FloatPara1_1_2?start=2015-01-02T12:00:00", HttpMethod.GET, "").get(); pdata = fromJson(resp, SchemaPvalue.ParameterData.MERGE).build(); assertEquals(9, pdata.getParameterCount()); t = TimeEncoding.parse("2015-01-02T12:00:09.000"); for(int i=0; i<pdata.getParameterCount(); i++) { pv = pdata.getParameter(i); assertEquals(TimeEncoding.toString(t), TimeEncoding.toString(pv.getGenerationTime())); t-=1000; } //request excluding realtime cache resp = restClient.doRequest("/archive/IntegrationTest/parameters/REFMDB/SUBSYS1/FloatPara1_1_2?start=2015-01-02T12:00:00&norealtime", HttpMethod.GET, "").get(); pdata = fromJson(resp, SchemaPvalue.ParameterData.MERGE).build(); assertEquals(0, pdata.getParameterCount()); //ascending request combining archive with cache resp = restClient.doRequest("/archive/IntegrationTest/parameters/REFMDB/SUBSYS1/FloatPara1_1_2?start=2015-01-02T11:59:50&order=asc", HttpMethod.GET, "").get(); pdata = fromJson(resp, SchemaPvalue.ParameterData.MERGE).build(); assertEquals(20, pdata.getParameterCount()); t = TimeEncoding.parse("2015-01-02T11:59:50"); for(int i=0; i<pdata.getParameterCount(); i++) { pv = pdata.getParameter(i); assertEquals(TimeEncoding.toString(t), TimeEncoding.toString(pv.getGenerationTime())); t+=1000; } } }