Bug 4316: Added initial test cases regarding Bravo extended fix import

This commit is contained in:
Steffen Schaefer
2017-10-06 10:17:25 +02:00
parent 633891123d
commit a45f7f377b
4 changed files with 194 additions and 47 deletions
@@ -0,0 +1,65 @@
package com.sap.sailing.server.trackfiles.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import org.junit.Assert;
import org.junit.Before;
import com.sap.sailing.domain.common.sensordata.BravoSensorDataMetadata;
import com.sap.sailing.domain.common.tracking.DoubleVectorFix;
import com.sap.sailing.domain.common.tracking.impl.BravoFixImpl;
import com.sap.sailing.domain.trackfiles.TrackFileImportDeviceIdentifier;
import com.sap.sailing.domain.trackimport.DoubleVectorFixImporter;
import com.sap.sailing.domain.trackimport.FormatNotSupportedException;
import com.sap.sailing.server.trackfiles.impl.BaseBravoDataImporterImpl;
import com.sap.sailing.server.trackfiles.impl.doublefix.DownsamplerTo1HzProcessor;
import com.sap.sailing.server.trackfiles.impl.doublefix.LearningBatchProcessor;
public abstract class AbstractBravoDataImportTest {
private DownsamplerTo1HzProcessor downsampler;
private BaseBravoDataImporterImpl bravoDataImporter;
private int callbackCallCount = 0;
private double sumRideHeightInMeters = 0.0;
protected abstract int getTrackColumnCount();
protected abstract Map<String, Integer> getColumnData();
protected interface ImportDataDefinition {
InputStream getInputStream();
int getExpectedFixesCount();
int getExpectedFixesConsolidated();
}
@Before
public void setUp() {
this.callbackCallCount = 0;
this.sumRideHeightInMeters = 0.0;
bravoDataImporter = new BaseBravoDataImporterImpl(getColumnData()) {
protected com.sap.sailing.server.trackfiles.impl.doublefix.DoubleFixProcessor createDownsamplingProcessor(
DoubleVectorFixImporter.Callback callback,
TrackFileImportDeviceIdentifier trackIdentifier) {
final LearningBatchProcessor batchProcessor = new LearningBatchProcessor(5000, 5000, callback, trackIdentifier);
downsampler = new DownsamplerTo1HzProcessor(BravoSensorDataMetadata.getTrackColumnCount(), batchProcessor);
return downsampler;
};
};
}
protected void testImport(ImportDataDefinition importData) throws FormatNotSupportedException, IOException {
bravoDataImporter.importFixes(importData.getInputStream(), (fixes, device) -> {
for (DoubleVectorFix fix : fixes) {
callbackCallCount++;
sumRideHeightInMeters += new BravoFixImpl(fix).getRideHeight().getMeters();
}
}, "filename", "source", /* downsample */ true);
Assert.assertEquals(importData.getExpectedFixesCount(), downsampler.getCountSourceTtl());
Assert.assertEquals(importData.getExpectedFixesConsolidated(), downsampler.getCountImportedTtl());
Assert.assertEquals(importData.getExpectedFixesConsolidated(), callbackCallCount);
}
}
@@ -4,42 +4,23 @@ import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.Map;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import com.sap.sailing.domain.common.sensordata.BravoSensorDataMetadata;
import com.sap.sailing.domain.common.tracking.DoubleVectorFix;
import com.sap.sailing.domain.common.tracking.impl.BravoFixImpl;
import com.sap.sailing.domain.trackfiles.TrackFileImportDeviceIdentifier;
import com.sap.sailing.domain.trackimport.DoubleVectorFixImporter;
import com.sap.sailing.domain.trackimport.FormatNotSupportedException;
import com.sap.sailing.server.trackfiles.impl.BravoDataImporterImpl;
import com.sap.sailing.server.trackfiles.impl.doublefix.DownsamplerTo1HzProcessor;
import com.sap.sailing.server.trackfiles.impl.doublefix.LearningBatchProcessor;
public class BravoDataImportTest {
public class BravoDataImportTest extends AbstractBravoDataImportTest {
private LearningBatchProcessor batchProcessor;
private DownsamplerTo1HzProcessor downsampler;
private final DoubleVectorFixImporter bravoDataImporter = new BravoDataImporterImpl() {
protected com.sap.sailing.server.trackfiles.impl.doublefix.DoubleFixProcessor createDownsamplingProcessor(
DoubleVectorFixImporter.Callback callback,
TrackFileImportDeviceIdentifier trackIdentifier) {
batchProcessor = new LearningBatchProcessor(5000, 5000, callback, trackIdentifier);
downsampler = new DownsamplerTo1HzProcessor(BravoSensorDataMetadata.getTrackColumnCount(), batchProcessor);
return downsampler;
};
};
private int callbackCallCount = 0;
private double sumRideHeightInMeters = 0.0;
@Override
protected Map<String, Integer> getColumnData() {
return BravoSensorDataMetadata.getColumnNamesToIndexInDoubleFix();
}
@Before
public void setUp() {
this.callbackCallCount = 0;
this.sumRideHeightInMeters = 0.0;
@Override
protected int getTrackColumnCount() {
return BravoSensorDataMetadata.getTrackColumnCount();
}
@Test
@@ -67,48 +48,36 @@ public class BravoDataImportTest {
testImport(ImportData.DUMMY_RANDOM_HAEDER_ONE_LINE);
}
private void testImport(ImportData importData) throws FormatNotSupportedException, IOException {
bravoDataImporter.importFixes(importData.getInputStream(), (fixes, device) -> {
for (DoubleVectorFix fix : fixes) {
callbackCallCount++;
sumRideHeightInMeters += new BravoFixImpl(fix).getRideHeight().getMeters();
}
}, "filename", "source", /* downsample */ true);
Assert.assertEquals(importData.expectedFixesCount, downsampler.getCountSourceTtl());
Assert.assertEquals(importData.expectedFixesConsolidated, downsampler.getCountImportedTtl());
Assert.assertEquals(importData.expectedFixesConsolidated, callbackCallCount);
}
private enum ImportData {
private enum ImportData implements ImportDataDefinition {
// find out the number of fixes using the following bash line:
// tail -n +5 Undefined\ Race\ -\ BRAVO.txt | awk '{if ($5<$6) print v=$5; else v=$6; sum+=v; count++; } END {print "Sum: ", sum, "Count: ", count, "Average:", sum/count;}'
FILE_UNDEFINED_RACE_BRAVO(870, 89) {
@Override
protected InputStream getInputStream() {
public InputStream getInputStream() {
return getClass().getResourceAsStream("/Undefined Race - BRAVO.txt");
}
},
FILE_NEW_BRAVO_FORMAT(6, 1) {
@Override
protected InputStream getInputStream() {
public InputStream getInputStream() {
return getClass().getResourceAsStream("/FMU_out_new.txt");
}
},
DUMMY_DEFAULT_HEADER_NO_DATA(0, 0) {
@Override
protected InputStream getInputStream() {
public InputStream getInputStream() {
return new ByteArrayInputStream(HEADER_ORDER_DEFAULT.getBytes(StandardCharsets.UTF_8));
}
},
DUMMY_DEAFULT_HEADER_ONE_LINE(1, 1) {
@Override
protected InputStream getInputStream() {
public InputStream getInputStream() {
return new ByteArrayInputStream((HEADER_ORDER_DEFAULT + DUMMY_CONTENT).getBytes(StandardCharsets.UTF_8));
}
},
DUMMY_RANDOM_HAEDER_ONE_LINE(1, 1) {
@Override
protected InputStream getInputStream() {
public InputStream getInputStream() {
return new ByteArrayInputStream((HEADER_ORDER_RANDOM + DUMMY_CONTENT).getBytes(StandardCharsets.UTF_8));
}
};
@@ -121,7 +90,15 @@ public class BravoDataImportTest {
this.expectedFixesConsolidated = expectedFixesConsolidated;
}
protected abstract InputStream getInputStream();
@Override
public int getExpectedFixesCount() {
return expectedFixesCount;
}
@Override
public int getExpectedFixesConsolidated() {
return expectedFixesConsolidated;
}
}
private static final String HEADER_ORDER_DEFAULT = "jjlDATE\tjjlTIME\tEpoch\tRideHeight\tRideHeightPortHull\t"
@@ -0,0 +1,101 @@
package com.sap.sailing.server.trackfiles.test;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.Map;
import org.junit.Test;
import com.sap.sailing.domain.common.sensordata.BravoExtendedSensorDataMetadata;
import com.sap.sailing.domain.trackimport.FormatNotSupportedException;
public class BravoExtendedDataImportTest extends AbstractBravoDataImportTest {
@Override
protected Map<String, Integer> getColumnData() {
return BravoExtendedSensorDataMetadata.getColumnNamesToIndexInDoubleFix();
}
@Override
protected int getTrackColumnCount() {
return BravoExtendedSensorDataMetadata.getTrackColumnCount();
}
@Test
public void testDefaultHeaderNoDataImport() throws FormatNotSupportedException, IOException {
testImport(ImportData.DUMMY_DEFAULT_HEADER_NO_DATA);
}
@Test
public void testDefaultHeaderOneLineImport() throws FormatNotSupportedException, IOException {
testImport(ImportData.DUMMY_DEAFULT_HEADER_ONE_LINE);
}
@Test
public void testRandomHeaderOneLineImport() throws FormatNotSupportedException, IOException {
testImport(ImportData.DUMMY_RANDOM_HAEDER_ONE_LINE);
}
private enum ImportData implements ImportDataDefinition {
DUMMY_DEFAULT_HEADER_NO_DATA(0, 0) {
@Override
public InputStream getInputStream() {
return new ByteArrayInputStream(HEADER_ORDER_DEFAULT.getBytes(StandardCharsets.UTF_8));
}
},
DUMMY_DEAFULT_HEADER_ONE_LINE(1, 1) {
@Override
public InputStream getInputStream() {
return new ByteArrayInputStream((HEADER_ORDER_DEFAULT + DUMMY_CONTENT).getBytes(StandardCharsets.UTF_8));
}
},
DUMMY_RANDOM_HAEDER_ONE_LINE(1, 1) {
@Override
public InputStream getInputStream() {
return new ByteArrayInputStream((HEADER_ORDER_RANDOM + DUMMY_CONTENT).getBytes(StandardCharsets.UTF_8));
}
};
private final int expectedFixesCount;
private final int expectedFixesConsolidated;
private ImportData(int expectedFixesCount, int expectedFixesConsolidated) {
this.expectedFixesCount = expectedFixesCount;
this.expectedFixesConsolidated = expectedFixesConsolidated;
}
@Override
public int getExpectedFixesCount() {
return expectedFixesCount;
}
@Override
public int getExpectedFixesConsolidated() {
return expectedFixesConsolidated;
}
}
private static final String HEADER_ORDER_DEFAULT = "jjlDATE\tjjlTIME\tEpoch\tMagneticVariation\tCurrentSpeed\t"
+ "CurrentDirection\tWindGradient\tLat\tLon\tCOG\tSOG\tHdg\tHeel\tTrim\tFlightPathAngle\tRollRate\t"
+ "PitchRate\tYawRate\tAccelX\tAccelY\tAccelZ\tHeaveSpeed\tHeave\tRideHeightPort\tRideHeightStbd\t"
+ "RideHeight\tBS\tLwy\tCse\tSOW\tAWA\tAWS\tTWA\tTWS\tTWD\tUpwashAngle\tUpwashSpeed\tAdjWindAngle\t"
+ "AdjWindSpeed\tVMG\tMastRotation\tDaggerBoardRakeAnglePort\tRudderRakeAnglePort\tDaggerBoardRakeAngleStbd\t"
+ "RudderRakeAngleStbd\tTargetTWA\tTargetVMG\tTargetBS\tPolarBS\tBsPercentage\tVmgPercentage\t\n";
private static final String HEADER_ORDER_RANDOM = "jjlDATE\tjjlTIME\tEpoch\tMagneticVariation\tCurrentSpeed\t"
+ "CurrentDirection\tWindGradient\tLat\tLon\tCOG\tSOG\tHdg\tHeel\tTrim\tFlightPathAngle\tRollRate\t"
+ "AdjWindSpeed\tVMG\tMastRotation\tDaggerBoardRakeAnglePort\tRudderRakeAnglePort\tDaggerBoardRakeAngleStbd\t"
+ "RideHeight\tBS\tLwy\tCse\tSOW\tAWA\tAWS\tTWA\tTWS\tTWD\tUpwashAngle\tUpwashSpeed\tAdjWindAngle\t"
+ "PitchRate\tYawRate\tAccelX\tAccelY\tAccelZ\tHeaveSpeed\tHeave\tRideHeightPort\tRideHeightStbd\t"
+ "RudderRakeAngleStbd\tTargetTWA\tTargetVMG\tTargetBS\tPolarBS\tBsPercentage\tVmgPercentage\t\n";
private static final String DUMMY_CONTENT = "20170721.000000\t144509.020891\t1500648308988.000000\t0.000000\t"
+ "0.000000\t0.000000\t0.100000\t4121.750774\t211.855241\t267.200000\t12.108000\t274.401591\t8.293443\t"
+ "1.381434\t-0.607992\t4.466850\t2.295866\t4.974762\t0.021349\t0.049948\t-0.003009\t-0.059050\t0.564561\t"
+ "-0.142641\t0.661195\t0.640803\t11.024831\t4.831789\t274.531789\t11.415373\t-28.235512\t12.815985\t"
+ "-88.908514\t6.063496\t183.968325\t0.000000\t0.000000\t0.000000\t0.000000\t-0.080389\t-46.507845\t"
+ "-0.301864\t0.915471\t0.737711\t5.518818\t60.000000\t4.049104\t8.098208\t11.025103\t134.646042\t0.684715\t\n";
}