U
    h&                     @   s   d Z ddlmZ ddlmZ ddlZddlmZmZ ddl	m
Z
mZmZmZmZmZmZ ddlmZmZmZ G dd	 d	eZG d
d deZG dd deZG dd deZddlmZmZ G dd deZG dd deZdS )ztests for passlib.util    )with_statement)partialN)is_ascii_safeto_bytes)irangePY2PY3uunicode
join_bytesPYPY)TestCasehbrun_with_fixed_seedsc                   @   s   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Ze	dd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 )!MiscTestz#tests various parts of utils modulec                 C   sL   ddl m} | t|d t| | dt|k | dt|k dS )ztest compat's lazymoduler   )compatz,^<module 'passlib.utils.compat' from '.*?'>$Z	UnicodeIOr   N)passlib.utilsr   ZassertRegexreprdir
assertTrue)selfr    r   >./venv/lib/python3.8/site-packages/passlib/tests/test_utils.pytest_compat   s    
zMiscTest.test_compatc                    sL   ddl m  G  fdddt}| |jd |jd }| |j|j d S )Nr   classpropertyc                       s   e Zd ZdZ dd ZdS )z)MiscTest.test_classproperty.<locals>.test   c                 S   s   | j S N)xvar)clsr   r   r   xprop)   s    z/MiscTest.test_classproperty.<locals>.test.xpropN)__name__
__module____qualname__r   r    r   r   r   r   test'   s   r$   r   r    )	passlib.utils.decorr   objectassertEqualr    __dict__assertIsim_func__func__)r   r$   propr   r   r   test_classproperty$   s
    
zMiscTest.test_classpropertyc              	   C   sd   ddl m} |ddddd }| d|jk | ttd	d
 | |ddd W 5 Q R X d S )Nr   )deprecated_functionz1.6z1.8)Z
deprecatedZremovedc                  W   s   | S )ztest docstringr   )argsr   r   r   	test_func5   s    z4MiscTest.test_deprecated_function.<locals>.test_funcz.. deprecated::zvthe function passlib.tests.test_utils.test_func() is deprecated as of Passlib 1.6, and will be removed in Passlib 1.8.)categorymessager      )r   r3   )r%   r.   r   __doc__ZassertWarningListdictDeprecationWarningr'   )r   r.   r0   r   r   r   test_deprecated_function1   s    


z!MiscTest.test_deprecated_functionc                    sn   ddl m  G  fdddt}| }| |jd | |jd | |jd |j}tsj| |j|j	 d S )Nr   memoized_propertyc                       s   e Zd ZdZ dd ZdS )z.MiscTest.test_memoized_property.<locals>.dummyr   c                 S   s   | j }|d | _ |S )Nr   )counter)r   valuer   r   r   r;   I   s    
z4MiscTest.test_memoized_property.<locals>.dummy.valueN)r!   r"   r#   r:   r;   r   r8   r   r   dummyF   s   r<   r   )
r%   r9   r&   r'   r;   r:   r   r)   r*   r+   )r   r<   dr,   r   r8   r   test_memoized_propertyC   s    	zMiscTest.test_memoized_propertyc                 C   sz   ddl m} t||  }| t|dd |d}|d}| |t | t|d | t|d | || dS )zgetrandbytes()r   )getrandbytes
   N)	r   r?   r   	getRandomr'   lenassertIsInstancebytesassertNotEqual)r   r?   wrapperabr   r   r   test_getrandbytesX   s    zMiscTest.test_getrandbytesi   )countc                 C   s  ddl m} t|| j|d}| |ddd | t|dd | t|dd | |ddd	 |tdd
}|tdd
}| |t	 | 
|| | tt|tdtdtdg |dd
}|dd
}| |t | 
|| | tt|dtdtdtdg dS )zgetrandstr()r   
getrandstr)seedabc rG      Zaaaaa    rH   c   abcasciiN)r   rL   r   rA   r'   assertRaises
ValueErrorr	   rC   r
   rE   sortedsetrD   decode)r   rM   rL   rF   xyr   r   r   test_getrandstrd   s     
&

