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 ( )