o
    ¯b_4  ã                   @   s®  d dl Z d dlZ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 G dd„ deƒZG dd„ dejƒZG d	d
„ d
ejƒZG dd„ deƒZG dd„ deeƒZG dd„ deƒZG dd„ dejƒZG dd„ deƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZdd„ Ze  ee¡ G dd „ d ƒZG d!d"„ d"ƒZd#d$„ ZG d%d&„ d&eƒZG d'd(„ d(eƒZG d)d*„ d*ƒZ G d+d,„ d,ƒZ!G d-d.„ d.eƒZ"G d/d0„ d0eƒZ#eeegZ$dS )1é    N)ÚaotÚcrefutilÚstyles)Úunittest)ÚTestCasec                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚVersionTestsc                 C   sP   G dd„ dƒa t t ƒ ¡}G dd„ dtjƒa t |¡}t ¡  |js&J dƒ‚d S )Nc                   @   ó   e Zd Zdd„ ZdS )ÚNullVersionedc                 S   ó
   d| _ d S )Nr   ©Úok©Úself© r   ú=/usr/lib/python3/dist-packages/twisted/test/test_persisted.pyÚ__init__   ó   
zNullVersioned.__init__N©Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r	      ó    r	   c                   @   ó   e Zd ZdZdd„ ZdS )r	   é   c                 S   r
   ©Nr   r   r   r   r   r   ÚupgradeToVersion1   r   zNullVersioned.upgradeToVersion1N)r   r   r   ÚpersistenceVersionr   r   r   r   r   r	      s    zinitial upgrade not run!)r	   ÚpickleÚdumpsr   Ú	VersionedÚloadsÚ	doUpgrader   )r   ÚpkclÚmnvr   r   r   Útest_nullVersionUpgrade   s   
z$VersionTests.test_nullVersionUpgradec                 C   s®   G dd„ dt jƒatƒ }|js|jrJ dƒ‚t |¡}dt_t |¡}t  	¡  |js.J dƒ‚|js5J dƒ‚t |¡}t |¡}t  	¡  |jdksLJ dƒ‚|jdksUJ dƒ‚d S )	Nc                   @   s6   e Zd ZdZdgZdZdZdd„ Zdd„ Zdd	„ Z	d
S )ÚMyVersionedé   Úgarbagedatar   c                 S   s   d| _ dd„ | _d S )NÚxxxc                 S   s   dS )Nzcant persistr   )Úqr   r   r   Ú<lambda>0   s    z&MyVersioned.__init__.<locals>.<lambda>)Úsomedatar'   r   r   r   r   r   .   s   zMyVersioned.__init__c                 S   ó   |  j d7  _ d S r   )Úv3r   r   r   r   ÚupgradeToVersion32   ó   zMyVersioned.upgradeToVersion3c                 S   r,   r   )Úv4r   r   r   r   ÚupgradeToVersion45   r/   zMyVersioned.upgradeToVersion4N)
r   r   r   r   ÚpersistenceForgetsr-   r0   r   r.   r1   r   r   r   r   r%   (   s    r%   zhasn't been upgraded yeté   zdidn't do version 3 upgradezdidn't do version 4 upgrader   zupgraded unnecessarily)
r   r   r%   r-   r0   r   r   r   r    r!   )r   ÚmvÚpicklÚobjr   r   r   Útest_versionUpgrade%   s   



z VersionTests.test_versionUpgradec                 C   s–   G dd„ dt jƒatddƒ}tddƒ}t ||f¡}~~dt_dd„ t_t |¡\}}t  ¡  |  	|j
d¡ |  	|j
d¡ |  |j¡ |  |j¡ d S )	Nc                   @   ó   e Zd Zdd„ Zdd„ ZdS )ÚClassWithCustomHashc                 S   s   || _ || _d S ©N)ÚuniqueÚhash)r   r;   r<   r   r   r   r   J   s   
zClassWithCustomHash.__init__c                 S   ó   | j S r:   )r<   r   r   r   r   Ú__hash__N   ó   zClassWithCustomHash.__hash__N)r   r   r   r   r>   r   r   r   r   r9   I   s    r9   Úv1r   Úv2r   c                 S   s   t | ddƒS ©NÚupgradedT©Úsetattrr   r   r   r   r*   W   s    ÿz3VersionTests.test_nonIdentityHash.<locals>.<lambda>)r   r   r9   r   r   r   r   r    r!   ÚassertEqualr;   Ú
assertTruerC   )r   r@   rA   Úpklr   r   r   Útest_nonIdentityHashF   s   


