U
    e»{j ã                   @   s*	  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlmZ d dlmZ d dlmZmZ d dlZd dlZd dlZd dlmZ d dlm Z  d dlm!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z; d dl<m=Z= ej> ?d	d
¡dkZ@dZAdZBdZCe4ejD Edd¡ƒZFd dlGmHZHmIZI dZJdZKdZLdd„ ZMeMƒ ZNdd„ ZOejPdd„ ƒZQejPdd„ ƒZRejPdd„ ƒZS�dJdd „ZTd!d"„ ZUejVd#d$„ ƒZWejPd%d&„ ƒZXejPd'd(„ ƒZYd)d*„ ZZd+d,„ Z[d-d.„ Z\d/d0„ Z]d1d2„ Z^d3d4„ Z_ej`jad5d6�d7d8„ ƒZbejPd9d:„ ƒZcejPd;d<„ ƒZdd=d>„ Zeej` fd?dd@g¡dAdB„ ƒZgej`jhej idC¡�oÌe@dDdE�dFdG„ ƒZjej`jhej idC¡�oòe@dDdE�dHdI„ ƒZkej`jhej idC¡�oe@dDdE�dJdK„ ƒZldLdM„ ZmdNdO„ Znej` fdPdd@g¡dQdR„ ƒZodSdT„ ZpdUdV„ ZqdWdX„ ZrdYdZ„ Zsd[d\„ Ztd]d^„ Zuej`jad5d6�d_d`„ ƒZvej`jad5d6�dadb„ ƒZwej`jad5d6�dcdd„ ƒZxdedf„ Zyej`jad5d6�dgdh„ ƒZzej` fdiddjg¡dkdl„ ƒZ{dmdn„ Z|dodp„ Z}dqdr„ Z~dsdt„ Zej`j€dudv„ ƒZ�dwdx„ Z‚ej`jhej idC¡�oJe@dDdE�dydz„ ƒZƒej`jhej idC¡�ope@dDdE�d{d|„ ƒZ„ej`jad5d6�d}d~„ ƒZ…dd€„ Z†ej`jad5d6�d�d‚„ ƒZ‡ej` fdƒdd5d„g¡d…d†„ ƒZˆej` fd‡ddˆd‰dŠg¡d‹dŒ„ ƒZ‰ejPd�dŽgd��d�d‘„ ƒZŠd’d“„ Z‹d”d•„ ZŒd–d—„ Z�d˜d™„ ZŽdšd›„ Z�dœd�„ Z�ej`jad5d6�dždŸ„ ƒZ‘ej` fd‡d d¡ej’d¢ej`j“eH d£dE�d¤�ej’d¥ej`j“eI d¦dE�d¤�g¡d§d¨„ ƒZ”d©dª„ Z•ej`jad5d6�d«d¬„ ƒZ–d­d®„ Z—ej`jad5d6�d¯d°„ ƒZ˜d±d²„ Z™d³d´„ Zšdµd¶„ Z›d·d¸„ Zœd¹dº„ Z�d»d¼„ Zžd½d¾„ ZŸd¿dÀ„ Z dÁdÂ„ Z¡dÃdÄ„ Z¢dÅdÆ„ Z£dÇdÈ„ Z¤ej` fdÉdÊdËej¥ g¡dÌdÍ„ ƒZ¦dÎdÏ„ Z§dÐdÑ„ Z¨dÒdÓ„ Z©dÔdÕ„ ZªdÖd×„ Z«dØdÙ„ Z¬dÚdÛ„ Z­dÜdÝ„ Z®dÞdß„ Z¯dàdá„ Z°dâdã„ Z±dädå„ Z²dædç„ Z³dèdé„ Z´dêdë„ Zµdìdí„ Z¶dîdï„ Z·dðdñ„ Z¸dòdó„ Z¹dôdõ„ Zºdöd÷„ Z»dødù„ Z¼dúdû„ Z½düdý„ Z¾dþdÿ„ Z¿�d �d„ ZÀ�d�d„ ZÁ�d�d„ ZÂ�d�d„ ZÃ�d�d	„ ZÄ�d
�d„ ZÅ�d�d„ ZÆ�d�d„ ZÇ�d�d„ ZÈ�d�d„ ZÉ�d�d„ ZÊ�d�d„ ZË�d�d„ ZÌ�d�d„ ZÍ�d�d„ ZÎ�d�d„ ZÏ�d �d!„ ZÐej`jheN �d"dE��d#�d$„ ƒZÑej`jheN �d"dE��d%�d&„ ƒZÒ�d'�d(„ ZÓ�d)�d*„ ZÔ�d+�d,„ ZÕ�d-�d.„ ZÖ�d/�d0„ Z×ej`jhe@�o„ej> ?�d1d
¡d
k�d2dE�ej`ja�d3�d4„ ƒƒZØej` f�d5�d6�d7g¡�d8�d9„ ƒZÙ�d:�d;„ ZÚej`ja�d<�d=„ ƒZÛej` f�d>�d?�d@�dA�dB�dC�dD�dE�dF�dGg	¡�dH�dI„ ƒZÜdS (K  é    N)ÚThreadPoolExecutor)Úislice)ÚNamedTemporaryFileÚTemporaryDirectory)Úunits)Úpaths)ÚCacheDamagedÚCacheMissingWarningÚ	_deltempsÚ_get_download_cache_locÚ_tempfilestodelÚcache_contentsÚcache_total_sizeÚcheck_download_cacheÚcheck_free_space_in_dirÚclear_download_cacheÚcompute_hashÚconfÚdownload_fileÚdownload_files_in_parallelÚexport_download_cacheÚget_cached_urlsÚget_file_contentsÚget_free_space_in_dirÚget_pkg_data_contentsÚget_pkg_data_filenameÚget_pkg_data_fileobjÚget_pkg_data_pathÚget_readable_fileobjÚimport_download_cacheÚimport_file_to_cacheÚis_urlÚis_url_in_cache)ÚAstropyWarningÚCIÚfalseÚtruezhttp://www.astropy.orgz!http://www.astropy.org/about.htmlzhttps://www.astropy.orgÚdataú	local.dat)ÚHAS_BZ2ÚHAS_LZMAé   é
   c               
   C   s¾   t ƒ �®} tj | d¡}tj | d¡}tj |d¡}t |¡ t|dƒ�}| d¡ W 5 Q R X z$t|ƒ� t ||¡ W 5 Q R X W n  tk
r    Y W 5 Q R £ dS X W 5 Q R £ dS W 5 Q R X d S )NÚaÚbÚfileÚwzsome contents
FT)	r   ÚosÚpathÚjoinÚmkdirÚopenÚwriteÚrenameÚPermissionError)ÚdÚd1Úd2Úf1Úf© r>   ú\/var/www/html/bwave/python/venv/lib/python3.8/site-packages/astropy/utils/tests/test_data.pyÚcan_rename_directory_in_useR   s    

r@   c                 C   s   t  | ¡ ¡  ¡ S ©N)ÚpathlibÚPathÚresolveÚas_uri)r2   r>   r>   r?   Úurl_tof   s    rF   c                 C   s   dd„ }|| ƒS )Nc              
   s   sd   t  ¡ D ]V}t d¡ ¡ }| dt|ƒ› � }t|dƒ�}| |¡ W 5 Q R X t|ƒ}||fV  qd S )Né   Zvalid_r0   )	Ú	itertoolsÚcountr1   ÚurandomÚhexÚstrr5   r6   rF   )Útmp_pathÚiÚcÚfnr=   Úur>   r>   r?   Ú_valid_urlsl   s    zvalid_urls.<locals>._valid_urlsr>   )rM   rR   r>   r>   r?   Ú
