o
    ¯©iH  ã                   @   sž  d Z ddlZddlmZ ddl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 d
ZdZdZdZdd„ Zeg d¢ƒZeg d¢ƒZG dd„ dƒZeeƒZedƒZdd„ ZeeƒZedƒZdd„ ZeeƒZedƒZdd„ ZeeƒZedƒZdd„ Z eeƒZ!ed ƒZ"d!d"„ Z#eeƒZ$d#d$„ Z%G d%d&„ d&ej&ƒZ'G d'd(„ d(ej&ƒZ(G d)d*„ d*ej&ƒZ)G d+d,„ d,ej&ƒZ*G d-d.„ d.ej&ƒZ+d/d0„ Z,e-d1krÍe,ƒ  dS dS )2z#Unit tests for crcmod functionalityé    N)Úarrayé   )ÚmkCrcFunÚCrc)Ú_usingExtension)ÚPredefinedCrc)ÚmkPredefinedCrcFun)Ú_crc_definitionsi…  i! iËm]l   ·‚	 c                 C   s   d}| D ]}|d|> B }q|S ©Nr   r   © )ÚbitsÚpÚnr   r   ú?/home/ubuntu/.local/lib/python3.10/site-packages/crcmod/test.pyÚpolyFromBits?   s   r   )!é@   é?   é=   é;   é:   é8   é7   é4   é1   é0   é/   é.   é,   é)   é%   é$   é"   é    é   é   é   é   é   é   é   é   é   é
   é	   é   é   é   r   )"r   é>   é9   r   é6   é5   r   r   r   é-   é(   é'   é&   r   é#   é!   r"   r#   é   é   é   r&   r'   é   r(   é   r*   r+   r,   r-   é   r/   r   r   c                   @   s˜   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$S )%Úpolyz?Class implementing polynomials over the field of integers mod 2c                 C   s"   t |ƒ}|dk rtdƒ‚|| _d S )Nr   zinvalid polynomial)ÚintÚ
ValueErrorr   )Úselfr   r   r   r   Ú__init__Y   s   
zpoly.__init__c                 C   s   | j S ©N©r   ©rD   r   r   r   Ú__int__^   s   zpoly.__int__c                 C   s   | j |j kS rF   rG   ©rD   Úotherr   r   r   Ú__eq__a   ó   zpoly.__eq__c                 C   s   | j |j kS rF   rG   rJ   r   r   r   Ú__ne__d   rM   zpoly.__ne__c                 C   s   t | j|jƒS rF   )Úcmpr   rJ   r   r   r   Ú__cmp__i   ó   zpoly.__cmp__c                 C   s
   | j dkS ©Nr   rG   rH   r   r   r   Ú__bool__l   ó   
