import  random 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  numpy  as  np 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  selfdrive . boardd . tests . boardd_old  as  boardd_old 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  selfdrive . boardd . boardd  as  boardd 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  common . realtime  import  sec_since_boot 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  cereal  import  log 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  unittest 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								def  generate_random_can_data_list ( ) : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  can_list  =  [ ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  cnt  =  random . randint ( 1 ,  64 ) 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  for  _  in  range ( cnt ) : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    can_data  =  np . random . bytes ( random . randint ( 1 ,  8 ) ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    can_list . append ( [ random . randint ( 0 ,  128 ) ,  random . randint ( 0 ,  128 ) ,  can_data ,  random . randint ( 0 ,  128 ) ] ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  return  can_list ,  cnt 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								class  TestBoarddApiMethods ( unittest . TestCase ) : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  def  test_correctness ( self ) : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  i  in  range ( 1000 ) : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      can_list ,  _  =  generate_random_can_data_list ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      # Sendcan 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      # Old API 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      m_old  =  boardd_old . can_list_to_can_capnp ( can_list ,  ' sendcan ' ) . to_bytes ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      # new API 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      m  =  boardd . can_list_to_can_capnp ( can_list ,  ' sendcan ' ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      ev_old  =  log . Event . from_bytes ( m_old ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      ev  =  log . Event . from_bytes ( m ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      self . assertEqual ( ev_old . which ( ) ,  ev . which ( ) ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      self . assertEqual ( len ( ev . sendcan ) ,  len ( ev_old . sendcan ) ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      for  i  in  range ( len ( ev . sendcan ) ) : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        attrs  =  [ ' address ' ,  ' busTime ' ,  ' dat ' ,  ' src ' ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  attr  in  attrs : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          self . assertEqual ( getattr ( ev . sendcan [ i ] ,  attr ,  ' new ' ) ,  getattr ( ev_old . sendcan [ i ] ,  attr ,  ' old ' ) ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      # Can 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      m_old  =  boardd_old . can_list_to_can_capnp ( can_list ,  ' can ' ) . to_bytes ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      # new API 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      m  =  boardd . can_list_to_can_capnp ( can_list ,  ' can ' ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      ev_old  =  log . Event . from_bytes ( m_old ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      ev  =  log . Event . from_bytes ( m ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      self . assertEqual ( ev_old . which ( ) ,  ev . which ( ) ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      self . assertEqual ( len ( ev . can ) ,  len ( ev_old . can ) ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      for  i  in  range ( len ( ev . can ) ) : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        attrs  =  [ ' address ' ,  ' busTime ' ,  ' dat ' ,  ' src ' ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  attr  in  attrs : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          self . assertEqual ( getattr ( ev . can [ i ] ,  attr ,  ' new ' ) ,  getattr ( ev_old . can [ i ] ,  attr ,  ' old ' ) ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  def  test_performance ( self ) : 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    can_list ,  _  =  generate_random_can_data_list ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    recursions  =  1000 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    n1  =  sec_since_boot ( ) 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    for  _  in  range ( recursions ) : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      boardd_old . can_list_to_can_capnp ( can_list ,  ' sendcan ' ) . to_bytes ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    n2  =  sec_since_boot ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    elapsed_old  =  n2  -  n1 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    # print('Old API, elapsed time: {} secs'.format(elapsed_old)) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    n1  =  sec_since_boot ( ) 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    for  _  in  range ( recursions ) : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      boardd . can_list_to_can_capnp ( can_list ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    n2  =  sec_since_boot ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    elapsed_new  =  n2  -  n1 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    # print('New API, elapsed time: {} secs'.format(elapsed_new)) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    self . assertTrue ( elapsed_new  <  elapsed_old  /  2 ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								if  __name__  ==  ' __main__ ' : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    unittest . main ( )