B
    چ\P                 @   s8  d 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 ddlmZ ddlm	Z	 ddl
Z
ddl
mZ dd	l
mZ dd
l
mZ ddl
mZ ddl
mZ ddl
mZ ddl
mZ ddl
mZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlm Z  ddlm!Z! ddlm"Z" ddlm#Z# ddlm$Z$ ddlm%Z% dd lm&Z& dd!lm'Z' dd"lm(Z( dd#lm)Z) dd$lm*Z* e
+ Z,G d%d& d&e-Z.G d'd( d(e.e'j/Z0G d)d* d*e.e'j/Z1G d+d, d,e.e'j/Z2G d-d. d.e'j/Z3e4d/kr4e!e5 dS )0z;Tests for net_connections() and Process.connections() APIs.    N)closing)AF_INET)AF_INET6)
SOCK_DGRAM)SOCK_STREAM)FREEBSD)LINUX)MACOS)NETBSD)OPENBSD)POSIX)SUNOS)WINDOWS)supports_ipv6)PY3)AF_UNIX)bind_socket)bind_unix_socket)check_connection_ntuple)create_sockets)get_free_port)HAS_CONNECTIONS_UNIX)pyrun)reap_children)run_test_module_by_name)safe_rmpath)skip_on_access_denied)tcp_socketpair)TESTFN)TRAVIS)unittest)unix_socket_path)unix_socketpair)wait_for_filec               @   s8   e Zd Zdd Zdd Zdd Zddd	ZdddZdS )Basec             C   s(   t t ts$tjdd}|r$t|d S )Nall)kind)r   r   r
   thisprocconnectionsAssertionError)selfcons r,   <lib/python3.7/site-packages/psutil/tests/test_connections.pysetUp7   s    z
Base.setUpc             C   s.   t t t  ts*tjdd}|r*t|d S )Nr%   )r&   )r   r   r   r
   r'   r(   r)   )r*   r+   r,   r,   r-   tearDown>   s
    zBase.tearDownc             C   sr   t jdd}tdd |D }tr.||  S | t|d |d jdkrf| ||  j|  |d S d S )Nr%   )r&   c             S   s   g | ]}|j |fqS r,   )fd).0cr,   r,   r-   
<listcomp>I   s    z+Base.get_conn_from_sock.<locals>.<listcomp>   r   )r'   r(   dictr
   filenoassertEquallenr0   )r*   sockr+   Zsmapr,   r,   r-   get_conn_from_sockG   s    zBase.get_conn_from_sockNc             C   s   |dkr|  |}t| |jdkr6| |j|  | |j|j | |j|tj	tj
 | }|strt|tr| }|jtkr|dd }|jtkrtrn| |j| |jtkrtrtjdd}| t | |S )zGiven a socket, makes sure it matches the one obtained
        via psutil. It assumes this process created one connection
        only (the one supposed to be checked).
        Nr5      r%   )r&   )r;   r   r0   r8   r7   familytypeZ
getsockoptsocketZ
SOL_SOCKETZSO_TYPEZgetsocknamer   
isinstancebytesdecoder   r   r   laddrr   r'   r(   compare_procsys_connectionsosgetpid)r*   r:   connrC   r+   r,   r,   r-   check_socketT   s(    


zBase.check_socketr%   c                sd   yt j|d}W n  t jk
r0   tr*dS  Y nX  fdd|D }|  |  | || dS )zGiven a process PID and its list of connections compare
        those against system-wide connections retrieved via
        psutil.net_connections.
        )r&   Nc                s"   g | ]}|j  kr|d d qS )Nr5   )pid)r1   r2   )rI   r,   r-   r3      s    z4Base.compare_procsys_connections.<locals>.<listcomp>)psutilnet_connectionsZAccessDeniedr	   sortr8   )r*   rI   Z	proc_consr&   Zsys_consr,   )rI   r-   rD   x   s    z Base.compare_procsys_connections)N)r%   )__name__
