U
    ;gS                     @   s\  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' e(ed"e) Z*d#d$ Z+e!j,j-d%d&G d'd( d(eZ.G d)d* d*e.Z/e!j,j-d%d&G d+d, d,e.Z0e!j,j-d%d&G d-d. d.e.Z1G d/d0 d0e.Z2e!j,j3ed1d2G d3d4 d4e.Z4G d5d6 d6eZ5dS )7zFTests for psutil.net_connections() and Process.net_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_NET_CONNECTIONS_UNIX)SKIP_SYSCONS)PsutilTestCase)bind_socket)bind_unix_socket)check_connection_ntuple)create_sockets)filter_proc_net_connections)pytest)reap_children)retry_on_failure)skip_on_access_denied)tcp_socketpair)unix_socketpair)wait_for_fileSOCK_SEQPACKETc                 C   s$   t  j| d}| dkr t|S |S )Nkind)allunix)psutilProcessnet_connectionsr   )r#   cons r*   A/tmp/pip-unpacked-wheel-u0epr1ex/psutil/tests/test_connections.pythis_proc_net_connections2   s    r,   serial)namec                   @   s&   e Zd Zdd Zdd Zd	ddZdS )
ConnectionTestCasec                 C   s   t ddg kstd S Nr$   r"   r,   AssertionErrorselfr*   r*   r+   setUp;   s    zConnectionTestCase.setUpc                 C   s   t ddg kstd S r0   r1   r3   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 }|  |  ||ksbt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cr8   r*   r+   
<listcomp>Q   s     
 zBConnectionTestCase.compare_procsys_connections.<locals>.<listcomp>)r&   r(   ZAccessDeniedr	   sortr2   )r4   r9   Z	proc_consr#   Zsys_consr*   r8   r+   compare_procsys_connectionsB   s    z.ConnectionTestCase.compare_procsys_connectionsN)r$   )__name__
__module____qualname__r5   r6   r?   r*   r*   r*   r+   r/   9   s   r/   c                   @   s4   e Zd Zejjedddd Zdd Zdd Z	d	S )
TestBasicOperationsrequires rootreasonc              	   C   s0   t    tjddD ]}t| qW 5 Q R X d S r0   )r   r&   r(   r   r4   connr*   r*   r+   test_systemX   s    zTestBasicOperations.test_systemc              	   C   s.   t   tddD ]}t| qW 5 Q R X d S r0   )r   r,   r   rG   r*   r*   r+   test_process^   s    z TestBasicOperations.test_processc              	   C   sF   t t tdd W 5 Q R X t t tjdd W 5 Q R X d S )Nz???r"   )r   Zraises
ValueErrorr,   r&   r(   r3   r*   r*   r+   test_invalid_kindc   s    z%TestBasicOperations.test_invalid_kindN)
r@   rA   rB   r   markskipifr   rI   rJ   rL   r*   r*   r*   r+   rC   W   s   
rC   c                   @   s   e Zd ZdZdd Zdd Zdd Zejj	e
  dd	d
d Zdd Zejj	e
  dd	dd Zejj	e dd	dd Zejj	e dd	dd ZdS )TestUnconnectedSocketsz;Tests sockets which are open but not connected to anything.c                 C   st   t dd}tdd |D }ts$tr0||  S t|dks@t|d jdkrh||  j| ksht|d S d S )Nr$   r"   c                 S   s   g | ]}|j |fqS r*   )fdr:   r*   r*   r+   r=   p   s     z=TestUnconnectedSockets.get_conn_from_sock.<locals>.<listcomp>   r   r7   )r,   dictr
   r   filenolenr2   rP   )r4   sockr)   Zsmapr*   r*   r+   get_conn_from_sockn   s    
z)TestUnconnectedSockets.get_conn_from_sockc                 C   s   |  |}t| |jdkr.|j| ks.t|j|jks>t|j|tj	tj
ksXt| }|sztrzt|trz| }|jtkr|dd }|j|kst|jtkrtrt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).
        r7   N   r$   r"   )rV   r   rP   rS   r2   familytype
