@@ -24,11 +24,11 @@ use matter::{
24
24
} ,
25
25
interaction_model:: {
26
26
core:: { IMStatusCode , OpCode } ,
27
- messages:: GenericPath ,
28
27
messages:: {
29
28
ib:: { AttrData , AttrPath , AttrResp } ,
30
- msg:: { ReadReq , ReportDataMsg , StatusResp } ,
29
+ msg:: { ReadReq , ReportDataMsg , StatusResp , SubscribeResp } ,
31
30
} ,
31
+ messages:: { msg:: SubscribeReq , GenericPath } ,
32
32
} ,
33
33
tlv:: { self , ElementType , FromTLV , TLVElement , TagType , ToTLV } ,
34
34
transport:: {
@@ -182,3 +182,43 @@ fn test_long_read_success() {
182
182
assert_eq ! ( report_data. more_chunks, None ) ;
183
183
assert_eq ! ( out_code, OpCode :: ReportData as u8 ) ;
184
184
}
185
+
186
+ #[ test]
187
+ fn test_long_read_subscription_success ( ) {
188
+ // Subscribe to the entire attribute database, which requires 2 reads to complete
189
+ let _ = env_logger:: try_init ( ) ;
190
+ let mut lr = LongRead :: new ( ) ;
191
+ let mut output = [ 0_u8 ; MAX_RX_BUF_SIZE + 100 ] ;
192
+
193
+ let wc_path = GenericPath :: new ( None , None , None ) ;
194
+
195
+ let read_all = [ AttrPath :: new ( & wc_path) ] ;
196
+ let subs_req = SubscribeReq :: new ( true , 1 , 20 ) . set_attr_requests ( & read_all) ;
197
+ let expected_part1 = wildcard_read_resp ( 1 ) ;
198
+ let ( out_code, out_data) = lr. process ( OpCode :: SubscribeRequest , & subs_req, & mut output) ;
199
+ let root = tlv:: get_root_node_struct ( out_data) . unwrap ( ) ;
200
+ let report_data = ReportDataMsg :: from_tlv ( & root) . unwrap ( ) ;
201
+ assert_attr_report_skip_data ( & report_data, & expected_part1) ;
202
+ assert_eq ! ( report_data. more_chunks, Some ( true ) ) ;
203
+ assert_eq ! ( out_code, OpCode :: ReportData as u8 ) ;
204
+
205
+ // Ask for the next read by sending a status report
206
+ let status_report = StatusResp {
207
+ status : IMStatusCode :: Success ,
208
+ } ;
209
+ let expected_part2 = wildcard_read_resp ( 2 ) ;
210
+ let ( out_code, out_data) = lr. process ( OpCode :: StatusResponse , & status_report, & mut output) ;
211
+ let root = tlv:: get_root_node_struct ( out_data) . unwrap ( ) ;
212
+ let report_data = ReportDataMsg :: from_tlv ( & root) . unwrap ( ) ;
213
+ assert_attr_report_skip_data ( & report_data, & expected_part2) ;
214
+ assert_eq ! ( report_data. more_chunks, None ) ;
215
+ assert_eq ! ( out_code, OpCode :: ReportData as u8 ) ;
216
+
217
+ // Finally confirm subscription
218
+ let ( out_code, out_data) = lr. process ( OpCode :: StatusResponse , & status_report, & mut output) ;
219
+ tlv:: print_tlv_list ( out_data) ;
220
+ let root = tlv:: get_root_node_struct ( out_data) . unwrap ( ) ;
221
+ let subs_resp = SubscribeResp :: from_tlv ( & root) . unwrap ( ) ;
222
+ assert_eq ! ( out_code, OpCode :: SubscriptResponse as u8 ) ;
223
+ assert_eq ! ( subs_resp. subs_id, 1 ) ;
224
+ }
0 commit comments