__module____qualname__r.   r/   r;   rH   rD   r,   r,   r,   r-   r$   5   s
   	
$r$   c               @   s|   e Zd ZdZdd Zee  ddd Zdd Z	ee  dd	d
 Z
ee ddd Zee ddd ZdS )TestUnconnectedSocketsz;Tests sockets which are open but not connected to anything.c          	   C   sP   dt  f}tttt|d*}| |}|jr2t| |j	t
j W d Q R X d S )Nz	127.0.0.1)addr)r   r   r   r   r   rH   raddrr)   r8   statusrJ   CONN_LISTEN)r*   rQ   r:   rG   r,   r,   r-   test_tcp_v4   s
    


z"TestUnconnectedSockets.test_tcp_v4zIPv6 not supportedc          	   C   sP   dt  f}tttt|d*}| |}|jr2t| |j	t
j W d Q R X d S )Nz::1)rQ   )r   r   r   r   r   rH   rR   r)   r8   rS   rJ   rT   )r*   rQ   r:   rG   r,   r,   r-   test_tcp_v6   s
    


z"TestUnconnectedSockets.test_tcp_v6c          	   C   sP   dt  f}tttt|d*}| |}|jr2t| |j	t
j W d Q R X d S )Nz	127.0.0.1)rQ   )r   r   r   r   r   rH   rR   r)   r8   rS   rJ   	CONN_NONE)r*   rQ   r:   rG   r,   r,   r-   test_udp_v4   s
    


z"TestUnconnectedSockets.test_udp_v4c          	   C   sP   dt  f}tttt|d*}| |}|jr2t| |j	t
j W d Q R X d S )Nz::1)rQ   )r   r   r   r   r   rH   rR   r)   r8   rS   rJ   rW   )r*   rQ   r:   rG   r,   r,   r-   test_udp_v6   s
    


z"TestUnconnectedSockets.test_udp_v6z
POSIX onlyc          
   C   sV   t  F}tt|td*}| |}|jr.t| |jt	j
 W d Q R X W d Q R X d S )N)r>   )r!   r   r   r   rH   rR   r)   r8   rS   rJ   rW   )r*   namer:   rG   r,   r,   r-   test_unix_tcp   s
    

z$TestUnconnectedSockets.test_unix_tcpc          
   C   sV   t  F}tt|td*}| |}|jr.t| |jt	j
 W d Q R X W d Q R X d S )N)r>   )r!   r   r   r   rH   rR   r)   r8   rS   rJ   rW   )r*   rZ   r:   rG   r,   r,   r-   test_unix_udp   s
    

z$TestUnconnectedSockets.test_unix_udpN)rM   rN   rO   __doc__rU   r    skipIfr   rV   rX   rY   r   r[   r\   r,   r,   r,   r-   rP      s   rP   c               @   sT   e Zd ZdZeeddd Zee ddd Z	e
edd	d
 Zdd ZdS )TestConnectedSocketPairszJTest socket pairs which are are actually connected to
    each other.
    zunreliable on SUONSc             C   s   dt  f}tjddrttt|d\}}zHtjdd}| t|d | |d jt	j
 | |d jt	j
 W d |  |  X d S )Nz	127.0.0.1tcp4)r&   )rQ   r<   r   r4   )r   r'   r(   r)   r   r   r8   r9   rS   rJ   ZCONN_ESTABLISHEDclose)r*   rQ   serverclientr+   r,   r,   r-   test_tcp   s    
z!TestConnectedSocketPairs.test_tcpz
POSIX onlyc          	   C   sh  t  V}t|\}}z.tjdd}|d jr>|d jr>t|d jrV|d jrVttrhdd |D }| t	|d t
ststr| |d jd | |d jd | ||d jp|d j n~trxv|d j|d j|d j|d jfD ]}| |d qW n<| |d jp |d j| | |d jp>|d j| W d |  |  X W d Q R X d S )	Nunix)r&   r   r4   c             S   s   g | ]}|j d kr|qS )z/var/run/log)rR   )r1   r2   r,   r,   r-   r3      s    z6TestConnectedSocketPairs.test_unix.<locals>.<listcomp>r<    )r!   r"   r'   r(   rC   rR   r)   r
   r8   r9   r   r   r   r   ra   )r*   rZ   rb   rc   r+   rQ   r,   r,   r-   	test_unix   s*    