zMiscTest.test_getrandstrc                 C   s0   ddl m} tdd | t|dd dS )zgenerate_password()r   )generate_passwordignorez1The function.*generate_password\(\) is deprecated   N)r   r^   warningsfilterwarningsr'   rB   )r   r^   r   r   r   test_generate_password   s    zMiscTest.test_generate_passwordc                 C   sD   ddl m} ddlm} |dg}| || | ||  dS )ztest is_crypt_context()r   )is_crypt_context)CryptContextZ	des_cryptN)r   rd   Zpasslib.contextre   r   assertFalse)r   rd   re   Zccr   r   r   test_is_crypt_context   s
    
zMiscTest.test_is_crypt_contextc                 C   sb   ddl }ddlm} || }|dd}|| }|dd}| || ||| dS )ztest genseed()r   N)genseedl    d(	 )randomr   rh   ZRandomrandintrE   rM   )r   ri   rh   rngrG   rH   r   r   r   test_genseed   s    zMiscTest.test_genseedc                    s$  ddl m}m}m} ddlm}m} | }|sf| |d | |ddd | |dd | 	d	|st| 
d
dD ]}||krx qqx|d }|| t ddr j jd  fdd}td}	||	}
||	|
}| |t | ||
 | |t|	t|
|
 |
dd d }| ||	||
 td}||}| |||| | |t|t|| | t|d|
 | |d|
 | |d| ddl m} |j}zjdfdd|_dD ](| |d|
d | |d|
 qd| |d|
d | |d|
 W 5 ||_X dS )ztest crypt.crypt() wrappersr   )	has_crypt
safe_crypt
test_crypt)get_supported_os_crypt_schemesget_crypt_handlerr   r$   ZaaNzaaqPiZY5xR5l.zcrypt.crypt() not availablez0crypt() present, but no supported schemes found!)Z	md5_cryptZsha256_cryptrP   
min_rounds)roundsc                    s>   t | tst | }t |tr,|d}t |ts:t|S )Nutf-8)
isinstancer
   AssertionErrorhashrD   rZ   Zsecretrw   )hasherr   r   get_hash   s    


z%MiscTest.test_crypt.<locals>.get_hashZxxu   testሴ c                    s    S r   r   rx   )retvalr   r   <lambda>       z%MiscTest.test_crypt.<locals>.<lambda>)NrO   :z:0z*0Zxxx)r   rm   rn   ro   Zpasslib.registryrp   rq   r'   rf   ZskipTestZfailgetattrZusingrr   r	   rC   r
   r   rV   rW   r   ZutilsZ_crypt)r   rm   rn   ro   rp   rq   Z	supportedZschemerz   s1Zh1resultZh1xs2Zh2modZorigr   )ry   r}   r   ro      sZ    

	
zMiscTest.test_cryptc                    s  ddl m m | t tdd | t tdd | t tdd | t dtd | t dd | t dd | t dtd | t dd | t dtd | t dd  fdd}td	td
tdd fD ]r}||r|  ||d|f  n| t || | ||d|f  |d}|  ||d|f  qtd	tdftdtdftdtdftdtdftdd dd td tdd ftdtd	ftd
tdftd
tdftdtd
ff	D ]\}}||rP||rP|  ||d||f  |  ||d||f  n | t || | t || | ||d||f  | ||d||f  |d}|d}|  ||d||f  |  ||d||f  qdS )ztest consteq()r   consteqstr_consteqrO   r   r   Nc                    s    kpt pt| S r   )r   r   )r;   r   r   r   consteq_supports_string  s    z6MiscTest.test_consteq.<locals>.consteq_supports_stringrG   rN   u   ÿ¢ r@   z	value %r:latin-1rS   ZabcabcZzbaabcZabzabcZabcabzrP   ZabcdefZdefabcZqwertyuiopasdfghjklzxcvbnmzvalues %r %r:)	r   r   r   rV   	TypeErrorr	   r   encoderf   )r   r   r;   lrr   r   r   test_consteq   sZ    





