U
    luf#                     @   sf   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Zd dlZd dl	Z	G dd de	j
ZdS )    N)Popen)mkdtempc                   @   sN   e Zd Zdd Zdd ZdddZdd	 Zd
d Zdd Zdd Z	dd Z
dS )AutoreloadTestc                 C   s    d| _ t | _| ddi d S )Ni   zrun_twice_magic.pya  
                    import os
                    import sys

                    import tornado.autoreload

                    sys.stdout.flush()

                    if "TESTAPP_STARTED" not in os.environ:
                        os.environ["TESTAPP_STARTED"] = "1"
                        tornado.autoreload._reload()
                    else:
                        os._exit(0)
                )ZmaxDiffr   pathwrite_filesself r	   @/tmp/pip-unpacked-wheel-bmg6zs32/tornado/test/autoreload_test.pysetUp   s    	 zAutoreloadTest.setUpc                 C   s@   zt | j W n* tk
r:   td t | j Y nX d S )N   )shutilrmtreer   OSErrortimesleepr   r	   r	   r
   tearDown-   s
    
zAutoreloadTest.tearDownNc              
   C   s   |dkr| j }| D ]r\}}t|trTttj || | |tj || qttj ||ddd}|	t
| W 5 Q R X qdS )zWrite a directory tree to self.path.

        tree is a dictionary mapping file names to contents, or
        sub-dictionaries representing subdirectories.
        Nwutf-8)encoding)r   items
isinstancedictosmkdirjoinr   openwritetextwrapdedent)r   tree	base_pathnamecontentsfr	   r	   r
   r   9   s    
zAutoreloadTest.write_filesc                 C   s   t  }dt jkr&|t jt jd  7 }t|tjtt j|d| jddd}t	dD ]}|
 d k	rd qtd qP|  td| d	 }| |jd	 |S )
N
PYTHONPATH)r%   Tr   )stdoutenvcwduniversal_newlinesr   (   g?zsubprocess failed to terminater   )r   getcwdenvironpathsepr   
subprocessPIPEr   r   rangepollr   r   kill	ExceptioncommunicateassertEqual
returncode)r   args
pythonpathpioutr	   r	   r
   run_subprocessI   s(    
zAutoreloadTest.run_subprocessc                 C   s$  d}|  dd|di dD ] }| j|d | jdd> |rPtjd	d
g}ntjg}| |d	dg }| |d W 5 Q R X | jdd8 | |dg }|rdnd}| || dd  W 5 Q R X | jdd8 | |dg }|rdnd}| || dd  W 5 Q R X W 5 Q R X qd S )Na  import sys

# In module mode, the path is set to the parent directory and we can import testapp.
try:
    import testapp
except ImportError:
    print("import testapp failed")
else:
    print("import testapp succeeded")

spec = getattr(sys.modules[__name__], '__spec__', None)
print(f"Starting {__name__=}, __spec__.name={getattr(spec, 'name', None)}")
exec(open("run_twice_magic.py").read())
testapp z__init__.pyz__main__.py)FT)wrappermodule)mode-mtornado.autoreloadzimport testapp succeeded
Starting __name__='__main__', __spec__.name=testapp.__main__
import testapp succeeded
Starting __name__='__main__', __spec__.name=testapp.__main__
fileztestapp/__main__.pyzimport testapp succeededzimport testapp failedz2
Starting __name__='__main__', __spec__.name=None
   	directoryz6
Starting __name__='__main__', __spec__.name=__main__
)r   ZsubTestsys
executabler<   r5   )r   mainr@   Z	base_argsr;   Zexpect_importr	   r	   r
   test_reloadg   sV    
	zAutoreloadTest.test_reloadc                 C   s>   d}|  dd|di | tjddddg}| |d d S )Nzimport sys

# This import will fail if path is not set up correctly
import testapp

if 'tornado.autoreload' not in sys.modules:
    raise Exception('started without autoreload wrapper')

print('Starting')
exec(open("run_twice_magic.py").read())
r=   r>   r?   rC   rD   zStarting
Starting
r   r<   rH   rI   r5   r   rJ   r;   r	   r	   r
    test_reload_wrapper_preservation   s    	z/AutoreloadTest.test_reload_wrapper_preservationc              
   C   s>   d}|  d|i | tjdddddddg}| |d d S )	Nzimport os
import sys

print(os.path.basename(sys.argv[0]))
print(f'argv={sys.argv[1:]}')
exec(open("run_twice_magic.py").read())
main.pyrC   rD   Zarg1z--arg2Zarg3z\main.py
argv=['arg1', '--arg2', '-m', 'arg3']
main.py
argv=['arg1', '--arg2', '-m', 'arg3']
rL   rM   r	   r	   r
   test_reload_wrapper_args   s    	z'AutoreloadTest.test_reload_wrapper_argsc                 C   s8   d}|  d|i | tjddddg}| |d d S )Nzimport os
import sys

if "TESTAPP_STARTED" in os.environ:
    print("exiting cleanly")
    sys.exit(0)
else:
    print("reloading")
    exec(open("run_twice_magic.py").read())
rO   rC   rD   z--until-successzreloading
exiting cleanly
rL   rM   r	   r	   r
   !test_reload_wrapper_until_success   s    z0AutoreloadTest.test_reload_wrapper_until_success)N)__name__
__module____qualname__r   r   r   r<   rK   rN   rP   rQ   r	   r	   r	   r
   r      s    
Qr   )r   r   r.   r   rH   tempfiler   r   r   ZunittestZTestCaser   r	   r	   r	   r
   <module>   s   