U
    aÊ¹jí  ã                   @   sL   d Z ddlZddlZddlZddlZddlZG dd„ dƒZG dd„ dƒZdS )zdevelop testsé    Nc                   @   s0   e Zd Zdd„ Zedd„ ƒZdd„ Zdd„ Zd	S )
ÚTestSandboxc              	   C   s,   t j t|ƒ¡� |  tj¡ W 5 Q R X d S ©N)Ú
setuptoolsÚsandboxÚDirectorySandboxÚstrÚ_file_writerÚosÚdevnull)ÚselfÚtmpdir© r   ú\/var/www/html/bwave/python/venv/lib/python3.8/site-packages/setuptools/tests/test_sandbox.pyÚtest_devnull   s    zTestSandbox.test_devnullc                    s   ‡ fdd„}|S )Nc               	      s(   t ˆ ddd��} |  d¡ W 5 Q R X d S )NÚwúutf-8©ÚencodingZxxx)ÚopenÚwrite)Úf©Úpathr   r   Údo_write   s    z*TestSandbox._file_writer.<locals>.do_writer   )r   r   r   r   r   r      s    zTestSandbox._file_writerc                 C   s:   t  td¡}t d¡}tj |t|ƒ¡ |j	dks6t
‚dS )zT
        It should be possible to execute a setup.py with a Byte Order Mark
        zscript-with-bom.pyÚ	namespaceZpassedN)Úpkg_resourcesÚresource_filenameÚ__name__ÚtypesÚ
ModuleTyper   r   Ú	_execfileÚvarsÚresultÚAssertionError)r   Útargetr   r   r   r   Útest_setup_py_with_BOM   s    
z"TestSandbox.test_setup_py_with_BOMc              	   C   s@   |d }|  d¡�}| d¡ W 5 Q R X tj t|ƒtƒ ¡ d S )Nzsetup.pyÚwbs   "degenerate script"
)r   r   r   r   r    r   Úglobals)r   r   Úsetup_pyÚstreamr   r   r   Útest_setup_py_with_CRLF"   s    z#TestSandbox.test_setup_py_with_CRLFN)r   Ú
__module__Ú__qualname__r   Ústaticmethodr   r%   r*   r   r   r   r   r      s
   
	r   c                   @   sD   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dS )ÚTestExceptionSaverc              	   C   s"   t j ¡ � tdƒ‚W 5 Q R X d S ©NÚdetails)r   r   ÚExceptionSaverÚ
ValueError©r   r   r   r   Útest_exception_trapped*   s    z)TestExceptionSaver.test_exception_trappedc              	   C   sb   t j ¡ �}tdƒ‚W 5 Q R X t t¡�}| ¡  W 5 Q R X t|jtƒsLt	‚t
|jƒdks^t	‚d S r/   )r   r   r1   r2   ÚpytestÚraisesÚresumeÚ
isinstanceÚvaluer#   r   )r   Ú	saved_excÚcaughtr   r   r   Útest_exception_resumed.   s    z)TestExceptionSaver.test_exception_resumedc              	   C   sb   t dƒ}tj ¡ �
}|‚W 5 Q R X t t ¡�}| ¡  W 5 Q R X t|jt ƒsPt	‚|j|k	s^t	‚d S r/   )
r2   r   r   r1   r5   r6   r7   r8   r9   r#   )r   Zorig_excr:   r;   r   r   r   Útest_exception_reconstructed8   s    z/TestExceptionSaver.test_exception_reconstructedc              	   C   s"   t j ¡ �}W 5 Q R X | ¡  d S r   )r   r   r1   r7   )r   r:   r   r   r   Ú test_no_exception_passes_quietlyD   s    
z3TestExceptionSaver.test_no_exception_passes_quietlyc              	   C   sf   G dd„ dt ƒ}tj ¡ �}|dƒ‚W 5 Q R X t tjj¡�}| ¡  W 5 Q R X t|j	ƒdksbt
‚d S )Nc                   @   s   e Zd ZdZedœdd„ZdS )zFTestExceptionSaver.test_unpickleable_exception.<locals>.CantPickleThisz:This Exception is unpickleable because it's not in globals)Úreturnc                 S   s   d| j f S )NzCantPickleThis%r)Úargsr3   r   r   r   Ú__repr__N   s    zOTestExceptionSaver.test_unpickleable_exception.<locals>.CantPickleThis.__repr__N)r   r+   r,   Ú__doc__r   rA   r   r   r   r   ÚCantPickleThisK   s   rC   ÚdetailzCantPickleThis('detail',))Ú	Exceptionr   r   r1   r5   r6   ÚUnpickleableExceptionr7   r   r9   r#   )r   rC   r:   r;   r   r   r   Útest_unpickleable_exceptionJ   s    z.TestExceptionSaver.test_unpickleable_exceptionc              
   C   sh   G dd„ dt ƒ}t tjj¡�*}tj ¡ � tj ¡  |‚W 5 Q R X W 5 Q R X |jj	\}|dksdt
‚dS )z£
        As revealed in #440, an infinite recursion can occur if an unpickleable
        exception while setuptools is hidden. Ensure this doesn't happen.
        c                   @   s   e Zd ZdZdS )zaTestExceptionSaver.test_unpickleable_exception_when_hiding_setuptools.<locals>.ExceptionUnderTestzE
            An unpickleable exception (not in globals).
            N)r   r+   r,   rB   r   r   r   r   ÚExceptionUnderTest_   s   rH   zExceptionUnderTest()N)rE   r5   r6   r   r   rF   Úsave_modulesÚhide_setuptoolsr9   r@   r#   )r   rH   r;   Úmsgr   r   r   Ú2test_unpickleable_exception_when_hiding_setuptoolsY   s    

zETestExceptionSaver.test_unpickleable_exception_when_hiding_setuptoolsc                 C   sÌ   dd„ }t  tjj¡�H}tj ¡ �2 tj ¡  tj t|ƒ¡� |ƒ  W 5 Q R X W 5 Q R X W 5 Q R X |j	j
\}}}|dks~t‚|dksŠt‚|ddiksšt‚t|j	ƒ}d|ks°t‚d|ks¼t‚d|ksÈt‚d	S )
z°
        When in a sandbox with setuptools hidden, a SandboxViolation
        should reflect a proper exception and not be wrapped in
        an UnpickleableException.
        c                	   S   s   t dddd�� W 5 Q R X dS )z9Trigger a SandboxViolation by writing outside the sandboxú/etc/foor   r   r   N)r   r   r   r   r   Ú
write_files   s    zVTestExceptionSaver.test_sandbox_violation_raised_hiding_setuptools.<locals>.write_filer   )rM   r   r   r   z('/etc/foo', 'w')z{'encoding': 'utf-8'}N)r5   r6   r   r   ZSandboxViolationrI   rJ   r   r   r9   r@   r#   )r   r   rN   r;   Úcmdr@   ÚkwargsrK   r   r   r   Ú/test_sandbox_violation_raised_hiding_setuptoolsl   s    
$
zBTestExceptionSaver.test_sandbox_violation_raised_hiding_setuptoolsN)
r   r+   r,   r4   r<   r=   r>   rG   rL   rQ   r   r   r   r   r.   )   s   
r.   )	rB   r	   r   r5   r   Zsetuptools.sandboxr   r   r.   r   r   r   r   Ú<module>   s   