zMiscTest.test_consteqc                 C   s*  |    ddlm} | t|d | t|d | t|d | |tdtd | |tdtd | |tdtd	 | |td
td | |tdtd | |tdtd | t|td | t|td | t|td | t|td | t|td | t|td | t|td | t|td | t|td | t|td | t|td | t|td | t|td | t|td | t|td | |tdtd | |tdtd | |tdtd | t|td  | t|td! | |td"td" | |td#td$ | |td%td% | |td&td& | |td'td( | |td)td$ | t|td* | t|td | t|td | |tdtd dS )+z"test saslprep() unicode normalizerr   )saslprepNr   r   rO      ­u   $­$‍$z$$$u
   $ $ $　$z$ $ $ $u   à   àr|   u   ᠎u   ￹u   u   ﷐u   u   �u   ⿰u   ‎u   ⁯u   ऀu   ￸u   󠀁u   ا1u   اu   ابu   ا1بu   اAبu   xاzZxAzu   I­XZIXuserZUSER   ªrG   u   Ⅸ)Zrequire_stringprepr   r   rV   r   r'   r	   rW   )r   spr   r   r   test_saslprepe  sR    zMiscTest.test_saslprepc                 C   s|   ddl m} | |dg  | |dg  | |ddg | |ddg | |dddg | |d	ddg d S )
Nr   )
splitcommarO   ,rG   z a , z a , brH   z a, b, )r   r   r'   )r   r   r   r   r   test_splitcomma  s    zMiscTest.test_splitcommac                 C   sR  ddl m} dD ]}|d t|}t|d D ]}d||f }|||}|d | jt|||d | jt|t|||d | jt|t|d |d	 |d | j	||d
t| |d q2qdD ]L}t|}t|d D ]2}d||f }|||}| j	||d
| |d qqdD ]T}t|}t|d D ]8}d||f }|||}| j	||d
|d  |d q4qd}| 	||dd | 	||d	d | 	||dd | 	||dd | 	||dd | 	||dd | 	||dd | 	||dd | 	||dd | 	||dd | 	||dd | 	||dd d
S )z!
        utf8_truncate()
        r   )utf8_truncate)	r      1s   123   s
      s
   s   a þþs&   abcdefghjusdfaoiu þþdsfioauweoiruerrt      zsource=%r index=%r: )msg   r   N)   s
       s
             )   s
      s
   MNOPr      Mr3   s   MNs   MNs   MNrQ            s   MNO	   r@      )
r   r   rZ   rB   rangeZassertLessEqualassertGreaterEqualmin
assertLessr'   )r   r   sourceendidxprefixr   r   r   r   test_utf8_truncate  sn    


" 

$	zMiscTest.test_utf8_truncateN)r!   r"   r#   r4   r   r-   r7   r>   rI   r   r]   rc   rg   rl   ro   r   r   r   r   r   r   r   r   r      s    
(VfO	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S )	CodecTestz,tests bytes/unicode helpers in passlib.utilsc                 C   sr   t rddl}| t|j nddl}| t|j | dt | dt t rb| ddd n| dd dS )z*test b() helper, bytes and native str typer   Nr       r       ÿ)	r   builtinsr)   rD   Z__builtin__strrC   r'   rZ   )r   r   r   r   r   
test_bytes:  s    zCodecTest.test_bytesc                 C   s   ddl m} | |tdd | |tdd | |tddd | t|tdd	 | |dd | |dd | |dd | |ddd | |ddd
dd | t|dd | t|d dS )ztest to_bytes()r   )r   rN   rT   r       ÿr   r   rU   rO   rt   N)r   r   r'   r	   rV   rW   rv   r   )r   r   r   r   r   test_to_bytesJ  s     zCodecTest.test_to_bytesc                 C   s   ddl m} | |tdtd | |tdtd | |tddtd | |dtd | |dtd | |dd	td | t|d | t|dd
 | t|d
 d
S )ztest to_unicode()r   )
to_unicoderN   r   rU   rT   r   r   r   N)r   r   r'   r	   rV   rW   rv   r   )r   r   r   r   r   test_to_unicodeg  s    zCodecTest.test_to_unicodec                 C   s   ddl m} | |tddd | |ddd tr`| |tddd | t|dd n&| t|tdd | |ddd | |tdd	d | |d
d	d | |tddtrdnd | |ddtrdnd | t|dd dS )ztest to_native_str()r   )to_native_strrN   rU   rT   r   s   àu   Ã r      rt   N)	r   r   r'   r	   r   rV   UnicodeDecodeErrorUnicodeEncodeErrorr   )r   r   r   r   r   test_to_native_str}  s*    


