o
    aS                     @   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
( 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 d0d1 d1eZ4e5d2kr,dd3l6m7Z7 e7e8 dS dS )4z;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)unittest)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   ,   t ststjdd}|rJ |d S d S d S Nallkind)r
   r   thisprocconnectionsselfcons r-   ?/usr/lib/python3/dist-packages/psutil/tests/test_connections.pysetUp6   s
   zConnectionTestCase.setUpc                 C   r#   r$   )r   r
   r(   r)   r*   r-   r-   r.   tearDown<   s
   zConnectionTestCase.tearDownr%   c                    s`   zt j|d}W n t jy   trY dS  w  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cr2   r-   r.   
<listcomp>R   s   " zBConnectionTestCase.compare_procsys_connections.<locals>.<listcomp>)psutilnet_connectionsZAccessDeniedr	   sortassertEqual)r+   r3   Z	proc_consr'   Zsys_consr-   r2   r.   compare_procsys_connectionsC   s   z.ConnectionTestCase.compare_procsys_connectionsN)r%   )__name__
__module____qualname__r/   r0   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   sF   t   tjddD ]}t| q
W d    d S 1 sw   Y  d S r$   )r   r8   r9   r   r+   connr-   r-   r.   test_systemZ   s
   
"zTestBasicOperations.test_systemc                 C   sJ   t   t jddD ]}t| qW d    d S 1 sw   Y  d S r$   )r   r8   Processr)   r   rB   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&   )ZassertRaises
ValueErrorr(   r)   r8   r9   r+   r-   r-   r.   test_invalid_kinde   s   z%TestBasicOperations.test_invalid_kindN)	r=   r>   r?   r   skipIfr   rD   rF   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   sr   t jdd}tdd |D }tstr||  S | t|d |d jdkr5| ||  j|  |d S )Nr%   r&   c                 S   s   g | ]}|j |fqS r-   )fdr4   r-   r-   r.   r7   p   s    z=TestUnconnectedSockets.get_conn_from_sock.<locals>.<listcomp>   r   r1   )	r(   r)   dictr
   r   filenor;   lenrL   )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
 | }|s=tr=t|tr=| }|jtkrH|dd }|jtkrPtrPn| |j| |jtkrntrnt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).
        r1   N   r%   r&   )rR   r   rL   r;   rO   familytypeZ
getsockoptsocketZ
SOL_SOCKETZSO_TYPEZgetsocknamer   
isinstancebytesdecoder   r   r   laddrr   r(   r)   r<   osgetpid)r+   rQ   rC   rZ   r,   r-   r-   r.   check_socket{   s(   


z#TestUnconnectedSockets.check_socketc                 C   `   d}t ttt|d}| |}|jrJ | |jtj	 W d    d S 1 s)w   Y  d S N	127.0.0.1r   addr)
r   r   r   r   r]   raddrr;   statusr8   CONN_LISTENr+   rc   rQ   rC   r-   r-   r.   test_tcp_v4      

"z"TestUnconnectedSockets.test_tcp_v4zIPv6 not supportedc                 C   r^   N)::1r   rb   )
r   r   r   r   r]   rd   r;   re   r8   rf   rg   r-   r-   r.   test_tcp_v6      

"z"TestUnconnectedSockets.test_tcp_v6c                 C   r^   r_   )
r   r   r   r   r]   rd   r;   re   r8   	CONN_NONErg   r-   r-   r.   test_udp_v4   ri   z"TestUnconnectedSockets.test_udp_v4c                 C   r^   rj   )
r   r   r   r   r]   rd   r;   re   r8   rn   rg   r-   r-   r.   test_udp_v6   rm   z"TestUnconnectedSockets.test_udp_v6
POSIX onlyc                 C   b   |   }tt|td}| |}|jrJ | |jtj	 W d    d S 1 s*w   Y  d S N)rU   

get_testfnr   r   r   r]   rd   r;   re   r8   rn   r+   testfnrQ   rC   r-   r-   r.   test_unix_tcp      

"z$TestUnconnectedSockets.test_unix_tcpc                 C   rr   rs   rt   rv   r-   r-   r.   test_unix_udp   ry   z$TestUnconnectedSockets.test_unix_udpN)r=   r>   r?   __doc__rR   r]   rh   r   rJ   r   rl   ro   rp   r   rx   rz   r-   r-   r-   r.   rK   j   s    #