z!VersionTests.test_nonIdentityHashc                    sš   G dd„ dt jƒaG dd„ dt jƒatƒ }tƒ }t |¡t |¡}‰ ~~dt_‡ fdd„}|t_dt_dd	„ }|t_t |¡}t  	¡  |  
|jj¡ d S )
Nc                   @   ó   e Zd ZdS )Ú	ToyClassAN©r   r   r   r   r   r   r   rK   d   ó    rK   c                   @   rJ   )Ú	ToyClassBNrL   r   r   r   r   rN   g   rM   rN   r   c                    s   t  ˆ ¡| _t ¡  d S r:   )r   r    Úyr   r!   r   ©ÚpklBr   r   r   p   s   zWVersionTests.test_upgradeDeserializesObjectsRequiringUpgrade.<locals>.upgradeToVersion1c                 S   s   t | ddƒ d S rB   rD   r   r   r   r   ÚsetUpgradedw   s   zQVersionTests.test_upgradeDeserializesObjectsRequiringUpgrade.<locals>.setUpgraded)r   r   rK   rN   r   r   r   r   r    r!   rG   rO   rC   )r   ÚxrO   ÚpklAr   rR   r   rP   r   Ú/test_upgradeDeserializesObjectsRequiringUpgradea   s   
z<VersionTests.test_upgradeDeserializesObjectsRequiringUpgradeN)r   r   r   r$   r7   rI   rU   r   r   r   r   r      s
    !r   c                   @   rJ   )ÚVersionedSubClassNrL   r   r   r   r   rV   �   rM   rV   c                   @   rJ   )ÚSecondVersionedSubClassNrL   r   r   r   r   rW   …   rM   rW   c                   @   rJ   )ÚVersionedSubSubClassNrL   r   r   r   r   rX   ‰   rM   rX   c                   @   rJ   )ÚVersionedDiamondSubClassNrL   r   r   r   r   rY   �   rM   rY   c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚAybabtuTestszž
    L{styles._aybabtu} gets all of classes in the inheritance hierarchy of its
    argument that are strictly between L{Versioned} and the class itself.
    c                 C   s   |   t tj¡g ¡ dS )zM
        L{styles._aybabtu} of L{Versioned} itself is an empty list.
        N)rF   r   Ú_aybabtur   r   r   r   r   Útest_aybabtuStrictEmpty—   s   z$AybabtuTests.test_aybabtuStrictEmptyc                 C   s   |   t t¡g ¡ dS )z�
        There are no classes I{between} L{VersionedSubClass} and L{Versioned},
        so L{styles._aybabtu} returns an empty list.
        N)rF   r   r[   rV   r   r   r   r   Útest_aybabtuStrictSubclass�   s   z'AybabtuTests.test_aybabtuStrictSubclassc                 C   s   |   t t¡tg¡ dS )z†
        With a sub-sub-class of L{Versioned}, L{styles._aybabtu} returns a list
        containing the intervening subclass.
        N)rF   r   r[   rX   rV   r   r   r   r   Útest_aybabtuSubsubclass¤   s   z$AybabtuTests.test_aybabtuSubsubclassc                 C   s   |   t t¡tttg¡ dS )z�
        For a diamond-shaped inheritance graph, L{styles._aybabtu} returns a
        list containing I{both} intermediate subclasses.
        N)rF   r   r[   rY   rX   rV   rW   r   r   r   r   Útest_aybabtuStrict«   s   þzAybabtuTests.test_aybabtuStrictN)r   r   r   Ú__doc__r\   r]   r^   r_   r   r   r   r   rZ   ‘   s    rZ   c                   @   r   )ÚMyEphemeralc                 C   ó
   || _ d S r:   ©rS   ©r   rS   r   r   r   r   ·   r   zMyEphemeral.__init__Nr   r   r   r   r   ra   ¶   r   ra   c                   @   r   )ÚEphemeralTestsc                 C   s\   t dƒ}|  |jt ¡ |  |jd¡ t |¡}t |¡}|  |jtj¡ |  	t