zpoly.__bool__c                 C   s   | S rF   r   rH   r   r   r   Ú__neg__o   s   zpoly.__neg__c                 C   s,   t |  ¡ d dƒ}d|> d }t| j|A ƒS ©Nr   )ÚmaxÚdegrA   r   )rD   r   Úxr   r   r   Ú
__invert__r   s   zpoly.__invert__c                 C   ó   t | j|jA ƒS rF   ©rA   r   rJ   r   r   r   Ú__add__w   ó   zpoly.__add__c                 C   r[   rF   r\   rJ   r   r   r   Ú__sub__z   r^   zpoly.__sub__c                 C   sX   | j }|j }|dks|dkrtdƒS d}|r(|d@ r||A }|d> }|d? }|st|ƒS r
   )r   rA   )rD   rK   ÚaÚbrY   r   r   r   Ú__mul__}   s   üzpoly.__mul__c           	      C   sà   | j }|  ¡ }|j }| ¡ }|dkrtdƒ‚|dkr | tdƒfS ||k r*tdƒ| fS || }d|> }||> }d}|dkr\||@ rH||A }|dB }|d> }|d? }|d? }|d8 }|dks<||@ rh||A }|dB }t|ƒt|ƒfS )Nr   zpolynomial division by zeror   )r   rX   ÚZeroDivisionErrorrA   )	rD   rK   ÚuÚmÚvr   Úkr`   Úqr   r   r   Ú
__divmod__‰   s0   ùzpoly.__divmod__c                 C   ó   |   |¡d S rR   ©ri   rJ   r   r   r   Ú__div__¢   rQ   zpoly.__div__c                 C   rj   rV   rk   rJ   r   r   r   Ú__mod__¥   rQ   zpoly.__mod__c                 C   s
   d| j  S )Nzpoly(0x%XL)rG   rH   r   r   r   Ú__repr__¨   rT   zpoly.__repr__c                 C   s|   | j }|dkr	dS g dgdgddgdœ|d@  }|d? }d}|r5|d@ r+| d	| ¡ |d? }|d7 }|s | ¡  d
 |¡S )Nr   Ú0Ú1rY   )r   r   é   r0   r0   rq   r   zx^%dú+)r   ÚappendÚreverseÚjoin)rD   r   Úlstr   r   r   r   Ú__str__«   s   ý
zpoly.__str__c                 C   sb   | j }|dkr	dS d}|dkr|d7 }|d? }|dkst|ƒ}|dkr/|d7 }|d? }|dks#|S )z#return the degree of the polynomialr   éÿÿÿÿé   r)   r   )r   rB   )rD   r`   r   r   r   r   rX   ¸   s   þþzpoly.degN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rE   rI   rL   rN   rP   rS   rU   rZ   r]   r_   rb   ri   rl   rm   rn   rw   rX   r   r   r   r   rA   W   s&    rA   é   c                 C   ó2   d}| D ]}|d | }qt |ƒ}t|t t ƒS ©Nr   r~   )rA   rB   Úx8pÚg8p©Údr   Úir   r   r   Úcrc8pÍ   ó
   r†   ry   c                 C   r   r€   )rA   rB   Úx16pÚg16prƒ   r   r   r   Úcrc16pÖ   r‡   rŠ   i   c                 C   r   r€   )rA   rB   Úx24pÚg24prƒ   r   r   r   Úcrc24pß   r‡   r   l        c                 C   r   r€   )rA   rB   Úx32pÚg32prƒ   r   r   r   Úcrc32pè   r‡   r   l            c                 C   r   r€   )rA   rB   Úx64pÚg64aprƒ   r   r   r   Úcrc64apñ   r‡   r“   c                 C   r   r€   )rA   rB   r‘   Úg64bprƒ   r   r   r   Úcrc64bpù   r‡   r•   c                   @   s¾   e Zd ZddgZeddfdgeddfdgeddfdgeddfd	geddfd
geddfdgeddfdgeddfdgeddfdgeddfdgeddfdgeddfdgedddfdggZdd„ Z	dS )ÚKnownAnswerTestsó   Tó   CatMouse987654321r   )éþ   é   rx   r   )éO   é›   )r™   éb   )iq  iVå  )i&  inõ  )i¡  iÂ  )iÄ¼ iµÄ )i½Y i7ª
 )i+Õ i«# )iÛÝ“kiô Üì   ÿÿ )iŸ…ûAì   § ho )ií•ll   åH )ì   `z| éXÿKc              
   C   sÐ   | j D ]b\}}t|Ž }|  |ddƒdd|f ¡ t| jƒD ]G\}}|  ||ƒ|| d||f ¡ |  ||dd … ||d d… ƒƒ|| d||f ¡ |  ||dd … ||d d… ƒƒ|| d||f ¡ qqd S )Nó    r   z,Wrong answer for CRC parameters %s, input ''z.Wrong answer for CRC parameters %s, input '%s'r/   rx   )Úknown_answersr   ÚassertEqualÚ	enumerateÚtest_messages)rD   Úcrcfun_paramsrf   Úcrcfunr…   Úmsgr   r   r   Útest_known_answers  s   46ýýz#KnownAnswerTests.test_known_answersN)
rz   r{   r|   r¦   Úg8Úg16Úg24Úg32r£   rª   r   r   r   r   r–     s&    þór–   c                   @   s~   e Zd Zg d¢Zeddfegeddfegeddfe	ge
ddfegeddfegeddfeggZed
dd„ƒZdd„ Zdd„ Zd	S )ÚCompareReferenceCrcTest)r¢   r—   ó	   123456789r˜   r   c                 C   s4   |dkrt |d@ ƒ}|dB }t | |¡}t |ƒd@ S )zThis function modifies the return value of binascii.crc32
        to be an unsigned 32-bit value. I.e. in the range 0 to 2**32-1.iÿÿÿi   €rž   )rB   ÚbinasciiÚcrc32)r„   ÚcrcrY   r   r   r   Úreference_crc322  s
   z'CompareReferenceCrcTest.reference_crc32c                 C   s4   t tdddƒ}| jD ]}|  ||ƒ|  |¡¡ q
