#!/usr/bin/env python3
import os
import json
import time
import datetime
import unittest
import subprocess
import cereal . messaging as messaging
from system . hardware import TICI
from system . sensord . rawgps . rawgpsd import at_cmd
from selfdrive . manager . process_config import managed_processes
class TestRawgpsd ( unittest . TestCase ) :
@classmethod
def setUpClass ( cls ) :
if not TICI :
raise unittest . SkipTest
cls . sm = messaging . SubMaster ( [ ' qcomGnss ' ] )
def tearDown ( self ) :
managed_processes [ ' rawgpsd ' ] . stop ( )
def _wait_for_output ( self , t = 10 ) :
self . sm . update ( 0 )
for __ in range ( t * 10 ) :
self . sm . update ( 100 )
if self . sm . updated [ ' qcomGnss ' ] :
break
return self . sm . updated [ ' qcomGnss ' ]
def test_wait_for_modem ( self ) :
os . system ( " sudo systemctl stop ModemManager lte " )
managed_processes [ ' rawgpsd ' ] . start ( )
assert not self . _wait_for_output ( 10 )
os . system ( " sudo systemctl restart ModemManager lte " )
assert self . _wait_for_output ( 30 )
def test_startup_time ( self ) :
for _ in range ( 5 ) :
managed_processes [ ' rawgpsd ' ] . start ( )
start_time = time . monotonic ( )
assert self . _wait_for_output ( ) , " rawgpsd didn ' t start outputting messages in time "
et = time . monotonic ( ) - start_time
assert et < 7 , f " rawgpsd took { et : .1f } s to start "
managed_processes [ ' rawgpsd ' ] . stop ( )
def test_turns_off_gnss ( self ) :
for s in ( 0.1 , 0.5 , 1 , 5 ) :
managed_processes [ ' rawgpsd ' ] . start ( )
time . sleep ( s )
managed_processes [ ' rawgpsd ' ] . stop ( )
ls = subprocess . check_output ( " mmcli -m any --location-status --output-json " , shell = True , encoding = ' utf-8 ' )
loc_status = json . loads ( ls )
assert set ( loc_status [ ' modem ' ] [ ' location ' ] [ ' enabled ' ] ) < = { ' 3gpp-lac-ci ' }
def test_assistance_loading ( self ) :
# clear assistance data
at_cmd ( " AT+QGPSDEL=0 " )
managed_processes [ ' rawgpsd ' ] . start ( )
assert self . _wait_for_output ( 10 )
managed_processes [ ' rawgpsd ' ] . stop ( )
# after QGPSDEL: '+QGPSXTRADATA: 0,"1980/01/05,19:00:00"'
# after loading: '+QGPSXTRADATA: 10080,"2023/06/24,19:00:00"'
out = at_cmd ( " AT+QGPSXTRADATA? " )
out = out . split ( " +QGPSXTRADATA: " ) [ 1 ] . split ( " ' " ) [ 0 ] . strip ( )
valid_duration , injected_date = out . split ( " , " , 1 )
assert valid_duration == " 10080 " # should be max time
# TODO: time doesn't match up
assert injected_date [ 1 : ] . startswith ( datetime . datetime . now ( ) . strftime ( " % Y/ % m/ %d " ) )
if __name__ == " __main__ " :
unittest . main ( failfast = True )