zCodecTest.test_to_native_strc                 C   sP   ddl m} | |d | |td | |d | |td dS )ztest is_ascii_safe()r   )r   s    abcz abcs    abcu    abcN)r   r   r   r	   rf   )r   r   r   r   r   test_is_ascii_safe  s
    zCodecTest.test_is_ascii_safec                 C   s   ddl m} | |dd | |dd | |dd | |dd | |dd | |dd | |dd | |dd dS )	ztest is_same_codec()r   )is_same_codecNrU   ASCIIrt   utf8ZUTF_8)r   r   r   rf   )r   r   r   r   r   test_is_same_codec  s    zCodecTest.test_is_same_codecN)
r!   r"   r#   r4   r   r   r   r   r   r   r   r   r   r   r   7  s   r   c                   @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )Base64EngineTestz%test standalone parts of Base64Enginec                 C   sR   ddl m}m} | t|d | t||d d  | t||d d d  d S )Nr   )Base64Engine
AB64_CHARSr   rP   A)passlib.utils.binaryr   r   rV   r   rW   )r   r   r   r   r   r   test_constructor  s    z!Base64EngineTest.test_constructorc                 C   s  ddl m} | |dtd | |tdtd | t|td | t|d | t|d | t|td	 | |d
td | t|d | |dtd | |dtd | |dtd | |dtd | |dtd dS )zab64_decode()r   )ab64_decoderT   69b7rN      abÿ   ab   ab!ab!   abcd69b71d   abcde   abcdef69b71d79   abcdeQ   abcdefg
69b71d79f8   ab+/69bfbf   ab./N)r   r   r'   r   r	   rV   rW   r   )r   r   r   r   r   test_ab64_decode  s    z!Base64EngineTest.test_ab64_decodec                 C   s   ddl m} | |tdd | tr,tnt|tdd | |tdd | |tdd	 | |td
d | |tdd dS )zab64_encode()r   )ab64_encoder   rT   r   r   r   r   r   r   r   r   r   N)	r   r   r'   r   rV   r   r   r   rZ   )r   r   r   r   r   test_ab64_encode  s     z!Base64EngineTest.test_ab64_encodec                 C   s   ddl m} | |dtd | |tdtd | t|td | t|d | t|d | t|td	 | |d
td | t|d | |dtd | |dtd | |dtd dS )zb64s_decode()r   )b64s_decoderT   r   rN   r   r   r   r   r   r   r   r   r   r   r   r   N)r   r   r'   r   r	   rV   rW   r   )r   r   r   r   r   test_b64s_decode  s    z!Base64EngineTest.test_b64s_decodec                 C   s   ddl m} | |tdd | tr,tnt|tdd | |tdd | |tdd	 | |td
d | |tdd dS )zb64s_encode()r   )b64s_encoder   rT   r   r   r   r   r   r   r   r   r   N)	r   r   r'   r   rV   r   r   r   rZ   )r   r   r   r   r   test_b64s_encode  s     z!Base64EngineTest.test_b64s_encodeN)	r!   r"   r#   r4   r   r   r   r   r   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdZd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dddgfdddddgfgZdddddgfg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 )-_Base64Testz+common tests for all Base64Engine instancesN   ?c                    s   t  fdd|D S )z!generate byte string from offsetsc                 3   s"   | ]} j j||d   V  qdS )r   N)enginebytemap).0or   r   r   	<genexpr>5  s     z _Base64Test.m.<locals>.<genexpr>)r   )r   offsetsr   r   r   m3  s    z_Base64Test.mc                 C   s<   | j }|j}| jD ]$\}}||}| ||d|f  qdS )z,test encode_bytes() against reference inputsz
encode %r:N)r   encode_bytesencoded_datar'   )r   r   r   rawencodedr   r   r   r   test_encode_bytes:  s
    z_Base64Test.test_encode_bytesc                 C   s0   | j }|j}| t|td | t|d dS )z"test encode_bytes() with bad inputr|   N)r   r   rV   r   r	   )r   r   r   r   r   r   test_encode_bytes_badB  s    z!_Base64Test.test_encode_bytes_badc                 C   s<   | j }|j}| jD ]$\}}||}| ||d|f  qdS )z,test decode_bytes() against reference inputsz
