U
    (crS                     @   sT  d Z ddl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' e( Z)e*ed!e+ Z,e#G d"d# d#eZ-G d$d% d%e-Z.e#G d&d' d'e-Z/e#G d(d) d)e-Z0G d*d+ d+e-Z1e2ed,G d-d. d.e-Z3G d/d0 d0eZ4e5d1krPdd2l6m7Z7 e7e8 dS )3z;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)HAS_CONNECTIONS_UNIX)SKIP_SYSCONS)PsutilTestCase)bind_socket)bind_unix_socket)check_connection_ntuple)create_sockets)reap_children)retry_on_failure)	serialrun)skip_on_access_denied)tcp_socketpair)unix_socketpair)wait_for_fileSOCK_SEQPACKETc                   @   s&   e Zd Zdd Zdd Zd	ddZdS )
ConnectionTestCasec                 C   s$   t s ts tjdd}|r t|d S Nallkind)r
   r   thisprocconnectionsAssertionErrorselfcons r,   A/tmp/pip-unpacked-wheel-l83rk7k5/psutil/tests/test_connections.pysetUp6   s    zConnectionTestCase.setUpc                 C   s$   t s ts tjdd}|r t|d S r"   )r   r
   r&   r'   r(   r)   r,   r,   r-   tearDown<   s    zConnectionTestCase.tearDownr#   c                    sf   zt j|d}W n" t jk
r2   tr,Y 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 )Npid.0cr1   r,   r-   
<listcomp>R   s     
 zBConnectionTestCase.compare_procsys_connections.<locals>.<listcomp>)psutilnet_connectionsZAccessDeniedr	   sortassertEqual)r*   r2   Z	proc_consr%   Zsys_consr,   r1   r-   compare_procsys_connectionsC   s    z.ConnectionTestCase.compare_procsys_connectionsN)r#   )__name__
__module____qualname__r.   r/   r;   r,   r,   r,   r-   r!   3   s   r!   c                   @   s0   e Zd Zeeddd Zdd Zdd ZdS )	TestBasicOperationsrequires rootc              	   C   s0   t    tjddD ]}t| qW 5 Q R X d S r"   )r   r7   r8   r   r*   connr,   r,   r-   test_systemZ   s    zTestBasicOperations.test_systemc              	   C   s4   t  $ t jddD ]}t| qW 5 Q R X d S r"   )r   r7   Processr'   r   rA   r,   r,   r-   test_process`   s    z TestBasicOperations.test_processc                 C   s(   | j ttjdd | j ttjdd d S )Nz???r$   )assertRaises
ValueErrorr&   r'   r7   r8   r*   r,   r,   r-   test_invalid_kinde   s    z%TestBasicOperations.test_invalid_kindN)	r<   r=   r>   unittestskipIfr   rC   rE   rI   r,   r,   r,   r-   r?   X   s   

r?   c                   @   s   e Zd ZdZdd Zd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   sv   t jdd}tdd |D }ts&tr2||  S | t|d |d jdkrj| ||  j|  |d S d S )Nr#   r$   c                 S   s   g | ]}|j |fqS r,   )fdr3   r,   r,   r-   r6   p   s     z=TestUnconnectedSockets.get_conn_from_sock.<locals>.<listcomp>   r   r0   )	r&   r'   dictr
   r   filenor:   lenrM   )r*   sockr+   Zsmapr,   r,   r-   get_conn_from_sockn   s    z)TestUnconnectedSockets.get_conn_from_sockc                 C   s   |  |}t| |jdkr.| |j|  | |j|j | |j|tj	tj
 | }|sztrzt|trz| }|jtkr|dd }|jtkrtrn| |j| |jtkrtrtjdd}| jt |dd |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).
        r0   N   r#   r$   )rS   r   rM   r:   rP   familytype
