U
    5d                  
   @   s$  d Z ddlZddlZddlZddlmZ ddlZddlmZ ddlm	Z	m
Z
 ddlZddlmZmZmZmZ dd	 Zejjd
e	e
gddgddd Zdd Zdd Zejjddddddfdddddfdddddfd dd!d"dfgdddd#gdd$d% Zd&d' Zd(d) Zd*d+ Zd,d- ZdS ).z
Test the utility functions.
    N)Path)TemporaryDirectory)ThreadPoolExecutorProcessPoolExecutor   )	parse_urlmake_local_storagetemporary_fileunique_file_namec                  C   sj   dd d} t | dkstt| }t |dks4t|dd dksHt|dd	 dd
 dksftdS )z8The file name should never be longer than 255 characterszhttps://www.something.com/dataA  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaz.txt   iNz
aaaaaa.txt-   
   Z
aaaaaaaaaa)lenAssertionErrorr
   split)urlfname r   :/tmp/pip-unpacked-wheel-nxrj6sbx/pooch/tests/test_utils.pytest_unique_name_long   s    r   poolthreadsZ	processes)idsc              	      s   t jd
fdd	}|t d| t jt jd t j rBtzP|  @ fddt
dD }|D ]}|  qht j stW 5 Q R X W 5 t j rt	  X d	S )z*Try to create the cache folder in parallelFc                    s   t d  | |d dS )zDelay before calling makedirsg      ?)exist_okN)timesleeppathr   )makedirsr   r   mockmakedirs9   s    
z6test_make_local_storage_parallel.<locals>.mockmakedirsr   Ztest_parallel_cachec                    s   g | ]} t qS r   )Zsubmitr   ).0i)
data_cacheexecutorr   r   
<listcomp>E   s    z4test_make_local_storage_parallel.<locals>.<listcomp>   N)F)osr   setattrr   joincurdirexistsr   shutilrmtreerangeresult)r   monkeypatchr    Zfuturesfuturer   )r#   r$   r   r    test_make_local_storage_parallel&   s    
r2   c              	   C   s~   ddd}t jt jd}t j|r*t| t d| tt	2}t
|dd dt|ks`td	t|ksptW 5 Q R X d
S )z9Should warn the user when can't create the local data dirFc                 S   s   t ddS z-Raise an exception to mimic permission issuesz
Fake errorNPermissionErrorr   r   r   r   r    S   s    zAtest_local_storage_makedirs_permissionerror.<locals>.mockmakedirsZtest_permissionr   SOME_VARIABLEr   envz!Pooch could not create data cache'SOME_VARIABLE'N)F)r'   r   r)   r*   r+   r   r(   pytestraisesr5   r   str)r0   r    r#   errorr   r   r   +test_local_storage_makedirs_permissionerrorP   s    
r>   c              
   C   s   dd }t  z}ttj|d tj|s4t| td| t	
t2}t|dd dt|ksjtdt|ksztW 5 Q R X W 5 Q R X d	S )
z;Should warn the user when can't write to the local data dirc                  [   s   t ddS r3   r4   )kwargsr   r   r   mocktempfilej   s    z@test_local_storage_newfile_permissionerror.<locals>.mocktempfilez1.0NamedTemporaryFiler6   r7   z#Pooch could not write to data cacher9   N)r   r'   r   r   r)   r+   r   r(   tempfiler:   r;   r5   r   r<   )r0   r@   r#   r=   r   r   r   *test_local_storage_newfile_permissionerrore   s    rC   z
url,outputzhttp://127.0.0.1:8080/test.nchttpz127.0.0.1:8080z/test.nc)protocolnetlocr   zftp://127.0.0.1:8080/test.ncftpz+doi:10.6084/m9.figshare.923450.v1/dike.jsonZdoiz10.6084/m9.figshare.923450.v1z
/dike.jsonz<doi:10.5281/zenodo.7632643/santisoler/pooch-test-data-v1.zipz10.5281/zenodo.7632643z"/santisoler/pooch-test-data-v1.zipzzenodo-doi-with-slashc                 C   s   t | |kstdS )zParse URL into 3 componentsN)r   r   )r   outputr   r   r   test_parse_url}   s     rI   c                	   C   s"   t t td W 5 Q R X dS )z:Should fail if we forget to not include // in the DOI linkzdoi://XXX/XXX/fname.txtN)r:   r;   
ValueErrorr   r   r   r   r   test_parse_url_invalid_doi   s    rK   c               
   C   s~   t  ^} t|  stt| d}|d W 5 Q R X t| }|  dksVtW 5 Q R X W 5 Q R X t|  rztdS )z8Make sure the file is writable and cleaned up in the endwMehN)r	   r   r+   r   openwritereadstrip)tmpoutfileinfiler   r   r   test_temporary_file   s    
(rU   c                  C   s   t  } t| j}t| s"t| |ks.tt|d}|d W 5 Q R X t|}|  dksltW 5 Q R X W 5 Q R X t| rtW 5 Q R X dS )zIMake sure the file is writable and cleaned up in the end when given a dirrL   rM   N)	r   r	   r   r+   r   rN   rO   rP   rQ   )r   rR   rS   rT   r   r   r   test_temporary_file_path   s    

(rV   c               	   C   sX   z.t  } t|  sttdW 5 Q R X W n$ tk
rR   t|  rNtY nX dS )zHMake sure the file is writable and cleaned up when there is an exceptionzNooooooooo!N)r	   r   r+   r   rJ   )rR   r   r   r   test_temporary_file_exception   s    rW   )__doc__r'   r,   r   pathlibr   rB   r   concurrent.futuresr   r   r:   utilsr   r   r	   r
   r   markZparametrizer2   r>   rC   rI   rK   rU   rV   rW   r   r   r   r   <module>   s\   

%

	

