a
    kÄ#d  ã                   @   sÆ   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m	Z	 d dl
mZ d dlmZ d dlmZ d d	lmZmZmZmZmZmZ d d
lmZ eƒ aG dd„ deƒZG dd„ deƒZdd„ ZdS )é    N)Úsocket)ÚLock)Úconf)Ú
ObjectPipeÚselect_objects)ÚMTU)ÚPacket)ÚScapy_Exception)ÚOptionalÚTypeÚTupleÚAnyÚListÚcast)ÚSuperSocketc                       sj   e Zd Zeƒ Zddd„Zdd„ Zdd„ Z‡ fdd	„Zd
d„ Z	dd„ Z
efdd„Zeejfdd„ƒZ‡  ZS )Ú
TestSocketNc                 C   s<   || _ tƒ | _|ptdd�| _|d u| _d | _t | ¡ d S )Nr   )Úname)	ÚbaseclsÚlistÚpaired_socketsr   ÚinsÚ_has_external_obj_pipZoutsÚopen_test_socketsÚappend©Úselfr   Zexternal_obj_pipe© r   úF/var/www/html/gsl.tools/lib/python3.9/site-packages/test/testsocket.pyÚ__init__   s    
zTestSocket.__init__c                 C   s   | S ©Nr   )r   r   r   r   Ú	__enter__,   s    zTestSocket.__enter__c                 C   s   |   ¡  dS )zClose the socketN)Úclose)r   Úexc_typeÚ	exc_valueÚ	tracebackr   r   r   Ú__exit__0   s    zTestSocket.__exit__c                    sˆ   | j r
d S | jD ].}z|j | ¡ W q tttfy<   Y q0 q| jsVtt| ƒ 	¡  nd| _ zt
 | ¡ W n tttfy‚   Y n0 d S )NT)Úclosedr   ÚremoveÚ
ValueErrorÚAttributeErrorÚ	TypeErrorr   Úsuperr   r!   r   )r   Ús©Ú	__class__r   r   r!   5   s    
zTestSocket.closec                 C   s$   |  j |g7  _ | j | g7  _ d S r   )r   )r   Úsockr   r   r   ÚpairM   s    zTestSocket.pairc                 C   sJ   t |ƒ}| jD ]}|j |¡ qzt ¡ |_W n ty@   Y n0 t|ƒS r   )Úbytesr   r   ÚsendÚtimeZ	sent_timer)   Úlen)r   ÚxÚsxÚrr   r   r   r2   R   s    
zTestSocket.sendc                 C   s   | j | j d¡t ¡ fS )z0Returns a tuple containing (cls, pkt_data, time)r   )r   r   Úrecvr3   ©r   r5   r   r   r   Úrecv_raw]   s    zTestSocket.recv_rawc                 C   s
   t | |ƒS r   )r   )ÚsocketsZremainr   r   r   Úselectb   s    zTestSocket.select)NN)Ú__name__Ú
__module__Ú__qualname__r   Ztest_socket_mutexr   r    r%   r!   r0   r2   r   r:   Ústaticmethodr   Zrecv_poll_rater<   Ú__classcell__r   r   r-   r   r      s     þ
r   c                       s>   e Zd ZdZd	‡ fdd„	Z‡ fdd„Zef‡ fdd„	Z‡  ZS )
ÚUnstableSocketzb
    This is an unstable socket which randomly fires exceptions or loses
    packets on recv.
    Nc                    s"   t t| ƒ ||¡ d| _d| _d S )Né
   )r+   rB   r   Zno_error_for_x_rx_pktsÚno_error_for_x_tx_pktsr   r-   r   r   r   n   s    zUnstableSocket.__init__c                    sX   | j dkr0t dd¡dkr0d| _ tdƒ tdƒ‚| j dkrH|  j d8  _ tt| ƒ |¡S )Nr   éè  é*   rC   zSOCKET CLOSEDúSocket closedé   )rD   ÚrandomÚrandintÚprintÚOSErrorr+   rB   r2   r9   r-   r   r   r2   w   s    

zUnstableSocket.sendc                    s¦   | j dkr~t dd¡dkr(d| _ tdƒ‚t dd¡dkrFd| _ tdƒ‚t dd¡dkrdd| _ tdƒ‚t dd¡dkr~d| _ d S | j dkr–|  j d	8  _ tt| ƒ |¡S )
Nr   rE   rF   rC   rG   é   é   éq   rH   )	rD   rI   rJ   rL   r	   r(   r+   rB   r8   r9   r-   r   r   r8   ‚   s     

zUnstableSocket.recv)NN)	r=   r>   r?   Ú__doc__r   r2   r   r8   rA   r   r   r-   r   rB   h   s     þ	rB   c                  C   s8   t ttƒdƒ} ttƒr4| r4td }| ¡  | d8 } qdS )zC
    Helper function to remove TestSocket objects after a test
    rH   r   N)Úmaxr4   r   r!   )Úcountr/   r   r   r   Úcleanup_testsockets–   s
    rS   )r3   rI   r   Ú	threadingr   Zscapy.configr   Zscapy.automatonr   r   Z
scapy.datar   Zscapy.packetr   Zscapy.errorr	   Zscapy.compatr
   r   r   r   r   r   Zscapy.supersocketr   r   r   r   rB   rS   r   r   r   r   Ú<module>	   s    M.