getsockoptsocket
SOL_SOCKETSO_TYPEgetsocknamer   
isinstancebytesdecoder   r   r   laddrr   r&   r'   r;   osgetpid)r*   rR   rB   r_   r+   r,   r,   r-   check_socket{   s*    

 
z#TestUnconnectedSockets.check_socketc              	   C   sJ   d}t ttt|d*}| |}|jr,t| |jt	j
 W 5 Q R X d S N	127.0.0.1r   addr)r   r   r   r   rb   raddrr(   r:   statusr7   CONN_LISTENr*   rg   rR   rB   r,   r,   r-   test_tcp_v4   s
    

z"TestUnconnectedSockets.test_tcp_v4zIPv6 not supportedc              	   C   sJ   d}t ttt|d*}| |}|jr,t| |jt	j
 W 5 Q R X d S N)::1r   rf   )r   r   r   r   rb   rh   r(   r:   ri   r7   rj   rk   r,   r,   r-   test_tcp_v6   s
    

z"TestUnconnectedSockets.test_tcp_v6c              	   C   sJ   d}t ttt|d*}| |}|jr,t| |jt	j
 W 5 Q R X d S rc   )r   r   r   r   rb   rh   r(   r:   ri   r7   	CONN_NONErk   r,   r,   r-   test_udp_v4   s
    

z"TestUnconnectedSockets.test_udp_v4c              	   C   sJ   d}t ttt|d*}| |}|jr,t| |jt	j
 W 5 Q R X d S rm   )r   r   r   r   rb   rh   r(   r:   ri   r7   rp   rk   r,   r,   r-   test_udp_v6   s
    

z"TestUnconnectedSockets.test_udp_v6
POSIX onlyc              	   C   sL   |   }tt|td*}| |}|jr.t| |jt	j
 W 5 Q R X d S N)rV   
get_testfnr   r   r   rb   rh   r(   r:   ri   r7   rp   r*   testfnrR   rB   r,   r,   r-   test_unix_tcp   s
    

z$TestUnconnectedSockets.test_unix_tcpc              	   C   sL   |   }tt|td*}| |}|jr.t| |jt	j
 W 5 Q R X d S rt   ru   rw   r,   r,   r-   test_unix_udp   s
    

z$TestUnconnectedSockets.test_unix_udpN)r<   r=   r>   __doc__rS   rb   rl   rJ   rK   r   ro   rq   rr   r   ry   rz   r,   r,   r,   r-   rL   j   s   #


rL   c                   @   s:   e Zd ZdZeeddd Zee ddd Z	dS )	TestConnectedSocketzJTest socket pairs which are are actually connected to
    each other.
    zunreliable on SUONSc                 C   s   d}t jddrttt|d\}}zHt jdd}| t|d | |d jt	j
 | |d jt	j
 W 5 |  |  X d S )Nrd   tcp4r$   rf   rT   r   rN   )r&   r'   r(   r   r   closer:   rQ   ri   r7   ZCONN_ESTABLISHED)r*   rg   serverclientr+   r,   r,   r-   test_tcp   s    zTestConnectedSocket.test_tcprs   c                 C   s`  |   }t|\}}z2tjdd}|d jr<|d jr<t|d jrT|d jrTtts\t	rjdd |D }| j
t|d|d tst	str| 
|d jd	 | 
|d jd	 | 
||d jp|d j nztr
|d j|d j|d j|d jfD ]}| 
|d	 qn<| 
|d jp"|d j| | 
|d jp@|d j| W 5 |  |  X d S )
Nunixr$   r   rN   c                 S   s   g | ]}|j d kr|qS )z/var/run/log)rh   r3   r,   r,   r-   r6      s     
 z1TestConnectedSocket.test_unix.<locals>.<listcomp>rT   msg )rv   r   r~   r&   r'   r_   rh   r(   r
   r   r:   rQ   r   r   r   )r*   rx   r   r   r+   rg   r,   r,   r-   	test_unix   s.     "zTestConnectedSocket.test_unixN)
r<   r=   r>   r{   rJ   rK   r   r   r   r   r,   r,   r,   r-   r|      s
   

r|   c                   @   s.   e Zd Zdd Zeeddd Zdd ZdS )	TestFiltersc              	      s    fdd}t   |dtttgtttg |dttgttg |dtgttg |dttgtg |dtgtg |dtgtg |d	ttgtg |d
tgtg |dtgtg tr|dtgtttg W 5 Q R X d S )Nc                    sd   t j| dD ] } |j|  |j| qts`tj| dD ] } |j|  |j| q>d S )Nr$   )r&   r'   assertInrU   rV   r   r7   r8   )r%   familiestypesrB   rH   r,   r-   check  s    z'TestFilters.test_filters.<locals>.checkr#   inetinet4tcpr}   tcp6udpudp4udp6r   )r   r   r   r   r   r   r    r   )r*   r   r,   rH   r-   test_filters  sV    	zTestFilters.test_filters)Zonly_ifc                    s  t    fdd}td}td}tj jt d}|jt	t
d|d}|jt	t
d|d}|jt	td|d}|jt	td|d} |}	tt|d	d
}
 |}tt|d	d
}t r |}tt|d	d
} |}tt|d	d
}nd }d }d }d }t D ]}| } t|d |D ]}|j|	jkrb|||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r6|||tt|dtjd q6qd S )Nc                    s   d}t |  |j|  |j|  |j|  |j|  |j| |D ].}	| j|	d}
|	|krx|
stqV|
rVt|
qVt	r 
| j|g d S )N)
r#   r   r   inet6r   r}   r   r   r   r   r$   )r   r:   rU   rV   r_   rh   ri   r'   r(   r   r;   r2   )procrB   rU   rV   r_   rh   ri   kindsZ	all_kindsr%   r+   rH   r,   r-   
check_conn<  s    
z+TestFilters.test_combos.<locals>.check_conna  
            import socket, time
            s = socket.socket({family}, socket.SOCK_STREAM)
            s.bind(('{addr}', 0))
            s.listen(5)
            with open('{testfn}', 'w') as f:
                f.write(str(s.getsockname()[:2]))
            time.sleep(60)
            a  
            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)
            )dirre   )rU   rg   rx   rn   T)deleterN   r,   )r#   r   r   r   r}   )r#   r   r   r   r   r2   )r#   r   r   r   r   )r#   r   r   r   r   )r   textwrapdedentr`   pathbasenamerv   getcwdformatintr   r   pyrunevalr   r   r&   childrenr'   r:   rQ   r2   r   r7   rj   r   rp   getattr)r*   r   Ztcp_templateZudp_templateZ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+   rB   r,   rH   r-   test_combos8  s|    



        