valid_urlsj   s    	rS   c                 C   s   dd„ }|| ƒS )Nc                 s   s:   t  ¡ D ],}| dt|ƒ› � }tj |¡st|ƒV  qd S )NZinvalid_)rH   rI   rL   r1   r2   ÚexistsrF   )rM   rN   rP   r>   r>   r?   Ú_invalid_urlsz   s    z#invalid_urls.<locals>._invalid_urlsr>   )rM   rU   r>   r>   r?   Úinvalid_urlsx   s    rV   c              	   c   s&   t  | ¡� d V  tƒ  W 5 Q R X d S rA   )r   Úset_temp_cacher   ©rM   r>   r>   r?   Ú
temp_cacheƒ   s    rY   Fc                 C   s|   |r$t jt jB t jB }t jt jB }nt jt jB }t j}t | ¡D ]6\}}}t ||¡ |D ]}t tj ||¡|¡ qZq@d S rA   )	ÚstatÚS_IRUSRÚS_IWUSRÚS_IXUSRr1   ÚwalkÚchmodr2   r3   )r9   ÚwritableZdirpermZfilepermÚdirpathÚdirnamesÚ	filenamesr=   r>   r>   r?   Úchange_tree_permissionŠ   s    rd   c              	   C   sB   z&t | d�� W 5 Q R £ W dS Q R X W n tk
r<   Y dS X d S )N©ÚdirFT)r   r8   ©r9   r>   r>   r?   Úis_dir_readonly—   s
    rh   c              
   c   s*   zt | dd� d V  W 5 t | dd� X d S )NT)r`   F)rd   rg   r>   r>   r?   Úreadonly_dirŸ   s    
ri   c                 c   s®   t | d��š}t |¡}t |¡�z dd„ t|tƒD ƒ}dd„ |D ƒ}t| ¡ ƒ}t	|ƒ� t
|ƒslt d¡ |V  W 5 Q R X t| ¡ ƒ|ks�t‚tƒ  W 5 Q R X W 5 Q R X d S )Nre   c                 S   s   h | ]\}}|’qS r>   r>   ©Ú.0rQ   rO   r>   r>   r?   Ú	<setcomp>¯   s     z!readonly_cache.<locals>.<setcomp>c                 S   s   i | ]}|t |d d�“qS ©T©Úcache©r   ©rk   rQ   r>   r>   r?   Ú
<dictcomp>°   s      z"readonly_cache.<locals>.<dictcomp>z!Unable to make directory readonly)r   rB   rC   r   rW   r   ÚFEWÚsetÚiterdirri   rh   ÚpytestÚskipÚAssertionErrorr   )rM   rS   r9   ÚusÚurlsÚfilesr>   r>   r?   Úreadonly_cache¨   s    


r|   c           
   
   c   sÐ   ddd„}dd„ }dd„ }t | d��¢}t |¡}t |¡�‚ dd	„ t|tƒD ƒ}d
d„ |D ƒ}t| ¡ ƒ}	| 	t
d|¡ | 	td|¡ | 	tjjd|¡ |V  t| ¡ ƒ|	ks²t‚tƒ  W 5 Q R X W 5 Q R X d S )Nc                 S   s   t tjdƒ‚d S )Nzos.mkdir monkeypatched out©ÚOSErrorÚerrnoÚEPERM)r2   Úmoder>   r>   r?   Úno_mkdir¼   s    z%fake_readonly_cache.<locals>.no_mkdirc                  _   s   t tjdƒ‚dS )zhOn Windows, mkdtemp uses mkdir in a loop and therefore hangs
        with it monkeypatched out.
        zos.mkdtemp monkeypatched outNr}   ©ÚargsÚkwargsr>   r>   r?   Ú
no_mkdtemp¿   s    z'fake_readonly_cache.<locals>.no_mkdtempc                  _   s   t tjdƒ‚d S )Nz)_SafeTemporaryDirectory monkeypatched outr}   rƒ   r>   r>   r?   Úno_TemporaryDirectoryÅ   s    z2fake_readonly_cache.<locals>.no_TemporaryDirectoryre   c                 S   s   h | ]\}}|’qS r>   r>   rj   r>   r>   r?   rl   Í   s     z&fake_readonly_cache.<locals>.<setcomp>c                 S   s   i | ]}|t |d d�“qS rm   rp   rq   r>   r>   r?   rr   Î   s      z'fake_readonly_cache.<locals>.<dictcomp>r4   ÚmkdtempZ_SafeTemporaryDirectory)N)r   rB   rC   r   rW   r   rs   rt   ru   Úsetattrr1   ÚtempfileÚastropyÚutilsr'   rx   r   )
rM   rS   Úmonkeypatchr‚   r†   r‡   r9   ry   rz   r{   r>   r>   r?   Úfake_readonly_cacheº   s&    

  ÿrŽ   c                 C   sŠ   t | ƒ\}}tt|dd�ƒ|ks$t‚t|ƒr0t‚tt|dd�ƒ|ksHt‚t|ƒsTt‚tt|dd�ƒ|kslt‚tt|dg d�ƒ|ks†t‚d S )NFrn   T©ro   Úsources)Únextr   r   rx   r"   ©rS   rY   rQ   rO   r>   r>   r?   Útest_download_file_basicÚ   s    r“   c                 C   st   dd„ }t | ƒ\}}|t|dd�ƒs(t‚|t|dd�ƒs<t‚|t|dd�ƒsPt‚tƒ  ¡ D ]\}}||ƒsZt‚qZd S )Nc                 S   s   | t j | ¡kS rA   )r1   r2   Úabspath)Úpr>   r>   r?   Úis_abså   s    z0test_download_file_absolute_path.<locals>.is_absFrn   T)r‘   r   rx   r   Úitems)rS   rY   r–   rQ   rO   ÚkÚvr>   r>   r?   Ú test_download_file_absolute_pathä   s    rš   c                 C   s\   t | ƒ\}}d}t|d|gd� t|d|gd� t|dg d� t|ƒsJt‚|tƒ ksXt‚d S )Nu   http://Ã©â€”â˜ƒâ€”Ã¨.comFr�   T)r‘   r   r"   rx   r   )rS   rY   rQ   rO   Zunicode_urlr>   r>   r?   Útest_unicode_urlð   s    r›   c                 C   sB   t | ƒ\}}d}t|d|gd� t|d|gd� t|dg d� d S )Na  http://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.comFr�   T©r‘   r   )rS   rY   rQ   rO   Zlong_urlr>   r>   r?   Útest_too_long_urlú   s
    r�   c                 C   s\   t | ƒ\}}t | ƒ\}}tdd|gd�}tdd|gd�}||ksDt‚t|ƒt|ƒksXt‚d S )Nzhttp://example.com/thingTr�   zhttp://example.com/THING)r‘   r   rx   r   )rS   rY   rQ   rO   Úu2Úc2r<   Úf2r>   r>   r?   Útest_case_collision  s    r¡   c                 C   sT   t | ƒ\}}tdd|gd� tdƒs(t‚tddg d� tdƒsBt‚tddg d� d S )Nzhttp://Example.com/thingTr�   zhttp://EXAMPLE.com/thingzHttp://example.com/thing©r‘   r   r"   rx   r’   r>   r>   r?   Útest_domain_name_case  s    r£   r‹   )Úsourcec                  C   s    t tdd�} tj | ¡st‚d S )NFrn   ©r   ÚTESTURLr1   r2   Úisfilerx   ©Úfnoutr>   r>   r?   Ú#test_download_nocache_from_internet  s    rª   c              	   c   s:   | d }d}t |dƒ�}| |¡ W 5 Q R X ||fV  d S )Nr/   s   Þ­¾ïÚwb©r5   r6   )rM   rP   Z
b_contentsr=   r>   r>   r?   Úa_binary_file  s
    r­   c              	   c   s:   | d }d}t |dƒ�}| |¡ W 5 Q R X ||fV  d S )Nzfile.txtú	contents
r0   r¬   )rM   rP   Úcontentsr=   r>   r>   r?   Úa_file#  s
    r°   c              	   C   sâ   t ƒ }tƒ  t | ¡� t ƒ }tƒ  ||ks0t‚W 5 Q R X t ƒ }tƒ  ||ksRt‚||ks^t‚G dd„ dtƒ}z6t | ¡�" t ƒ }tƒ  ||ks”t‚|‚W 5 Q R X W n |k
r¸   Y nX t ƒ }tƒ  ||ksÒt‚||ksÞt‚d S )Nc                   @   s   e Zd ZdS )z test_temp_cache.<locals>.SpecialN)Ú__name__Ú
__module__Ú__qualname__r>   r>   r>   r?   ÚSpecial;  s   r´   )r   r   r   rW   rx   Ú	Exception)rM   Zdldir0Zdldir1Zdldir2r´   Zdldir3Zdldir4r>   r>   r?   Útest_temp_cache,  s.    r¶   ÚparallelTc                    s&  t | ƒ\}}||d fg}i ‰ tt| tƒƒD ]h\}\}}	t|ƒrBt‚g ˆ |< t||ƒD ]}
ˆ |  |
¡ qTt | ƒ\}}ˆ |  |¡ | |||	f¡ q*|r²tdd„ |D ƒdˆ d�}n‡ fdd„|D ƒ}t|ƒt|ƒksØt‚t	||ƒD ]>\}\}}}	t
|ƒ|k�st‚t
|ƒ|	k�st‚t|ƒsât‚qâd S )Nc                 S   s   g | ]\}}}|‘qS r>   r>   ©rk   rQ   rO   Úc_badr>   r>   r?   Ú
<listcomp>l  s     zAtest_download_with_sources_and_bogus_original.<locals>.<listcomp>Tr�   c              	      s(   g | ] \}}}t |d ˆ  |d¡d�‘qS )TNr�   )r   Úgetr¸   ©r�   r>   r?   rº   o  s   ÿ©r‘   Ú	enumerater   rs   r"   rx   Úappendr   ÚlenÚzipr   )rS   rV   rY   r·   rQ   rO   rz   rN   Úumr¹   ÚiuÚrsÚrr>   r¼   r?   Ú-test_download_with_sources_and_bogus_originalM  s2    
  ÿ
þrÆ   Úwinzflaky cache error on Windows CI)Úreasonc              	   C   sŒ   t t|tƒƒ}tt|ƒd��$}t | dd„ dd„ |D ƒ¡ƒ}W 5 Q R X tƒ  t|ƒt|ƒks`t‚t||ƒD ]\}\}}t	|ƒ|ksjt‚qjdS )zÙHammer download_file with multiple threaded requests.

    The goal is to stress-test the locking system. Normal parallel downloading
    also does this but coverage tools lose track of which paths are explored.

    ©Úmax_workersc                 S   s   t | dd�S ©NTrn   rp   ©rQ   r>   r>   r?   Ú<lambda>†  ó    z2test_download_file_threaded_many.<locals>.<lambda>c                 S   s   g | ]\}}|‘qS r>   r>   rj   r>   r>   r?   rº   †  s     z4test_download_file_threaded_many.<locals>.<listcomp>N)
Úlistr   ÚN_THREAD_HAMMERr   rÀ   Úmapr   rx   rÁ   r   )rY   rS   rz   ÚPrÅ   rQ   rO   r>   r>   r?   Ú test_download_file_threaded_manyz  s    
(rÓ   c              	      sV   dd„ ‰ t t| tƒƒ}tt|ƒd��(}t | ‡ fdd„dd„ |D ƒ¡ƒ W 5 Q R X dS )	zDemonstrate urllib's segfault.c              	   S   s0   t j | ¡�}d}|r"| d¡}qW 5 Q R X d S )NTé   )ÚurllibÚrequestÚurlopenÚread)rQ   ÚremoteÚblockr>   r>   r?   Ú	slurp_url“  s    z)test_threaded_segfault.<locals>.slurp_urlrÉ   c                    s   ˆ | ƒS rA   r>   rÌ   ©rÛ   r>   r?   rÍ   ›  rÎ   z(test_threaded_segfault.<locals>.<lambda>c                 S   s   g | ]\}}|‘qS r>   r>   rj   r>   r>   r?   rº   ›  s     z*test_threaded_segfault.<locals>.<listcomp>N)rÏ   r   rÐ   r   rÀ   rÑ   )rS   rz   rÒ   r>   rÜ   r?   Útest_threaded_segfault�  s    rÝ   c              	   C   sÐ   g }i }t t||ƒtƒD ](\\}}}| |¡ |||< | |¡ qdd„ }tt|ƒd��}	t|	 ||¡ƒ}
W 5 Q R X tƒ  t|
ƒt|ƒksŽt	‚t|
|ƒD ]2\}
}||kr¾t
|
ƒ|| ksÊt	‚q˜|
dks˜t	‚q˜dS )a+  Hammer download_file with multiple threaded requests.

    Because some of these requests fail, the locking context manager is
    exercised with exceptions as well as success returns. I do not expect many
    surprises from the threaded version, but the process version gave trouble
    here.

    c                 S   s*   zt | dd�W S  tk
