77 DmsgControlParseError , MessageParseError , MessageLengthError ,
88)
99
10- @pytest .fixture
11- def message_with_lots_of_displays ():
10+
11+ def build_multi_display_message (num_displays : int ) -> tuple [Message , list [int ]]:
12+ """Build a message with enough displays to require multiple packets
13+ when built, returning the message object and a list of the lengths
14+ of each packet.
15+ """
1216 msgobj = Message ()
13- # Message header byte length: 6
14- # Dmsg header byte length: 4
15- # Text length: 2(length bytes) + 9(chars) = 11
16- # Each Dmsg total: 4 + 11 = 15
17- # Dmsg's: 4096 * 15 = 61440
18- # 4096 Dmsg's with Message header: 4096 * 15 + 6 = 61446 bytes
19- for i in range (4096 ):
20- msgobj .displays .append (Display (index = i , text = f'Foo { i :05d} ' ))
21- return msgobj
17+ msg_lengths = []
18+ text_format = 'Foo {:05d}'
19+ text_length = len (text_format .format (0 ))
20+
21+ # Initial message header length
22+ cur_msg_length = 6
23+
24+ # Dmsg header + text length bytes + text bytes
25+ dmsg_length = 4 + 2 + text_length
26+
27+ for i in range (num_displays ):
28+ msgobj .displays .append (Display (index = i , text = text_format .format (i )))
29+ if cur_msg_length + dmsg_length > 2048 :
30+ msg_lengths .append (cur_msg_length )
31+ cur_msg_length = 6 + dmsg_length
32+ else :
33+ cur_msg_length += dmsg_length
34+ msg_lengths .append (cur_msg_length )
35+ assert not any (l > 2048 for l in msg_lengths )
36+ return msgobj , msg_lengths
37+
38+
39+ @pytest .fixture
40+ def message_with_multi_packet_displays () -> tuple [Message , list [int ]]:
41+ """Message with enough displays to require at least 6 packets
42+ but not so many as to make the test take too long.
43+ """
44+ return build_multi_display_message (6 * 136 + 1 ) # 6 full packets + 1 display
45+
46+
47+ @pytest .fixture
48+ def message_with_lots_of_displays () -> tuple [Message , list [int ]]:
49+ return build_multi_display_message (4096 )
2250
2351
2452def test_uhs_message (uhs500_msg_bytes , uhs500_msg_parsed ):
@@ -60,7 +88,7 @@ def test_messages():
6088
6189
6290def test_packet_length (faker , message_with_lots_of_displays ):
63- msgobj = message_with_lots_of_displays
91+ msgobj , msg_lengths = message_with_lots_of_displays
6492
6593 # Make sure the 2048 byte limit is respected
6694 with pytest .raises (MessageLengthError ):
@@ -73,8 +101,9 @@ def test_packet_length(faker, message_with_lots_of_displays):
73101
74102 # Iterate over individual message packets and make sure we get all displays
75103 all_parsed_displays = []
76- for msg_bytes in msgobj .build_messages ():
104+ for i , msg_bytes in enumerate ( msgobj .build_messages () ):
77105 assert len (msg_bytes ) <= 2048
106+ assert len (msg_bytes ) == msg_lengths [i ]
78107 parsed , remaining = Message .parse (msg_bytes )
79108 assert not len (remaining )
80109 all_parsed_displays .extend (parsed .displays )
@@ -321,3 +350,26 @@ def test_invalid_dmsg_control(uhs500_msg_bytes, faker):
321350 bad_bytes = bytes (bad_bytes )
322351 with pytest .raises (DmsgControlParseError ):
323352 r = Message .parse (bad_bytes )
353+
354+
355+ @pytest .mark .benchmark (group = 'message-parse' )
356+ def test_bench_message_parse (uhs500_msg_bytes , uhs500_msg_parsed_fixed_text_length ):
357+ parsed , remaining = Message .parse (uhs500_msg_bytes , retain_text_length = True )
358+ assert not len (remaining )
359+ assert parsed == uhs500_msg_parsed_fixed_text_length
360+
361+
362+ @pytest .mark .benchmark (group = 'message-build' )
363+ def test_bench_message_build (uhs500_msg_bytes , uhs500_msg_parsed_fixed_text_length ):
364+ msg_bytes = uhs500_msg_parsed_fixed_text_length .build_message ()
365+ assert len (msg_bytes ) == len (uhs500_msg_bytes )
366+ assert msg_bytes == uhs500_msg_bytes
367+
368+
369+ @pytest .mark .benchmark (group = 'message-build-multi' )
370+ def test_bench_message_build_multi (message_with_multi_packet_displays ):
371+ msgobj , msg_lengths = message_with_multi_packet_displays
372+ assert len (msg_lengths ) > 1
373+ for i , msg_bytes in enumerate (msgobj .build_messages ()):
374+ msg_len = len (msg_bytes )
375+ assert msg_len == msg_lengths [i ]
0 commit comments