zTestFilters.test_combosc              	   C   s  t   tjdd}| t|t r*dnd |D ]$}| |jtt	f | |j
t q4t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 |D ]&}| |jtt	f | |j
t q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 rdnd |D ]*}| |jtt	f | |j
ttf qt rdtjdd}| t|d |D ]&}| |jt	 | |j
ttf q<trtststjdd}| t|d |D ]&}| |jt | |j
ttf qW 5 Q R X d S )Nr   r$   rT   rN   r}   r   r   r   r   r   r      r   r      )r   r&   r'   r:   rQ   r   r   rU   r   r   rV   r   r   r   r   r
   r   )r*   r+   rB   r,   r,   r-   
test_count  s\    
zTestFilters.test_countN)r<   r=   r>   r   r   r	   r   r   r,   r,   r,   r-   r     s   +
`r   r@   c                   @   s&   e Zd ZdZdd Ze dd ZdS )TestSystemWideConnectionszTests for net_connections().c              	      s    fdd}t  h ddlm} | D ]L\}}|dkr>ts>q(|\}}t|} t|tt	| |||| q(W 5 Q R X d S )Nc                    sD   | D ]:} j |j||d |jtkr6 j |j||d t| qd S )Nr   )r   rU   r   rV   r   )r+   r   types_rB   rH   r,   r-   r     s
    
z0TestSystemWideConnections.test_it.<locals>.checkr   )	conn_tmapr   )
r   psutil._commonr   itemsr   r7   r8   r:   rQ   set)r*   r   r   r%   groupsr   r   r+   r,   rH   r-   test_it  s    
z!TestSystemWideConnections.test_itc              	      s   t  }t|}W 5 Q R X g d}g }t|D ]:}|  }|| td| }| |}|j q.|D ]}t	| qnfddt
jddD }	D ]B | t fdd|	D | t
 }
| t|
d| qd S )N
   a                  import time, os
                from psutil.tests import create_sockets
                with create_sockets():
                    with open(r'%s', 'w') as f:
                        f.write("hello")
                    time.sleep(60)
                c                    s   g | ]}|j  kr|qS r,   r1   r4   x)pidsr,   r-   r6   
  s
      zFTestSystemWideConnections.test_multi_sockets_procs.<locals>.<listcomp>r#   r$   c                    s   g | ]}|j  kr|qS r,   r1   r   r1   r,   r-   r6     s     
 )r   rQ   rangerv   appendr   r   r   r2   r   r7   r8   r:   rD   r'   )r*   socksexpectedtimesfnamesifnamesrcZsprocZsysconsr   r,   )r2   r   r-   test_multi_sockets_procs  s,    



z2TestSystemWideConnections.test_multi_sockets_procsN)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 }t tD ]\}|drtt|}t|}| s@t|| t| | || || || qt	r~tj
 tj trtj d S )NZCONN_)r   r7   
startswithr   strisupperr(   ZassertNotInr   r   Z	CONN_IDLEZ
CONN_BOUNDr   ZCONN_DELETE_TCB)r*   ZintsstrsnamenumZstr_r,   r,   r-   test_connection_constants  s     


z"TestMisc.test_connection_constantsN)r<   r=   r>   r   r,   r,   r,   r-   r     s   r   __main__)run_from_name)9r{   r`   rX   r   rJ   
contextlibr   r   r   r   r   r7   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   rD   r&   r   objectr    r!   r?   rL   r|   r   rK   r   r   r<   Zpsutil.tests.runnerr   __file__r,   r,   r,   r-   <module>   sh   $b= J
>