r$   Y d S X d S rË   )r   r~   rÌ   r>   r>   r?   r»   ³  s    z=test_download_file_threaded_many_partial_success.<locals>.getrÉ   N)r   rÁ   rÐ   r¿   r   rÀ   rÏ   rÑ   r   rx   r   )rY   rS   rV   rz   r¯   rQ   rO   rN   r»   rÒ   rÅ   r>   r>   r?   Ú0test_download_file_threaded_many_partial_successž  s    
rÞ   c                 C   sì   t | ƒ\}}t|dd� t | ƒ\}}t|dd� t|ƒs<t‚t|ƒ t|ƒrPt‚t|ƒs\t‚t | ƒ\}}t|dd�}t|ƒs€t‚t|ƒ t|ƒr”t‚t|ƒs t‚t | ƒ\}}	t|dd�}
t|ƒsÄt‚tt|
ƒƒ t|ƒrÜt‚t|ƒsèt‚d S rË   )r‘   r   r"   rx   r   r   )rS   Úu1Úc1rž   rŸ   Úu3Úc3Zf3Zu4Zc4Zf4r>   r>   r?   Útest_clear_download_cacheÄ  s(    rã   c           	         s¼   d‰ ‡ ‡fdd„}|ƒ \}}t |ƒ t|ƒr0t‚|ƒ \}}|ƒ \}}||ksPt‚t|ƒs\t‚t|ƒsht‚t |ƒ t|ƒr|t‚t|ƒsˆt‚tj |¡sœtdƒ‚t |ƒ tj |¡r¸tdƒ‚dS )z>Check that files with the same hash don't confuse the storage.z Test data; doesn't matter much.
c               	      sJ   t dˆdd��} |  ˆ ¡ W 5 Q R X t| jƒ}t|ƒ t|dd�}||fS )Nr0   F)rf   ÚdeleteTrn   )r   r6   rF   Únamer   r   )r=   ÚurlÚfilename©ÚcontentrM   r>   r?   Úmake_urlç  s    
zPtest_clear_download_multiple_references_doesnt_corrupt_storage.<locals>.make_urlz7Contents should not be deleted while a reference existsz4No reference exists any more, file should be deletedN)r   r"   rx   r1   r2   rT   )	rY   rM   rê   Za_urlZ
a_filenameÚf_urlZ
f_filenameZg_urlZ
g_filenamer>   rè   r?   Ú>test_clear_download_multiple_references_doesnt_corrupt_storageá  s0    


ÿþÿþrì   Ú	use_cachec              	   C   sx   | d }d}t |dƒ�}| |¡ W 5 Q R X t|ƒ}t||d�}|tksPtdƒ‚tj |¡sdtdƒ‚t	|ƒ|kstt‚dS )a9  Confirm that downloading a local file does not delete it.

    When implemented with urlretrieve (rather than urlopen) local files are
    not copied to create temporaries, so importing them to the cache deleted
    the original from wherever it was in the filesystem. I lost some built-in
    astropy data.

    r/   z	some textr0   rn   zFile should not be deleted!N)
r5   r6   rF   r   r   rx   r1   r2   r§   r   )rM   rY   rí   rP   r¯   r=   rQ   r>   r>   r?   Ú'test_download_file_local_cache_survives  s    
rî   c                 C   sR   t |ƒ\}}t |ƒ}t|d||gd�}t|ƒ|ks6t‚t|ƒsBt‚t|ƒrNt‚d S ©NTr�   ©r‘   r   r   rx   r"   )rY   rS   rV   Úprimaryr¯   Ú	fallback1r=   r>   r>   r?   Útest_sources_normal  s    ró   c                 C   sR   t |ƒ}t |ƒ\}}t|d||gd�}t|ƒ|ks6t‚t|ƒsBt‚t|ƒrNt‚d S rï   rð   )rY   rS   rV   rñ   rò   r¯   r=   r>   r>   r?   Útest_sources_fallback%  s    rô   c                 C   sT   t |ƒ\}}t |ƒ\}}t|d|gd�}t|ƒ|ks8t‚t|ƒsDt‚t|ƒrPt‚d S rï   rð   )rY   rS   rV   rñ   Úbogusrò   r¯   r=   r>   r>   r?   Útest_sources_ignore_primary.  s    rö   c                 C   sh   t |ƒ}t |ƒ}t |ƒ\}}t|d|||gd�}t|ƒ|ks@t‚t|ƒsLt‚t|ƒrXt‚t|ƒrdt‚d S rï   rð   )rY   rS   rV   rñ   rò   Ú	fallback2r¯   r=   r>   r>   r?   Útest_sources_multiple7  s    rø   c              	   C   sn   t |ƒ}t |ƒ}t |ƒ}t tjj¡� t|d|||gd� W 5 Q R X t|ƒrRt‚t|ƒr^t‚t|ƒrjt‚d S rï   )	r‘   rv   ÚraisesrÕ   ÚerrorÚURLErrorr   r"   rx   )rY   rS   rV   rñ   rò   r÷   r>   r>   r?   Útest_sources_multiple_missingB  s    rü   c              
   C   sR  t | d��¦}tj |d¡}t|dƒ�}| d¡ W 5 Q R X t|jƒ}tt	|dd�ƒdks\t
‚t|dƒ�}| d¡ W 5 Q R X tt	|dd�ƒdks”t
‚tt	|dd�ƒdks¬t
‚W 5 Q R X tj |¡rÆt
‚t tjj¡� t	|d	d� W 5 Q R X tt	|dd�ƒdk�s
t
d
ƒ‚t tjj¡� t	|dd� W 5 Q R X tt	|dd�ƒdk�sNt
dƒ‚d S )Nre   r=   r0   ÚoldTrn   ÚnewÚupdateFz!Cached version should still existz3Failed update should not remove the current version)r   r1   r2   r3   r5   r6   rF   rå   r   r   rx   rT   rv   rù   rÕ   rú   rû   )rM   rY   r9   Úf_namer=   rë   r>   r>   r?   Útest_update_urlM  s.    
"ÿþÿþr  c                  C   s"   t tddd�} tj | ¡st‚d S )NF©ro   Úshow_progressr¥   r¨   r>   r>   r?   Útest_download_noprogressh  s    r  c                  C   sx   t ƒ } ttdd�}tj | ¡s"t‚tj |¡s2t‚ttƒ tj 	|¡rJt‚tdƒ tj 
| d¡}tj |¡rttdƒ‚d S )NTrn   z+http://this_was_never_downloaded_before.comÚlockz Cache dir lock was not released!)r   r   r¦   r1   r2   Úisdirrx   r§   r   rT   r3   )Údownload_dirr©   Zlockdirr>   r>   r?   Útest_download_cachen  s    r  c               	   C   s�   dddœ} dt › d�}tjtjj|d�� tt d| d� W 5 Q R X tjt|d��}tt d| d	d
�}W 5 Q R X t	|ƒdks|t
‚tj |¡sŒt
‚dS )z7Tests for https://github.com/astropy/astropy/pull/10434Nz/does/not/exist)ÚcafileÚcapathz'Verification of TLS/SSL certificate at z failed©ÚmatchF)ro   Ússl_contextT)ro   r  Zallow_insecureé   )ÚTESTURL_SSLrv   rù   rÕ   rú   rû   r   Úwarnsr#   rÀ   rx   r1   r2   r§   )r  ÚmsgÚwarning_linesr©   r>   r>   r?   Ú-test_download_certificate_verification_failed‚  s    
   ÿr  c                 C   st   t |ƒ\}}tƒ }t|dd�}tj |¡s.t‚tƒ  tj |¡rDt‚tj |¡rTt‚t|dd�}tj |¡spt‚d S rË   )	r‘   r   r   r1   r2   r§   rx   r   rT   )rM   rY   rS   Útesturlr¯   r  r©   r>   r>   r?   Útest_download_cache_after_clear—  s    r  c                 C   sv   t j}t j}d}g }i }d|fD ]*}| || ¡ |d || g||d < q t||d�}tdd„ |D ƒƒsrt|ƒ‚d S )Nzintersphinx/READMEÚ éÿÿÿÿr¼   c                 S   s   g | ]}t j |¡‘qS r>   )r1   r2   r§   )rk   r=   r>   r>   r?   rº   ³  s     z>test_download_parallel_from_internet_works.<locals>.<listcomp>)r   ZdataurlZdataurl_mirrorr¿   r   Úallrx   )rY   Zmain_urlZ
mirror_urlZfilelocrz   r�   Úsr©   r>   r>   r?   Ú*test_download_parallel_from_internet_works¨  s    r  ÚmethodÚspawnc           
   	   C   sÚ   g }t  | ¡�¬ t|tƒD ]"\}}t|ƒr.t‚| ||f¡ qtdd„ |D ƒ|d�}t|ƒt|ƒksht‚dd„ |D ƒ}|t	t
