o
    Zh                     @   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   sB   t jt| | tj W d    d S 1 sw   Y  d S N)
setuptoolssandboxDirectorySandboxstr_file_writerosdevnull)selftmpdir r   T/var/www/html/lang_env/lib/python3.10/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 d    d S 1 sw   Y  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sJ 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)r   targetr   r   r   r   test_setup_py_with_BOM   s   
z"TestSandbox.test_setup_py_with_BOMc                 C   sT   |d }| d}|d W d    n1 sw   Y  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1 sw   Y  d S Ndetails)r   r   ExceptionSaver
ValueErrorr   r   r   r   test_exception_trapped*   s   z)TestExceptionSaver.test_exception_trappedc                 C   s|   t j }td1 sw   Y  tt}|  W d    n1 s&w   Y  t|jts3J t	|jdks<J d S r.   )
r   r   r0   r1   pytestraisesresume
isinstancevaluer   )r   	saved_exccaughtr   r   r   test_exception_resumed.   s   
z)TestExceptionSaver.test_exception_resumedc                 C   s|   t d}tj }|1 sw   Y  tt }|  W d    n1 s(w   Y  t|jt s5J |j|us<J d S r.   )	r1   r   r   r0   r4   r5   r6   r7   r8   )r   Zorig_excr9   r:   r   r   r   test_exception_reconstructed8   s   
z/TestExceptionSaver.test_exception_reconstructedc                 C   s6   t j }W d    n1 sw   Y  |  d S r   )r   r   r0   r6   )r   r9   r   r   r    test_no_exception_passes_quietlyD   s   z3TestExceptionSaver.test_no_exception_passes_quietlyc                 C   s   G dd dt }tj }|d1 sw   Y  ttjj}|  W d    n1 s0w   Y  t|j	dks>J d S )Nc                   @   s   e Zd ZdZdef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 S )NCantPickleThis)argsr2   r   r   r   __repr__N   s   zOTestExceptionSaver.test_unpickleable_exception.<locals>.CantPickleThis.__repr__N)r   r*   r+   __doc__r   rA   r   r   r   r   r?   K   s    r?   detailzCantPickleThis('detail',))
	Exceptionr   r   r0   r4   r5   UnpickleableExceptionr6   r   r8   )r   r?   r9   r:   r   r   r   test_unpickleable_exceptionJ   s   
z.TestExceptionSaver.test_unpickleable_exceptionc              	   C   s   G dd dt }ttjj}tj  tj  |1 s w   Y  W d   n1 s/w   Y  |jj	\}|dks?J 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    rG   NzExceptionUnderTest())
rD   r4   r5   r   r   rE   save_moduleshide_setuptoolsr8   r@   )r   rG   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=}tj ( tj  tjt| |  W d   n1 s-w   Y  W d   n1 s<w   Y  W d   n1 sKw   Y  |j	j
\}}}|dks]J |dkscJ |ddikskJ t|j	}d|v svJ d|v s|J d	|v sJ 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   s4   t dddd	 W d   dS 1 sw   Y  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_fileNr   )rL   r   r   r   z('/etc/foo', 'w')z{'encoding': 'utf-8'})r4   r5   r   r   ZSandboxViolationrH   rI   r   r   r8   r@   )r   r   rM   r:   cmdr@   kwargsrJ   r   r   r   /test_sandbox_violation_raised_hiding_setuptoolsl   s&   

zBTestExceptionSaver.test_sandbox_violation_raised_hiding_setuptoolsN)
r   r*   r+   r3   r;   r<   r=   rF   rK   rP   r   r   r   r   r-   )   s    
r-   )	rB   r	   r   r4   r   Zsetuptools.sandboxr   r   r-   r   r   r   r   <module>   s    