3 JZP@s8dZddlZddlZddlZddlmZddlmZddlmZddlmZddlm Z ddl Z ddl m Z dd l m Z dd l m Z dd l mZdd l mZdd l mZddl mZddl mZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlm Z ddlm!Z!ddlm"Z"ddlm#Z#ddlm$Z$ddlm%Z%dd lm&Z&dd!lm'Z'dd"lm(Z(dd#lm)Z)dd$lm*Z*e j+Z,Gd%d&d&e-Z.Gd'd(d(e.e'j/Z0Gd)d*d*e.e'j/Z1Gd+d,d,e.e'j/Z2Gd-d.d.e'j/Z3e4d/kr4e!e5dS)0z;Tests for net_connections() and Process.connections() APIs.N)closing)AF_INET)AF_INET6) SOCK_DGRAM) SOCK_STREAM)FREEBSD)LINUX)NETBSD)OPENBSD)OSX)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@s8eZdZddZddZddZd dd Zdd d ZdS)BasecCs"tstjdd}| st|dS)Nall)kind)r thisproc connectionsAssertionError)selfconsr,(/usr/lib64/python3.6/test_connections.pysetUp6s z Base.setUpcCs0tttts,tjdd}| s,t|dS)Nr%)r&)rrrr r'r(r))r*r+r,r,r-tearDown<s  z Base.tearDowncCsrtjdd}tdd|D}tr.||jS|jt|d|djdkrf|j||jj|j|dSdS)Nr%)r&cSsg|]}|j|fqSr,)fd).0cr,r,r- Gsz+Base.get_conn_from_sock..r)r'r(dictr fileno assertEquallenr0)r*sockr+Zsmapr,r,r-get_conn_from_sockEs  zBase.get_conn_from_sockNcCs|dkr|j|}t||jdkr6|j|j|j|j|j|j|j|j|jtj tj |j }| rt rt |tr|j}|jtkr|dd}|jtkrtrn|j|j||jtkrtrtjdd}|jtj||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). Nr4r%)r&r5)r;rr0r8r7familytypeZ getsockoptsocketZ SOL_SOCKETZSO_TYPEZ getsocknamer isinstancebytesdecoderrr laddrrr'r(compare_procsys_connectionsosgetpid)r*r:connrCr+r,r,r- check_socketRs(     zBase.check_socketr%c sdytj|d}Wn tjk r0tr*dSYnXfdd|D}|j|j|j||dS)zGiven a process PID and its list of connections compare those against system-wide connections retrieved via psutil.net_connections. )r&Ncs"g|]}|jkr|ddqS)Nr4r5)pid)r1r2)rIr,r-r3sz4Base.compare_procsys_connections..)psutilnet_connectionsZ AccessDeniedr sortr8)r*rIZ proc_consr&Zsys_consr,)rIr-rDvsz Base.compare_procsys_connections)N)r%)__name__ __module__ __qualname__r.r/r;rHrDr,r,r,r-r$4s   $r$c@s|eZdZdZddZeje dddZddZ eje dd d Z eje d d d Z eje d ddZ dS)TestUnconnectedSocketsz;Tests sockets which are open but not connected to anything.c CsRdtf}tttt|d,}|j|}|j s4t|j|j t j WdQRXdS)Nz 127.0.0.1)addr) rrrrrrHraddrr)r8statusrJ CONN_LISTEN)r*rQr:rGr,r,r- test_tcp_v4s    z"TestUnconnectedSockets.test_tcp_v4zIPv6 not supportedc CsRdtf}tttt|d,}|j|}|j s4t|j|j t j WdQRXdS)Nz::1)rQ) rrrrrrHrRr)r8rSrJrT)r*rQr:rGr,r,r- test_tcp_v6s    z"TestUnconnectedSockets.test_tcp_v6c CsRdtf}tttt|d,}|j|}|j s4t|j|j t j WdQRXdS)Nz 127.0.0.1)rQ) rrrrrrHrRr)r8rSrJ CONN_NONE)r*rQr:rGr,r,r- test_udp_v4s    z"TestUnconnectedSockets.test_udp_v4c CsRdtf}tttt|d,}|j|}|j s4t|j|j t j WdQRXdS)Nz::1)rQ) rrrrrrHrRr)r8rSrJrW)r*rQr:rGr,r,r- test_udp_v6s    z"TestUnconnectedSockets.test_udp_v6z POSIX onlycCsXtH}tt|td,}|j|}|j s0t|j|jt j WdQRXWdQRXdS)N)r>) r!rrrrHrRr)r8rSrJrW)r*namer:rGr,r,r- test_unix_tcps   z$TestUnconnectedSockets.test_unix_tcpcCsXtH}tt|td,}|j|}|j s0t|j|jt j WdQRXWdQRXdS)N)r>) r!rrrrHrRr)r8rSrJrW)r*rZr:rGr,r,r- test_unix_udps   z$TestUnconnectedSockets.test_unix_udpN)rMrNrO__doc__rUr skipIfrrVrXrYr r[r\r,r,r,r-rPsrPc@sTeZdZdZejedddZeje dddZ e e dd d Z d d Z d S)TestConnectedSocketPairszJTest socket pairs which are are actually connected to each other. zunreliable on SUONSc Csdtf}tjdd sttt|d\}}zHtjdd}|jt|d|j|djt j |j|djt j Wd|j |j XdS)Nz 127.0.0.1tcp4)r&)rQr<rr4) rr'r(r)rrr8r9rSrJZCONN_ESTABLISHEDclose)r*rQserverclientr+r,r,r-test_tcps  z!TestConnectedSocketPairs.test_tcpz POSIX onlycCsltZ}t|\}}z2tjdd}|djo8|dj s@t|djoR|dj sZttrldd|D}|jt |dt st st r|j|djd|j|djd|j||djp|djn~t r xv|dj|dj|dj|djfD]}|j|dqWn<|j|djp$|dj||j|djpB|dj|Wd|j|jXWdQRXdS) Nunix)r&rr4cSsg|]}|jdkr|qS)z /var/run/log)rR)r1r2r,r,r-r3sz6TestConnectedSocketPairs.test_unix..r<)r!r"r'r(rCrRr)r r8r9rrr r ra)r*rZrbrcr+rQr,r,r- test_unixs*    "z"TestConnectedSocketPairs.test_unix)Zonly_ifcsfdd}tjd}tjd}ddlm}tjjt}||jt t d|d}||jt t d|d}||jt t d |d}||jt t d |d} t |} t t|} t |} t t|} trt |}t t|}t | }t t|}nd}d}d}d}xtjD]}|j}jt|d x|D]}|j| jkr\|||t t| ftjdn|j| jkr|||t t| ftjdnZ|jt|ddkr|||t t|ftjdn,|jt|ddkr0|||t t|ftjdq0Wq Wjt|jdddS)Nc sd }t|j|j|j|j|j|j|j|j|j|j|x8|D]0} |j| d } | |krz| stqX| sXt| qXWt rj |j |gdS) Nr%inetinet4inet6tcpr`tcp6udpudp4udp6)r&) r%rhrirjrkr`rlrmrnro) rr8r=r>rCrRrSr(r)rrDrI) procrGr=r>rCrRrSZkindsZ all_kindsr&r+)r*r,r- check_conns   z8TestConnectedSocketPairs.test_combos..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=rQZtestfnz::1r4r%rhrirkr`rmrnrIrjrlroz???)r&)r%rhrirkr`)r%rhrirmrn)r%rhrjrkrl)r%rhrjrmro)textwrapdedentstringrrrEpathbasenamerZ substituteintrrrevalr#rr'Zchildrenr(r8r9rIrrJrTrrWgetattr assertRaises ValueError)r*rqZ tcp_templateZ udp_templaterrZtestfileZ tcp4_templateZ udp4_templateZ tcp6_templateZ udp6_templateZ tcp4_procZ tcp4_addrZ udp4_procZ udp4_addrZ tcp6_procZ tcp6_addrZ udp6_procZ udp6_addrpr+rGr,)r*r- test_combossb       z$TestConnectedSocketPairs.test_combosc Cst}tjdd}|jt|t|tjdd}|jt|trJdndx,|D]$}|j|jtt f|j|j t qVWtjdd}|jt|d|j|djt|j|dj t trtjdd}|jt|d|j|djt |j|dj t tjd d}|jt|tr(dndx.|D]&}|j|jtt f|j|j t q4Wtjd d}|jt|d|j|djt|j|dj t trtjd d}|jt|d|j|djt |j|dj t tjd d}|jt|trd ndx2|D]*}|j|jtt f|j|j t t fqWtrtjdd}|jt|dx.|D]&}|j|jt |j|j t t fqlWt rtjdd}|jt|dx.|D]&}|j|jt|j|j t t fqWWdQRXdS)Nr%)r&rkr<r4r`rrlrmrnrorhrjre)rr'r(r8r9rassertInr=rrr>rrrr)r*socksr+rGr,r,r-test_multi_sockets_filteringes`                z5TestConnectedSocketPairs.test_multi_sockets_filteringN)rMrNrOr]r r^r rdr rgrr r~rr,r,r,r-r_s !br_c@sJeZdZdZeddZeddZeeje o6e dddZ d S) TestSystemWideConnectionszTests for net_connections().c sfdd}tddlm}xZ|jD]N\}}|dkrBt rBq*|\}}tj|}jt|tt |||||q*Wj t tjddWdQRXdS)NcsVttdt}xB|D]:}j|j||d|j|krFj|j||dt|qWdS)Nr)msg)rzr?objectrr=r>r)r+familiestypes_rrG)r*r,r-checks   z0TestSystemWideConnections.test_it..checkr) conn_tmaprez???)r&) rpsutil._commonritemsrrJrKr8r9setr{r|)r*rrr&groupsrrr+r,)r*r-test_its   z!TestSystemWideConnections.test_itc Cs@t0}ddtjddD}|jt|t|WdQRXdS)NcSsg|]}|jtjkr|qSr,)rIrErF)r1xr,r,r-r3sz>TestSystemWideConnections.test_multi_socks..r%)r&)rrJrKr8r9)r*rr+r,r,r-test_multi_sockssz*TestSystemWideConnections.test_multi_sockszunreliable on OSX + TRAVISc st}t|}WdQRXgd}xRt|D]F}tjjtt|}tj d|}t |}j |j |j t|q,Wx$t|D]}tt|}t|qWfddtjddD}xJD]B|jtfdd|D|tj} |jt| jd|qWdS)N a import time, os from psutil.tests import create_sockets with create_sockets(): with open('%s', 'w') as f: f.write(str(os.getpid())) time.sleep(60) csg|]}|jkr|qSr,)rI)r1r)pidsr,r-r3szFTestSystemWideConnections.test_multi_sockets_procs..r%)r&csg|]}|jkr|qSr,)rI)r1r)rIr,r-r3s)rr9rangerErvrealpathrstrrsrtrappendrIZ addCleanuprr#rJrKr8Processr() r*rZexpectedtimesiZfnamesrcZsprocZsysconsr}r,)rIrr-test_multi_sockets_procss(       z2TestSystemWideConnections.test_multi_sockets_procsN) rMrNrOr]rrrr r^r rrr,r,r,r-rs rc@seZdZddZdS)TestMisccCsg}g}xhttD]\}|jdrtt|}t|}|jsBt||jt||j|||j||j|qWt rtj tj t rtj dS)NZCONN_)dirrJ startswithrzrisupperr)Z assertNotInrr Z CONN_IDLEZ CONN_BOUNDrZCONN_DELETE_TCB)r*ZintsZstrsrZZnumZstr_r,r,r-test_connection_constantss      z"TestMisc.test_connection_constantsN)rMrNrOrr,r,r,r-rsr__main__)6r]rEr?rs contextlibrrrrrrJrrr r r r r rrrZpsutil._compatrZ psutil.testsrrrrrrrrrrrrrrrr r!r"r#rr'rr$ZTestCaserPr_rrrM__file__r,r,r,r-s^                                  \7`P