"z"TestConnectedSocketPairs.test_unix)Zonly_ifc                s   fdd}t d}t d}ddlm} tjt}||jt	t
d|d}||jt	t
d|d}||jt	td	|d}||jt	td	|d}	t|}
tt|}t|}tt|}t rt|}tt|}t|	}tt|}nd }d }d }d }xt D ]}| } t|d
 x|D ]}|j|
jkrX|||t
t|dtjd n|j|jkr|||t
t|dtjd nZ|jt|dd kr|||tt|dtjd n,|jt|dd kr,|||tt|dtjd q,W q
W  jt|jdd d S )Nc                s   d}t |  |j|  |j|  |j|  |j|  |j| x6|D ].}	| j|	d}
|	|krz|
stqX|
rXt|
qXW t	r 
| j|g d S )N)
r%   inetinet4inet6tcpr`   tcp6udpudp4udp6)r&   )r   r8   r=   r>   rC   rR   rS   r(   r)   r   rD   rI   )procrG   r=   r>   rC   rR   rS   ZkindsZ	all_kindsr&   r+   )r*   r,   r-   
check_conn  s    

z8TestConnectedSocketPairs.test_combos.<locals>.check_conna  
            import socket, time
            s = socket.socket($family, socket.SOCK_STREAM)
            s.bind(('$addr', 0))
            s.listen(1)
            with open('$testfn', 'w') as f:
                f.write(str(s.getsockname()[:2]))
            time.sleep(60)
        z
            import socket, time
            s = socket.socket($family, socket.SOCK_DGRAM)
            s.bind(('$addr', 0))
            with open('$testfn', 'w') as f:
                f.write(str(s.getsockname()[:2]))
            time.sleep(60)
        r   )Templatez	127.0.0.1)r=   rQ   Ztestfnz::1r4   r,   )r%   rh   ri   rk   r`   )r%   rh   ri   rm   rn   rI   )r%   rh   rj   rk   rl   )r%   rh   rj   rm   ro   z???)r&   )textwrapdedentstringrr   rE   pathbasenamer   Z
substituteintr   r   r   evalr#   r   r'   Zchildrenr(   r8   r9   rI   r   rJ   rT   r   rW   getattrassertRaises
ValueError)r*   rq   Ztcp_templateZudp_templaterr   ZtestfileZtcp4_templateZudp4_templateZtcp6_templateZudp6_templateZ	tcp4_procZ	tcp4_addrZ	udp4_procZ	udp4_addrZ	tcp6_procZ	tcp6_addrZ	udp6_procZ	udp6_addrpr+   rG   r,   )r*   r-   test_combos  sb    
z$TestConnectedSocketPairs.test_combosc          	   C   s  t  }tjdd}| t|t| tjdd}| t|t rJdnd x,|D ]$}| |jtt	f | |j
t qVW tjdd}| t|d | |d jt | |d j
t t rtjdd}| t|d | |d jt	 | |d j
t tjd	d}| t|t r(dnd x.|D ]&}| |jtt	f | |j
t q4W tjd
d}| t|d | |d jt | |d j
t t rtjdd}| t|d | |d jt	 | |d j
t tjdd}| t|t rdnd x2|D ]*}| |jtt	f | |j
ttf qW t rtjdd}| t|d x.|D ]&}| |jt	 | |j
ttf qlW trtjdd}| t|d x.|D ]&}| |jt | |j
ttf qW W d Q R X d S )Nr%   )r&   rk   r<   r4   r`   r   rl   rm   rn   ro   rh      rj   re      )r   r'   r(   r8   r9   r   assertInr=   r   r   r>   r   r   r   r   )r*   socksr+   rG   r,   r,   r-   test_multi_sockets_filteringg  s`    





