14
14
# limitations under the License.
15
15
16
16
import copy
17
+ import logging
17
18
from dataclasses import dataclass , field
18
19
from enum import Enum , auto
20
+ from typing import Optional
19
21
20
22
from . import fixes
21
23
from .constraints import get_constraints , is_typed_constraint
@@ -698,6 +700,28 @@ def event_number(self, value):
698
700
def pics (self ):
699
701
return self ._test .pics
700
702
703
+ def _get_last_event_number (self , responses ) -> Optional [int ]:
704
+ if not self .is_event :
705
+ return None
706
+
707
+ # find the largest event number in all responses
708
+ # This iterates over everything (not just last element) since some commands like
709
+ # `chip-tool any read-all` may return multiple replies
710
+ event_number = None
711
+
712
+ for response in responses :
713
+ if not isinstance (response , dict ):
714
+ continue
715
+ received_event_number = response .get ('eventNumber' )
716
+
717
+ if not isinstance (received_event_number , int ):
718
+ continue
719
+
720
+ if (event_number is None ) or (event_number < received_event_number ):
721
+ event_number = received_event_number
722
+
723
+ return event_number
724
+
701
725
def post_process_response (self , received_responses ):
702
726
result = PostProcessResponseResult ()
703
727
@@ -710,6 +734,18 @@ def post_process_response(self, received_responses):
710
734
if self ._test .save_response_as :
711
735
self ._runtime_config_variable_storage [self ._test .save_response_as ] = received_responses
712
736
737
+ if self .is_event :
738
+ last_event_number = self ._get_last_event_number (received_responses )
739
+ if last_event_number :
740
+ if 'LastReceivedEventNumber' in self ._runtime_config_variable_storage :
741
+ if self ._runtime_config_variable_storage ['LastReceivedEventNumber' ] > last_event_number :
742
+ logging .warning (
743
+ "Received an older event than expected: received %r < %r" ,
744
+ last_event_number ,
745
+ self ._runtime_config_variable_storage ['LastReceivedEventNumber' ]
746
+ )
747
+ self ._runtime_config_variable_storage ['LastReceivedEventNumber' ] = last_event_number
748
+
713
749
if self .wait_for is not None :
714
750
self ._response_cluster_wait_validation (received_responses , result )
715
751
return result
@@ -1162,6 +1198,10 @@ def __apply_legacy_config(self, config):
1162
1198
self .__apply_legacy_config_if_missing (config , 'cluster' , '' )
1163
1199
self .__apply_legacy_config_if_missing (config , 'timeout' , 90 )
1164
1200
1201
+ # These values are default runtime values (non-legacy)
1202
+ self .__apply_legacy_config_if_missing (
1203
+ config , 'LastReceivedEventNumber' , 0 )
1204
+
1165
1205
def __apply_legacy_config_if_missing (self , config , key , value ):
1166
1206
if key not in config :
1167
1207
config [key ] = value
0 commit comments