dS )a  The binascii module has a 32-bit CRC function that is used in a wide range
        of applications including the checksum used in the ZIP file format.
        This test compares the CRC-32 implementation of this crcmod module to
        that of binascii.crc32.r   r   rž   N)r   r®   r¦   r¤   r´   )rD   r²   r©   r   r   r   Útest_compare_crc32=  s   
ÿz*CompareReferenceCrcTest.test_compare_crc32c                 C   s<   | j D ]\}}t|Ž }| jD ]}|  ||ƒ||ƒ¡ qqdS )z]Compare various CRCs of this crcmod module to a pure
        polynomial-based implementation.N)Útest_poly_crcsr   r¦   r¤   )rD   r§   Úcrc_poly_funr¨   r©   r   r   r   Útest_compare_polyI  s   
ÿûz)CompareReferenceCrcTest.test_compare_polyN)r   )rz   r{   r|   r¦   r«   r†   r¬   rŠ   r­   r   r®   r   Úg64ar“   Úg64br•   r¶   Ústaticmethodr´   rµ   r¸   r   r   r   r   r¯   !  s    ú	
r¯   c                   @   s$   e Zd ZdZdZdd„ Zdd„ ZdS )ÚCrcClassTestzVerify the Crc classr˜   c                 C   s´   t tƒ}d}|  t|ƒ|¡ |  | ¡ d¡ |  | ¡ d¡ | | j¡ |  |jd¡ |  | ¡ d¡ |  | ¡ d¡ | 	¡ }|  
||u¡ d}|  t|ƒ|¡ |  t|ƒ|¡ dS )	z*Verify the CRC class when not using xorOutzcpoly = 0x104C11DB7
reverse = True
initCrc  = 0xFFFFFFFF
xorOut   = 0x00000000
crcValue = 0xFFFFFFFFs   ÿÿÿÿÚFFFFFFFFrŸ   s   ÷´ §ÚF7B400A7zcpoly = 0x104C11DB7
reverse = True
initCrc  = 0xFFFFFFFF
xorOut   = 0x00000000
crcValue = 0xF7B400A7N)r   r®   r¤   ÚstrÚdigestÚ	hexdigestÚupdater©   ÚcrcValueÚcopyÚ
assertTrue)rD   r³   Ústr_reprY   r   r   r   Útest_simple_crc32_classZ  s    ÿÿz$CrcClassTest.test_simple_crc32_classc                 C   sò   t tddd}d}|  t|ƒ|¡ |  | ¡ d¡ |  | ¡ d¡ | | j¡ |  |jd¡ |  | ¡ d¡ |  | ¡ d	¡ | 	¡ }|  
||u¡ d
}|  t|ƒ|¡ |  t|ƒ|¡ | ¡ }|  
||u¡ |  
||u¡ d}|  t|ƒ|¡ dS )z&Verify the CRC class when using xorOutr   rx   )ÚinitCrcÚxorOutzcpoly = 0x104C11DB7
reverse = True
initCrc  = 0x00000000
xorOut   = 0xFFFFFFFF
crcValue = 0x00000000s       Ú00000000r¡   s   KÿXÚ084BFF58zcpoly = 0x104C11DB7
reverse = True
initCrc  = 0x00000000
xorOut   = 0xFFFFFFFF
crcValue = 0x084BFF58N)r   r®   r¤   r¿   rÀ   rÁ   rÂ   r©   rÃ   rÄ   rÅ   Únew)rD   r³   rÆ   rY   Úyr   r   r   Útest_full_crc32_classy  s,   ÿÿÿz"CrcClassTest.test_full_crc32_classN)rz   r{   r|   r}   r©   rÇ   rÎ   r   r   r   r   r¼   U  s
    r¼   c                   @   sN   e Zd ZdZg d¢ZddgddgddggZd	d
„ Zdd„ Zdd„ Zdd„ Z	dS )ÚPredefinedCrcTestzVerify the predefined CRCs)r¢   r—   r˜   úcrc-aug-ccitt)i  iíÖ  i7V  úx-25)r   iÙä  i‘
  úcrc-32)r   r    r¡   c              
   C   sÎ   | j D ]a\}}t|ƒ}|  |ddƒdd| ¡ t| jƒD ]G\}}|  ||ƒ|| d||f ¡ |  ||dd … ||d d… ƒƒ|| d||f ¡ |  ||dd … ||d d… ƒƒ|| d||f ¡ qqd S )Nr¢   r   z#Wrong answer for CRC '%s', input ''z#Wrong answer for CRC %s, input '%s'r/   rx   )r£   r   r¤   r¥   Útest_messages_for_known_answers)rD   Úcrcfun_namerf   r¨   r…   r©   r   r   r   rª   µ  s   46ýýz$PredefinedCrcTest.test_known_answersc              	   C   sØ   | j D ]f\}}t| jƒD ]\\}}t|ƒ}| |¡ |  |j|| d||f ¡ | ¡ }|  |j|| d||f ¡ |  |j|d d||f ¡ | |¡ |  |j|| d||f ¡ |  |j|| d||f ¡ qqd S )Nz$Wrong answer for crc1 %s, input '%s'z#Wrong state for crc1 %s, input '%s'r   z#Wrong state for crc2 %s, input '%s')r£   r¥   rÓ   r   rÂ   r¤   rÃ   rÌ   )rD   rÔ   rf   r…   r©   Úcrc1Úcrc2r   r   r   Útest_class_with_known_answers¾  s   