z5TestConnectedSocketPairs.test_multi_sockets_filteringN)rM   rN   rO   r]   r    r^   r   rd   r   rg   r   r	   r~   r   r,   r,   r,   r-   r_      s
   !br_   c               @   sJ   e Zd ZdZe dd Ze dd Ze ee	o6e
ddd Zd	S )
TestSystemWideConnectionszTests for net_connections().c          	      s    fdd}t  ~ ddlm} xX| D ]L\}}|dkr@ts@q*|\}}t|} t|tt	| |||| q*W  j
ttjdd W d Q R X d S )Nc                sV   t tdt }xB| D ]:} j|j||d |j|krF j|j||d t| qW d S )Nr   )msg)rz   r?   objectr   r=   r>   r   )r+   familiestypes_r   rG   )r*   r,   r-   check  s    

z0TestSystemWideConnections.test_it.<locals>.checkr   )	conn_tmapre   z???)r&   )r   psutil._commonr   itemsr   rJ   rK   r8   r9   setr{   r|   )r*   r   r   r&   groupsr   r   r+   r,   )r*   r-   test_it  s    
z!TestSystemWideConnections.test_itc          	   C   s@   t  0}dd tjddD }| t|t| W d Q R X d S )Nc             S   s   g | ]}|j t kr|qS r,   )rI   rE   rF   )r1   xr,   r,   r-   r3     s    z>TestSystemWideConnections.test_multi_socks.<locals>.<listcomp>r%   )r&   )r   rJ   rK   r8   r9   )r*   r   r+   r,   r,   r-   test_multi_socks  s    z*TestSystemWideConnections.test_multi_sockszunreliable on MACOS + TRAVISc       
   	      s  t  }t|}W d Q R X g d}xRt|D ]F}tjtt| }t	d| }t
|}|j | t| q,W x$t|D ]}tt| }t| qW fddtjddD }xJD ]B | t fdd|D | t }	| t|	d| qW d S )N
   a                  import time, os
                from psutil.tests import create_sockets
                with create_sockets():
                    with open(r'%s', 'w') as f:
                        f.write(str(os.getpid()))
                    time.sleep(60)
                c                s   g | ]}|j  kr|qS r,   )rI   )r1   r   )pidsr,   r-   r3     s    zFTestSystemWideConnections.test_multi_sockets_procs.<locals>.<listcomp>r%   )r&   c                s   g | ]}|j  kr|qS r,   )rI   )r1   r   )rI   r,   r-   r3     s    )r   r9   rangerE   rv   realpathr   strrs   rt   r   appendrI   Z
addCleanupr   r#   rJ   rK   r8   Processr(   )
r*   r   ZexpectedtimesifnamesrcZsprocZsysconsr}   r,   )rI   r   r-   test_multi_sockets_procs  s(    



z2TestSystemWideConnections.test_multi_sockets_procsN)rM   rN   rO   r]   r   r   r   r    r^   r	   r   r   r,   r,   r,   r-   r     s
   r   c               @   s   e Zd Zdd ZdS )TestMiscc             C   s   g }g }xht tD ]\}|drtt|}t|}| sBt|| t| | || || || qW t	rtj
 tj trtj d S )NZCONN_)dirrJ   
startswithrz   r   isupperr)   ZassertNotInr   r   Z	CONN_IDLEZ
CONN_BOUNDr   ZCONN_DELETE_TCB)r*   ZintsZstrsrZ   ZnumZstr_r,   r,   r-   test_connection_constants  s     


z"TestMisc.test_connection_constantsN)rM   rN   rO   r   r,   r,   r,   r-   r     s   r   __main__)6r]   rE   r?   rs   
contextlibr   r   r   r   r   rJ   r   r   r	   r
   r   r   r   r   r   r   Zpsutil._compatr   Zpsutil.testsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r   r'   r   r$   ZTestCaserP   r_   r   r   rM   __file__r,   r,   r,   r-   <module>   s^   ]7 `P