ƒ ƒksˆt‚t||ƒD ]\}\}	}t|ƒ|ks’t‚q’tƒ  W 5 Q R X | t
ƒ ¡rÐt‚tƒ  d S )Nc                 S   s   g | ]\}}|‘qS r>   r>   rj   r>   r>   r?   rº   À  s     z6test_download_parallel_fills_cache.<locals>.<listcomp>)Zmultiprocessing_start_methodc                 S   s   h | ]\}}|’qS r>   r>   rj   r>   r>   r?   rl   Ã  s     z5test_download_parallel_fills_cache.<locals>.<setcomp>)r   rW   r   rs   r"   rx   r¿   r   rÀ   rt   r   rÁ   r   r   Úintersection)
rM   rS   r  rz   rÂ   rO   rÄ   Zurl_setrÅ   rQ   r>   r>   r?   Ú"test_download_parallel_fills_cache¶  s"     ÿr  c           	      C   s’   g }i }t | tƒD ]"\}}t|ƒr&t‚| ||f¡ qtdd„ |D ƒ|d�}t|ƒt|ƒks`t‚tƒ  t||ƒD ]\}\}}t	|ƒ|kspt‚qpd S )Nc                 S   s   g | ]\}}|‘qS r>   r>   rj   r>   r>   r?   rº   Ò  s     z=test_download_parallel_with_empty_sources.<locals>.<listcomp>r¼   )
r   rs   r"   rx   r¿   r   rÀ   r   rÁ   r   )	rS   rY   rz   r�   rÂ   rO   rÄ   rÅ   rQ   r>   r>   r?   Ú)test_download_parallel_with_empty_sourcesÌ  s    r  c                 C   sü   t | ƒ\}}||d fg}i }tt| tƒƒD ]h\}\}}	t|ƒrBt‚g ||< t||ƒD ]}
||  |
¡ qTt | ƒ\}}||  |¡ | |||	f¡ q*tdd„ |D ƒ|d�}t|ƒt|ƒks¾t‚t	||ƒD ].\}\}}}	t
|ƒ|ksæt‚t
|ƒ|	ksÈt‚qÈd S )Nc                 S   s   g | ]\}}}|‘qS r>   r>   r¸   r>   r>   r?   rº   é  s     zJtest_download_parallel_with_sources_and_bogus_original.<locals>.<listcomp>r¼   r½   )rS   rV   rY   rQ   rO   rz   r�   rN   rÂ   r¹   rÃ   rÄ   rÅ   r>   r>   r?   Ú6test_download_parallel_with_sources_and_bogus_originalÛ  s     r   c                 C   s`   t t|tƒƒ}tdd„ |D ƒƒ}t|ƒt|ƒks4t‚t||ƒD ]\}\}}t|ƒ|ks>t‚q>d S )Nc                 S   s   g | ]\}}|‘qS r>   r>   rj   r>   r>   r?   rº   õ  s     z/test_download_parallel_many.<locals>.<listcomp>)rÏ   r   ÚN_PARALLEL_HAMMERr   rÀ   rx   rÁ   r   )rY   rS   ÚtdrÅ   rQ   rO   r>   r>   r?   Útest_download_parallel_manyò  s
    r#  c              	   C   sL   t t|tƒƒ}t|ƒ}t tjj¡� t	|gdd„ |D ƒ ƒ W 5 Q R X dS )zÝCheck that a partially successful download works.

    Even in the presence of many requested URLs, presumably hitting all the
    parallelism this system can manage, a download failure leads to a tidy
    shutdown.

    c                 S   s   g | ]\}}|‘qS r>   r>   rj   r>   r>   r?   rº     s     z:test_download_parallel_partial_success.<locals>.<listcomp>N)
rÏ   r   r!  r‘   rv   rù   rÕ   rÖ   rû   r   )rY   rS   rV   r"  Úu_badr>   r>   r?   Ú&test_download_parallel_partial_successû  s    r%  c              
   C   sŒ   t  ¡ }zrt  d¡ ttƒD ]Z}tt|tƒƒ}t	|ƒ}|gdd„ |D ƒ }t  
|¡ t tjj¡� t|ƒ W 5 Q R X qW 5 t  |¡ X dS )a  Check that a partially successful parallel download leaves the cache unlocked.

    This needs to be repeated many times because race conditions are what cause
    this sort of thing, especially situations where a process might be forcibly
    shut down while it holds the lock.

    r   c                 S   s   g | ]\}}|‘qS r>   r>   rj   r>   r>   r?   rº      s     zDtest_download_parallel_partial_success_lock_safe.<locals>.<listcomp>N)ÚrandomÚgetstateÚsetstateÚseedÚranger!  rÏ   r   rs   r‘   Úshufflerv   rù   rÕ   rÖ   rû   r   )rY   rS   rV   r  Ú_r"  r$  rz   r>   r>   r?   Ú0test_download_parallel_partial_success_lock_safe  s    

r-  c              
   C   sæ  g }t tƒD ]T}|d›}|| }t|dƒ�}| |¡ W 5 Q R X t|ƒ}t|ƒ | |||f¡ qtdd„ |D ƒƒ}t|ƒt|ƒksˆt	‚t
||ƒD ]\}	\}}}t|	ƒ|ks’t	‚q’g }
|D ]N\}}}|› d�}|| }t|dƒ�}| |¡ W 5 Q R X |
 ||||f¡ qºtdd„ |D ƒdd�}t|ƒt|ƒk�s6t	‚t
||
ƒD ]2\}\}}}}t|ƒ|k�sbt	‚||k�s@t	‚�q@td	d„ |D ƒd
d�}t|ƒt|ƒk�s t	‚t
||
ƒD ]6\}\}}}}t|ƒ|k�sÌt	‚t|ƒ|k�sªt	‚�qªd S )NZ04dr0   c                 S   s   g | ]\}}}|‘qS r>   r>   ©rk   rP   rQ   rO   r>   r>   r?   rº   3  s     z1test_download_parallel_update.<locals>.<listcomp>z updatedc                 S   s   g | ]\}}}|‘qS r>   r>   r.  r>   r>   r?   rº   @  s     Trn   c                 S   s   g | ]\}}}|‘qS r>   r>   r.  r>   r>   r?   rº   E  s     rÿ   )r*  r!  r5   r6   rF   r   r¿   r   rÀ   rx   rÁ   r   )rY   rM   r"  rN   rO   rP   r=   rQ   Úr1Zr_1Ztd2Zc_plusÚr2Zr_2Zr3Zr_3r>   r>   r?   Útest_download_parallel_update(  s<    
r1  c              	      s�   t |ƒ\‰ }t |ƒ\‰}tˆ dd�}t|ƒ|ks4t‚‡ ‡fdd„}ttd��}t| |ttƒ¡ƒ}W 5 Q R X t	ƒ  |D ]}t|ƒ|ksvt‚qvd S )NTrn   c                    s   t ˆ dˆgd�S ©Nrÿ   r�   rp   )rN   ©rQ   rž   r>   r?   rÿ   W  s    z$test_update_parallel.<locals>.updaterÉ   )
r‘   r   r   rx   r   rÐ   rt   rÑ   r*  r   )rY   rS   rO   rŸ   r=   rÿ   rÒ   rÅ   r>   r3  r?   Útest_update_parallelM  s    r4  c              	      sŒ   t |ƒ\‰ }tt|tƒƒ}tˆ dd�}t|ƒ|ks6t‚‡ fdd„}tt|ƒd��}t| 	||¡ƒ}W 5 Q R X t
ƒ  tdd„ |D ƒƒsˆt‚d S )NTrn   c                    s   | \}}t ˆ d|gd�|fS r2  rp   )Zucrž   rŸ   rÌ   r>   r?   rÿ   l  s    z*test_update_parallel_multi.<locals>.updaterÉ   c                 s   s   | ]\}}t |ƒ|kV  qd S rA   )r   )rk   r=   rO   r>   r>   r?   Ú	<genexpr>t  s     z-test_update_parallel_multi.<locals>.<genexpr>)r‘   rÏ   r   rÐ   r   r   rx   r   rÀ   rÑ   r   Úany)rY   rS   rO   Ziucsr=   rÿ   rÒ   rÅ   r>   rÌ   r?   Útest_update_parallel_multib  s    r7  c               	   C   s4   t tddd��} |  ¡  d¡dks&t‚W 5 Q R X d S )NFúutf-8)ro   ÚencodingÚAstropyr  )r   r¦   rØ   Úfindrx   )Úpager>   r>   r?   Útest_url_nocachew  s    r=  c                 C   s\   t | ƒ\}}t|dd�}t|ƒ}d| }t|ƒ}tj |¡s@t‚t|ƒ tj |¡rXt‚d S )NTrn   zhash/)	r‘   r   r   r   r1   r2   r§   rx   r   )rS   rY   r  r¯   r•   ÚhashZhashstrr©   r>   r>   r?   Útest_find_by_hash}  s    r?  c                	   C   s&   t  tjj¡� tdƒ W 5 Q R X d S )NZ@kjfrhgjklahgiulrhgiuraehgiurhgiuhreglhurieghruelighiuerahiulruli)rv   rù   rÕ   rú   rû   r   r>   r>   r>   r?   Útest_find_invalidŠ  s    ÿr@  ÚpackageÚnumpyc                 C   s2   t dd| d�}tj |¡rt‚tj |¡r.t‚dS )z/Test can create a file path to an invalid file.Z
kjfrhgjklaZ
hgiulrhgiu)rA  N)r   r1   r2   r§   rx   r  )rA  r2   r>   r>   r?   Útest_get_invalid”  s    rC  rç   zlocal.dat.gzzlocal.dat.bz2zlocal.dat.xzc              
   C   s    t sd| ksts^d| kr^tjtdd��0 ttj d| ¡dd��}| 	¡  W 5 Q R X W 5 Q R X n>ttj d| ¡dd��"}| 	¡  | 
¡  ¡ dks’t‚W 5 Q R X d S )	NÚbz2Úxzz format files are not supportedr  r'   Úbinary©r9  ó   CONTENT)r)   r*   rv   rù   Ú
ValueErrorr   r1   r2   r3   ÚreadlinerØ   Úrstriprx   )rç   r=   r>   r>   r?   Útest_local_data_obj�  s     ÿ ÿrL  zinvalid.dat.bz2zinvalid.dat.gz)Úparamsc                 C   sL   d}d}|| j  }t|ƒ}| d¡r*|}n| d¡r:|}nd}| |¡ |S )Ns
   BZhinvalids
   ‹invalidú.bz2z.gzÚinvalid)ÚparamrL   ÚendswithÚwrite_bytes)rÖ   rM   Z
bz_contentZ
gz_contentZdatafilerç   r¯   r>   r>   r?   Úbad_compressed°  s    



rS  c              
   C   s’   |   d¡}|   d¡}ts|s$ts`|r`tjtdd��& t| dd��}| ¡  W 5 Q R X W 5 Q R X n.t| dd��}| ¡  ¡   d¡s„t	‚W 5 Q R X d S )NrN  z.xzz)does not provide the [lb]z[2m]a? module\.r  rF  rG  s   invalid)
rQ  r)   r*   rv   rù   ÚModuleNotFoundErrorr   rØ   rK  rx   )rS  Zis_bz2Zis_xzr=   r>   r>   r?   Útest_local_data_obj_invalidÆ  s    

	 ÿrU  c                   C   s   t j t¡rt d¡st‚d S )Nr(   )r1   r2   r§   Ú	TESTLOCALrQ  rx   r>   r>   r>   r?   Útest_local_data_nameÜ  s    rW  c               	   C   sv   t j t j t¡d¡} tj d| ¡ z>ddl}| 	¡ }t j 
|¡t j 
t j | ddd¡¡ks`t‚W 5 tj d¡ X dS )zìRegression test for issue #1256

    Tests that `get_pkg_data_filename` works in a third-party package that
    doesn't make any relative imports from the module it's used from.

    Uses a test package under ``data/test_package``.
    r'   r   NÚtest_packagezfoo.txt)r1   r2   r3   ÚdirnameÚ__file__ÚsysÚinsertÚpoprX  Zget_data_filenameÚnormcaserx   )Údata_dirrX  rç   r>   r>   r?   Ú"test_data_name_third_party_packageè  s    