ïÿz/PredefinedCrcTest.test_class_with_known_answersc                 C   s<   t D ]}t|d ƒ}|dƒ}|  ||d d|d  ¡ qd S ©NÚnamer°   ÚcheckzWrong answer for CRC '%s')Ú_predefined_crc_definitionsr   r¤   )rD   Útable_entryÚcrc_funcÚ
calc_valuer   r   r   Útest_function_predefined_tableÓ  s
   üz0PredefinedCrcTest.test_function_predefined_tablec                 C   s@   t D ]}t|d ƒ}| d¡ |  |j|d d|d  ¡ qd S rØ   )rÛ   r   rÂ   r¤   rÃ   )rD   rÜ   rÕ   r   r   r   Útest_class_predefined_tableÚ  s
   
üz-PredefinedCrcTest.test_class_predefined_tableN)
rz   r{   r|   r}   rÓ   r£   rª   r×   rß   rà   r   r   r   r   rÏ   ¦  s    ý	rÏ   c                   @   s<   e Zd ZdZdZg d¢Zg d¢Zdd„ Zdd„ Zd	d
„ Z	dS )ÚInputTypesTestz<Check the various input types that CRC functions can accept.r˜   )rÐ   rÑ   rÒ   )ÚBÚHÚIÚLc                 C   s^   | j D ])}t|ƒ}tt| jƒd ƒD ]}| jd|… }||ƒ}|t|ƒƒ}|  ||¡ qqdS )zmTest that bytearray inputs are accepted, as an example
        of a type that implements the buffer protocol.r   N)Úcheck_crc_namesr   ÚrangeÚlenr©   Ú	bytearrayr¤   )rD   Úcrc_namer¨   r…   Útest_msgÚbytes_answerÚbytearray_answerr   r   r   Útest_bytearray_inputô  s   
üþz#InputTypesTest.test_bytearray_inputc           	      C   s‚   | j D ];}t|ƒ}tt| jƒd ƒD ]+}| jd|… }||ƒ}| jD ]}|t|ƒj dkr<t||ƒ}||ƒ}|  ||¡ q"qqdS )ziTest that array inputs are accepted, as an example
        of a type that implements the buffer protocol.r   Nr   )	ræ   r   rç   rè   r©   Úarray_check_typesr   Úitemsizer¤   )	rD   rê   r¨   r…   rë   rì   Ú
array_typeÚ
test_arrayÚarray_answerr   r   r   Útest_array_inputÿ  s   


€üýþzInputTypesTest.test_array_inputc              	   C   sJ   | j D ]}t|ƒ}|  t¡ |dƒ W d  ƒ n1 sw   Y  qdS )z(Test that Unicode input raises TypeErrorÚ	123456789N)ræ   r   ÚassertRaisesÚ	TypeError)rD   rê   r¨   r   r   r   Útest_unicode_input  s   

ÿ€þz!InputTypesTest.test_unicode_inputN)
rz   r{   r|   r}   r©   ræ   rï   rî   rô   rø   r   r   r   r   rá   â  s    rá   c                   C   s   t dtƒ t ƒ  t ¡  d S )NzUsing extension:)Úprintr   ÚunittestÚmainr   r   r   r   Úruntests  s   
rü   Ú__main__).r}   rú   r   r±   Úcrcmodr   r   r   Ú
predefinedr   r   r	   rÛ   r«   r¬   r­   r®   r   r¹   rº   rA   r‚   r   r†   r‰   rˆ   rŠ   rŒ   r‹   r   r   rŽ   r   r’   r‘   r“   r”   r•   ÚTestCaser–   r¯   r¼   rÏ   rá   rü   rz   r   r   r   r   Ú<module>   sV   	t 4Q<3
ÿ