Skip to content

Commit 94dac36

Browse files
committed
More unittests for commsdsl2wireshark.
1 parent d6de877 commit 94dac36

4 files changed

Lines changed: 94 additions & 10 deletions

File tree

app/commsdsl2comms/test/test24/Schema.xml

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
<?xml version="1.0" encoding="UTF-8"?>
2-
<schema name="test24"
3-
id="1"
4-
endian="big"
5-
version="5">
2+
<schema name="test24" endian="big" version="5">
63
<fields>
74
<enum name="MsgId" type="uint8" semanticType="messageId" >
85
<validValue name="M1" val="1" />

app/commsdsl2comms/test/test29/Schema.xml

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
<?xml version="1.0" encoding="UTF-8"?>
2-
<schema name="test29"
3-
id="1"
4-
endian="big"
5-
version="5">
2+
<schema name="test29" endian="big" version="5">
63

74
<fields>
85
<enum name="MsgId" type="uint8" semanticType="messageId" >

app/commsdsl2wireshark/src/WiresharkStringField.cpp

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,8 @@ std::string WiresharkStringField::wiresharkFieldRegistrationImpl(const Wireshark
7575
{"DESC", wiresharkFieldDescriptionStr(refField)},
7676
};
7777

78-
if (genStringFieldParseObj().parseHasZeroTermSuffix()) {
78+
auto parseObj = genStringFieldParseObj();
79+
if (parseObj.parseHasZeroTermSuffix() || parseObj.parseFixedLength()) {
7980
repl["Z"] = "z";
8081
}
8182

@@ -196,7 +197,52 @@ std::string WiresharkStringField::wiresharkValidFuncBodyImpl([[maybe_unused]] co
196197

197198
std::string WiresharkStringField::wiresharkCompPrepValueStrImpl(const std::string& value) const
198199
{
199-
return '\"' + value + '\"';
200+
std::string valueTmp = value;
201+
do {
202+
if (value.empty()) {
203+
break;
204+
}
205+
206+
static const char Prefix = strings::genStringRefPrefix();
207+
if (value[0] == Prefix) {
208+
auto* refField = genGenerator().genFindField(std::string(value, 1));
209+
if (refField == nullptr) {
210+
genGenerator().genLogger().genWarning("Failed to find referenced field: " + value);
211+
break;
212+
}
213+
214+
if (refField->genParseObj().parseKind() != commsdsl::parse::ParseField::ParseKind::String) {
215+
genGenerator().genLogger().genWarning("Not referencing <string> field: " + value);
216+
break;
217+
}
218+
219+
auto* refStringField = static_cast<const WiresharkStringField*>(refField);
220+
valueTmp = refStringField->genStringFieldParseObj().parseDefaultValue();
221+
break;
222+
}
223+
224+
auto prefixPos = value.find_first_of(Prefix);
225+
if (prefixPos == std::string::npos) {
226+
break;
227+
}
228+
229+
assert(0U < prefixPos);
230+
bool allBackSlashes =
231+
std::all_of(
232+
value.begin(), value.begin() + static_cast<std::ptrdiff_t>(prefixPos),
233+
[](char ch)
234+
{
235+
return ch == '\\';
236+
});
237+
238+
if (!allBackSlashes) {
239+
break;
240+
}
241+
242+
valueTmp.assign(value, 1, std::string::npos);
243+
} while (false);
244+
245+
return '\"' + valueTmp + '\"';
200246
}
201247

202248
bool WiresharkStringField::wiresharkHasTrivialValidImpl() const
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import sys
2+
3+
from commsdsl_pcap_gen import *
4+
5+
def do_frame(id, payload):
6+
prefix = struct.pack('>B', id)
7+
return prefix + payload
8+
9+
def pcap1(f):
10+
seq = 1
11+
msg1_payload1 = struct.pack('>B', 1)
12+
msg1_1 = do_frame(1, msg1_payload1)
13+
msg1_payload2 = struct.pack('>BH', 0, 5)
14+
msg1_2 = do_frame(1, msg1_payload2)
15+
header = commsdsl_create_ethernet_ip_tcp_headers(len(msg1_1) + len(msg1_2), seq)
16+
commsdsl_write_packet(f, header + msg1_1 + msg1_2, time.time())
17+
18+
def pcap2(f):
19+
seq = 2000
20+
msg2_payload1 = struct.pack('>B', 1)
21+
msg2_1 = do_frame(2, msg2_payload1)
22+
msg2_payload2 = struct.pack('>BH', 5, 5)
23+
msg2_2 = do_frame(2, msg2_payload2)
24+
header = commsdsl_create_ethernet_ip_tcp_headers(len(msg2_1) + len(msg2_2), seq)
25+
commsdsl_write_packet(f, header + msg2_1 + msg2_2, time.time())
26+
27+
def pcap3(f):
28+
seq = 3000
29+
msg3_payload1 = struct.pack('>8s', b"bla\x00\x00\x00\x00\x00")
30+
msg3_1 = do_frame(3, msg3_payload1)
31+
msg3_payload2 = struct.pack('>8sH', b"hello\x00\x00\x00", 5)
32+
msg3_2 = do_frame(3, msg3_payload2)
33+
header = commsdsl_create_ethernet_ip_tcp_headers(len(msg3_1) + len(msg3_2), seq)
34+
commsdsl_write_packet(f, header + msg3_1 + msg3_2, time.time())
35+
36+
def main():
37+
with open(sys.argv[1], 'wb') as f:
38+
commsdsl_write_pcap_header(f)
39+
pcap1(f)
40+
pcap2(f)
41+
pcap3(f)
42+
43+
if __name__ == '__main__':
44+
main()

0 commit comments

Comments
 (0)