ÿr`  c                	   C   s"   t  t¡� tdƒ W 5 Q R X d S )Nz../../../data/README.rst)rv   rù   ÚRuntimeErrorr   r>   r>   r>   r?   Útest_local_data_nonlocalfail   s    rb  c              	   C   sZ   d}| d }t |dƒ�}| |¡ | ¡  W 5 Q R X t|ƒ}t |¡ ¡ }||ksVt‚d S )Ns$   1234567890abcdefghijklmnopqrstuvwxyzztmp.datr«   )r5   r6   Úflushr   ÚhashlibÚmd5Ú	hexdigestrx   )rM   Zrandsrç   ZntfZchhashZshashr>   r>   r?   Útest_compute_hash  s    
rg  c               	   C   s4   t dƒ�} |  ¡ }W 5 Q R X tdƒ}||ks0t‚d S )Nzdata/local.dat)r   rØ   r   rx   )r=   Z	contents1Z	contents2r>   r>   r?   Útest_get_pkg_data_contents  s    
rh  c              	   C   sä  dt _|  dd¡ |  d¡ |  dd¡ |  d¡ |  tjdd¡ |  tjdd¡ ddd	„}|  td
|¡ t 	t
¡� tjdd� W 5 Q R X t t¡�}ttdd�}W 5 Q R X t|ƒ}ddg}|dkrÔ| ddg¡ |D ]4}t|ƒ ¡ }t|ƒD ]\}}	|	|krð||=  qØqðqØt|ƒdk�s*td|› �ƒ‚|dk�sBtd|› �ƒ‚tj |¡�sTt‚tjtdd�� ttƒ W 5 Q R X tj |¡�sˆt‚tƒ  tj |¡�r t‚ttdd�}
t|
dƒ�$}| ¡  d¡ d¡dk�sÖt‚W 5 Q R X dS )zj
    Tests to make sure the default behavior when the cache directory can't
    be located is correct
    TÚXDG_CONFIG_HOMEÚfooÚXDG_CACHE_HOMEÚbarZ
_temp_pathNc                 S   s
   t ƒ ‚d S rA   )r~   )ZdirnmÚlinktoÚpkgnamer>   r>   r?   Úosraiser3  s    z.test_data_noastropy_fallback.<locals>.osraiserZ_find_or_create_root_dirr‹   )Zrootnamern   z'remote data cache could not be accessedztemporary fileé   Úsocketr   zGot some unexpected warnings: )é   rp  zExpected 2 or 4 warnings, got z0.*Not clearing data cache - cache inaccessible.*r  FÚrbr8  r:  r  )N)r   Z"delete_temporary_downloads_at_exitZsetenvZdelenvr‰   r   Zset_temp_configrW   rv   rù   r~   Úget_cache_dirr  r	   r   r¦   rÀ   ÚextendrL   Úlowerr¾   rx   r1   r2   r§   r   r
   r5   rØ   Údecoder;  )r�   ro  r  r©   Zn_warnsZpartial_warn_msgsZwlZcur_wrN   Zpartial_msgZ	fnnocacher<  r>   r>   r?   Útest_data_noastropy_fallback  sP    



ÿþ ÿrx  zunicode.txtzunicode.txt.gzzunicode.txt.bz2zno bz2 support)Zmarkszunicode.txt.xzzno lzma supportc                 C   s„   t tj d| ¡dd�}t|tƒs$t‚| ¡ d }|dks<t‚t tj d| ¡dd�}t|tƒs`t‚| ¡ d }|ddd … ks€t‚d S )Nr'   r8  rG  r  u!   ×”×�×¡×˜×¨×•× ×•×ž×™ ×¤×™×™×ª×•×ŸrF  s"   ÿ×”×�×¡×˜×¨×•× ×•×ž×™ ×¤×™×™×ª×•×Ÿ)	r   r1   r2   r3   Ú
isinstancerL   rx   Ú
splitlinesÚbytes)rç   r¯   Úxr>   r>   r?   Útest_read_unicodeg  s    ÿÿr}  c               	   C   sj   d} t  | ¡} t| tƒst‚G dd„ dƒ}|| ƒ}t|dd��"}| ¡  | ¡  ¡ dks\t‚W 5 Q R X d S )Ns€   H4sICIxwG1AAA2xvY2FsLmRhdAALycgsVkjLzElVANKlxakpCpl5CiUZqQolqcUl8Tn5yYk58SmJJYnxWmCRzLx0hbTSvOSSzPy8Yi5nf78QV78QLgAlLytnRQAAAA==c                   @   s"   e Zd ZdZdd„ Zddd„ZdS )z*test_compressed_stream.<locals>.FakeStreamz?
        A fake stream that has `read`, but no `seek`.
        c                 S   s
   || _ d S rA   ©r'   )Úselfr'   r>   r>   r?   Ú__init__”  s    z3test_compressed_stream.<locals>.FakeStream.__init__Nc                 S   s8   |d kr| j }d| _ n| j d |… }| j |d … | _ |S )NrÎ   r~  )r  ÚnbytesÚresultr>   r>   r?   rØ   —  s    z/test_compressed_stream.<locals>.FakeStream.read)N)r±   r²   r³   Ú__doc__r€  rØ   r>   r>   r>   r?   Ú
FakeStream�  s   r„  rF  rG  rH  )	Úbase64Ú	b64decodery  r{  rx   r   rJ  rØ   rK  )Zgzipped_datar„  Ústreamr=   r>   r>   r?   Útest_compressed_stream‡  s    ÿ
rˆ  c                	   C   s&   t  tjj¡� tdƒ W 5 Q R X dS )z’
    checks that download_file gives a URLError and not an AttributeError,
    as its code pathway involves some fiddling with the exception.
    z&http://www.astropy.org/nonexistentfileN)rv   rù   rÕ   rú   rû   r   r>   r>   r>   r?   Ú.test_invalid_location_download_raises_urlerror¦  s    r‰  c                	   C   s"   t  t¡� tdƒ W 5 Q R X dS )zM
    checks that download_file gives an OSError if the socket is blocked
    ú"http://astropy.org/nonexistentfileN)rv   rù   r~   r   r>   r>   r>   r?   Ú(test_invalid_location_download_noconnect±  s    r‹  c                   C   s*   t dƒrt‚ttddd� t tƒs&t‚d S )NrŠ  TFr  )r"   rx   r   r¦   r>   r>   r>   r?   Útest_is_url_in_cache_remote»  s    rŒ  c                 C   sV   t |ƒ\}}t |ƒ}t|ƒr t‚t|ƒr,t‚t|ddd� t|ƒsFt‚t|ƒrRt‚d S )NTFr  )r‘   r"   rx   r   )rY   rS   rV   r  r¯   Znonexistentr>   r>   r?   Útest_is_url_in_cache_localÃ  s    r�  c           	      C   sŒ   t |ƒ\}}t |ƒ\}}| d }tƒ  tƒ r0t‚t|dd� tƒ  t|dd� tƒ  t|||gƒ tƒ  t|ƒ tƒ  t||gƒ tƒ  d S ©Núthe.zipTrn   )r‘   r   r   rx   r   r   r   )	rM   rY   rS   rV   r  Útesturl_contentsÚtesturl2Útesturl2_contentsÚzip_file_namer>   r>   r?   Útest_check_download_cacheÑ  s    
r”  c                 C   s”   t |ƒ\}}t|ddd�}t|ƒ|ks*t‚ttƒ ƒ}| d }t||gƒ t|ƒ t|ƒ t	|ƒsdt‚ttƒ ƒ|ksvt‚tt|ddd�ƒ|ks�t‚d S )NTFr  r�  )
r‘   r   r   rx   rt   r   r   r   r   r"   )rM   rY   rS   r  r¯   r=   Úinitial_urls_in_cacher“  r>   r>   r?   Ú test_export_import_roundtrip_oneè  s    
ÿÿr–  c              
   C   sR   t |ƒ\}}tdƒ�4}t|ƒr"t‚t t¡� t||gƒ W 5 Q R X W 5 Q R X d S )Nr«   )r‘   r   r"   rx   rv   rù   ÚKeyErrorr   )rY   rS   r  r¯   Úzip_filer>   r>   r?   Útest_export_url_not_presentû  s
    
r™  c                 C   sŠ   t |ƒ\}}t |ƒ\}}| d }t|dd� t|dd� t|ƒsDt‚t|||gƒ t|ƒ t|ƒ t||gƒ t|ƒszt‚t|ƒr†t‚d S rŽ  )r‘   r   r"   rx   r   r   r   )rM   rY   rS   r  r�  r‘  r’  r“  r>   r>   r?   Útest_import_one  s    rš  c                 C   s^   | d }t |tƒD ]\}}t|dd� qttƒ ƒ}t|ƒ tƒ  t|ƒ ttƒ ƒ|ksZt‚d S rŽ  )	r   rs   r   rt   r   r   r   r   rx   )rM   rY   rS   r“  rQ   rO   r•  r>   r>   r?   Útest_export_import_roundtrip  s    
r›  c              	   C   sˆ   t |tƒD ]\}}t|dd� q
ttƒ ƒ}t ¡ �}t|ƒ | ¡ }W 5 Q R X t	ƒ  t |¡�}t
|ƒ W 5 Q R X ttƒ ƒ|ks„t‚d S rË   )r   rs   r   rt   r   ÚioÚBytesIOr   Úgetvaluer   r   rx   )rY   rS   rQ   rO   r•  r=   r.   r>   r>   r?   Ú#test_export_import_roundtrip_stream!  s    

