Ë
    Bü´jQ'  ã                   ó¶   — d dl Z d dlZd dlmZmZmZ d dlmZ d dlm	Z	 d dl
mZmZ d dlmZ 	  G d„ de j                  «      Zed	k(  r e j$                  «        yy)
é    N)ÚMockÚpatchÚ	MagicMock)ÚABNF)Ú	WebSocket)ÚWebSocketProtocolExceptionÚWebSocketPayloadException)ÚSSLErrorc                   ó<   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
y	)
ÚLargePayloadTestc                 ó’  — g d¢}|D ]²  \  }}| j                  ||¬«      5  d|z  }t        j                  |t        j                  «      }|j	                  «       }| j                  |t        «       | j                  t        |«      |k\  «       | j                  t        |j                  «      |«       ddd«       Œ´ y# 1 sw Y   Œ¿xY w)z:Test WebSocket frame length encoding at various boundaries)	)é}   zSingle byte length)é~   zTwo byte length start)é   zTwo byte length)éÿÿ  zTwo byte length max)é   zEight byte length start)é @  z16KB boundary)é@  zJust over 16KB)é €  Ú32KB)i   Ú128KB)ÚlengthÚdescriptionó   AN)ÚsubTestr   Úcreate_frameÚOPCODE_BINARYÚformatÚassertIsInstanceÚbytesÚ
assertTrueÚlenÚassertEqualÚdata)ÚselfÚ
test_casesr   r   ÚpayloadÚframeÚ	formatteds          úa/root/workspace/ytshorts/venv/lib/python3.12/site-packages/websocket/tests/test_large_payloads.pyÚ%test_frame_length_encoding_boundariesz6LargePayloadTest.test_frame_length_encoding_boundaries    sº   € ò

ˆ
ð $.ò 	:ÑˆF�KØ—‘ V¸�ÓEñ :à ™-�ô ×)Ñ)¨'´4×3EÑ3EÓF�ð "ŸL™L›N�	ð ×%Ñ% i´Ô7Ø—‘¤ I£°&Ñ 8Ô9ð × Ñ ¤ U§Z¡Z£°&Ô9÷:ð :ñ	:÷:ð :ús    BB=Â=C	c                 ó*  ‡‡	— ddz  }g Š	d}t        dt        |«      |«      D ]  }‰	j                  ||||z    «       Œ dŠˆˆ	fd„}ddlm}  ||d¬«      }|j                  t        |«      «      }| j                  ||«       | j                  ‰d	«       y
)zHTest receiving large payloads in chunks (simulating the 16KB recv issue)ó   Br   r   r   c                 ó:   •— ‰t        ‰«      k\  ry‰‰   }‰dz  Š|S ©Nó    é   ©r"   ©ÚbufsizeÚresultÚ
call_countÚchunkss     €€r*   Ú	mock_recvzCLargePayloadTest.test_recv_large_payload_chunked.<locals>.mock_recvP   ó*   ø€ àœS ›[Ò(ØØ˜JÑ'ˆFØ˜!‰OˆJØˆMr0   ©Úframe_bufferT©Úskip_utf8_validationr1   N)Úranger"   ÚappendÚwebsocket._abnfr;   Úrecv_strictr#   ÚassertGreater)
r%   Úlarge_payloadÚ
chunk_sizeÚir8   r;   Úfbr5   r6   r7   s
           @@r*   Útest_recv_large_payload_chunkedz0LargePayloadTest.test_recv_large_payload_chunkedB   s    ù€ ð ˜u™ˆð ˆØˆ
Ü�qœ#˜mÓ,¨jÓ9ò 	=ˆAØ�M‰M˜-¨¨A°
©NÐ;Õ<ð	=ð ˆ
õ	õ 	1á˜)¸$Ô?ˆð —‘¤ MÓ 2Ó3ˆà×Ñ˜ Ô/à×Ñ˜: qÕ)r0   c                 ó  ‡— d}g Šˆfd„}ddl m}  ||d¬«      }|j                  |«      }| j                  t	        |«      |«       | j                  t        d„ ‰D «       «      «       | j                  t	        ‰«      d«       y	)
z&Simulate SSL BAD_LENGTH error scenarior   c                 ód   •— ‰j                  | «       | dkD  rt        d«      ‚dt        | d«      z  S )Nr   z[SSL: BAD_LENGTH] unknown erroró   C)r?   r
   Úmin)r4   Ú