|dƒ¡ d S )Né   rS   )ra   rF   Ú	__class__rS   r   r   r    r   Ú	EphemeralÚassertFalseÚhasattr)r   Úor5   r   r   r   Útest_ephemeral¼   s   

zEphemeralTests.test_ephemeralN)r   r   r   rl   r   r   r   r   re   »   r   re   c                   @   r8   )Ú
Pickleablec                 C   rb   r:   rc   rd   r   r   r   r   É   r   zPickleable.__init__c                 C   r=   r:   rc   r   r   r   r   ÚgetXÌ   r?   zPickleable.getXN)r   r   r   r   rn   r   r   r   r   rm   È   ó    rm   c                   @   r   )ÚNotPickleablez)
    A class that is not pickleable.
    c                 C   s   t dƒ‚)z9
        Raise an exception instead of pickling.
        zNot serializable.)Ú	TypeErrorr   r   r   r   Ú
__reduce__Õ   s   zNotPickleable.__reduce__N)r   r   r   r`   rr   r   r   r   r   rp   Ð   ó    rp   c                   @   r   )ÚCopyRegisteredzb
    A class that is pickleable only because it is registered with the
    C{copyreg} module.
    c                 C   s   t ƒ | _dS )zE
        Ensure that this object is normally not pickleable.
        N)rp   ÚnotPickleabler   r   r   r   r   â   s   zCopyRegistered.__init__N)r   r   r   r`   r   r   r   r   r   rt   Ü   ó    rt   c                   @   s   e Zd ZdZdS )ÚCopyRegisteredLoadedz2
    L{CopyRegistered} after unserialization.
    N)r   r   r   r`   r   r   r   r   rw   é   s    rw   c                 C   s   t dfS )zé
    Externally implement C{__reduce__} for L{CopyRegistered}.

    @param cr: The L{CopyRegistered} instance.

    @return: a 2-tuple of callable and argument list, in this case
        L{CopyRegisteredLoaded} and no arguments.
    r   )rw   )Úcrr   r   r   ÚreduceCopyRegisteredï   s   	ry   c                   @   r   )ÚAú
    dummy class
    c                 C   ó   d S r:   r   r   r   r   r   Úamethod  ó   z	A.amethodN)r   r   r   r`   r}   r   r   r   r   rz   þ   rs   rz   c                   @   r   )ÚBr{   c                 C   r|   r:   r   r   r   r   r   Úbmethod  r~   z	B.bmethodN)r   r   r   r`   r€   r   r   r   r   r     rs   r   c                   C   r|   r:   r   r   r   r   r   Úfunktion  r~   r�   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚPicklingTestsz$Test pickling of extra object types.c                 C   s$   t  t¡}t  |¡}|  |t¡ d S r:   )r   r   r   r    rF   )r   r5   rk   r   r   r   Útest_module  s   

zPicklingTests.test_modulec                 C   sF   t dƒ}t |j¡}t |¡}|  |ƒ d¡ |  t|ƒt|jƒ¡ d S )Nr3   )rm   r   r   rn   r    rF   Útype)r   r6   r5   rk   r   r   r   Útest_instanceMethod  s
   
z!PicklingTests.test_instanceMethodN)r   r   r   r`   rƒ   r…   r   r   r   r   r‚     s    r‚   c                   @   r   )ÚStringIOTransitionTestsz–
    When pickling a cStringIO in Python 2, it should unpickle as a BytesIO or a
    StringIO in Python 3, depending on the type of its contents.
    c                 C   s0   d}t  |¡}|  |tj¡ |  | ¡ d¡ dS )zg
        A cStringIO pickled with bytes in it will yield an L{io.BytesIO} on
        python 3.
        sE   ctwisted.persisted.styles
unpickleStringI
p0
(S'test'
p1
I0
tp2
Rp3
.ÚtestN)r   r    ÚassertIsInstanceÚioÚStringIOrF   Úgetvalue)r   ÚpickledStringIWithTextÚloadedr   r   r   Útest_unpickleBytesIO*  s
   ÿ