rŸ  c              	   C   s¢   |d }d}t |dƒ�}| |¡ W 5 Q R X t|tƒD ]\}}t|dd� q6t t¡� t|ƒ W 5 Q R X t	|dd�|ks~t
‚t|dd� t	|dd�|ksžt
‚d S )	Nzf.zips   Some contents
to check laterr«   Trn   rF  rG  )Ú	overwrite)r5   r6   r   rs   r   rv   rù   ÚFileExistsErrorr   r   rx   )rY   rS   rM   rP   rO   r=   rQ   r,  r>   r>   r?   Ú test_export_overwrite_flag_works0  s    r¢  c           	   	   C   sî   | d }|  ¡  | d }tt|tƒƒ}dd„ |D ƒ}t |¡�: |D ]\}}t|dd� qDttƒ ƒ|kslt	‚t
|ƒ W 5 Q R X | d }|  ¡  t |¡�L t|ƒ tƒ  ttƒ ƒ|ksºt	‚|D ] \}}tt|dd�ƒ|ks¾t	‚q¾W 5 Q R X d S )NÚoriginalr�  c                 S   s   h | ]\}}|’qS r>   r>   rj   r>   r>   r?   rl   F  s     zBtest_export_import_roundtrip_different_location.<locals>.<setcomp>Trn   rþ   )r4   rÏ   r   rs   r   rW   r   rt   r   rx   r   r   r   r   )	rM   rS   Zoriginal_cacher“  rz   r•  rQ   rO   Z	new_cacher>   r>   r?   Ú/test_export_import_roundtrip_different_location@  s$    r¤  c                 C   s   t ƒ r
t‚tƒ dkst‚d S )Nr   )r   rx   r   )rY   r>   r>   r?   Ú"test_cache_size_is_zero_when_emptyW  s    
r¥  c                 C   sd   t |ƒ\}}t|ƒ tƒ }t|dd� tƒ |t|ƒ t| d¡ƒ ksJt‚t|ƒ tƒ |ks`t‚d S )NTrn   r8  )r‘   r   r   r   rÀ   Úencoderx   )rY   rS   rQ   rO   Zs_ir>   r>   r?   ÚBtest_cache_size_changes_correctly_when_files_are_added_and_removed\  s    $r§  c           	      C   sv   g }t |tƒD ]$\}}t|dd�}| |||f¡ qttƒ  ¡ ƒttƒ ƒksPt‚|D ]\}}}tƒ | |ksTt‚qTd S rË   )	r   rs   r   r¿   rt   r   Úkeysr   rx   )	rY   rS   rÅ   r-   Za_cZa_frQ   rO   Úhr>   r>   r?   Ú(test_cache_contents_agrees_with_get_urlsh  s    rª  Údesired_sizel     ÈNÎZor  c              	   C   s$   t  t¡� t| |ƒ W 5 Q R X d S rA   )rv   rù   r~   r   )rM   r«  r>   r>   r?   Útest_free_space_checker_huger  s    r¬  c              	   C   s¨   | d }t |dƒ� W 5 Q R X t t¡� t|ƒ W 5 Q R X t| ƒ}|dkrVt|dƒrZt‚t| dd�}|dkrz|jtj	ks~t‚t| tj
d�}|dkr |jtj
ks¤t‚d S )Nr/   r0   r   ÚunitT)r­  )r5   rv   rù   r~   r   Úhasattrrx   r­  Ú_uÚbyteZMbit)rM   rP   Z
free_spacer>   r>   r?   Ú"test_get_free_space_file_directoryx  s    
r±  c              	   C   s.   t | ƒ}t t¡� t|g d� W 5 Q R X d S )Nr¼   )r‘   rv   rù   r—  r   )rV   rY   rQ   r>   r>   r?   Ú!test_download_file_bogus_settingsŠ  s    r²  c              	   C   s*   t  tjj¡� tt| ƒƒ W 5 Q R X dS )zSMake sure we get a URLError rather than OSError even if it's a
    local directory.N)rv   rù   rÕ   rÖ   rû   r   rF   rX   r>   r>   r?   Ú"test_download_file_local_directory�  s    r³  c                 C   s$   t | ƒ\}}t|ƒ}|tks t‚d S rA   )r‘   r   r   rx   )rS   rQ   rO   r=   r>   r>   r?   Ú%test_download_file_schedules_deletion—  s    r´  c              	   C   sn   t | d ƒ}t|dƒ�}| d¡ W 5 Q R X tj |¡s<t‚t t	¡� t
|ƒ W 5 Q R X tj |¡sjt‚d S )Nr/   r0   ré   )rL   r5   r6   r1   r2   rT   rx   rv   rù   ra  r   )rM   rP   r=   r>   r>   r?   Ú=test_clear_download_cache_refuses_to_delete_outside_the_cachež  s    rµ  c              	   C   sŠ   t |ƒ\}}t|dd� tƒ }tj tj |d¡¡}t|dƒ�}| d¡ W 5 Q R X t	 
t¡�}tƒ  W 5 Q R X ||jjks€t‚tƒ  d S ©NTrn   rõ   r0   úbogus file that exists)r‘   r   r   r1   r2   r”   r3   r5   r6   rv   rù   r   r   ÚvalueÚ	bad_filesrx   r   )rY   rS   rQ   rO   ÚdldirÚbfr=   Úer>   r>   r?   Ú-test_check_download_cache_finds_bogus_entries¨  s    r½  c              	   C   sŒ   t |ƒ\}}t|dd�}tj tj tj |¡d¡¡}t|dƒ�}| d¡ W 5 Q R X t	 
t¡�}tƒ  W 5 Q R X ||jjks‚t‚tƒ  d S r¶  )r‘   r   r1   r2   r”   r3   rY  r5   r6   rv   rù   r   r   r¸  r¹  rx   r   )rY   rS   rQ   rO   r=   r»  r¼  r>   r>   r?   Ú0test_check_download_cache_finds_bogus_subentriesµ  s    r¾  c              	   C   sL  t |ƒ\}}t|dd�}tƒ }tj tj |d¡¡}t|dƒ�}| d¡ W 5 Q R X tj tj tj 	|¡d¡¡}t|dƒ�}| d¡ W 5 Q R X tj tj |d¡¡}	t|	dƒ�}| d	¡ W 5 Q R X t |ƒ\}
}t|dd�}t 
|¡ tj 	|¡}t t¡�}tƒ  W 5 Q R X t|jjƒ|||	|hk�s0t‚|jjD ]}t|ƒ �q8d S )
NTrn   Zbogus1r0   r·  Zbogus2zother bogus file that existsr¯   z&awkwardly-named bogus file that exists)r‘   r   r   r1   r2   r”   r3   r5   r6   rY  Úunlinkrv   rù   r   r   rt   r¸  r¹  rx   r   )rY   rS   rQ   rO   rP   rº  Zbf1r=   Zbf2Zbf3rž   rŸ   r    Zbf4r¼  r»  r>   r>   r?   Ú!test_check_download_cache_cleanupÁ  s*    
rÀ  c                 C   s(   t |ƒ\}}t|dd� t|dd� d S )NTrn   rÿ   rœ   )rY   rS   rQ   r,  r>   r>   r?   Ú.test_download_cache_update_doesnt_damage_cacheß  s    rÁ  c              
      sp  ‡ fdd„}t ƒ }| d }d}t |¡ t |¡�T t |¡ t|dƒ�}| |¡ W 5 Q R X t	 
t¡� t ¡  W 5 Q R X |ƒ  W 5 Q R X |t ƒ ksšt‚t|ƒ|ks®tdƒ‚t	 
t¡� t |¡� W 5 Q R X W 5 Q R X |t ƒ ksèt‚tt|ƒƒ|ksüt‚| d }t|dƒ�}| |¡ W 5 Q R X t | ¡� |ƒ  W 5 Q R X |t ƒ k�sPt‚t|ƒ|k�sbt‚t |¡ t |¡ | d d }t|dƒ�}| |¡ W 5 Q R X t | ¡� |ƒ  W 5 Q R X |t ƒ k�sÎt‚t|ƒ|k�sàt‚t |¡ t |¡ | d d d	 }t|dƒ�}| |¡ W 5 Q R X t | ¡� |ƒ  W 5 Q R X |t ƒ k�sPt‚t|ƒ|k�sbt‚t |¡ d
S )a¿  Ensure that bogus cache settings are handled sensibly.

    Because the user can specify the cache location in a config file, and
    because they might try to deduce the location by looking around at what's
    in their directory tree, and because the cache directory is actual several
    tree levels down from the directory set in the config file, it's important
    to check what happens if each of the steps in the path is wrong somehow.
    c               
      sø   t  t¡� tƒ rt‚W 5 Q R X t  t¡� tdƒr8t‚W 5 Q R X t  t¡� tƒ rXt‚W 5 Q R X t  t¡�. tˆ ƒ\} }t| dd�}t	|ƒ|ks–t‚W 5 Q R X t  t¡� t| ƒr¸t‚W 5 Q R X t  t¡�" t  
t¡� tƒ  W 5 Q R X W 5 Q R X dS )zrWe want a broken cache to produce a warning but then astropy should
        act like there isn't a cache.
        zhttp://www.example.com/Trn   N)rv   r  r	   r   rx   r"   r   r‘   r   r   rù   r~   r   )rQ   rO   rÅ   ©rS   r>   r?   Ú!check_quietly_ignores_bogus_cacheï  s    zLtest_cache_dir_is_actually_a_file.<locals>.check_quietly_ignores_bogus_cacher/   r®   r0   zFile should not be harmed.r‹   Údownloadræ   N)r   r1   r4   r   rW   ÚshutilÚrmtreer5   r6   rv   rù   r~   rt  rx   r   rL   ÚremoveÚmakedirs)rM   rS   rÃ  rº  rP   Úctr=   Úcdr>   rÂ  r?   Ú!test_cache_dir_is_actually_a_fileå  sZ    






rË  c              	   C   s4   | \}}t t|ƒƒ�}| ¡ |ks&t‚W 5 Q R X d S rA   )r   rL   rØ   rx   ©r°   rP   rO   Úrfr>   r>   r?   Útest_get_fileobj_strB  s    rÎ  c              	   C   s8   | \}}t tj |¡ƒ�}| ¡ |ks*t‚W 5 Q R X d S rA   )r   Úpyr2   ÚlocalrØ   rx   rÌ  r>   r>   r?   Útest_get_fileobj_localpathH  s    rÑ  c              	   C   s6   | \}}t t |¡ƒ�}| ¡ |ks(t‚W 5 Q R X d S rA   )r   rB   rC   rØ   rx   rÌ  r>   r>   r?   Útest_get_fileobj_pathlibN  s    rÒ  c              	   C   s4   | \}}t |dd��}| ¡ |ks&t‚W 5 Q R X d S )NrF  rG  )r   rØ   rx   )r­   rP   rO   rÍ  r>   r>   r?   Útest_get_fileobj_binaryT  s    rÓ  c                 C   sR   | \}}t |ƒ�8}t|ƒ�$}t t¡� | ¡  W 5 Q R X W 5 Q R X W 5 Q R X d S rA   )r5   r   rv   rù   Ú	TypeErrorrØ   ©r°   rP   rO   r=   rÍ  r>   r>   r?   Ú"test_get_fileobj_already_open_textZ  s
    

rÖ  c              
   C   sF   | \}}t |dƒ�*}t|ƒ�}| ¡ |ks.t‚W 5 Q R X W 5 Q R X d S )Nrs  ©r5   r   rØ   rx   rÕ  r>   r>   r?   Ú$test_get_fileobj_already_open_binaryb  s    
rØ  c              
   C   sJ   | \}}t |dƒ�.}t|dd��}| ¡ |ks2t‚W 5 Q R X W 5 Q R X d S )Nrs  rF  rG  r×  )r­   rP   rO   r=   rÍ  r>   r>   r?   Ú+test_get_fileobj_binary_already_open_binaryi  s    rÙ  c              	   C   sp   t ƒ }t t¡� d|d< W 5 Q R X t|ƒ\}}t|dd� t ƒ }||ksNt‚t t¡� d|d< W 5 Q R X d S )Né   rj  Trn   )r   rv   rù   rÔ  r‘   r   rx   )rY   rS   rO   rQ   r,  r>   r>   r?   Ú test_cache_contents_not_writablep  s    rÛ  c              	   C   sÒ   t |ƒ\}}| d }| d }t |¡ t |¡�@ t|dd�}t|ƒsJt‚t|ƒ|ksZt‚t	 
||¡ tƒ  W 5 Q R X t |¡�H t|ƒsŽt‚t|dd�}||ks¦t‚tj |¡s¶t‚t|ƒ tƒ  W 5 Q R X d S )NÚ1Ú2Trn   )r‘   r1   r4   r   rW   r   r"   rx   r   rÅ  Úcopytreer   r2   rT   r   )rM   rS   rQ   rO   r:   r;   Úp1Zp2r>   r>   r?   Útest_cache_relocatable|  s"    
rà  c              	   C   sV   t tƒ}| tdt| ƒ¡ t|ƒ�}| ¡  W 5 Q R X t|  ¡ ƒ}t	|ƒdksRt
‚dS )zAchecks that get_readable_fileobj leaves no temporary files behindÚtempdirr   N)rF   rV  r‰   rŠ   rL   r   rØ   rÏ   ru   rÀ   rx   )rM   r�   ræ   r=   Ztempdir_listingr>   r>   r?   Ú3test_get_readable_fileobj_cleans_up_temporary_files�  s    
râ  c               	   C   s6   t  t¡} t| ƒ�}| ¡  ¡ dks(t‚W 5 Q R X d S )NzDThis file is used in the test_local_data_* testing functions
CONTENT)rB   rC   rV  r   rØ   rK  rx   )Zfpathr=   r>   r>   r?   Ú&test_path_objects_get_readable_fileobj¤  s    


ÿÿrã  c               
   C   sX   t tdd��2} t | dd��}| d¡ W 5 Q R X |  d¡ W 5 Q R X | jrP|jsTt‚dS )zyEnsure fileobj state is as expected when get_readable_fileobj()
    is called inside another get_readable_fileobj().
    rF  rG  zUTF-8r  N)r   rV  ÚseekÚclosedrx   )ÚfileobjZfileobj2r>   r>   r?   Ú test_nested_get_readable_fileobj­  s
    rç  c              	      s*  t jd‡ fdd„	ƒ‰d dœ‡fdd„
}G ‡‡fdd„dƒ‰ |  tjjd|¡ t tj	j
¡� d	‰d
‰ttdd� W 5 Q R X t tj	j¡� d
‰d	‰ttdd� W 5 Q R X d
‰d
‰ttdd�}t|dƒ�}| ¡ dˆ ksÜt‚W 5 Q R X d ‰d
‰ttdd�}t|dƒ�}| ¡ dˆ k�st‚W 5 Q R X d S )Nc                 3   s   ˆ ƒ V  d S rA   r>   )Ú
remote_urlÚtimeout)ÚMockURLr>   r?   Úmockurl¿  s    z.test_download_file_wrong_size.<locals>.mockurl)Ú
tlscontextc                    s   t dtfi ƒƒ }ˆ |_|S )NZ
MockOpener)ÚtypeÚobjectr5   )rì  r„   r…   Zmock_opener)rë  r>   r?   Úmockurl_builderÃ  s    z6test_download_file_wrong_size.<locals>.mockurl_builderc                       s.   e Zd Z‡ fdd„Z‡fdd„Zddd„ZdS )	z.test_download_file_wrong_size.<locals>.MockURLc                    s   t  dˆ  ¡| _d S )Nó   a)rœ  r�  Úreader©r  )Úreal_lengthr>   r?   r€  É  s    z7test_download_file_wrong_size.<locals>.MockURL.__init__c                    s   dt ˆ ƒiS )NzContent-Length)rL   rò  )Úreport_lengthr>   r?   ÚinfoÌ  s    z3test_download_file_wrong_size.<locals>.MockURL.infoNc                 S   s   | j  |¡S rA   )rñ  rØ   )r  Úlengthr>   r>   r?   rØ   Ï  s    z3test_download_file_wrong_size.<locals>.MockURL.read)N)r±   r²   r³   r€  rõ  rØ   r>   )ró  rô  r>   r?   rê  È  s   rê  Z_build_urlopenerrÔ   iÿ  Frn   rs  rð  )N)Ú
contextlibÚcontextmanagerr‰   r‹   rŒ   r'   rv   rù   rÕ   rú   ÚContentTooShortErrorr   r¦   rû   r5   rØ   rx   )r�   rï  rP   r=   r>   )rê  rë  ró  rô  r?   Útest_download_file_wrong_size¾  s.    
rú  c              	   C   sz   z$t | ƒ� t| ƒst‚W 5 Q R X W nP tk
rt   ttdƒrVt ¡ dkrVt d¡ nt 	¡ dkrnt d¡ n‚ Y nX d S )NÚgeteuidr   z>We are root, we can't make a directory un-writable with chmod.ÚWindowszgIt seems we can't make a driectory un-writable under Windows with chmod, in spite of the documentation.)
ri   rh   rx   r®  r1   rû  rv   rw   ÚplatformÚsystemrX   r>   r>   r?   Ú"test_can_make_directories_readonlyë  s    
ÿÿrÿ  c              
   C   s®   | d }d}t |dƒ�}| |¡ W 5 Q R X t| ƒ�` z$t |dƒ�}| d¡ W 5 Q R X W n tk