recv_callss    €r*   Úmock_recv_with_ssl_limitzTLargePayloadTest.test_ssl_large_payload_simulation.<locals>.mock_recv_with_ssl_limitl   s6   ø€ Ø×Ñ˜gÔ&à˜ŠÜÐ@ÓAÐAØœ#˜g uÓ-Ñ-Ð-r0   r   r:   Tr<   c              3   ó&   K  — | ]	  }|d k  –— Œ y­w)r   N© )Ú.0Úcalls     r*   ú	<genexpr>zELargePayloadTest.test_ssl_large_payload_simulation.<locals>.<genexpr>}   s   è ø€ ÒA¨d˜D E�MÑAùs   ‚r1   N)r@   r;   rA   r#   r"   r!   ÚallrB   )r%   Úpayload_sizerM   r;   rF   r5   rL   s         @r*   Ú!test_ssl_large_payload_simulationz2LargePayloadTest.test_ssl_large_payload_simulationd   sw   ø€ ð ˆàˆ
ô	.õ 	1áÐ2ÈÔNˆð —‘ Ó-ˆð 	×Ñœ˜V› lÔ3à�‰œÑA°jÔAÓAÔBà×Ñœ3˜z›?¨AÕ.r0   c                 óþ  — g d¢}|D ]è  }| j                  |¬«      5  d|z  }t        j                  |t        j                  «      }|j	                  «       }| j                  |t        «       | j                  t        |j                  «      |«       d}|t        j                  k  rd|z   }n|t        j                  k  rd|z   }nd|z   }| j                  t        |«      ||z   «       ddd«       Œê y# 1 sw Y   ŒõxY w)z6Test frame formatting with various large payload sizes)iÿ?  r   r   r   r   r   )Úsizeó   Dé   é   é
   N)r   r   r   r   r   r   r    r#   r"   r$   ÚLENGTH_7Ú	LENGTH_16)r%   Ú
test_sizesrW   r'   r(   r)   Ú	mask_sizeÚexpected_header_sizes           r*   Ú test_frame_format_large_payloadsz1LargePayloadTest.test_frame_format_large_payloads�   s  € ò @ˆ
àò 	NˆDØ—‘ 4�Ó(ñ NØ ™+�Ü×)Ñ)¨'´4×3EÑ3EÓF�ð "ŸL™L›N�	ð ×%Ñ% i´Ô7Ø× Ñ ¤ U§Z¡Z£°$Ô7ð �	Øœ$Ÿ-™-Ò'ð ˜I™ñ )ð œDŸN™NÒ*ð ˜I™ñ )ð ˜Y™ð )ð × Ñ ¤ Y£Ð1EÈÑ1LÔM÷=Nð Nñ	N÷Nð Nús   œCC3Ã3C<	c                 ó(  ‡— t        «       }g Šˆfd„}||_        d|j                  _        t	        «       }||_        d|_        ddz  }t        d«      5 }d„ |_        |j                  |«      }| j                  |d«       d	d	d	«       y	# 1 sw Y   y	xY w)
z?Test that large payloads are sent in chunks to avoid SSL issuesc                 óN   •— ‰j                  t        | «      «       t        | «      S ©N)r?   r"   )r$   Úsent_chunkss    €r*   Ú	mock_sendzDLargePayloadTest.test_send_large_payload_chunking.<locals>.mock_send°   s   ø€ Ø×Ñœs 4›yÔ)Ü�t“9Ðr0   g      >@Tó   Er   zwebsocket._core.sendc                 ó   — t        |«      S rd   r2   )Úsockr$   s     r*   ú<lambda>zCLargePayloadTest.test_send_large_payload_chunking.<locals>.<lambda>Á   s
   € ¼CÀ»I€ r0   r   N)r   ÚsendÚ
gettimeoutÚreturn_valuer   ri   Ú	connectedr   Úside_effectÚsend_binaryrB   )r%   Ú	mock_sockrf   ÚwsrC   Úmock_send_funcr5   re   s          @r*   Ú test_send_large_payload_chunkingz1LargePayloadTest.test_send_large_payload_chunking¨   s�   ø€ ô “Fˆ	ð ˆô	ð #ˆ	ŒØ,0ˆ	×ÑÔ)ô ‹[ˆØˆŒØˆŒð ˜u™ˆô Ð)Ó*ð 	*¨nÙ)EˆNÔ&ð —^‘^ MÓ2ˆFð ×Ñ˜v qÔ)÷	*÷ 	*ñ 	*ús   Á,BÂBc           	      óŠ  — ddz  }t        j                  |t         j                  «      }|j                  «       }| j	                  |t
        «       t        j                  dd«      dz   }t        ddddt         j                  d|«      }| j                  t        «      5  |j                  d¬	«       d