decode %r:N)r   decode_bytesr   r'   )r   r   rZ   r   r   r   r   r   r   test_decode_bytesL  s
    z_Base64Test.test_decode_bytesc              	   C   sD  t rdd nt}| j}| j}|j}d}| ||dd| tddD ]d}|jrn|dk r\|n|d|d > }n|dk r|d|d > n|}| ||dd|> |d	|  qF| ||ddd|d  tddD ]l}|jr|dk r|n|d|d > }n|dk r|d|d > n|}| ||ddd|> || d
|  qdS )z(test decode_bytes() ignores padding bitsc                 S   s
   t | gS r   )rD   )vr   r   r   r~   V  r   z7_Base64Test.test_decode_bytes_padding.<locals>.<lambda>r   r   r   r   r   r3   z
%d/4 bits:z
%d/2 bits:N)r   chrr   r   r   r'   r   big)r   Zbchrr   r   rZ   ZBNULLiZcorrectr   r   r   test_decode_bytes_paddingT  s&    "z%_Base64Test.test_decode_bytes_paddingc                 C   st   | j }|j}| t||jdd  | | j|jk | t|| jd  | t||jdd  | t|d dS )z"test decode_bytes() with bad inputNrQ   r   )	r   r   rV   rW   r   r   bad_byter   charmap)r   r   rZ   r   r   r   test_decode_bytes_bado  s    z!_Base64Test.test_decode_bytes_badc                 C   s4  | j }ddlm}m} |  }d}tdD ]}||r<dndd}|sLd}d| d	 d
 }|||}	||	}
| t	|
| |
|
}| ||	 |d dkr||ddd	g7 }d
| d }|||j|}
|
|
}	| t	|	|d|  ||	}|d r"| |dd |
dd  q*| ||
 q*dS )z2test encode_bytes/decode_bytes against random datar   )r?   rL   Fi  r      Tr   r3   r   rP   zencoded %d:N)r   r   r?   rL   rA   r   rj   r   r'   rB   r   choicer   )r   r   r?   rL   rk   Zsaw_zeror   sizeZenc_sizer   r   r   Zraw_sizer   r   r   
test_codec  s0    





z_Base64Test.test_codecc                 C   s  ddl m} |  }| j}| jj}d}|dk r|dd}|||j|d}|d@ dkrl| t	|| q&|
||}| dk r|d}|d}||kr||\}	}
| |	 | |
| n2| |d	 d ||\}	}
| |	 | |
| |d7 }q&d
S )ztest repair_unused()r   rK   i,     rU   r   r   g      ?r   N)r   rL   rA   r   check_repair_unusedrj   r  r   rV   rW   r   r   ri   rZ   rf   r'   rE   r   )r   rL   rk   r   r  r   r  ZcdataZrdataokr   r   r   r   test_repair_unused  s0    




z_Base64Test.test_repair_unuseds   3"s   "3r3   r   r   s   "3s   "c                 C   sZ   | j }| j| j D ],\}}}|||}||}| || q| t|jtdg  dS )ztest encode_transposed_bytes()rG   N)	r   
transposedtransposed_dupsZencode_transposed_bytesr   r'   rV   r   r	   )r   r   r   inputr   tmpoutr   r   r   test_encode_transposed_bytes  s    
z(_Base64Test.test_encode_transposed_bytesc                 C   s>   | j }| jD ],\}}}||}|||}| || qdS )ztest decode_transposed_bytes()N)r   r  r   decode_transposed_bytesr'   )r   r   r  r   r   r  r  r   r   r   test_decode_transposed_bytes  s
    
