#!/usr/bin/env python3
import os
import unittest
from pathlib import Path
from parameterized import parameterized
from unittest import mock
from openpilot . system . hardware . hw import Paths
from openpilot . tools . lib . url_file import URLFile
class TestFileDownload ( unittest . TestCase ) :
def compare_loads ( self , url , start = 0 , length = None ) :
""" Compares range between cached and non cached version """
file_cached = URLFile ( url , cache = True )
file_downloaded = URLFile ( url , cache = False )
file_cached . seek ( start )
file_downloaded . seek ( start )
self . assertEqual ( file_cached . get_length ( ) , file_downloaded . get_length ( ) )
self . assertLessEqual ( length + start if length is not None else 0 , file_downloaded . get_length ( ) )
response_cached = file_cached . read ( ll = length )
response_downloaded = file_downloaded . read ( ll = length )
self . assertEqual ( response_cached , response_downloaded )
# Now test with cache in place
file_cached = URLFile ( url , cache = True )
file_cached . seek ( start )
response_cached = file_cached . read ( ll = length )
self . assertEqual ( file_cached . get_length ( ) , file_downloaded . get_length ( ) )
self . assertEqual ( response_cached , response_downloaded )
def test_small_file ( self ) :
# Make sure we don't force cache
os . environ [ " FILEREADER_CACHE " ] = " 0 "
small_file_url = " https://raw.githubusercontent.com/commaai/openpilot/master/docs/SAFETY.md "
# If you want large file to be larger than a chunk
# large_file_url = "https://commadataci.blob.core.windows.net/openpilotci/0375fdf7b1ce594d/2019-06-13--08-32-25/3/fcamera.hevc"
# Load full small file
self . compare_loads ( small_file_url )
file_small = URLFile ( small_file_url )
length = file_small . get_length ( )
self . compare_loads ( small_file_url , length - 100 , 100 )
self . compare_loads ( small_file_url , 50 , 100 )
# Load small file 100 bytes at a time
for i in range ( length / / 100 ) :
self . compare_loads ( small_file_url , 100 * i , 100 )
def test_large_file ( self ) :
large_file_url = " https://commadataci.blob.core.windows.net/openpilotci/0375fdf7b1ce594d/2019-06-13--08-32-25/3/qlog.bz2 "
# Load the end 100 bytes of both files
file_large = URLFile ( large_file_url )
length = file_large . get_length ( )
self . compare_loads ( large_file_url , length - 100 , 100 )
self . compare_loads ( large_file_url )
@parameterized . expand ( [ ( True , ) , ( False , ) ] )
def test_recover_from_missing_file ( self , cache_enabled ) :
os . environ [ " FILEREADER_CACHE " ] = " 1 " if cache_enabled else " 0 "
file_url = " http://localhost:5001/test.png "
file_exists = False
def get_length_online_mock ( self ) :
if file_exists :
return 4
return - 1
patch_length = mock . patch . object ( URLFile , " get_length_online " , get_length_online_mock )
patch_length . start ( )
try :
length = URLFile ( file_url ) . get_length ( )
self . assertEqual ( length , - 1 )
file_exists = True
length = URLFile ( file_url ) . get_length ( )
self . assertEqual ( length , 4 )
finally :
tempfile_length = Path ( Paths . download_cache_root ( ) ) / " ba2119904385654cb0105a2da174875f8e7648db175f202ecae6d6428b0e838f_length "
if tempfile_length . exists ( ) :
tempfile_length . unlink ( )
patch_length . stop ( )
if __name__ == " __main__ " :
unittest . main ( )