rn   Y n"X ttdƒr�t ¡ dkr�t d¡ W 5 Q R X t	|ƒ|ksªt
‚d S )	NÚtestr®   r0   zw+zmore contents
rû  r   z9We are root, we can't make a file un-writable with chmod.)r5   r6   ri   r8   r®  r1   rû  rv   rw   r   rx   )rM   rP   rO   r=   r>   r>   r?   Útest_can_make_files_readonlyý  s    
r  c                 C   s   t ƒ | kst‚d S rA   ©r   rx   ©r|   r>   r>   r?   Útest_read_cache_readonly  s    r  c                 C   s*   | D ] }t |dd�}|| | kst‚qd S rË   ©r   rx   ©r|   rQ   r=   r>   r>   r?   Ú!test_download_file_cache_readonly  s    r  c              	   C   sd   |d }d}d}t |dƒ�}| |¡ W 5 Q R X t t¡� t||dd� W 5 Q R X t|ƒr`t‚d S ©Nz	test-filezSome text or otherzhttp://example.com/r0   T)Zremove_original©r5   r6   rv   rù   r~   r    r"   rx   )r|   rM   rç   ré   ræ   r=   r>   r>   r?   Útest_import_file_cache_readonly  s    r
  c              	   C   sN   t |ƒ\}}t t¡� t|dd�}W 5 Q R X t|ƒ|ks>t‚t|ƒrJt‚d S rË   )r‘   rv   r  r	   r   r   rx   r"   )r|   rS   rQ   rO   r=   r>   r>   r?   Ú,test_download_file_cache_readonly_cache_miss$  s
    r  c              
   C   sX   | D ]N}t  t¡� t|dd�}W 5 Q R X || | ks:t‚t|ƒt| | ƒkst‚qd S ©Nrÿ   rn   ©rv   r  r	   r   rx   r   r  r>   r>   r?   Ú(test_download_file_cache_readonly_update,  s
    r  c                 C   s
   t ƒ  d S rA   ©r   r  r>   r>   r?   Ú+test_check_download_cache_works_if_readonly4  s    r  c                 C   s   t ƒ | kst‚d S rA   r  ©rŽ   r>   r>   r?   Útest_read_cache_fake_readonlyA  s    r  c                 C   s*   | D ] }t |dd�}|| | kst‚qd S rË   r  ©rŽ   rQ   r=   r>   r>   r?   Ú&test_download_file_cache_fake_readonlyE  s    r  c              	   C   s"   t  t¡� t ¡  W 5 Q R X d S rA   )rv   rù   r~   rŠ   rˆ   r  r>   r>   r?   Ú test_mkdtemp_cache_fake_readonlyK  s    r  c              
   C   s,   t  t¡� tƒ � W 5 Q R X W 5 Q R X d S rA   )rv   rù   r~   r   r  r>   r>   r?   Útest_TD_cache_fake_readonlyP  s    r  c              	   C   sd   |d }d}d}t |dƒ�}| |¡ W 5 Q R X t t¡� t||dd� W 5 Q R X t|ƒr`t‚d S r  r	  )rŽ   rM   rç   ré   ræ   r=   r>   r>   r?   Ú$test_import_file_cache_fake_readonlyV  s    r  c              	   C   sN   t |ƒ\}}t t¡� t|dd�}W 5 Q R X t|ƒr:t‚t|ƒ|ksJt‚d S rË   )r‘   rv   r  r	   r   r"   rx   r   )rŽ   rS   rQ   rO   r=   r>   r>   r?   Ú1test_download_file_cache_fake_readonly_cache_missb  s
    r  c              
   C   sX   | D ]N}t  t¡� t|dd�}W 5 Q R X || | ks:t‚t|ƒt| | ƒkst‚qd S r  r  r  r>   r>   r?   Ú-test_download_file_cache_fake_readonly_updatej  s
    r  c                 C   s
   t ƒ  d S rA   r  r  r>   r>   r?   Ú0test_check_download_cache_works_if_fake_readonlyr  s    r  c           	   	   C   sX  d}t ƒ rt‚t |d�rt‚t|tƒD ]\}}t|d|d� q&t ƒ rHt‚tt |d�ƒtks^t‚tƒ t|d�k srt‚t|td ƒD ]\}}t|dd� q€tt ƒ ƒtd ks¬t‚tt |d�ƒtksÂt‚tƒ t|d�ksÖt‚tt ƒ ƒttƒ  	¡ ƒksòt‚tt |d�ƒtt|d� 	¡ ƒk�st‚t ƒ D ]&}t
