#!/usr/bin/env python3
import unittest
from unittest . mock import Mock , patch
from parameterized import parameterized
from selfdrive . thermald . fan_controller import TiciFanController
ALL_CONTROLLERS = [ ( TiciFanController , ) ]
def patched_controller ( controller_class ) :
with patch ( " os.system " , new = Mock ( ) ) :
return controller_class ( )
class TestFanController ( unittest . TestCase ) :
def wind_up ( self , controller , ignition = True ) :
for _ in range ( 1000 ) :
controller . update ( max_cpu_temp = 100 , ignition = ignition )
def wind_down ( self , controller , ignition = False ) :
for _ in range ( 1000 ) :
controller . update ( max_cpu_temp = 10 , ignition = ignition )
@parameterized . expand ( ALL_CONTROLLERS )
def test_hot_onroad ( self , controller_class ) :
controller = patched_controller ( controller_class )
self . wind_up ( controller )
self . assertGreaterEqual ( controller . update ( max_cpu_temp = 100 , ignition = True ) , 70 )
@parameterized . expand ( ALL_CONTROLLERS )
def test_offroad_limits ( self , controller_class ) :
controller = patched_controller ( controller_class )
self . wind_up ( controller )
self . assertLessEqual ( controller . update ( max_cpu_temp = 100 , ignition = False ) , 30 )
@parameterized . expand ( ALL_CONTROLLERS )
def test_no_fan_wear ( self , controller_class ) :
controller = patched_controller ( controller_class )
self . wind_down ( controller )
self . assertEqual ( controller . update ( max_cpu_temp = 10 , ignition = False ) , 0 )
@parameterized . expand ( ALL_CONTROLLERS )
def test_limited ( self , controller_class ) :
controller = patched_controller ( controller_class )
self . wind_up ( controller , ignition = True )
self . assertGreaterEqual ( controller . update ( max_cpu_temp = 100 , ignition = True ) , 80 )
@parameterized . expand ( ALL_CONTROLLERS )
def test_windup_speed ( self , controller_class ) :
controller = patched_controller ( controller_class )
self . wind_down ( controller , ignition = True )
for _ in range ( 10 ) :
controller . update ( max_cpu_temp = 90 , ignition = True )
self . assertGreaterEqual ( controller . update ( max_cpu_temp = 90 , ignition = True ) , 60 )
if __name__ == " __main__ " :
unittest . main ( )