d
d
«       y
# 1 sw Y   y
xY w)z.Test UTF-8 validation with large text payloadsu   Hello ä¸–ç•Œ! iÐ  z!Hiè  s   ÿþ invalid utf8r1   r   Fr<   N)r   r   ÚOPCODE_TEXTr   r   r    ÚstructÚpackÚOPCODE_CLOSEÚassertRaisesr   Úvalidate)r%   Ú
large_textr(   r)   Úinvalid_utf8_close_datas        r*   Útest_utf8_validation_large_textz0LargePayloadTest.test_utf8_validation_large_textÉ   s±   € ð &¨Ñ,ˆ
ô ×!Ñ! *¬d×.>Ñ.>Ó?ˆð —L‘L“Nˆ	Ø×Ñ˜i¬Ô/ô #)§+¡+¨d°DÓ"9Ð<TÑ"TÐô �Q˜˜1˜a¤×!2Ñ!2°AÐ7NÓOˆð ×ÑÔ9Ó:ñ 	7Ø�N‰N°ˆNÔ6÷	7÷ 	7ñ 	7ús   ÂB9Â9Cc                 ó
  ‡‡— ddz  }t        dt        |«      d«      D �cg c]
  }|||dz    ‘Œ c}ŠdŠˆˆfd„}ddlm}  ||d¬«      }|j	                  d«      }| j                  ||«       | j                  ‰d	«       y
c c}w )z9Test frame buffer with edge cases that could trigger bugsó   Fr   r   i   c                 ó:   •— ‰t        ‰«      k\  ry‰‰   }‰dz  Š|S r/   r2   r3   s     €€r*   r8   z@LargePayloadTest.test_frame_buffer_edge_cases.<locals>.mock_recvë   r9   r0   r:   Tr<   rY   N)r>   r"   r@   r;   rA   r#   )	r%   Úpayload_16krE   r8   r;   rF   r5   r6   r7   s	          @@r*   Útest_frame_buffer_edge_casesz-LargePayloadTest.test_frame_buffer_edge_casesà   s‰   ù€ ð ˜U‘lˆô 6;¸1¼cÀ+Ó>NÐPTÓ5UÖV°�+˜a ! d¡(Ò+ÒVˆàˆ
õ	õ 	1á˜)¸$Ô?ˆØ—‘ Ó&ˆà×Ñ˜ Ô-à×Ñ˜ QÕ'ùò' Ws    B c                 óð   — d}d|z  }t        j                  |t         j                  «      }|j                  «       }| j	                  |t
        «       | j                  t        |j                  «      |«       y)z4Test behavior at WebSocket maximum frame size limitsi   ó   GN)	r   r   r   r   r   r    r#   r"   r$   )r%   Ú
large_sizer'   r(   r)   s        r*   Útest_max_frame_size_limitsz+LargePayloadTest.test_max_frame_size_limitsü   sd   € ð !ˆ
Ø˜Ñ#ˆô ×!Ñ! '¬4×+=Ñ+=Ó>ˆð —L‘L“Nˆ	Ø×Ñ˜i¬Ô/ð 	×Ñœ˜UŸZ™Z›¨*Õ5r0   N)Ú__name__Ú
__module__Ú__qualname__r+   rG   rU   ra   rt   r~   rƒ   r‡   rO   r0   r*   r   r      s/   „ ò :òD *òD/ò:%NòN*òB7ò.(ó86r0   r   Ú__main__)Úunittestrw   Úunittest.mockr   r   r   r@   r   Úwebsocket._corer   Úwebsocket._exceptionsr   r	   Úwebsocket._ssl_compatr
   ÚTestCaser   rˆ   ÚmainrO   r0   r*   ú<module>r“      sQ   ðã Û ß 0Ñ 0å  Ý %ß WÝ *ðô(o6�x×(Ñ(ô o6ðd ˆzÒØ€H‡M�M…Oð r0   