|ƒ�s0t‚t
||d��rt‚�qt |d�D ]&}t
|ƒ�rbt‚t
||d��sPt‚�qPtƒ  t|d� t ƒ d }t t¡� t|dg |d� W 5 Q R X t||d� tt ƒ ƒtd k�sàtd	ƒ‚tt |d�ƒtk�sütd	ƒ‚t|g dd
�}t t¡� t||d� W 5 Q R X t |d�d }t t¡� t|dg d� W 5 Q R X t|g d|d�}t t¡� t|ƒ W 5 Q R X t||d� tt ƒ ƒtd k�s°t‚tt |d�ƒtd k�sÌt‚t|ƒ tt ƒ ƒtk�sèt‚tt |d�ƒtd k�st‚t|d� tt ƒ ƒtk�s"t‚t |d��r2t‚tƒ  t ƒ �rDt‚t |d��rTt‚d S )NÚbogus_cache_name©rn  T)ro   rn  r  rn   r   )ro   r�   rn  zwrong pkgname should do nothing)r�   ro   r�   )r�   ro   rn  )r   rx   r   rs   r   rÀ   r   rt   r   r¨  r"   r   rv   rù   r—  r   ra  )	rY   rS   r-   rQ   r,  rN   r=   ZuaÚfar>   r>   r?   Útest_pkgname_isolationv  sd    

&



r  c           
   	   C   sb  d}t ƒ rt‚t |d�rt‚t|tƒD ]\}}t|dd� q&t ¡ �}t|ƒ | ¡ }W 5 Q R X t |¡�}t	||d� W 5 Q R X t
ƒ  t
|d� tt ƒ ƒtt |d�ƒks®t‚t|d�}tƒ  ¡ D ]0\}}	|	|| ksÚt‚t|	ƒt|| ƒksÂt‚qÂtƒ  t ¡ �}t||d� | ¡ }W 5 Q R X t |¡�}t	|ƒ W 5 Q R X tt ƒ ƒtt |d�ƒk�s^t‚d S )Nr  r  Trn   )r   rx   r   rs   r   rœ  r�  r   rž  r   r   rt   r   r—   r   r   )
rY   rS   r-   rQ   r,  r=   r.   Zccar˜   r™   r>   r>   r?   Útest_transport_cache_via_zip»  s0    




r  c                 C   s\   d}t ƒ rt‚t |d�rt‚tdd„ t|tƒD ƒ|d� t ƒ rBt‚tt |d�ƒtksXt‚d S )Nr  r  c                 S   s   g | ]\}}|‘qS r>   r>   rj   r>   r>   r?   rº   ã  s     z;test_download_parallel_respects_pkgname.<locals>.<listcomp>)r   rx   r   r   rs   rÀ   )rY   rS   r-   r>   r>   r?   Ú'test_download_parallel_respects_pkgnameÝ  s    

r   z>This platform is unable to rename directories that are in use.c              	   C   sF   t |ƒ\}}tt|dd�ƒ�  t|ƒ t|ƒr2t‚tƒ  W 5 Q R X d S rË   )r‘   r5   r   r   r"   rx   r   ©rY   rS   rQ   rO   r>   r>   r?   Útest_removal_of_open_filesè  s
    r"  c              	   C   sv   t |ƒ\}}tt|dd�ƒ�D t |ƒ\}}t|d|gd�}tƒ  t|ƒsLt‚t|ƒ|ks\t‚W 5 Q R X t|ƒsrt‚d S )NTrn   rÿ   r�   )r‘   r5   r   r   r"   rx   r   )rY   rS   rQ   rO   rž   rŸ   r=   r>   r>   r?   Útest_update_of_open_filesô  s    r#  c              
   C   sl   dd„ }t r| tjjd|¡ t|ƒ\}}tt|dd�ƒ�( tj	t
dd�� t|ƒ W 5 Q R X W 5 Q R X d S )Nc                  _   s   t  tdƒ¡ t‚d S ©Nzin use©ÚwarningsÚwarnr	   r8   rƒ   r>   r>   r?   Ú	no_rmtree  s    z5test_removal_of_open_files_windows.<locals>.no_rmtreeÚ_rmtreeTrn   ú
.*in use.*r  )ÚCAN_RENAME_DIRECTORY_IN_USEr‰   r‹   rŒ   r'   r‘   r5   r   rv   r  r	   r   )rY   rS   r�   r(  rQ   rO   r>   r>   r?   Ú"test_removal_of_open_files_windows  s    r,  c           	   
   C   s¼   dd„ }t r| tjjd|¡ t|ƒ\}}tt|dd�ƒ�^ t|ƒ\}}tj	t
dd�� t|d|gd	�}W 5 Q R X tƒ  t|ƒs„t‚t|ƒ|ks”t‚W 5 Q R X tt|dg d	�ƒ|ks¸t‚d S )
Nc                  _   s   t  tdƒ¡ t‚d S r$  r%  rƒ   r>   r>   r?   r(    s    z4test_update_of_open_files_windows.<locals>.no_rmtreer)  Trn   r*  r  rÿ   r�   )r+  r‰   r‹   rŒ   r'   r‘   r5   r   rv   r  r	   r   r"   rx   r   )	rY   rS   r�   r(  rQ   rO   rž   rŸ   r=   r>   r>   r?   Ú!test_update_of_open_files_windows  s    r-  c              
   C   sx   t |ƒ\}}t dd¡�V t tjj¡� t|ƒ W 5 Q R X t	|ƒrHt
‚t tjj¡� ttƒ W 5 Q R X W 5 Q R X d S )NZallow_internetF)r‘   r   Zset_temprv   rù   rÕ   rú   rû   r   r"   rx   r¦   r!  r>   r>   r?   Útest_no_allow_internet&  s    r.  c                 C   sP   t |ƒ\}}t|dd� tƒ }tj |d¡}t|ƒs8t‚t|ƒ t|ƒsLt‚d S )NTrn   r¯   )	r‘   r   r   r1   r2   r3   r"   rx   r   )rY   rS   rQ   rO   rº  Zbad_filenamer>   r>   r?   Ú,test_clear_download_cache_not_too_aggressive1  s    r/  c                 C   s  t |ƒ\}}t|dd�}t|ƒ t|ƒr,t‚t |ƒ\}}t|dd�}ttj tj |¡d¡ƒ t|ƒrjt‚t |ƒ\}}t|dd�}ttj |¡ƒ t|ƒržt‚t |ƒ\}}t|dd�}ttj |¡d ƒ t|ƒrÖt‚t |ƒ\}}t|dd�}t	|ƒ}t|ƒ t|ƒ�rt‚d S )NTrn   ræ   ú/)
r‘   r   r   r"   rx   r1   r2   r3   rY  r   )rY   rS   rQ   rO   r=   r©  r>   r>   r?   Ú"test_clear_download_cache_variants<  s*    r1  ZIS_CRONz.Flaky/too much external traffic for regular CIc                 C   s   d}t |ƒ dS )z>Test that download automatically enables TLS/SSL when requiredz`ftp://anonymous:mail%40astropy.org@gdc.cddis.eosdis.nasa.gov/pub/products/iers/finals2000A.dailyNrp   )rY   ræ   r>   r>   r?   Útest_ftp_tls_auto]  s    r2  Úbasezhttp://example.comzhttps://example.comc                 C   sv   |d }|}t |ƒ\}}t|d|gd� t|ƒs4t‚t|dg d� t|ƒ t|ƒrVt‚t|ƒrbt‚t|d|gd� d S )Nr0  Tr�   )r‘   r   r"   rx   r   )rY   rS   r3  ÚslashZno_slashrQ   rO   r>   r>   r?   Útest_url_trailing_slashi  s    r5  c                 C   s,   t |ƒ\}}tdd|gd� tdƒr(t‚d S )Nzfile://Tr�   zfile:///r¢   r!  r>   r>   r?   Útest_empty_url|  s    r6  c               	   C   s|   d} t  tjj¡�}t| ƒ W 5 Q R X | ¡ }d}dddddg}|D ]}||krDd} qZqD|sxtd	|› d
d |¡› �ƒ‚d S )NzPftp://anonymous:mail%40astropy.org@nonexisting/pub/products/iers/finals2000A.allFzName or service not knownz,nodename nor servname provided, or not knownzgetaddrinfo failedz$Temporary failure in name resolutionz#No address associated with hostnameTzGot z, expected one of these: ú,)	rv   rù   rÕ   rú   rû   r   Zexconlyrx   r3   )Z
faulty_urlÚexcinfoÚerrmsgZ	found_msgZpossible_msgsZcur_msgr>   r>   r?   Ú4test_download_ftp_file_properly_handles_socket_error‚  s     ûr:  ©r  Zans)zhttp://googlecomT)zhttps://google.comT)zftp://google.comT)zsftp://google.comT)zssh://google.comT)z!file:///c:/path/to/the%20file.txtT)z
google.comF)zC:\\path\\file.docxF)zdata://fileFc                 C   s   t | ƒ|kst‚d S rA   )r!   rx   r;  r>   r>   r?   Útest_string_is_url_check—  s    r<  )F)Ýr…  r÷  r   rd  rœ  rH   r1   rB   rý  r&  rÅ  rZ   r[  rŠ   Úurllib.errorrÕ   Úurllib.parseÚurllib.requestr&  Úconcurrent.futuresr   r   r   r   Zpy.pathrÏ  rv   Zastropy.utils.datar‹   r   r¯  Zastropy.configr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   Zastropy.utils.exceptionsr#   Úenvironr»   r$   r¦   ZTESTURL2r  r2   r3   rV  Z"astropy.utils.compat.optional_depsr)   r*   rs   r!  rÐ   r@   r+  rF   ZfixturerS   rV   rY   rd   rh   rø  ri   r|   rŽ   r“   rš   r›   r�   r¡   r£   ÚmarkZremote_datarª   r­   r°   r¶   ZparametrizerÆ   ZskipifÚ
startswithrÓ   rÝ   rÞ   rã   rì   rî   ró   rô   rö   rø   rü   r  r  r  r  r  r  r  r  r   r#  r%  Zslowr-  r1  r4  r7  r=  r?  r@  rC  rL  rS  rU  rW  r`  rb  rg  rh  rx  rP  Zxfailr}  rˆ  r‰  r‹  rŒ  r�  r”  r–  r™  rš  r›  rŸ  r¢  r¤  r¥  r§  rª  ZEbyter¬  r±  r²  r³  r´  rµ  r½  r¾  rÀ  rÁ  rË  rÎ  rÑ  rÒ  rÓ  rÖ  rØ  rÙ  rÛ  rà  râ  rã  rç  rú  rÿ  r  r  r  r
  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r"  r#  r,  r-  r.  r/  r1  r2  r5  r6  r:  r<  r>   r>   r>   r?   Ú<module>   s  t








		


!
, ÿ
 ÿ
 ÿ
#&
			




	
% ÿ
 ÿ


	
 
ÿ

	
Hþþùþ







]	-E"þþ!þ÷þ