import os
import random
import unittest
from pathlib import Path
from typing import Optional
from openpilot . system . hardware . hw import Paths
import openpilot . system . loggerd . deleter as deleter
import openpilot . system . loggerd . uploader as uploader
from openpilot . system . loggerd . xattr_cache import setxattr
def create_random_file ( file_path : Path , size_mb : float , lock : bool = False , upload_xattr : Optional [ bytes ] = None ) - > None :
file_path . parent . mkdir ( parents = True , exist_ok = True )
if lock :
lock_path = str ( file_path ) + " .lock "
os . close ( os . open ( lock_path , os . O_CREAT | os . O_EXCL ) )
chunks = 128
chunk_bytes = int ( size_mb * 1024 * 1024 / chunks )
data = os . urandom ( chunk_bytes )
with open ( file_path , " wb " ) as f :
for _ in range ( chunks ) :
f . write ( data )
if upload_xattr is not None :
setxattr ( str ( file_path ) , uploader . UPLOAD_ATTR_NAME , upload_xattr )
class MockResponse ( ) :
def __init__ ( self , text , status_code ) :
self . text = text
self . status_code = status_code
class MockApi ( ) :
def __init__ ( self , dongle_id ) :
pass
def get ( self , * args , * * kwargs ) :
return MockResponse ( ' { " url " : " http://localhost/does/not/exist " , " headers " : {} } ' , 200 )
def get_token ( self ) :
return " fake-token "
class MockApiIgnore ( ) :
def __init__ ( self , dongle_id ) :
pass
def get ( self , * args , * * kwargs ) :
return MockResponse ( ' ' , 412 )
def get_token ( self ) :
return " fake-token "
class MockParams ( ) :
def __init__ ( self ) :
self . params = {
" DongleId " : b " 0000000000000000 " ,
" IsOffroad " : b " 1 " ,
}
def get ( self , k , block = False , encoding = None ) :
val = self . params [ k ]
if encoding is not None :
return val . decode ( encoding )
else :
return val
def get_bool ( self , k ) :
val = self . params [ k ]
return ( val == b ' 1 ' )
class UploaderTestCase ( unittest . TestCase ) :
f_type = " UNKNOWN "
root : Path
seg_num : int
seg_format : str
seg_format2 : str
seg_dir : str
def set_ignore ( self ) :
uploader . Api = MockApiIgnore
def setUp ( self ) :
uploader . Api = MockApi
uploader . Params = MockParams
uploader . fake_upload = True
uploader . force_wifi = True
uploader . allow_sleep = False
self . seg_num = random . randint ( 1 , 300 )
self . seg_format = " 2019-04-18--12-52-54-- {} "
self . seg_format2 = " 2019-05-18--11-22-33-- {} "
self . seg_dir = self . seg_format . format ( self . seg_num )
def make_file_with_data ( self , f_dir : str , fn : str , size_mb : float = .1 , lock : bool = False ,
upload_xattr : Optional [ bytes ] = None , preserve_xattr : Optional [ bytes ] = None ) - > Path :
file_path = Path ( Paths . log_root ( ) ) / f_dir / fn
create_random_file ( file_path , size_mb , lock , upload_xattr )
if preserve_xattr is not None :
setxattr ( str ( file_path . parent ) , deleter . PRESERVE_ATTR_NAME , preserve_xattr )
return file_path