mirror of
https://github.com/rehlds/rehlds.git
synced 2024-12-29 08:05:50 +03:00
Various fixes in the decoder of flight record dumps
This commit is contained in:
parent
dd654c085b
commit
9b9f494416
@ -1,4 +1,5 @@
|
|||||||
apply plugin: 'java'
|
apply plugin: 'java'
|
||||||
|
apply plugin: 'groovy'
|
||||||
|
|
||||||
group = 'org.rehlds.flightrec'
|
group = 'org.rehlds.flightrec'
|
||||||
version = rootProject.version
|
version = rootProject.version
|
||||||
@ -11,6 +12,7 @@ repositories {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
testCompile 'org.codehaus.groovy:groovy-all:2.4.5'
|
||||||
testCompile "junit:junit:4.12"
|
testCompile "junit:junit:4.12"
|
||||||
compile project(':flightrec/decoder_api')
|
compile project(':flightrec/decoder_api')
|
||||||
}
|
}
|
||||||
|
0
flightrec/decoder/pub/extDecoders/.keep
Normal file
0
flightrec/decoder/pub/extDecoders/.keep
Normal file
@ -17,7 +17,8 @@ public class FlightLogTreeBuilder {
|
|||||||
|
|
||||||
void handleLeaveMessage(FlightrecMessage msg) {
|
void handleLeaveMessage(FlightrecMessage msg) {
|
||||||
if (currentNode == rootNode) {
|
if (currentNode == rootNode) {
|
||||||
rootNode = new LogTreeNodeComplex(null, null, msg);
|
currentNode.leaveMsg = msg;
|
||||||
|
rootNode = new LogTreeNodeComplex(null, null, null);
|
||||||
rootNode.addChild(currentNode);
|
rootNode.addChild(currentNode);
|
||||||
currentNode.setParent(rootNode);
|
currentNode.setParent(rootNode);
|
||||||
currentNode = rootNode;
|
currentNode = rootNode;
|
||||||
|
@ -46,17 +46,17 @@ public class FlightRecorder {
|
|||||||
FileScanResult scanResult = FlightRecFileScanner.scan(f);
|
FileScanResult scanResult = FlightRecFileScanner.scan(f);
|
||||||
|
|
||||||
System.out.println("Dump file scan results: ");
|
System.out.println("Dump file scan results: ");
|
||||||
for (HeaderScanResult metaHeader : scanResult.metaHeaders) {
|
for (HeaderScanResult hdr : scanResult.metaHeaders) {
|
||||||
System.out.print("\tMeta header @ 0x" + Long.toHexString(metaHeader.pos) + "; valid: " + (metaHeader.error == null));
|
System.out.print(String.format("\tMeta header @ 0x%08X; len=%d; version=%d; valid=%s", hdr.pos, hdr.len, hdr.version, "" + (hdr.error == null)));
|
||||||
if (metaHeader.error != null) {
|
if (hdr.error != null) {
|
||||||
System.out.print("; error: " + metaHeader.error);
|
System.out.print("; error: " + hdr.error);
|
||||||
}
|
}
|
||||||
System.out.println();
|
System.out.println();
|
||||||
}
|
}
|
||||||
for (HeaderScanResult dataHeader : scanResult.dataHeaders) {
|
for (HeaderScanResult hdr : scanResult.dataHeaders) {
|
||||||
System.out.print("\tData header @ 0x" + Long.toHexString(dataHeader.pos) + "; valid: " + (dataHeader.error == null));
|
System.out.print(String.format("\tData header @ 0x%08X; len=%d; version=%d; valid=%s", hdr.pos, hdr.len, hdr.version, "" + (hdr.error == null)));
|
||||||
if (dataHeader.error != null) {
|
if (hdr.error != null) {
|
||||||
System.out.print("; error: " + dataHeader.error);
|
System.out.print("; error: " + hdr.error);
|
||||||
}
|
}
|
||||||
System.out.println();
|
System.out.println();
|
||||||
}
|
}
|
||||||
@ -133,6 +133,7 @@ public class FlightRecorder {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
System.out.println("Read " + messages.size() + " messages from '" + cfg.dumpFile.getAbsolutePath() + "'");
|
||||||
LogTreeNodeComplex treeRootNode = buildTree(messages);
|
LogTreeNodeComplex treeRootNode = buildTree(messages);
|
||||||
if (treeRootNode == null) {
|
if (treeRootNode == null) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -55,7 +55,10 @@ public class TextLogWriter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
String escapeString(String s) {
|
String escapeString(String s) {
|
||||||
return s.replace("\"", "\\\"").replace("'", "\\'");
|
return s.replace("\"", "\\\"")
|
||||||
|
.replace("'", "\\'")
|
||||||
|
.replace("\n", "\\n")
|
||||||
|
.replace("\r", "\\r");
|
||||||
}
|
}
|
||||||
|
|
||||||
String generateIndent() {
|
String generateIndent() {
|
||||||
@ -144,7 +147,7 @@ public class TextLogWriter {
|
|||||||
if (node.enterMsg != null) {
|
if (node.enterMsg != null) {
|
||||||
writeMessage(node.enterMsg);
|
writeMessage(node.enterMsg);
|
||||||
} else {
|
} else {
|
||||||
writer.write(generateIndent() + ">> [Unknown]");
|
writer.write(generateIndent() + ">> [Unknown]\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
indent++;
|
indent++;
|
||||||
@ -154,7 +157,7 @@ public class TextLogWriter {
|
|||||||
if (node.leaveMsg != null) {
|
if (node.leaveMsg != null) {
|
||||||
writeMessage(node.leaveMsg);
|
writeMessage(node.leaveMsg);
|
||||||
} else {
|
} else {
|
||||||
writer.write(generateIndent() + "<< [Unknown]");
|
writer.write(generateIndent() + "<< [Unknown]\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -0,0 +1,181 @@
|
|||||||
|
package org.rehlds.flightrec.logtree
|
||||||
|
|
||||||
|
import org.junit.Test
|
||||||
|
import org.rehlds.flightrec.api.EntranceKind
|
||||||
|
import org.rehlds.flightrec.api.FlightrecMessage
|
||||||
|
import org.rehlds.flightrec.api.FlightrecMessageType
|
||||||
|
|
||||||
|
class FlightLogTreeBuilderTest {
|
||||||
|
static final FlightrecMessageType hierarchyMsgType1 = new FlightrecMessageType('test', 'hmsg1', 1, true);
|
||||||
|
static final FlightrecMessageType hierarchyMsgType2 = new FlightrecMessageType('test', 'hmsg1', 1, true);
|
||||||
|
static final FlightrecMessageType flatMsgType1 = new FlightrecMessageType('test', 'flatmsg1', 1, true);
|
||||||
|
static final FlightrecMessageType flatMsgType2 = new FlightrecMessageType('test', 'flatmsg2', 1, true);
|
||||||
|
|
||||||
|
static FlightrecMessage enterMsg(FlightrecMessageType type) {
|
||||||
|
return new FlightrecMessage(type, EntranceKind.ENTRANCE_ENTER, null, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static FlightrecMessage leaveMsg(FlightrecMessageType type) {
|
||||||
|
return new FlightrecMessage(type, EntranceKind.ENTRANCE_LEAVE, null, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static FlightrecMessage flatMsg(FlightrecMessageType type) {
|
||||||
|
return new FlightrecMessage(type, EntranceKind.ENTRANCE_UNUSED, null, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void 'decode 2 flat messages'() {
|
||||||
|
def messages = [flatMsg(flatMsgType1), flatMsg(flatMsgType2)]
|
||||||
|
def rootNode = FlightLogTreeBuilder.buildTree(messages)
|
||||||
|
|
||||||
|
assert rootNode.children.size() == 2
|
||||||
|
assert rootNode.children[0].msg == messages[0];
|
||||||
|
assert rootNode.children[1].msg == messages[1];
|
||||||
|
|
||||||
|
assert rootNode.enterMsg == null
|
||||||
|
assert rootNode.leaveMsg == null
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void 'decode 2 empty hierarchy msgs'() {
|
||||||
|
def messages = [
|
||||||
|
enterMsg(hierarchyMsgType1), leaveMsg(hierarchyMsgType1),
|
||||||
|
enterMsg(hierarchyMsgType2), leaveMsg(hierarchyMsgType2)
|
||||||
|
]
|
||||||
|
def rootNode = FlightLogTreeBuilder.buildTree(messages)
|
||||||
|
|
||||||
|
assert rootNode.children.size() == 2
|
||||||
|
|
||||||
|
rootNode.children[0].enterMsg == messages[0]
|
||||||
|
rootNode.children[0].leaveMsg == messages[1]
|
||||||
|
assert rootNode.children[0].children.empty
|
||||||
|
|
||||||
|
rootNode.children[1].enterMsg == messages[2]
|
||||||
|
rootNode.children[1].leaveMsg == messages[3]
|
||||||
|
assert rootNode.children[1].children.empty
|
||||||
|
|
||||||
|
assert rootNode.enterMsg == null
|
||||||
|
assert rootNode.leaveMsg == null
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void 'decode 2 hierarchy messages with flat payload'() {
|
||||||
|
def messages = [
|
||||||
|
enterMsg(hierarchyMsgType1), flatMsg(flatMsgType1), leaveMsg(hierarchyMsgType1),
|
||||||
|
enterMsg(hierarchyMsgType2), flatMsg(flatMsgType2), leaveMsg(hierarchyMsgType2)
|
||||||
|
]
|
||||||
|
def rootNode = FlightLogTreeBuilder.buildTree(messages)
|
||||||
|
|
||||||
|
assert rootNode.children.size() == 2
|
||||||
|
|
||||||
|
rootNode.children[0].enterMsg == messages[0]
|
||||||
|
rootNode.children[0].leaveMsg == messages[2]
|
||||||
|
assert rootNode.children[0].children.size() == 1
|
||||||
|
assert rootNode.children[0].children[0].msg == messages[1]
|
||||||
|
|
||||||
|
rootNode.children[1].enterMsg == messages[3]
|
||||||
|
rootNode.children[1].leaveMsg == messages[5]
|
||||||
|
assert rootNode.children[1].children.size() == 1
|
||||||
|
assert rootNode.children[1].children[0].msg == messages[4]
|
||||||
|
|
||||||
|
assert rootNode.enterMsg == null
|
||||||
|
assert rootNode.leaveMsg == null
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void 'decode hierarchical message with mixed payload'() {
|
||||||
|
def messages = [
|
||||||
|
flatMsg(flatMsgType2),
|
||||||
|
enterMsg(hierarchyMsgType1),
|
||||||
|
flatMsg(flatMsgType1),
|
||||||
|
enterMsg(hierarchyMsgType2),
|
||||||
|
flatMsg(flatMsgType2),
|
||||||
|
leaveMsg(hierarchyMsgType2),
|
||||||
|
flatMsg(flatMsgType2),
|
||||||
|
leaveMsg(hierarchyMsgType1),
|
||||||
|
flatMsg(flatMsgType1)
|
||||||
|
]
|
||||||
|
def rootNode = FlightLogTreeBuilder.buildTree(messages)
|
||||||
|
|
||||||
|
assert rootNode.children.size() == 3
|
||||||
|
assert rootNode.enterMsg == null
|
||||||
|
assert rootNode.leaveMsg == null
|
||||||
|
|
||||||
|
assert rootNode.children[0].msg == messages[0]
|
||||||
|
assert rootNode.children[2].msg == messages[8]
|
||||||
|
|
||||||
|
assert rootNode.children[1].enterMsg == messages[1]
|
||||||
|
assert rootNode.children[1].leaveMsg == messages[7]
|
||||||
|
assert rootNode.children[1].children.size() == 3
|
||||||
|
|
||||||
|
assert rootNode.children[1].children[0].msg == messages[2]
|
||||||
|
assert rootNode.children[1].children[2].msg == messages[6]
|
||||||
|
|
||||||
|
assert rootNode.children[1].children[1].enterMsg == messages[3]
|
||||||
|
assert rootNode.children[1].children[1].leaveMsg == messages[5]
|
||||||
|
assert rootNode.children[1].children[1].children.size() == 1
|
||||||
|
|
||||||
|
assert rootNode.children[1].children[1].children[0].msg == messages[4]
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void 'decode hierarchical msg with flat payload and missing start'() {
|
||||||
|
def messages = [
|
||||||
|
flatMsg(flatMsgType1),
|
||||||
|
leaveMsg(hierarchyMsgType1),
|
||||||
|
flatMsg(flatMsgType2)
|
||||||
|
]
|
||||||
|
def rootNode = FlightLogTreeBuilder.buildTree(messages)
|
||||||
|
|
||||||
|
assert rootNode.children.size() == 2
|
||||||
|
assert rootNode.enterMsg == null
|
||||||
|
assert rootNode.leaveMsg == null
|
||||||
|
|
||||||
|
assert rootNode.children[0].enterMsg == null
|
||||||
|
assert rootNode.children[0].leaveMsg == messages[1]
|
||||||
|
assert rootNode.children[0].children.size() == 1
|
||||||
|
assert rootNode.children[0].children[0].msg == messages[0]
|
||||||
|
|
||||||
|
assert rootNode.children[1].msg == messages[2]
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void 'decode empty hierarchical msg with missing start'() {
|
||||||
|
def messages = [
|
||||||
|
leaveMsg(hierarchyMsgType1),
|
||||||
|
flatMsg(flatMsgType2)
|
||||||
|
]
|
||||||
|
def rootNode = FlightLogTreeBuilder.buildTree(messages)
|
||||||
|
|
||||||
|
assert rootNode.children.size() == 2
|
||||||
|
assert rootNode.enterMsg == null
|
||||||
|
assert rootNode.leaveMsg == null
|
||||||
|
|
||||||
|
assert rootNode.children[0].enterMsg == null
|
||||||
|
assert rootNode.children[0].leaveMsg == messages[0]
|
||||||
|
assert rootNode.children[0].children.empty
|
||||||
|
|
||||||
|
assert rootNode.children[1].msg == messages[1]
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void 'decode hierarchical msg with flat payload and missing end'() {
|
||||||
|
def messages = [
|
||||||
|
flatMsg(flatMsgType1),
|
||||||
|
enterMsg(hierarchyMsgType1),
|
||||||
|
flatMsg(flatMsgType2)
|
||||||
|
]
|
||||||
|
def rootNode = FlightLogTreeBuilder.buildTree(messages)
|
||||||
|
|
||||||
|
assert rootNode.children.size() == 2
|
||||||
|
assert rootNode.enterMsg == null
|
||||||
|
assert rootNode.leaveMsg == null
|
||||||
|
|
||||||
|
assert rootNode.children[0].msg == messages[0]
|
||||||
|
|
||||||
|
assert rootNode.children[1].enterMsg == messages[1]
|
||||||
|
assert rootNode.children[1].leaveMsg == null
|
||||||
|
assert rootNode.children[1].children.size() == 1
|
||||||
|
assert rootNode.children[1].children[0].msg == messages[2]
|
||||||
|
}
|
||||||
|
}
|
@ -65,10 +65,7 @@ task publishPrepareFiles {
|
|||||||
println flightRecJarTask.class.name
|
println flightRecJarTask.class.name
|
||||||
File flightRecJarFile = flightRecJarTask.archivePath
|
File flightRecJarFile = flightRecJarTask.archivePath
|
||||||
project.file('publish/publishRoot/flighrec').mkdirs()
|
project.file('publish/publishRoot/flighrec').mkdirs()
|
||||||
copy {
|
GradleCppUtils.copyFile(flightRecJarFile, project.file('publish/publishRoot/flighrec/decoder.jar'), false)
|
||||||
from flightRecJarFile
|
|
||||||
into 'publish/publishRoot/flighrec'
|
|
||||||
}
|
|
||||||
copy {
|
copy {
|
||||||
from new File(project(':flightrec/decoder').projectDir, 'pub')
|
from new File(project(':flightrec/decoder').projectDir, 'pub')
|
||||||
into 'publish/publishRoot/flighrec'
|
into 'publish/publishRoot/flighrec'
|
||||||
|
Loading…
Reference in New Issue
Block a user