22#![ cfg( test) ]
33extern crate std;
44
5- use uf_crsf:: async_io:: write_packet;
5+ use uf_crsf:: async_io:: { write_packet, AsyncCrsfReader } ;
66use uf_crsf:: packets:: { LinkStatistics , Packet , PacketAddress } ;
7- use uf_crsf:: parser:: CrsfParser ;
87use uf_crsf:: CrsfStreamError ;
98
10- async fn build_link_statistics_packet_bytes ( ) -> std:: vec:: Vec < u8 > {
9+ async fn build_link_statistics_packet_bytes ( uplink_rssi_1 : u8 ) -> std:: vec:: Vec < u8 > {
1110 let packet = LinkStatistics {
12- uplink_rssi_1 : 10 ,
11+ uplink_rssi_1 : uplink_rssi_1 ,
1312 uplink_rssi_2 : 20 ,
1413 uplink_link_quality : 95 ,
1514 uplink_snr : -80 ,
@@ -29,14 +28,14 @@ async fn build_link_statistics_packet_bytes() -> std::vec::Vec<u8> {
2928
3029#[ tokio:: test]
3130async fn test_write_and_read_packet_async ( ) {
32- let packet_bytes = build_link_statistics_packet_bytes ( ) . await ;
31+ let packet_bytes = build_link_statistics_packet_bytes ( 10 ) . await ;
3332
3433 // Mock reader
35- let mut reader = & packet_bytes[ ..] ;
34+ let reader = & packet_bytes[ ..] ;
3635
3736 // Parser
38- let mut parser = CrsfParser :: new ( ) ;
39- let result = parser . read_packet ( & mut reader ) . await ;
37+ let mut reader = AsyncCrsfReader :: new ( reader ) ;
38+ let result = reader . read_packet ( ) . await ;
4039
4140 assert ! ( result. is_ok( ) ) ;
4241 let parsed_packet = result. unwrap ( ) ;
@@ -58,27 +57,75 @@ async fn test_write_and_read_packet_async() {
5857
5958#[ tokio:: test]
6059async fn test_read_packet_async_with_no_data ( ) {
61- let mut reader = & [ ] [ ..] ;
62- let mut parser = CrsfParser :: new ( ) ;
63- let result = parser. read_packet ( & mut reader) . await ;
60+ let mut reader = AsyncCrsfReader :: new ( & [ ] [ ..] ) ;
61+ let result = reader. read_packet ( ) . await ;
6462 assert ! ( matches!( result, Err ( CrsfStreamError :: UnexpectedEof ) ) ) ;
6563}
6664
6765#[ tokio:: test]
6866async fn test_read_packet_async_with_incomplete_data ( ) {
69- let packet_bytes = build_link_statistics_packet_bytes ( ) . await ;
70- let mut reader = & packet_bytes[ ..packet_bytes. len ( ) - 1 ] ;
71- let mut parser = CrsfParser :: new ( ) ;
72- let result = parser. read_packet ( & mut reader) . await ;
67+ let packet_bytes = build_link_statistics_packet_bytes ( 10 ) . await ;
68+ let mut reader = AsyncCrsfReader :: new ( & packet_bytes[ ..packet_bytes. len ( ) - 1 ] ) ;
69+ let result = reader. read_packet ( ) . await ;
7370 assert ! ( matches!( result, Err ( CrsfStreamError :: UnexpectedEof ) ) ) ;
7471}
7572
7673#[ tokio:: test]
7774async fn test_read_packet_async_with_garbage ( ) {
7875 let garbage = [ 0x01 , 0x02 , 0x03 ] ;
79- let mut reader = & garbage[ ..] ;
80- let mut parser = CrsfParser :: new ( ) ;
81- let result = parser. read_packet ( & mut reader) . await ;
76+ let mut reader = AsyncCrsfReader :: new ( & garbage[ ..] ) ;
77+ let result = reader. read_packet ( ) . await ;
8278 // We expect an InvalidSync error because the first byte is not a valid sync byte.
8379 assert ! ( matches!( result, Err ( CrsfStreamError :: InvalidSync ( _) ) ) ) ;
8480}
81+
82+ #[ tokio:: test]
83+ async fn test_read_packet_async_chunked_stream ( ) {
84+ let packet1_bytes = build_link_statistics_packet_bytes ( 10 ) . await ;
85+ let packet2_bytes = build_link_statistics_packet_bytes ( 50 ) . await ;
86+
87+ let mut combined_bytes = std:: vec:: Vec :: new ( ) ;
88+ combined_bytes. extend_from_slice ( & packet1_bytes) ;
89+ combined_bytes. extend_from_slice ( & packet2_bytes) ;
90+
91+ let mut stream_reader = AsyncCrsfReader :: new ( & combined_bytes[ ..] ) ;
92+
93+ let result1 = stream_reader. read_packet ( ) . await ;
94+ let result2 = stream_reader. read_packet ( ) . await ;
95+
96+ assert ! ( result1. is_ok( ) ) ;
97+ let parsed_packet1 = result1. unwrap ( ) ;
98+ let expected_packet1 = LinkStatistics {
99+ uplink_rssi_1 : 10 ,
100+ uplink_rssi_2 : 20 ,
101+ uplink_link_quality : 95 ,
102+ uplink_snr : -80 ,
103+ active_antenna : 1 ,
104+ rf_mode : 2 ,
105+ uplink_tx_power : 3 ,
106+ downlink_rssi : 30 ,
107+ downlink_link_quality : 98 ,
108+ downlink_snr : -75 ,
109+ } ;
110+ assert ! ( matches!( & parsed_packet1, Packet :: LinkStatistics ( p) if p == & expected_packet1) ) ;
111+
112+ assert ! (
113+ result2. is_ok( ) ,
114+ "Second packet parsing failed: {:?}" ,
115+ result2. err( )
116+ ) ;
117+ let parsed_packet2 = result2. unwrap ( ) ;
118+ let expected_packet2 = LinkStatistics {
119+ uplink_rssi_1 : 50 ,
120+ uplink_rssi_2 : 20 ,
121+ uplink_link_quality : 95 ,
122+ uplink_snr : -80 ,
123+ active_antenna : 1 ,
124+ rf_mode : 2 ,
125+ uplink_tx_power : 3 ,
126+ downlink_rssi : 30 ,
127+ downlink_link_quality : 98 ,
128+ downlink_snr : -75 ,
129+ } ;
130+ assert ! ( matches!( parsed_packet2, Packet :: LinkStatistics ( p) if p == expected_packet2) ) ;
131+ }
0 commit comments