getsockoptsocket
SOL_SOCKETSO_TYPEgetsocknamer   
isinstancebytesdecoder   laddrr   r   r,   r?   osgetpid)r4   rU   rH   rb   r)   r*   r*   r+   check_socket{   s     



z#TestUnconnectedSockets.check_socketc              	   C   sN   d}t ttt|d.}| |}|jdks0t|jtj	ks@tW 5 Q R X d S N	127.0.0.1r   addrr*   )
r   r   r   r   re   raddrr2   statusr&   CONN_LISTENr4   rj   rU   rH   r*   r*   r+   test_tcp_v4   s
    
z"TestUnconnectedSockets.test_tcp_v4zIPv6 not supportedrE   c              	   C   sN   d}t ttt|d.}| |}|jdks0t|jtj	ks@tW 5 Q R X d S N)::1r   ri   r*   )
r   r   r   r   re   rk   r2   rl   r&   rm   rn   r*   r*   r+   test_tcp_v6   s
    
z"TestUnconnectedSockets.test_tcp_v6c              	   C   sN   d}t ttt|d.}| |}|jdks0t|jtj	ks@tW 5 Q R X d S rf   )
r   r   r   r   re   rk   r2   rl   r&   	CONN_NONErn   r*   r*   r+   test_udp_v4   s
    
z"TestUnconnectedSockets.test_udp_v4c              	   C   sN   d}t ttt|d.}| |}|jdks0t|jtj	ks@tW 5 Q R X d S rp   )
r   r   r   r   re   rk   r2   rl   r&   rs   rn   r*   r*   r+   test_udp_v6   s
    
z"TestUnconnectedSockets.test_udp_v6
POSIX onlyc              	   C   sP   |   }tt|td.}| |}|jdks2t|jtj	ksBtW 5 Q R X d S N)rY    

get_testfnr   r   r   re   rk   r2   rl   r&   rs   r4   testfnrU   rH   r*   r*   r+   test_unix_tcp   s
    
z$TestUnconnectedSockets.test_unix_tcpc              	   C   sP   |   }tt|td.}| |}|jdks2t|jtj	ksBtW 5 Q R X d S rw   ry   r{   r*   r*   r+   test_unix_udp   s
    
z$TestUnconnectedSockets.test_unix_udpN)r@   rA   rB   __doc__rV   re   ro   r   rM   rN   r   rr   rt   ru   r   r}   r~   r*   r*   r*   r+   rO   j   s   


rO   c                   @   sB   e Zd ZdZejjedddd Zejje	 dddd Z
d	S )
TestConnectedSocketzFTest socket pairs which are actually connected to
    each other.
    zunreliable on SUONSrE   c                 C   s   d}t ddg ksttt|d\}}zFt dd}t|dksBt|d jtjksVt|d jtjksjtW 5 |  |  X d S )Nrg   tcp4r"   ri   rW   r   rQ   )	r,   r2   r   r   closerT   rl   r&   ZCONN_ESTABLISHED)r4   rj   serverclientr)   r*   r*   r+   test_tcp   s    