z,StringIOTransitionTests.test_unpickleBytesION)r   r   r   r`   rŽ   r   r   r   r   r†   $  rv   r†   c                   @   r   )ÚEvilSourcerorc                 C   s   | | _ | | j _|| j j_d S r:   )ÚaÚbÚcrd   r   r   r   r   9  s   zEvilSourceror.__init__Nr   r   r   r   r   r�   8  r   r�   c                   @   r8   )ÚNonDictStatec                 C   r=   r:   ©Ústater   r   r   r   Ú__getstate__@  r?   zNonDictState.__getstate__c                 C   rb   r:   r”   )r   r•   r   r   r   Ú__setstate__C  r   zNonDictState.__setstate__N)r   r   r   r–   r—   r   r   r   r   r“   ?  ro   r“   c                   @   sT   e 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S )ÚAOTTestsc              
   C   sF   ddddt dddƒddtjd d tf
}t t |¡¡}|  ||¡ d S )	Nr   g       @y              @Tr&   rf   ÚhelloÚworld)ÚsliceÚsysÚmaxsizeÚEllipsisr   ÚunjellyFromSourceÚjellyToSourcerF   )r   r6   ÚrtObjr   r   r   Útest_simpleTypesH  s   
özAOTTests.test_simpleTypesc                 C   sL   t ƒ }tƒ }|j|_||_t t |¡¡jj}|  t |¡j	t 
|¡¡ d S r:   )rz   r   r€   r�   r   rŸ   r    rF   Ú_selfOfMethodrg   Ú_classOfMethod)r   r�   r‘   Úim_r   r   r   Útest_methodSelfIdentityX  s   z AOTTests.test_methodSelfIdentityc                 C   sP   t ƒ }tƒ }|j|_||_tj}t`z|  ttjt |¡¡ W |t_dS |t_w )z°
        If a class change after an instance has been created,
        L{aot.unjellyFromSource} shoud raise a C{TypeError} when trying to
        unjelly the instance.
        N)	rz   r   r€   r�   ÚassertRaisesrq   r   rŸ   r    )r   r�   r‘   Úsavedbmethodr   r   r   Útest_methodNotSelfIdentity`  s   z#AOTTests.test_methodNotSelfIdentityc                 C   s$   G dd„ dƒ}|   ttj|ƒ ¡ dS )z±
        L{aot.jellyToSource} should raise a C{TypeError} when trying to jelly
        an unknown type without a C{__dict__} property or C{__getstate__}
        method.
        c                   @   s   e Zd Zedd„ ƒZdS )z2AOTTests.test_unsupportedType.<locals>.UnknownTypec                 S   s   t ƒ ‚r:   )ÚAttributeErrorr   r   r   r   Ú__dict__y  s   z;AOTTests.test_unsupportedType.<locals>.UnknownType.__dict__N)r   r   r   Úpropertyr«   r   r   r   r   ÚUnknownTypex  s    r­   N)r§   rq   r   r    )r   r­   r   r   r   Útest_unsupportedTypeq  s   zAOTTests.test_unsupportedTypec                 C   s¨   t  ¡ j}d|dœ}dddddddd	d	 tt j|tg}t|ƒ}| |¡ | |¡ | |¡ t  t  ||g¡¡}|d
 |d u sBJ ‚|d d
d… |d
d… ksRJ ‚d S )Nrš   )r™   Úmethodr   r&   rf   zhe	llo

"x world!u   goodbye 
	á€� world!g      ð?éd   r   é   )	r   Ú
AOTJellierÚ	jellyToAOr   r�   ÚtupleÚappendrŸ   r    )r   ÚajÚdÚlÚtÚujr   r   r   Útest_basicIdentity  s,   

ô


$zAOTTests.test_basicIdentityc                 C   s,   t ƒ }d|_t t |¡¡j|jksJ ‚d S )Nz	meringue!)r“   r•   r   rŸ   r    )r   r�   r   r   r   Útest_nonDictStateš  s    zAOTTests.test_nonDictStatec                 C   s"   t  t  tƒ ¡¡}|  |t¡ dS )zƒ
        L{aot.jellyToSource} and L{aot.unjellyFromSource} honor functions
        registered in the pickle copy registry.
        N)r   rŸ   r    rt   rˆ   rw   )r   rº   r   r   r   Útest_copyRegŸ  s   zAOTTests.test_copyRegc                 C   sV   t t g ƒƒ}t |¡}t |¡}|j|u sJ ‚|jj|ju s J ‚|j|jjus)J ‚d S r:   )r�   r   Ú
jellyToAOTÚunjellyFromAOTr�   r‘   r’   )r   rk   Új1Úojr   r   r   Útest_funkyReferences§  s   

zAOTTests.test_funkyReferencesc                 C   sf   g }|df}|  |¡ t |¡}t |¡}|  |d t¡ |  |d d |¡ |  |d d d¡ dS )zS
        L{aot.jellyToAOT} can persist circular references through tuples.
        iá  r   r   N)rµ   r   r¾   r¿   rˆ   r´   ÚassertIsrF   )r   r¸   r¹   rÀ   rÁ   r   r   r   Útest_circularTuple°  s   


zAOTTests.test_circularTupleN)r   r   r   r¢   r¦   r©   r®   r»   r¼   r½   rÂ   rÄ   r   r   r   r   r˜   G  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 )ÚCrefUtilTestsz 
    Tests for L{crefutil}.
    c                 C   s    t  i ¡}|  t|jdd¡ dS )zO
        L{crefutil._DictKeyAndValue} only support keys C{0} and C{1}.
        r&   rf   N)r   Ú_DictKeyAndValuer§   ÚRuntimeErrorÚ__setitem__©r   r·   r   r   r   Útest_dictUnknownKeyÃ  s   
z!CrefUtilTests.test_dictUnknownKeyc                 C   s&   t  ¡ }d|d< |  t|jdd¡ dS )zI
        L{crefutil._Defer} can be assigned a key only one time.
        r   r   N)r   Ú_Deferr§   rÇ   rÈ   rÉ   r   r   r   Útest_deferSetMultipleTimesÊ  s   z(CrefUtilTests.test_deferSetMultipleTimesc                 C   s&   t  g d¢t¡}|  t|ji d¡ dS )z¹
        A L{crefutil._Container} where all of its elements are known at
        construction time is nonsensical and will result in errors in any call
        to addDependant.
        )r   r&   rf   z	ignore-meN)r   Ú
_ContainerÚlistr§   ÚAssertionErrorÚaddDependant)r   Ú	containerr   r   r   Ú&test_containerWhereAllElementsAreKnownÒ  s   z4CrefUtilTests.test_containerWhereAllElementsAreKnownc                 C   s   |   ttƒ jt ¡ d¡ dS )zù
        If a dictionary key contains a circular reference (which is probably a
        bad practice anyway) it will be resolved by a
        L{crefutil._DictKeyAndValue}, not by placing a L{crefutil.NotKnown}
        into a dictionary key.
        ÚvalueN)r§   rÏ   ÚdictrÈ   r   ÚNotKnownr   r   r   r   Ú.test_dontPutCircularReferencesInDictionaryKeysÛ  s   ÿz<CrefUtilTests.test_dontPutCircularReferencesInDictionaryKeysc                 C   s   |   tt dt ¡ t¡¡ dS )zÛ
        L{crefutil._InstanceMethod} raises L{AssertionError} to indicate it
        should not be called.  This should not be possible with any of its API
        clients, but is provided for helping to debug.
        Úno_nameN)r§   rÏ   r   Ú_InstanceMethodrÕ   r„   r   r   r   r   Ú*test_dontCallInstanceMethodsThatArentReadyæ  s   þz8CrefUtilTests.test_dontCallInstanceMethodsThatArentReadyN)	r   r   r   r`   rÊ   rÌ   rÒ   rÖ   rÙ   r   r   r   r   rÅ   ¾  s    	rÅ   )%Úcopyregr‰   r   rœ   Útwisted.persistedr   r   r   Útwisted.trialr   Útwisted.trial.unittestr   r   r   rV   rW   rX   rY   rZ   rh   ra   re   rm   rp   rt   rw   ry   rz   r   r�   r‚   r†   r�   r“   r˜   rÅ   Ú	testCasesr   r   r   r   Ú<module>   s>   p%		w4