rK   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
J tt|d\}}z-t jdd}| t|d | |d jtj | |d jtj W |	  |	  d S |	  |	  w )Nr`   tcp4r&   rb   rS   r   rM   )
r(   r)   r   r   r;   rP   re   r8   ZCONN_ESTABLISHEDclose)r+   rc   serverclientr,   r-   r-   r.   test_tcp   s   
zTestConnectedSocket.test_tcprq   c                 C   s  |   }t|\}}ztjdd}|d jr|d jrJ |d jr)|d jr)J ts-tr4dd |D }| jt	|d|d t
sDtsDtre| |d jd	 | |d jd	 | ||d jpb|d j nEtr|d j|d j|d j|d jfD ]}| |d	 qyn2| |d jp|d j| | |d jp|d j| W |  |  d S W |  |  d S W |  |  d S |  |  w )
Nunixr&   r   rM   c                 S   s   g | ]	}|j d kr|qS )z/var/run/log)rd   r4   r-   r-   r.   r7          z1TestConnectedSocket.test_unix.<locals>.<listcomp>rS   msg )ru   r   r(   r)   rZ   rd   r
   r   r;   rP   r   r   r   r~   )r+   rw   r   r   r,   rc   r-   r-   r.   	test_unix   s>   	
zTestConnectedSocket.test_unixN)
r=   r>   r?   r{   r   rJ   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  n |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ro|dtgtttg W d    d S W d    d S 1 szw   Y  d S )Nc                    sh   t j| dD ]} |j|  |j| qts0tj| dD ]} |j|  |j| qd S d S )Nr&   )r(   r)   assertInrT   rU   r   r8   r9   )r'   familiestypesrC   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  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 ]d}| } t|d |D ]S}|j|	jkr|||t
t|
dtjd q|j|jkr|||t
t|dtjd q|jt|dd kr|||tt|dtjd q|jt|dd kr|||tt|dtjd qqd S )Nc                    s   d}t |  |j|  |j|  |j|  |j|  |j| |D ]}	| j|	d}
|	|v r<|
s;J q+|
rBJ |
q+trO 	| j
|g d S d S )N)
r%   r   r   inet6r   r}   r   r   r   r   r&   )r   r;   rT   rU   rZ   rd   re   r)   r   r<   r3   )procrC   rT   rU   rZ   rd   re   Z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)
            )dirra   )rT   rc   rw   rk   T)deleterM   r-   )r%   r   r   r   r}   )r%   r   r   r   r   r3   )r%   r   r   r   r   )r%   r   r   r   r   )r   textwrapdedentr[   pathbasenameru   getcwdformatintr   r   pyrunevalr    r   r(   childrenr)   r;   rP   r3   r   r8   rf   r   rn   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,   rC   r-   rH   r.   test_combos8  sr   











zTestFilters.test_combosc                 C   s
  t  v 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 rpt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 qt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 r-tjdd}| t|d |D ]}| |jt	 | |j
ttf qtrZtsbtsjtjdd}| t|d |D ]+}| |jt | |j
ttf qFW d    d S W d    d S W d    d S W d    d S 1 s~w   Y  d S )Nr   r&   rS   rM   r}   r   r   r   r   r   r      r   r      )r   r(   r)   r;   rP   r   r   rT   r   r   rU   r   r   r   r   r
   r   )r+   r,   rC   r-   r-   r.   
test_count  sl   
225$zTestFilters.test_countN)r=   r>   r?   r   r   r	   r   r   r-   r-   r-   r.   r     s
    +
`r   rA   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  : ddlm} | D ]&\}}|dkrtsq|\}}t|} t|tt	| |||| qW d    d S 1 sFw   Y  d S )Nc                    sD   | D ]} j |j||d |jtkr j |j||d t| qd S )Nr   )r   rT   r   rU   r   )r,   r   types_rC   rH   r-   r.   r     s   

z0TestSystemWideConnections.test_it.<locals>.checkr   )	conn_tmapr   )
r   psutil._commonr   itemsr   r8   r9   r;   rP   set)r+   r   r   r'   groupsr   r   r,   r-   rH   r.   test_it  s   
"z!TestSystemWideConnections.test_itc                    s   t  }t|}W d    n1 sw   Y  g d}g }t|D ]}|  }|| td| }| |}|j q!|D ]}t	| qAfddt
jddD }	D ]! | t fdd|	D | t
 }
| t|
d| qWd 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  v r|qS r-   r2   r5   x)pidsr-   r.   r7   
  s    zFTestSystemWideConnections.test_multi_sockets_procs.<locals>.<listcomp>r%   r&   c                    s   g | ]	}|j  kr|qS r-   r2   r   r2   r-   r.   r7     r   )r   rP   rangeru   appendr   r   r   r3   r    r8   r9   r;   rE   r)   )r+   ZsocksZexpectedtimesfnamesifnamesrcZsprocZsysconsr   r-   )r3   r   r.   test_multi_sockets_procs  s0   




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r6tt|}t|}| s J || t| | || || || qtr?tj	 tj
 trFtj d S d S )NZCONN_)r   r8   
startswithr   strisupperZassertNotInr   r   Z	CONN_IDLEZ
CONN_BOUNDr   ZCONN_DELETE_TCB)r+   ZintsZstrsnameZ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[   rV   r   
contextlibr   r   r   r   r   r8   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    rE   r(   r   objectr!   r"   r@   rK   r|   r   rJ   r   r   r=   Zpsutil.tests.runnerr   __file__r-   r-   r-   r.   <module>   sl   $b= 
J>
