U
    La&                     @   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   assertRegexreprdir
assertTrue)selfr    r   </tmp/pip-unpacked-wheel-8v2dfbvt/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)
deprecated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   r6   )r&   r/   r   __doc__ZassertWarningListdictDeprecationWarningr(   )r   r/   r3   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   r;   r   r   dummyF   s   r?   r   )
r&   r<   r'   r(   r>   r=   r   r*   r+   r,   )r   r?   dr-   r   r;   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   rB   r   	getRandomr(   lenassertIsInstancebytesassertNotEqual)r   rB   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 rJ      Zaaaaa    rK   c   abcasciiN)r   rO   r   rD   r(   assertRaises
ValueErrorr	   rF   r
   rH   sortedsetrG   decode)r   rP   rO   rI   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   ra   warningsfilterwarningsr(   rE   )r   ra   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   rg   Zpasslib.contextrh   r   assertFalse)r   rg   rh   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   rl   RandomrandintrH   rP   )r   rm   rl   rngrJ   rK   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_cryptrS   
min_rounds)roundsc                    s>   t | tst | }t |tr,|d}t |ts:t|S )Nutf-8)
isinstancer
   AssertionErrorhashrG   r]   secretr|   )hasherr   r   get_hash   s    


z%MiscTest.test_crypt.<locals>.get_hashZxxu   testሴ c                    s    S r   r   r}   )retvalr   r   <lambda>       z%MiscTest.test_crypt.<locals>.<lambda>)NrR   :z:0z*0Zxxx)r   rr   rs   rt   Zpasslib.registryru   rv   r(   ri   ZskipTestZfailgetattrZusingrw   r	   rF   r
   r   rY   rZ   r   utilsZ_crypt)r   rr   rs   rt   ru   rv   	supportedschemer   s1h1resultZh1xs2h2modorigr   )r   r   r   rt      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_consteqrR   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_stringrJ   rQ   u   ÿ¢ rC   z	value %r:latin-1rV   ZabcabcZzbaabcZabzabcZabcabzrS   ZabcdefZdefabcZqwertyuiopasdfghjklzxcvbnmzvalues %r %r:)	r   r   r   rY   	TypeErrorr	   r   encoderi   )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   rR      ­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userUSER   ªrJ   u   Ⅸ)Zrequire_stringprepr   r   rY   r   r(   r	   rZ   )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   )
splitcommarR   ,rJ   z a , z a , brK   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 þþdsfioauweoiruerry      zsource=%r index=%r: )msg   r   N)   s
       s
             )   s
      s
   MNOPr      Mr6   s   MNs   MNs   MNrT            s   MNO	   rC      )
r   r   r]   rE   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$   r7   r   r.   r:   rA   rL   r   r`   rf   rk   rq   rt   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*   rG   __builtin__strrF   r(   r]   )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   rQ   rW   r       ÿr   r   rX   rR   ry   N)r   r   r(   r	   rY   rZ   r{   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_unicoderQ   r   rX   rW   r   r   r   N)r   r   r(   r	   rY   rZ   r{   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_strrQ   rX   rW   r   s   àu   Ã r      ry   N)	r   r   r(   r	   r   rY   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	   ri   )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_codecNrX   ASCIIry   utf8ZUTF_8)r   r   r   ri   )r   r   r   r   r   test_is_same_codec  s    zCodecTest.test_is_same_codecN)
r"   r#   r$   r7   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   rS   A)passlib.utils.binaryr   r   rY   r   rZ   )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_decoderW   69b7rQ      abÿ   ab   ab!ab!   abcd69b71d   abcde   abcdef69b71d79   abcdeQ   abcdefg
69b71d79f8   ab+/69bfbf   ab./N)r   r   r(   r   r	   rY   rZ   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   rW   r   r   r   r   r   r   r   r   r   N)	r   r   r(   r   rY   r   r   r   r]   )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_decoderW   r   rQ   r   r   r   r   r   r   r   r   r   r   r   r   N)r   r   r(   r   r	   rY   rZ   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   rW   r   r   r   r   r   r   r   r   r   N)	r   r   r(   r   rY   r   r   r   r]   )r   r   r   r   r   test_b64s_encode  s     z!Base64EngineTest.test_b64s_encodeN)	r"   r#   r$   r7   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  rY   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   r]   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   )rG   )vr   r   r   r   V  r   z7_Base64Test.test_decode_bytes_padding.<locals>.<lambda>r   r   r   r   r   r6   z
%d/4 bits:z
%d/2 bits:N)r   chrr   r   r  r(   r   big)r   Zbchrr   r   r]   ZBNULLi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 inputNrT   r   )	r   r  rY   rZ   r   r   bad_byter   charmap)r   r   r]   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   )rB   rO   Fi  r      Tr   r6   r   rS   zencoded %d:N)r   r   rB   rO   rD   r   ro   r  r(   rE   r  choicer   )r   r   rB   rO   rp   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   rN   i,     rX   r   r   g      ?r   N)r   rO   rD   r   check_repair_unusedro   r  r   rY   rZ   r  r  rm   r]   ri   r(   rH   r   )r   rO   rp   r   r  r  r  cdataZrdataokr   r   r   r   test_repair_unused  s0    




z_Base64Test.test_repair_unuseds   3"s   "3r6   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()rJ   N)	r   
transposedtransposed_dupsZencode_transposed_bytesr  r(   rY   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  rY   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   rS   zencoded %r:r   NrN   d   zdecode %r out of bounds:r   )rD   r   r   rF   rG   r(   rY   rZ   r   r  r   r  r   rO   r   ro   rE   r   r   r   )r   bitsZencoded_pairsrp   r   r   r]   padcharsupperr>   r  r   r   rO   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    rc   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   r]   r   r   r   test_encoded_intsL  s    
z_Base64Test.test_encoded_ints)r"   r#   r$   r7   r   r  r5  r  r   r  r  r  r  r  r  r  r  r  r   r"  r$  r*  r-  r/  r1  r4  r7  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$   r7   r8  r   descriptionPrefixr  r5  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)rA  s   JOdJeZKe)rB  s   JOdJfk)rC  s   JOdJeZw)rE  r+  r  )rD  rF  r  N)	r"   r#   r$   r7   r9  r   rG  r  r5  r   r   r   r   rH  x  s    rH  )r7   
__future__r   	functoolsr   rd   r   r   r   Zpasslib.utils.compatr   r   r   r	   r
   r   r   Zpasslib.tests.utilsr   r   r   r   r   r   r   r   r8  r9  r:  rH  r   r   r   r   <module>   s(   $    ( i  ?