zTestConnectedSocket.test_tcprv   c                 C   s  |   }t|\}}ztdd}|d jr<|d jr<t||d jrX|d jrXt|ts`trndd |D }t	|dks~tt
stststr|d jdkst|d jdkst||d jp|d jkstn|d jp|d j|kstW 5 |  |  X d S )	Nr%   r"   r   rQ   c                 S   s   g | ]}|j d kr|qS )z/var/run/log)rk   r:   r*   r*   r+   r=      s     
 z1TestConnectedSocket.test_unix.<locals>.<listcomp>rW   rx   )rz   r   r   r,   rb   rk   r2   r
   r   rT   r   r   r   )r4   r|   r   r   r)   r*   r*   r+   	test_unix   s     
 zTestConnectedSocket.test_unixN)r@   rA   rB   r   r   rM   rN   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              	   C   s   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                 S   sb   t | dD ] }|j|kst|j|ks
tq
ts^tj| dD ] }|j|ksNt|j|ks<tq<d S )Nr"   )r,   rX   r2   rY   r   r&   r(   )r#   familiestypesrH   r*   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   )r4   r   r*   r*   r+   test_filters  s*    	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ks8t|D ]}|j|	jkrh|||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<qd S )Nc                    s   d}t | |j|kst|j|ks(t|j|ks6t|j|ksDt|j|ksRt|D ]2}	| j|	d}
|	|kr||
g kstqV|
g ksVtqVtr 	| j
|g d S )N)
r$   r   r   inet6r   r   r   r   r   r   r"   )r   rX   r2   rY   rb   rk   rl   r(   r   r?   r9   )procrH   rX   rY   rb   rk   rl   kindsZ	all_kindsr#   r)   r3   r*   r+   
check_conn$  s    z+TestFilters.test_combos.<locals>.check_conna4  
            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(0.1) for x in range(100)]
            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(0.1) for x in range(100)]
            )dirrh   )rX   rj   r|   rq   T)deleterQ   r*   )r$   r   r   r   r   )r$   r   r   r   r   r9   )r$   r   r   r   r   )r$   r   r   r   r   )r   textwrapdedentrc   pathbasenamerz   getcwdformatintr   r   pyrunevalr    r   r&   r'   childrenr(   rT   r2   r9   r   rm   r   rs   getattr)r4   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)   rH   r*   r3   r+   test_combos   s    



        



zTestFilters.test_combosc              	   C   s  t   tdd}t|t r$dndks.t|D ]$}|jttfksHt|jt	ks2tq2tdd}t|dksrt|d jtkst|d jt	kstt rtdd}t|dkst|d jtkst|d jt	ksttdd}t|t rdndkst|D ]*}|jttfkst|jt
kstqtd	d}t|dksJt|d jtks^t|d jt
ksrtt rtd
d}t|dkst|d jtkst|d jt
ksttdd}t|t rdndkst|D ].}|jttfkst|jt	t
fkstqt rntdd}t|dks>t|D ]*}|jtksVt|jt	t
fksBtqBtrtststdd}t|dkst|D ]*}|jtkst|jt	t
fkstqW 5 Q R X d S )Nr   r"   rW   rQ   r   r   r   r   r   r   r      r   r%      )r   r,   rT   r   r2   rX   r   r   rY   r   r   r   r   r
   r   )r4   r)   rH   r*   r*   r+   
test_count  s\    









zTestFilters.test_countN)r@   rA   rB   r   r   r	   r   r   r*   r*   r*   r+   r      s
   
 r   rD   rE   c                   @   s&   e Zd ZdZdd Ze dd ZdS )TestSystemWideConnectionszTests for net_connections().c              	   C   s   dd }t  h ddlm} | D ]L\}}|dkr:ts:q$|\}}t|}t|tt|ksdt	|||| q$W 5 Q R X d S )Nc                 S   s<   | D ]2}|j |kst|j tkr.|j|ks.tt| qd S )N)rX   r2   r   rY   r   )r)   r   types_rH   r*   r*   r+   r     s
    
z0TestSystemWideConnections.test_it.<locals>.checkr   )	conn_tmapr%   )
r   psutil._commonr   itemsr   r&   r(   rT   setr2   )r4   r   r   r#   groupsr   r   r)   r*   r*   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 |kstt
 }
t|
d|kst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(0.1) for x in range(100)]
                c                    s   g | ]}|j  kr|qS r*   r8   r;   x)pidsr*   r+   r=     s    
 zFTestSystemWideConnections.test_multi_sockets_procs.<locals>.<listcomp>r$   r"   c                    s   g | ]}|j  kr|qS r*   r8   r   r8   r*   r+   r=   !  s     
 )r   rT   rangerz   appendr   r   r   r9   r    r&   r(   r2   r'   )r4   socksexpectedtimesfnames_fnamesrcZsprocZsysconsr   r*   )r9   r   r+   test_multi_sockets_procs  s,    





z2TestSystemWideConnections.test_multi_sockets_procsN)r@   rA   rB   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|ksLt||ksXt|| || qtr~tj	 tj
 trtj d S )NZCONN_)r   r&   
startswithr   strisupperr2   r   r   Z	CONN_IDLEZ
CONN_BOUNDr   ZCONN_DELETE_TCB)r4   Zintsstrsr.   numZstr_r*   r*   r+   test_net_connection_constants'  s     


z&TestMisc.test_net_connection_constantsN)r@   rA   rB   r   r*   r*   r*   r+   r   &  s   r   )6r   rc   r[   r   
contextlibr   r   r   r   r   r&   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   objectr!   r,   rM   Zxdist_groupr/   rC   rO   r   r   rN   r   r   r*   r*   r*   r+   <module>   sb   ]7 g?