U
    ‰þV]  ã                   @   st   d 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e e¡Z	G dd„ dej
ƒZG dd„ dƒZG dd„ dej
ƒZdS )	a  
Utilities helpful for writing tests

Provides a UnixSocketServerThread that creates a running server, listening on a
newly created unix socket.

Example usage:

.. code-block:: python

    def test_unix_domain_adapter_monkeypatch():
        with UnixSocketServerThread() as usock_thread:
            with requests_unixsocket.monkeypatch('http+unix://'):
                urlencoded_usock = quote_plus(usock_process.usock)
                url = 'http+unix://%s/path/to/page' % urlencoded_usock
                r = requests.get(url)
é    Nc                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )Ú
KillThreadc                    s   t t| ƒj||Ž || _d S ©N)Úsuperr   Ú__init__Úserver)Úselfr   ÚargsÚkwargs©Ú	__class__© ú?/usr/lib/python3/dist-packages/requests_unixsocket/testutils.pyr      s    zKillThread.__init__c                 C   s$   t  d¡ t d¡ | jj ¡  d S )Né   ZSleeping)ÚtimeÚsleepÚloggerÚdebugr   Ú_mapÚclear©r   r   r   r   Úrun#   s    

zKillThread.run)Ú__name__Ú
__module__Ú__qualname__r   r   Ú__classcell__r   r   r
   r   r      s   r   c                   @   s   e Zd ZdZdd„ ZdS )ÚWSGIAppNc                 C   sh   t  d|d ¡ t  d|¡ d}dd|d fd|d	 fd
|d fg}d}|||ƒ t  d|||¡ |gS )Nz WSGIApp.__call__: Invoked for %sZ	PATH_INFOzWSGIApp.__call__: environ = %rz200 OK)zX-Transportzunix domain socketzX-Socket-PathZSERVER_PORTzX-Requested-Query-StringZQUERY_STRINGzX-Requested-Paths   Hello world!zZWSGIApp.__call__: Responding with status_text = %r; response_headers = %r; body_bytes = %r)r   r   )r   ÚenvironZstart_responseZstatus_textZresponse_headersZ
body_bytesr   r   r   Ú__call__,   s"    


ü
  ûzWSGIApp.__call__)r   r   r   r   r   r   r   r   r   r   )   s   r   c                       s<   e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Zd	d
„ Z‡  ZS )ÚUnixSocketServerThreadc                    s0   t t| ƒj||Ž |  ¡ | _d | _t ¡ | _d S r   )	r   r   r   Úget_tempfile_nameÚusockr   Ú	threadingZEventÚserver_ready_event)r   r   r	   r
   r   r   r   A   s    
zUnixSocketServerThread.__init__c                 C   s,   t  t¡jt  ¡ t ¡ jdd … f}d| S )Niøÿÿÿz/tmp/test_requests.%s_%s_%s)ÚosÚstatÚ__file__Úst_inoÚgetpidÚuuidZuuid4Úhex©r   r   r   r   r   r   G   s    $z(UnixSocketServerThread.get_tempfile_namec                 C   sD   t  d| ¡ tƒ }tj|| jd}||_|| _| j ¡  | 	¡  d S )NzCall waitress.serve in %r ...)Zunix_socket)
r   r   r   ÚwaitressZcreate_serverr    r   r"   Úsetr   )r   Zwsgi_appr   r   r   r   r   N   s    
zUnixSocketServerThread.runc                 C   s0   t  d|  ¡ |  ¡  t  d| ¡ | j ¡  | S )NzStarting %r ...zStarted %r.)r   r   Ústartr"   Úwaitr   r   r   r   Ú	__enter__W   s
    
z UnixSocketServerThread.__enter__c                 G   s"   | j  ¡  | jrt| jƒ ¡  d S r   )r"   r.   r   r   r-   r*   r   r   r   Ú__exit__^   s    
zUnixSocketServerThread.__exit__)	r   r   r   r   r   r   r/   r0   r   r   r   r
   r   r   @   s
   	r   )Ú__doc__Zloggingr#   r!   r   r(   r+   Z	getLoggerr   r   ZThreadr   r   r   r   r   r   r   Ú<module>   s   