z(_Base64Test.test_decode_transposed_bytesc                 C   s8   | j }| jD ]&\}}}||}| t|j|| qdS )z8test decode_transposed_bytes() fails if map is a one-wayN)r   r  r   rV   r   r  )r   r   r  _r   r  r   r   r    test_decode_transposed_bytes_bad  s    
z,_Base64Test.test_decode_transposed_bytes_badc                 C   s  |   }| j}t|d| }t|d| }| d }|| d }d|> }	|D ](\}
}||
}| |t | || qL| t|d | t||	 |D ] \}
}| |||
d|f  q| j}| t||d|d   | t||d|d   | t|| j	|  | t
||jd  | t
|d dd	lm} td
D ]}|d|	d }
||
}| t|| | |||
 |||j|}||}
| |
dd|  | |
|	d|  ||
}|r| |dd |dd  n| || q<dS )z5helper to check encode_intXX & decode_intXX functionszencode_int%szdecode_int%sr   r   rP   zencoded %r:r   NrK   d   zdecode %r out of bounds:r{   )rA   r   r   rC   rD   r'   rV   rW   r   r   r   r  r   rL   r   rj   rB   r   r   r   )r   bitsZencoded_pairsrk   r   r   rZ   Zpadcharsupperr;   r   r   r   rL   r   r   r   r   check_int_pair  sF    
z_Base64Test.check_int_pairc                 C   s0   | j }| j}| dd|dfd|dfg d S )Nr   r   ?   )r   r   r  r   r   r   r   r   r   	test_int6/  s    z_Base64Test.test_int6c              	   C   sP   | j }| j}| dd|ddfd|jr0|ddn|ddfd|ddfg d S )Nr  r   r  i  r   r   r  r   r  r   r   r   
test_int124  s     z_Base64Test.test_int12c                 C   s`   | j }| j}| dd|ddddfd|jr8|ddddn|ddddfd|ddddfg d S )N   r   r  i r  r  r   r   r   
test_int24:  s    $z_Base64Test.test_int24c                 C   s   | j }| j}| dd|dddddddddddfd|jrT|dddddddddddn|dddddddddddfd|jr|dddddddddddn|dddddddddddfg d S )N@   r   r  r   <   l    r`   r  r  r   r   r   
test_int64A  s    $$$z_Base64Test.test_int64c                 C   sh   | j s| d| j}| j D ]F\}}}t|d| }t|d| }| ||| | ||| qdS )z(test against reference integer encodingsznone defined for classzencode_int%dzdecode_int%dN)encoded_intsZ	skipTestsr   r   r'   )r   r   datar;   r  r   rZ   r   r   r   test_encoded_intsL  s    
z_Base64Test.test_encoded_ints)r!   r"   r#   r4   r   r   r$  r   r   r   r   r   r   r  r  r
  r  r  r  r  r  r  r  r  r   r#  r&  r   r   r   r   r      s6   
/(
0r   )h64h64bigc                	   @   s6   e Zd ZdZeZdZddddddd	d
dg	ZddgZdS )H64_Testztest H64 codec functionsz	h64 codecr   r   )   Us   J/)   Us   Jd8)   UUs   JdOJ)   UUs   JdOJe0)   UUUs   JdOJeK3)   UUUs   JdOJeKZe)   UUs   JdOJj0)   UU_s   JdOJey3)   z.r  r  )   .z  r  N)	r!   r"   r#   r4   r'  r   descriptionPrefixr   r$  r   r   r   r   r)  _  s    r)  c                	   @   s6   e Zd ZdZeZdZddddddd	d
dg	ZddgZdS )H64Big_Testztest H64Big codec functionszh64big codecr*  )r+  s   JE)r,  s   JOc)r-  s   JOdJ)r.  s   JOdJeU)r/  s   JOdJeZI)r0  s   JOdJeZKe)r1  s   JOdJfk)r2  s   JOdJeZw)r4  r  r  )r3  r5  r  N)	r!   r"   r#   r4   r(  r   r6  r   r$  r   r   r   r   r7  x  s    r7  )r4   Z
__future__r   	functoolsr   ra   r   r   r   Zpasslib.utils.compatr   r   r   r	   r
   r   r   Zpasslib.tests.utilsr   r   r   r   r   r   r   r   r'  r(  r)  r7  r   r   r   r   <module>   s(   $    ( i  ?