alerts: handle min duration properly (#23191)
	
		
	
				
					
				
			* alerts: handle min duration properly * add active * tests * cleanup test * update refspj-view-ci-routes
							parent
							
								
									4627d201b6
								
							
						
					
					
						commit
						07b971d473
					
				
				 5 changed files with 62 additions and 14 deletions
			
			
		@ -0,0 +1,45 @@ | 
				
			|||||||
 | 
					#!/usr/bin/env python3 | 
				
			||||||
 | 
					import random | 
				
			||||||
 | 
					import unittest | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from selfdrive.controls.lib.events import Alert, EVENTS | 
				
			||||||
 | 
					from selfdrive.controls.lib.alertmanager import AlertManager | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class TestAlertManager(unittest.TestCase): | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def test_duration(self): | 
				
			||||||
 | 
					    """ | 
				
			||||||
 | 
					      Enforce that an alert lasts for max(alert duration, duration the alert is added) | 
				
			||||||
 | 
					    """ | 
				
			||||||
 | 
					    for duration in range(1, 100): | 
				
			||||||
 | 
					      alert = None | 
				
			||||||
 | 
					      while not isinstance(alert, Alert): | 
				
			||||||
 | 
					        event = random.choice([e for e in EVENTS.values() if len(e)]) | 
				
			||||||
 | 
					        alert = random.choice(list(event.values())) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      alert.duration = duration | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      # check two cases: | 
				
			||||||
 | 
					      # - alert is added to AM for <= the alert's duration | 
				
			||||||
 | 
					      # - alert is added to AM for > alert's duration | 
				
			||||||
 | 
					      for greater in (True, False): | 
				
			||||||
 | 
					        if greater: | 
				
			||||||
 | 
					          add_duration = duration + random.randint(1, 10) | 
				
			||||||
 | 
					        else: | 
				
			||||||
 | 
					          add_duration = random.randint(1, duration) | 
				
			||||||
 | 
					        show_duration = max(duration, add_duration) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        AM = AlertManager() | 
				
			||||||
 | 
					        for frame in range(duration+10): | 
				
			||||||
 | 
					          if frame < add_duration: | 
				
			||||||
 | 
					            AM.add_many(frame, [alert, ]) | 
				
			||||||
 | 
					          AM.process_alerts(frame) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          shown = AM.alert is not None | 
				
			||||||
 | 
					          should_show = frame <= show_duration | 
				
			||||||
 | 
					          self.assertEqual(shown, should_show, msg=f"{frame=} {add_duration=} {duration=}") | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if __name__ == "__main__": | 
				
			||||||
 | 
					  unittest.main() | 
				
			||||||
@ -1 +1 @@ | 
				
			|||||||
c09fc7b1409529a9991428845ee14f0e37d95b2d | 
					0ae46ae318a63476d8905aa0c32b0e587177868a | 
				
			||||||
					Loading…
					
					
				
		Reference in new issue